/*
 *
 *    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.
 */

#import <Foundation/Foundation.h>

#import "MTRAsyncCallbackWorkQueue.h"
#import "MTRBaseClusterUtils.h"
#import "MTRBaseDevice_Internal.h"
#import "MTRCallbackBridge.h"
#import "MTRClusterConstants.h"
#import "MTRCluster_Internal.h"
#import "MTRClusters_Internal.h"
#import "MTRCommandPayloadsObjc.h"
#import "MTRDevice_Internal.h"
#import "MTRLogging_Internal.h"
#import "MTRStructsObjc.h"

#include <lib/support/CHIPListUtils.h>
#include <platform/CHIPDeviceLayer.h>
#include <type_traits>

using chip::Callback::Callback;
using chip::Callback::Cancelable;
using namespace chip::app::Clusters;
using chip::Optional;
using chip::SessionHandle;
using chip::Messaging::ExchangeManager;
using chip::System::Clock::Seconds16;
using chip::System::Clock::Timeout;

static void MTRClustersLogEnqueue(NSString * logPrefix, MTRAsyncCallbackWorkQueue * workQueue)
{
    MTR_LOG_DEFAULT("%@ enqueueWorkItem %@", logPrefix, workQueue);
}

static void MTRClustersLogDequeue(NSString * logPrefix, MTRAsyncCallbackWorkQueue * workQueue)
{
    MTR_LOG_DEFAULT("%@ dequeueWorkItem %@", logPrefix, workQueue);
}

static void MTRClustersLogCompletion(NSString * logPrefix, id value, NSError * error)
{
    // Log the data at the INFO level (not usually persisted permanently),
    // but make sure we log the work completion at the DEFAULT level.
    MTR_LOG_INFO("%@ received response: %@ error: %@", logPrefix, value, error);
    MTR_LOG_DEFAULT("%@ endWork", logPrefix);
}

// NOLINTBEGIN(clang-analyzer-cplusplus.NewDeleteLeaks): Linter is unable to locate the delete on these objects.
@implementation MTRClusterIdentify

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (void)identifyWithParams:(MTRIdentifyClusterIdentifyParams *)params
            expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
     expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix =
        [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex, _endpoint,
                  (unsigned int) MTRClusterIDTypeIdentifyID, (unsigned int) MTRCommandIDTypeClusterIdentifyCommandIdentifyID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                Identify::Commands::Identify::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.identifyTime = params.identifyTime.unsignedShortValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)triggerEffectWithParams:(MTRIdentifyClusterTriggerEffectParams *)params
                 expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
          expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                     completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix =
        [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex, _endpoint,
                  (unsigned int) MTRClusterIDTypeIdentifyID, (unsigned int) MTRCommandIDTypeClusterIdentifyCommandTriggerEffectID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                Identify::Commands::TriggerEffect::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.effectIdentifier = static_cast<std::remove_reference_t<decltype(request.effectIdentifier)>>(
                    params.effectIdentifier.unsignedCharValue);
                request.effectVariant
                    = static_cast<std::remove_reference_t<decltype(request.effectVariant)>>(params.effectVariant.unsignedCharValue);

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (NSDictionary<NSString *, id> *)readAttributeIdentifyTimeWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeIdentifyID)
                                        attributeID:@(MTRAttributeIDTypeClusterIdentifyAttributeIdentifyTimeID)
                                             params:params];
}

- (void)writeAttributeIdentifyTimeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeIdentifyTimeWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeIdentifyTimeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                     params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeIdentifyID)
                                  attributeID:@(MTRAttributeIDTypeClusterIdentifyAttributeIdentifyTimeID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeIdentifyTypeWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeIdentifyID)
                                        attributeID:@(MTRAttributeIDTypeClusterIdentifyAttributeIdentifyTypeID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeIdentifyID)
                                        attributeID:@(MTRAttributeIDTypeClusterIdentifyAttributeGeneratedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeIdentifyID)
                                        attributeID:@(MTRAttributeIDTypeClusterIdentifyAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeIdentifyID)
                                        attributeID:@(MTRAttributeIDTypeClusterIdentifyAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeIdentifyID)
                                        attributeID:@(MTRAttributeIDTypeClusterIdentifyAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeIdentifyID)
                                        attributeID:@(MTRAttributeIDTypeClusterIdentifyAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterIdentify (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

- (void)identifyWithParams:(MTRIdentifyClusterIdentifyParams *)params
            expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
     expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
         completionHandler:(MTRStatusCompletion)completionHandler
{
    [self identifyWithParams:params
               expectedValues:expectedDataValueDictionaries
        expectedValueInterval:expectedValueIntervalMs
                   completion:completionHandler];
}
- (void)triggerEffectWithParams:(MTRIdentifyClusterTriggerEffectParams *)params
                 expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
          expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
              completionHandler:(MTRStatusCompletion)completionHandler
{
    [self triggerEffectWithParams:params
                   expectedValues:expectedDataValueDictionaries
            expectedValueInterval:expectedValueIntervalMs
                       completion:completionHandler];
}
@end

@implementation MTRClusterGroups

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (void)addGroupWithParams:(MTRGroupsClusterAddGroupParams *)params
            expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
     expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                completion:(void (^)(MTRGroupsClusterAddGroupResponseParams * _Nullable data, NSError * _Nullable error))completion
{
    NSString * logPrefix =
        [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex, _endpoint,
                  (unsigned int) MTRClusterIDTypeGroupsID, (unsigned int) MTRCommandIDTypeClusterGroupsCommandAddGroupID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRGroupsClusterAddGroupResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, GroupsClusterAddGroupResponseCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRGroupsClusterAddGroupResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                Groups::Commands::AddGroup::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.groupID = params.groupID.unsignedShortValue;
                request.groupName = [self asCharSpan:params.groupName];

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)viewGroupWithParams:(MTRGroupsClusterViewGroupParams *)params
             expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                 completion:
                     (void (^)(MTRGroupsClusterViewGroupResponseParams * _Nullable data, NSError * _Nullable error))completion
{
    NSString * logPrefix =
        [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex, _endpoint,
                  (unsigned int) MTRClusterIDTypeGroupsID, (unsigned int) MTRCommandIDTypeClusterGroupsCommandViewGroupID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRGroupsClusterViewGroupResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                GroupsClusterViewGroupResponseCallbackType successCb, MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRGroupsClusterViewGroupResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                Groups::Commands::ViewGroup::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.groupID = params.groupID.unsignedShortValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)getGroupMembershipWithParams:(MTRGroupsClusterGetGroupMembershipParams *)params
                      expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
               expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                          completion:(void (^)(MTRGroupsClusterGetGroupMembershipResponseParams * _Nullable data,
                                         NSError * _Nullable error))completion
{
    NSString * logPrefix =
        [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex, _endpoint,
                  (unsigned int) MTRClusterIDTypeGroupsID, (unsigned int) MTRCommandIDTypeClusterGroupsCommandGetGroupMembershipID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRGroupsClusterGetGroupMembershipResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                GroupsClusterGetGroupMembershipResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRGroupsClusterGetGroupMembershipResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                Groups::Commands::GetGroupMembership::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                {
                    using ListType_0 = std::remove_reference_t<decltype(request.groupList)>;
                    using ListMemberType_0 = ListMemberTypeGetter<ListType_0>::Type;
                    if (params.groupList.count != 0) {
                        auto * listHolder_0 = new ListHolder<ListMemberType_0>(params.groupList.count);
                        if (listHolder_0 == nullptr || listHolder_0->mList == nullptr) {
                            return CHIP_ERROR_INVALID_ARGUMENT;
                        }
                        listFreer.add(listHolder_0);
                        for (size_t i_0 = 0; i_0 < params.groupList.count; ++i_0) {
                            if (![params.groupList[i_0] isKindOfClass:[NSNumber class]]) {
                                // Wrong kind of value.
                                return CHIP_ERROR_INVALID_ARGUMENT;
                            }
                            auto element_0 = (NSNumber *) params.groupList[i_0];
                            listHolder_0->mList[i_0] = element_0.unsignedShortValue;
                        }
                        request.groupList = ListType_0(listHolder_0->mList, params.groupList.count);
                    } else {
                        request.groupList = ListType_0();
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)removeGroupWithParams:(MTRGroupsClusterRemoveGroupParams *)params
               expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                   completion:
                       (void (^)(MTRGroupsClusterRemoveGroupResponseParams * _Nullable data, NSError * _Nullable error))completion
{
    NSString * logPrefix =
        [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex, _endpoint,
                  (unsigned int) MTRClusterIDTypeGroupsID, (unsigned int) MTRCommandIDTypeClusterGroupsCommandRemoveGroupID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRGroupsClusterRemoveGroupResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                GroupsClusterRemoveGroupResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRGroupsClusterRemoveGroupResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                Groups::Commands::RemoveGroup::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.groupID = params.groupID.unsignedShortValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)removeAllGroupsWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                               completion:(MTRStatusCompletion)completion
{
    [self removeAllGroupsWithParams:nil
                     expectedValues:expectedValues
              expectedValueInterval:expectedValueIntervalMs
                         completion:completion];
}
- (void)removeAllGroupsWithParams:(MTRGroupsClusterRemoveAllGroupsParams * _Nullable)params
                   expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
            expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                       completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix =
        [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex, _endpoint,
                  (unsigned int) MTRClusterIDTypeGroupsID, (unsigned int) MTRCommandIDTypeClusterGroupsCommandRemoveAllGroupsID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                Groups::Commands::RemoveAllGroups::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)addGroupIfIdentifyingWithParams:(MTRGroupsClusterAddGroupIfIdentifyingParams *)params
                         expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                  expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                             completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeGroupsID,
                                     (unsigned int) MTRCommandIDTypeClusterGroupsCommandAddGroupIfIdentifyingID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                Groups::Commands::AddGroupIfIdentifying::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.groupID = params.groupID.unsignedShortValue;
                request.groupName = [self asCharSpan:params.groupName];

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (NSDictionary<NSString *, id> *)readAttributeNameSupportWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeGroupsID)
                                        attributeID:@(MTRAttributeIDTypeClusterGroupsAttributeNameSupportID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeGroupsID)
                                        attributeID:@(MTRAttributeIDTypeClusterGroupsAttributeGeneratedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeGroupsID)
                                        attributeID:@(MTRAttributeIDTypeClusterGroupsAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeGroupsID)
                                        attributeID:@(MTRAttributeIDTypeClusterGroupsAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeGroupsID)
                                        attributeID:@(MTRAttributeIDTypeClusterGroupsAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeGroupsID)
                                        attributeID:@(MTRAttributeIDTypeClusterGroupsAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterGroups (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

- (void)addGroupWithParams:(MTRGroupsClusterAddGroupParams *)params
            expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
     expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
         completionHandler:
             (void (^)(MTRGroupsClusterAddGroupResponseParams * _Nullable data, NSError * _Nullable error))completionHandler
{
    [self addGroupWithParams:params
               expectedValues:expectedDataValueDictionaries
        expectedValueInterval:expectedValueIntervalMs
                   completion:^(MTRGroupsClusterAddGroupResponseParams * _Nullable data, NSError * _Nullable error) {
                       // Cast is safe because subclass does not add any selectors.
                       completionHandler(static_cast<MTRGroupsClusterAddGroupResponseParams *>(data), error);
                   }];
}
- (void)viewGroupWithParams:(MTRGroupsClusterViewGroupParams *)params
             expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
      expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
          completionHandler:
              (void (^)(MTRGroupsClusterViewGroupResponseParams * _Nullable data, NSError * _Nullable error))completionHandler
{
    [self viewGroupWithParams:params
               expectedValues:expectedDataValueDictionaries
        expectedValueInterval:expectedValueIntervalMs
                   completion:^(MTRGroupsClusterViewGroupResponseParams * _Nullable data, NSError * _Nullable error) {
                       // Cast is safe because subclass does not add any selectors.
                       completionHandler(static_cast<MTRGroupsClusterViewGroupResponseParams *>(data), error);
                   }];
}
- (void)getGroupMembershipWithParams:(MTRGroupsClusterGetGroupMembershipParams *)params
                      expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
               expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                   completionHandler:(void (^)(MTRGroupsClusterGetGroupMembershipResponseParams * _Nullable data,
                                         NSError * _Nullable error))completionHandler
{
    [self getGroupMembershipWithParams:params
                        expectedValues:expectedDataValueDictionaries
                 expectedValueInterval:expectedValueIntervalMs
                            completion:^(
                                MTRGroupsClusterGetGroupMembershipResponseParams * _Nullable data, NSError * _Nullable error) {
                                // Cast is safe because subclass does not add any selectors.
                                completionHandler(static_cast<MTRGroupsClusterGetGroupMembershipResponseParams *>(data), error);
                            }];
}
- (void)removeGroupWithParams:(MTRGroupsClusterRemoveGroupParams *)params
               expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
        expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
            completionHandler:
                (void (^)(MTRGroupsClusterRemoveGroupResponseParams * _Nullable data, NSError * _Nullable error))completionHandler
{
    [self removeGroupWithParams:params
                 expectedValues:expectedDataValueDictionaries
          expectedValueInterval:expectedValueIntervalMs
                     completion:^(MTRGroupsClusterRemoveGroupResponseParams * _Nullable data, NSError * _Nullable error) {
                         // Cast is safe because subclass does not add any selectors.
                         completionHandler(static_cast<MTRGroupsClusterRemoveGroupResponseParams *>(data), error);
                     }];
}
- (void)removeAllGroupsWithParams:(MTRGroupsClusterRemoveAllGroupsParams * _Nullable)params
                   expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
            expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                completionHandler:(MTRStatusCompletion)completionHandler
{
    [self removeAllGroupsWithParams:params
                     expectedValues:expectedDataValueDictionaries
              expectedValueInterval:expectedValueIntervalMs
                         completion:completionHandler];
}
- (void)removeAllGroupsWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                        completionHandler:(MTRStatusCompletion)completionHandler
{
    [self removeAllGroupsWithParams:nil
                     expectedValues:expectedValues
              expectedValueInterval:expectedValueIntervalMs
                  completionHandler:completionHandler];
}
- (void)addGroupIfIdentifyingWithParams:(MTRGroupsClusterAddGroupIfIdentifyingParams *)params
                         expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
                  expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                      completionHandler:(MTRStatusCompletion)completionHandler
{
    [self addGroupIfIdentifyingWithParams:params
                           expectedValues:expectedDataValueDictionaries
                    expectedValueInterval:expectedValueIntervalMs
                               completion:completionHandler];
}
@end

@implementation MTRClusterScenes

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (void)addSceneWithParams:(MTRScenesClusterAddSceneParams *)params
            expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
     expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                completion:(void (^)(MTRScenesClusterAddSceneResponseParams * _Nullable data, NSError * _Nullable error))completion
{
    NSString * logPrefix =
        [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex, _endpoint,
                  (unsigned int) MTRClusterIDTypeScenesID, (unsigned int) MTRCommandIDTypeClusterScenesCommandAddSceneID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRScenesClusterAddSceneResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, ScenesClusterAddSceneResponseCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRScenesClusterAddSceneResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                Scenes::Commands::AddScene::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.groupID = params.groupID.unsignedShortValue;
                request.sceneID = params.sceneID.unsignedCharValue;
                request.transitionTime = params.transitionTime.unsignedShortValue;
                request.sceneName = [self asCharSpan:params.sceneName];
                {
                    using ListType_0 = std::remove_reference_t<decltype(request.extensionFieldSets)>;
                    using ListMemberType_0 = ListMemberTypeGetter<ListType_0>::Type;
                    if (params.extensionFieldSets.count != 0) {
                        auto * listHolder_0 = new ListHolder<ListMemberType_0>(params.extensionFieldSets.count);
                        if (listHolder_0 == nullptr || listHolder_0->mList == nullptr) {
                            return CHIP_ERROR_INVALID_ARGUMENT;
                        }
                        listFreer.add(listHolder_0);
                        for (size_t i_0 = 0; i_0 < params.extensionFieldSets.count; ++i_0) {
                            if (![params.extensionFieldSets[i_0] isKindOfClass:[MTRScenesClusterExtensionFieldSet class]]) {
                                // Wrong kind of value.
                                return CHIP_ERROR_INVALID_ARGUMENT;
                            }
                            auto element_0 = (MTRScenesClusterExtensionFieldSet *) params.extensionFieldSets[i_0];
                            listHolder_0->mList[i_0].clusterID = element_0.clusterID.unsignedIntValue;
                            {
                                using ListType_2 = std::remove_reference_t<decltype(listHolder_0->mList[i_0].attributeValueList)>;
                                using ListMemberType_2 = ListMemberTypeGetter<ListType_2>::Type;
                                if (element_0.attributeValueList.count != 0) {
                                    auto * listHolder_2 = new ListHolder<ListMemberType_2>(element_0.attributeValueList.count);
                                    if (listHolder_2 == nullptr || listHolder_2->mList == nullptr) {
                                        return CHIP_ERROR_INVALID_ARGUMENT;
                                    }
                                    listFreer.add(listHolder_2);
                                    for (size_t i_2 = 0; i_2 < element_0.attributeValueList.count; ++i_2) {
                                        if (![element_0.attributeValueList[i_2]
                                                isKindOfClass:[MTRScenesClusterAttributeValuePair class]]) {
                                            // Wrong kind of value.
                                            return CHIP_ERROR_INVALID_ARGUMENT;
                                        }
                                        auto element_2 = (MTRScenesClusterAttributeValuePair *) element_0.attributeValueList[i_2];
                                        if (element_2.attributeID != nil) {
                                            auto & definedValue_4 = listHolder_2->mList[i_2].attributeID.Emplace();
                                            definedValue_4 = element_2.attributeID.unsignedIntValue;
                                        }
                                        {
                                            using ListType_4
                                                = std::remove_reference_t<decltype(listHolder_2->mList[i_2].attributeValue)>;
                                            using ListMemberType_4 = ListMemberTypeGetter<ListType_4>::Type;
                                            if (element_2.attributeValue.count != 0) {
                                                auto * listHolder_4
                                                    = new ListHolder<ListMemberType_4>(element_2.attributeValue.count);
                                                if (listHolder_4 == nullptr || listHolder_4->mList == nullptr) {
                                                    return CHIP_ERROR_INVALID_ARGUMENT;
                                                }
                                                listFreer.add(listHolder_4);
                                                for (size_t i_4 = 0; i_4 < element_2.attributeValue.count; ++i_4) {
                                                    if (![element_2.attributeValue[i_4] isKindOfClass:[NSNumber class]]) {
                                                        // Wrong kind of value.
                                                        return CHIP_ERROR_INVALID_ARGUMENT;
                                                    }
                                                    auto element_4 = (NSNumber *) element_2.attributeValue[i_4];
                                                    listHolder_4->mList[i_4] = element_4.unsignedCharValue;
                                                }
                                                listHolder_2->mList[i_2].attributeValue
                                                    = ListType_4(listHolder_4->mList, element_2.attributeValue.count);
                                            } else {
                                                listHolder_2->mList[i_2].attributeValue = ListType_4();
                                            }
                                        }
                                    }
                                    listHolder_0->mList[i_0].attributeValueList
                                        = ListType_2(listHolder_2->mList, element_0.attributeValueList.count);
                                } else {
                                    listHolder_0->mList[i_0].attributeValueList = ListType_2();
                                }
                            }
                        }
                        request.extensionFieldSets = ListType_0(listHolder_0->mList, params.extensionFieldSets.count);
                    } else {
                        request.extensionFieldSets = ListType_0();
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)viewSceneWithParams:(MTRScenesClusterViewSceneParams *)params
             expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                 completion:
                     (void (^)(MTRScenesClusterViewSceneResponseParams * _Nullable data, NSError * _Nullable error))completion
{
    NSString * logPrefix =
        [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex, _endpoint,
                  (unsigned int) MTRClusterIDTypeScenesID, (unsigned int) MTRCommandIDTypeClusterScenesCommandViewSceneID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRScenesClusterViewSceneResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                ScenesClusterViewSceneResponseCallbackType successCb, MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRScenesClusterViewSceneResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                Scenes::Commands::ViewScene::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.groupID = params.groupID.unsignedShortValue;
                request.sceneID = params.sceneID.unsignedCharValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)removeSceneWithParams:(MTRScenesClusterRemoveSceneParams *)params
               expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                   completion:
                       (void (^)(MTRScenesClusterRemoveSceneResponseParams * _Nullable data, NSError * _Nullable error))completion
{
    NSString * logPrefix =
        [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex, _endpoint,
                  (unsigned int) MTRClusterIDTypeScenesID, (unsigned int) MTRCommandIDTypeClusterScenesCommandRemoveSceneID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRScenesClusterRemoveSceneResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                ScenesClusterRemoveSceneResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRScenesClusterRemoveSceneResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                Scenes::Commands::RemoveScene::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.groupID = params.groupID.unsignedShortValue;
                request.sceneID = params.sceneID.unsignedCharValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)removeAllScenesWithParams:(MTRScenesClusterRemoveAllScenesParams *)params
                   expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
            expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                       completion:(void (^)(MTRScenesClusterRemoveAllScenesResponseParams * _Nullable data,
                                      NSError * _Nullable error))completion
{
    NSString * logPrefix =
        [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex, _endpoint,
                  (unsigned int) MTRClusterIDTypeScenesID, (unsigned int) MTRCommandIDTypeClusterScenesCommandRemoveAllScenesID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRScenesClusterRemoveAllScenesResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                ScenesClusterRemoveAllScenesResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRScenesClusterRemoveAllScenesResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                Scenes::Commands::RemoveAllScenes::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.groupID = params.groupID.unsignedShortValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)storeSceneWithParams:(MTRScenesClusterStoreSceneParams *)params
              expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
       expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                  completion:
                      (void (^)(MTRScenesClusterStoreSceneResponseParams * _Nullable data, NSError * _Nullable error))completion
{
    NSString * logPrefix =
        [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex, _endpoint,
                  (unsigned int) MTRClusterIDTypeScenesID, (unsigned int) MTRCommandIDTypeClusterScenesCommandStoreSceneID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRScenesClusterStoreSceneResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                ScenesClusterStoreSceneResponseCallbackType successCb, MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRScenesClusterStoreSceneResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                Scenes::Commands::StoreScene::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.groupID = params.groupID.unsignedShortValue;
                request.sceneID = params.sceneID.unsignedCharValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)recallSceneWithParams:(MTRScenesClusterRecallSceneParams *)params
               expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                   completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix =
        [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex, _endpoint,
                  (unsigned int) MTRClusterIDTypeScenesID, (unsigned int) MTRCommandIDTypeClusterScenesCommandRecallSceneID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                Scenes::Commands::RecallScene::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.groupID = params.groupID.unsignedShortValue;
                request.sceneID = params.sceneID.unsignedCharValue;
                if (params.transitionTime != nil) {
                    auto & definedValue_0 = request.transitionTime.Emplace();
                    if (params.transitionTime == nil) {
                        definedValue_0.SetNull();
                    } else {
                        auto & nonNullValue_1 = definedValue_0.SetNonNull();
                        nonNullValue_1 = params.transitionTime.unsignedShortValue;
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)getSceneMembershipWithParams:(MTRScenesClusterGetSceneMembershipParams *)params
                      expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
               expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                          completion:(void (^)(MTRScenesClusterGetSceneMembershipResponseParams * _Nullable data,
                                         NSError * _Nullable error))completion
{
    NSString * logPrefix =
        [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex, _endpoint,
                  (unsigned int) MTRClusterIDTypeScenesID, (unsigned int) MTRCommandIDTypeClusterScenesCommandGetSceneMembershipID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRScenesClusterGetSceneMembershipResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                ScenesClusterGetSceneMembershipResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRScenesClusterGetSceneMembershipResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                Scenes::Commands::GetSceneMembership::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.groupID = params.groupID.unsignedShortValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)enhancedAddSceneWithParams:(MTRScenesClusterEnhancedAddSceneParams *)params
                    expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
             expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                        completion:(void (^)(MTRScenesClusterEnhancedAddSceneResponseParams * _Nullable data,
                                       NSError * _Nullable error))completion
{
    NSString * logPrefix =
        [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex, _endpoint,
                  (unsigned int) MTRClusterIDTypeScenesID, (unsigned int) MTRCommandIDTypeClusterScenesCommandEnhancedAddSceneID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRScenesClusterEnhancedAddSceneResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                ScenesClusterEnhancedAddSceneResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRScenesClusterEnhancedAddSceneResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                Scenes::Commands::EnhancedAddScene::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.groupID = params.groupID.unsignedShortValue;
                request.sceneID = params.sceneID.unsignedCharValue;
                request.transitionTime = params.transitionTime.unsignedShortValue;
                request.sceneName = [self asCharSpan:params.sceneName];
                {
                    using ListType_0 = std::remove_reference_t<decltype(request.extensionFieldSets)>;
                    using ListMemberType_0 = ListMemberTypeGetter<ListType_0>::Type;
                    if (params.extensionFieldSets.count != 0) {
                        auto * listHolder_0 = new ListHolder<ListMemberType_0>(params.extensionFieldSets.count);
                        if (listHolder_0 == nullptr || listHolder_0->mList == nullptr) {
                            return CHIP_ERROR_INVALID_ARGUMENT;
                        }
                        listFreer.add(listHolder_0);
                        for (size_t i_0 = 0; i_0 < params.extensionFieldSets.count; ++i_0) {
                            if (![params.extensionFieldSets[i_0] isKindOfClass:[MTRScenesClusterExtensionFieldSet class]]) {
                                // Wrong kind of value.
                                return CHIP_ERROR_INVALID_ARGUMENT;
                            }
                            auto element_0 = (MTRScenesClusterExtensionFieldSet *) params.extensionFieldSets[i_0];
                            listHolder_0->mList[i_0].clusterID = element_0.clusterID.unsignedIntValue;
                            {
                                using ListType_2 = std::remove_reference_t<decltype(listHolder_0->mList[i_0].attributeValueList)>;
                                using ListMemberType_2 = ListMemberTypeGetter<ListType_2>::Type;
                                if (element_0.attributeValueList.count != 0) {
                                    auto * listHolder_2 = new ListHolder<ListMemberType_2>(element_0.attributeValueList.count);
                                    if (listHolder_2 == nullptr || listHolder_2->mList == nullptr) {
                                        return CHIP_ERROR_INVALID_ARGUMENT;
                                    }
                                    listFreer.add(listHolder_2);
                                    for (size_t i_2 = 0; i_2 < element_0.attributeValueList.count; ++i_2) {
                                        if (![element_0.attributeValueList[i_2]
                                                isKindOfClass:[MTRScenesClusterAttributeValuePair class]]) {
                                            // Wrong kind of value.
                                            return CHIP_ERROR_INVALID_ARGUMENT;
                                        }
                                        auto element_2 = (MTRScenesClusterAttributeValuePair *) element_0.attributeValueList[i_2];
                                        if (element_2.attributeID != nil) {
                                            auto & definedValue_4 = listHolder_2->mList[i_2].attributeID.Emplace();
                                            definedValue_4 = element_2.attributeID.unsignedIntValue;
                                        }
                                        {
                                            using ListType_4
                                                = std::remove_reference_t<decltype(listHolder_2->mList[i_2].attributeValue)>;
                                            using ListMemberType_4 = ListMemberTypeGetter<ListType_4>::Type;
                                            if (element_2.attributeValue.count != 0) {
                                                auto * listHolder_4
                                                    = new ListHolder<ListMemberType_4>(element_2.attributeValue.count);
                                                if (listHolder_4 == nullptr || listHolder_4->mList == nullptr) {
                                                    return CHIP_ERROR_INVALID_ARGUMENT;
                                                }
                                                listFreer.add(listHolder_4);
                                                for (size_t i_4 = 0; i_4 < element_2.attributeValue.count; ++i_4) {
                                                    if (![element_2.attributeValue[i_4] isKindOfClass:[NSNumber class]]) {
                                                        // Wrong kind of value.
                                                        return CHIP_ERROR_INVALID_ARGUMENT;
                                                    }
                                                    auto element_4 = (NSNumber *) element_2.attributeValue[i_4];
                                                    listHolder_4->mList[i_4] = element_4.unsignedCharValue;
                                                }
                                                listHolder_2->mList[i_2].attributeValue
                                                    = ListType_4(listHolder_4->mList, element_2.attributeValue.count);
                                            } else {
                                                listHolder_2->mList[i_2].attributeValue = ListType_4();
                                            }
                                        }
                                    }
                                    listHolder_0->mList[i_0].attributeValueList
                                        = ListType_2(listHolder_2->mList, element_0.attributeValueList.count);
                                } else {
                                    listHolder_0->mList[i_0].attributeValueList = ListType_2();
                                }
                            }
                        }
                        request.extensionFieldSets = ListType_0(listHolder_0->mList, params.extensionFieldSets.count);
                    } else {
                        request.extensionFieldSets = ListType_0();
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)enhancedViewSceneWithParams:(MTRScenesClusterEnhancedViewSceneParams *)params
                     expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
              expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                         completion:(void (^)(MTRScenesClusterEnhancedViewSceneResponseParams * _Nullable data,
                                        NSError * _Nullable error))completion
{
    NSString * logPrefix =
        [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex, _endpoint,
                  (unsigned int) MTRClusterIDTypeScenesID, (unsigned int) MTRCommandIDTypeClusterScenesCommandEnhancedViewSceneID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRScenesClusterEnhancedViewSceneResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                ScenesClusterEnhancedViewSceneResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRScenesClusterEnhancedViewSceneResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                Scenes::Commands::EnhancedViewScene::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.groupID = params.groupID.unsignedShortValue;
                request.sceneID = params.sceneID.unsignedCharValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)copySceneWithParams:(MTRScenesClusterCopySceneParams *)params
             expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                 completion:
                     (void (^)(MTRScenesClusterCopySceneResponseParams * _Nullable data, NSError * _Nullable error))completion
{
    NSString * logPrefix =
        [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex, _endpoint,
                  (unsigned int) MTRClusterIDTypeScenesID, (unsigned int) MTRCommandIDTypeClusterScenesCommandCopySceneID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRScenesClusterCopySceneResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                ScenesClusterCopySceneResponseCallbackType successCb, MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRScenesClusterCopySceneResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                Scenes::Commands::CopyScene::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.mode = static_cast<std::remove_reference_t<decltype(request.mode)>>(params.mode.unsignedCharValue);
                request.groupIdentifierFrom = params.groupIdentifierFrom.unsignedShortValue;
                request.sceneIdentifierFrom = params.sceneIdentifierFrom.unsignedCharValue;
                request.groupIdentifierTo = params.groupIdentifierTo.unsignedShortValue;
                request.sceneIdentifierTo = params.sceneIdentifierTo.unsignedCharValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (NSDictionary<NSString *, id> *)readAttributeSceneCountWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeScenesID)
                                        attributeID:@(MTRAttributeIDTypeClusterScenesAttributeSceneCountID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeCurrentSceneWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeScenesID)
                                        attributeID:@(MTRAttributeIDTypeClusterScenesAttributeCurrentSceneID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeCurrentGroupWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeScenesID)
                                        attributeID:@(MTRAttributeIDTypeClusterScenesAttributeCurrentGroupID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeSceneValidWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeScenesID)
                                        attributeID:@(MTRAttributeIDTypeClusterScenesAttributeSceneValidID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeNameSupportWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeScenesID)
                                        attributeID:@(MTRAttributeIDTypeClusterScenesAttributeNameSupportID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeLastConfiguredByWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeScenesID)
                                        attributeID:@(MTRAttributeIDTypeClusterScenesAttributeLastConfiguredByID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeScenesID)
                                        attributeID:@(MTRAttributeIDTypeClusterScenesAttributeGeneratedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeScenesID)
                                        attributeID:@(MTRAttributeIDTypeClusterScenesAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeScenesID)
                                        attributeID:@(MTRAttributeIDTypeClusterScenesAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeScenesID)
                                        attributeID:@(MTRAttributeIDTypeClusterScenesAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeScenesID)
                                        attributeID:@(MTRAttributeIDTypeClusterScenesAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterScenes (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

- (void)addSceneWithParams:(MTRScenesClusterAddSceneParams *)params
            expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
     expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
         completionHandler:
             (void (^)(MTRScenesClusterAddSceneResponseParams * _Nullable data, NSError * _Nullable error))completionHandler
{
    [self addSceneWithParams:params
               expectedValues:expectedDataValueDictionaries
        expectedValueInterval:expectedValueIntervalMs
                   completion:^(MTRScenesClusterAddSceneResponseParams * _Nullable data, NSError * _Nullable error) {
                       // Cast is safe because subclass does not add any selectors.
                       completionHandler(static_cast<MTRScenesClusterAddSceneResponseParams *>(data), error);
                   }];
}
- (void)viewSceneWithParams:(MTRScenesClusterViewSceneParams *)params
             expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
      expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
          completionHandler:
              (void (^)(MTRScenesClusterViewSceneResponseParams * _Nullable data, NSError * _Nullable error))completionHandler
{
    [self viewSceneWithParams:params
               expectedValues:expectedDataValueDictionaries
        expectedValueInterval:expectedValueIntervalMs
                   completion:^(MTRScenesClusterViewSceneResponseParams * _Nullable data, NSError * _Nullable error) {
                       // Cast is safe because subclass does not add any selectors.
                       completionHandler(static_cast<MTRScenesClusterViewSceneResponseParams *>(data), error);
                   }];
}
- (void)removeSceneWithParams:(MTRScenesClusterRemoveSceneParams *)params
               expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
        expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
            completionHandler:
                (void (^)(MTRScenesClusterRemoveSceneResponseParams * _Nullable data, NSError * _Nullable error))completionHandler
{
    [self removeSceneWithParams:params
                 expectedValues:expectedDataValueDictionaries
          expectedValueInterval:expectedValueIntervalMs
                     completion:^(MTRScenesClusterRemoveSceneResponseParams * _Nullable data, NSError * _Nullable error) {
                         // Cast is safe because subclass does not add any selectors.
                         completionHandler(static_cast<MTRScenesClusterRemoveSceneResponseParams *>(data), error);
                     }];
}
- (void)removeAllScenesWithParams:(MTRScenesClusterRemoveAllScenesParams *)params
                   expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
            expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                completionHandler:(void (^)(MTRScenesClusterRemoveAllScenesResponseParams * _Nullable data,
                                      NSError * _Nullable error))completionHandler
{
    [self removeAllScenesWithParams:params
                     expectedValues:expectedDataValueDictionaries
              expectedValueInterval:expectedValueIntervalMs
                         completion:^(MTRScenesClusterRemoveAllScenesResponseParams * _Nullable data, NSError * _Nullable error) {
                             // Cast is safe because subclass does not add any selectors.
                             completionHandler(static_cast<MTRScenesClusterRemoveAllScenesResponseParams *>(data), error);
                         }];
}
- (void)storeSceneWithParams:(MTRScenesClusterStoreSceneParams *)params
              expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
       expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
           completionHandler:
               (void (^)(MTRScenesClusterStoreSceneResponseParams * _Nullable data, NSError * _Nullable error))completionHandler
{
    [self storeSceneWithParams:params
                expectedValues:expectedDataValueDictionaries
         expectedValueInterval:expectedValueIntervalMs
                    completion:^(MTRScenesClusterStoreSceneResponseParams * _Nullable data, NSError * _Nullable error) {
                        // Cast is safe because subclass does not add any selectors.
                        completionHandler(static_cast<MTRScenesClusterStoreSceneResponseParams *>(data), error);
                    }];
}
- (void)recallSceneWithParams:(MTRScenesClusterRecallSceneParams *)params
               expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
        expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
            completionHandler:(MTRStatusCompletion)completionHandler
{
    [self recallSceneWithParams:params
                 expectedValues:expectedDataValueDictionaries
          expectedValueInterval:expectedValueIntervalMs
                     completion:completionHandler];
}
- (void)getSceneMembershipWithParams:(MTRScenesClusterGetSceneMembershipParams *)params
                      expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
               expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                   completionHandler:(void (^)(MTRScenesClusterGetSceneMembershipResponseParams * _Nullable data,
                                         NSError * _Nullable error))completionHandler
{
    [self getSceneMembershipWithParams:params
                        expectedValues:expectedDataValueDictionaries
                 expectedValueInterval:expectedValueIntervalMs
                            completion:^(
                                MTRScenesClusterGetSceneMembershipResponseParams * _Nullable data, NSError * _Nullable error) {
                                // Cast is safe because subclass does not add any selectors.
                                completionHandler(static_cast<MTRScenesClusterGetSceneMembershipResponseParams *>(data), error);
                            }];
}
- (void)enhancedAddSceneWithParams:(MTRScenesClusterEnhancedAddSceneParams *)params
                    expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
             expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                 completionHandler:(void (^)(MTRScenesClusterEnhancedAddSceneResponseParams * _Nullable data,
                                       NSError * _Nullable error))completionHandler
{
    [self enhancedAddSceneWithParams:params
                      expectedValues:expectedDataValueDictionaries
               expectedValueInterval:expectedValueIntervalMs
                          completion:^(MTRScenesClusterEnhancedAddSceneResponseParams * _Nullable data, NSError * _Nullable error) {
                              // Cast is safe because subclass does not add any selectors.
                              completionHandler(static_cast<MTRScenesClusterEnhancedAddSceneResponseParams *>(data), error);
                          }];
}
- (void)enhancedViewSceneWithParams:(MTRScenesClusterEnhancedViewSceneParams *)params
                     expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
              expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                  completionHandler:(void (^)(MTRScenesClusterEnhancedViewSceneResponseParams * _Nullable data,
                                        NSError * _Nullable error))completionHandler
{
    [self
        enhancedViewSceneWithParams:params
                     expectedValues:expectedDataValueDictionaries
              expectedValueInterval:expectedValueIntervalMs
                         completion:^(MTRScenesClusterEnhancedViewSceneResponseParams * _Nullable data, NSError * _Nullable error) {
                             // Cast is safe because subclass does not add any selectors.
                             completionHandler(static_cast<MTRScenesClusterEnhancedViewSceneResponseParams *>(data), error);
                         }];
}
- (void)copySceneWithParams:(MTRScenesClusterCopySceneParams *)params
             expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
      expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
          completionHandler:
              (void (^)(MTRScenesClusterCopySceneResponseParams * _Nullable data, NSError * _Nullable error))completionHandler
{
    [self copySceneWithParams:params
               expectedValues:expectedDataValueDictionaries
        expectedValueInterval:expectedValueIntervalMs
                   completion:^(MTRScenesClusterCopySceneResponseParams * _Nullable data, NSError * _Nullable error) {
                       // Cast is safe because subclass does not add any selectors.
                       completionHandler(static_cast<MTRScenesClusterCopySceneResponseParams *>(data), error);
                   }];
}
@end

@implementation MTRClusterOnOff

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (void)offWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                   completion:(MTRStatusCompletion)completion
{
    [self offWithParams:nil expectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs completion:completion];
}
- (void)offWithParams:(MTROnOffClusterOffParams * _Nullable)params
           expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
               completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix =
        [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex, _endpoint,
                  (unsigned int) MTRClusterIDTypeOnOffID, (unsigned int) MTRCommandIDTypeClusterOnOffCommandOffID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                OnOff::Commands::Off::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)onWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
       expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                  completion:(MTRStatusCompletion)completion
{
    [self onWithParams:nil expectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs completion:completion];
}
- (void)onWithParams:(MTROnOffClusterOnParams * _Nullable)params
           expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
               completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix =
        [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex, _endpoint,
                  (unsigned int) MTRClusterIDTypeOnOffID, (unsigned int) MTRCommandIDTypeClusterOnOffCommandOnID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                OnOff::Commands::On::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)toggleWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
           expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                      completion:(MTRStatusCompletion)completion
{
    [self toggleWithParams:nil expectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs completion:completion];
}
- (void)toggleWithParams:(MTROnOffClusterToggleParams * _Nullable)params
           expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
               completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix =
        [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex, _endpoint,
                  (unsigned int) MTRClusterIDTypeOnOffID, (unsigned int) MTRCommandIDTypeClusterOnOffCommandToggleID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                OnOff::Commands::Toggle::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)offWithEffectWithParams:(MTROnOffClusterOffWithEffectParams *)params
                 expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
          expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                     completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix =
        [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex, _endpoint,
                  (unsigned int) MTRClusterIDTypeOnOffID, (unsigned int) MTRCommandIDTypeClusterOnOffCommandOffWithEffectID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                OnOff::Commands::OffWithEffect::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.effectIdentifier = static_cast<std::remove_reference_t<decltype(request.effectIdentifier)>>(
                    params.effectIdentifier.unsignedCharValue);
                request.effectVariant = params.effectVariant.unsignedCharValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)onWithRecallGlobalSceneWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                            expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                       completion:(MTRStatusCompletion)completion
{
    [self onWithRecallGlobalSceneWithParams:nil
                             expectedValues:expectedValues
                      expectedValueInterval:expectedValueIntervalMs
                                 completion:completion];
}
- (void)onWithRecallGlobalSceneWithParams:(MTROnOffClusterOnWithRecallGlobalSceneParams * _Nullable)params
                           expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                               completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeOnOffID,
                                     (unsigned int) MTRCommandIDTypeClusterOnOffCommandOnWithRecallGlobalSceneID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                OnOff::Commands::OnWithRecallGlobalScene::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)onWithTimedOffWithParams:(MTROnOffClusterOnWithTimedOffParams *)params
                  expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
           expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                      completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix =
        [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex, _endpoint,
                  (unsigned int) MTRClusterIDTypeOnOffID, (unsigned int) MTRCommandIDTypeClusterOnOffCommandOnWithTimedOffID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                OnOff::Commands::OnWithTimedOff::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.onOffControl
                    = static_cast<std::remove_reference_t<decltype(request.onOffControl)>>(params.onOffControl.unsignedCharValue);
                request.onTime = params.onTime.unsignedShortValue;
                request.offWaitTime = params.offWaitTime.unsignedShortValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (NSDictionary<NSString *, id> *)readAttributeOnOffWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeOnOffID)
                                        attributeID:@(MTRAttributeIDTypeClusterOnOffAttributeOnOffID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeGlobalSceneControlWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeOnOffID)
                                        attributeID:@(MTRAttributeIDTypeClusterOnOffAttributeGlobalSceneControlID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeOnTimeWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeOnOffID)
                                        attributeID:@(MTRAttributeIDTypeClusterOnOffAttributeOnTimeID)
                                             params:params];
}

- (void)writeAttributeOnTimeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeOnTimeWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeOnTimeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                               params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeOnOffID)
                                  attributeID:@(MTRAttributeIDTypeClusterOnOffAttributeOnTimeID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeOffWaitTimeWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeOnOffID)
                                        attributeID:@(MTRAttributeIDTypeClusterOnOffAttributeOffWaitTimeID)
                                             params:params];
}

- (void)writeAttributeOffWaitTimeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                     expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeOffWaitTimeWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeOffWaitTimeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                     expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                    params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeOnOffID)
                                  attributeID:@(MTRAttributeIDTypeClusterOnOffAttributeOffWaitTimeID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeStartUpOnOffWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeOnOffID)
                                        attributeID:@(MTRAttributeIDTypeClusterOnOffAttributeStartUpOnOffID)
                                             params:params];
}

- (void)writeAttributeStartUpOnOffWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeStartUpOnOffWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeStartUpOnOffWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                     params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeOnOffID)
                                  attributeID:@(MTRAttributeIDTypeClusterOnOffAttributeStartUpOnOffID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeOnOffID)
                                        attributeID:@(MTRAttributeIDTypeClusterOnOffAttributeGeneratedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeOnOffID)
                                        attributeID:@(MTRAttributeIDTypeClusterOnOffAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeOnOffID)
                                        attributeID:@(MTRAttributeIDTypeClusterOnOffAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeOnOffID)
                                        attributeID:@(MTRAttributeIDTypeClusterOnOffAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeOnOffID)
                                        attributeID:@(MTRAttributeIDTypeClusterOnOffAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterOnOff (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

- (void)offWithParams:(MTROnOffClusterOffParams * _Nullable)params
           expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
    expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
        completionHandler:(MTRStatusCompletion)completionHandler
{
    [self offWithParams:params
               expectedValues:expectedDataValueDictionaries
        expectedValueInterval:expectedValueIntervalMs
                   completion:completionHandler];
}
- (void)offWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
            completionHandler:(MTRStatusCompletion)completionHandler
{
    [self offWithParams:nil
               expectedValues:expectedValues
        expectedValueInterval:expectedValueIntervalMs
            completionHandler:completionHandler];
}
- (void)onWithParams:(MTROnOffClusterOnParams * _Nullable)params
           expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
    expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
        completionHandler:(MTRStatusCompletion)completionHandler
{
    [self onWithParams:params
               expectedValues:expectedDataValueDictionaries
        expectedValueInterval:expectedValueIntervalMs
                   completion:completionHandler];
}
- (void)onWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
       expectedValueInterval:(NSNumber *)expectedValueIntervalMs
           completionHandler:(MTRStatusCompletion)completionHandler
{
    [self onWithParams:nil
               expectedValues:expectedValues
        expectedValueInterval:expectedValueIntervalMs
            completionHandler:completionHandler];
}
- (void)toggleWithParams:(MTROnOffClusterToggleParams * _Nullable)params
           expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
    expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
        completionHandler:(MTRStatusCompletion)completionHandler
{
    [self toggleWithParams:params
               expectedValues:expectedDataValueDictionaries
        expectedValueInterval:expectedValueIntervalMs
                   completion:completionHandler];
}
- (void)toggleWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
           expectedValueInterval:(NSNumber *)expectedValueIntervalMs
               completionHandler:(MTRStatusCompletion)completionHandler
{
    [self toggleWithParams:nil
               expectedValues:expectedValues
        expectedValueInterval:expectedValueIntervalMs
            completionHandler:completionHandler];
}
- (void)offWithEffectWithParams:(MTROnOffClusterOffWithEffectParams *)params
                 expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
          expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
              completionHandler:(MTRStatusCompletion)completionHandler
{
    [self offWithEffectWithParams:params
                   expectedValues:expectedDataValueDictionaries
            expectedValueInterval:expectedValueIntervalMs
                       completion:completionHandler];
}
- (void)onWithRecallGlobalSceneWithParams:(MTROnOffClusterOnWithRecallGlobalSceneParams * _Nullable)params
                           expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
                    expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                        completionHandler:(MTRStatusCompletion)completionHandler
{
    [self onWithRecallGlobalSceneWithParams:params
                             expectedValues:expectedDataValueDictionaries
                      expectedValueInterval:expectedValueIntervalMs
                                 completion:completionHandler];
}
- (void)onWithRecallGlobalSceneWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                            expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                completionHandler:(MTRStatusCompletion)completionHandler
{
    [self onWithRecallGlobalSceneWithParams:nil
                             expectedValues:expectedValues
                      expectedValueInterval:expectedValueIntervalMs
                          completionHandler:completionHandler];
}
- (void)onWithTimedOffWithParams:(MTROnOffClusterOnWithTimedOffParams *)params
                  expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
           expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
               completionHandler:(MTRStatusCompletion)completionHandler
{
    [self onWithTimedOffWithParams:params
                    expectedValues:expectedDataValueDictionaries
             expectedValueInterval:expectedValueIntervalMs
                        completion:completionHandler];
}
@end

@implementation MTRClusterOnOffSwitchConfiguration

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (NSDictionary<NSString *, id> *)readAttributeSwitchTypeWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeOnOffSwitchConfigurationID)
                                        attributeID:@(MTRAttributeIDTypeClusterOnOffSwitchConfigurationAttributeSwitchTypeID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeSwitchActionsWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeOnOffSwitchConfigurationID)
                                        attributeID:@(MTRAttributeIDTypeClusterOnOffSwitchConfigurationAttributeSwitchActionsID)
                                             params:params];
}

- (void)writeAttributeSwitchActionsWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                       expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeSwitchActionsWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeSwitchActionsWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                       expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                      params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeOnOffSwitchConfigurationID)
                                  attributeID:@(MTRAttributeIDTypeClusterOnOffSwitchConfigurationAttributeSwitchActionsID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeOnOffSwitchConfigurationID)
                                     attributeID:@(MTRAttributeIDTypeClusterOnOffSwitchConfigurationAttributeGeneratedCommandListID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeOnOffSwitchConfigurationID)
                                     attributeID:@(MTRAttributeIDTypeClusterOnOffSwitchConfigurationAttributeAcceptedCommandListID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeOnOffSwitchConfigurationID)
                                        attributeID:@(MTRAttributeIDTypeClusterOnOffSwitchConfigurationAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeOnOffSwitchConfigurationID)
                                        attributeID:@(MTRAttributeIDTypeClusterOnOffSwitchConfigurationAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeOnOffSwitchConfigurationID)
                                        attributeID:@(MTRAttributeIDTypeClusterOnOffSwitchConfigurationAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterOnOffSwitchConfiguration (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

@end

@implementation MTRClusterLevelControl

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (void)moveToLevelWithParams:(MTRLevelControlClusterMoveToLevelParams *)params
               expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                   completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeLevelControlID,
                                     (unsigned int) MTRCommandIDTypeClusterLevelControlCommandMoveToLevelID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                LevelControl::Commands::MoveToLevel::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.level = params.level.unsignedCharValue;
                if (params.transitionTime == nil) {
                    request.transitionTime.SetNull();
                } else {
                    auto & nonNullValue_0 = request.transitionTime.SetNonNull();
                    nonNullValue_0 = params.transitionTime.unsignedShortValue;
                }
                request.optionsMask
                    = static_cast<std::remove_reference_t<decltype(request.optionsMask)>>(params.optionsMask.unsignedCharValue);
                request.optionsOverride = static_cast<std::remove_reference_t<decltype(request.optionsOverride)>>(
                    params.optionsOverride.unsignedCharValue);

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)moveWithParams:(MTRLevelControlClusterMoveParams *)params
           expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
               completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix =
        [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex, _endpoint,
                  (unsigned int) MTRClusterIDTypeLevelControlID, (unsigned int) MTRCommandIDTypeClusterLevelControlCommandMoveID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                LevelControl::Commands::Move::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.moveMode
                    = static_cast<std::remove_reference_t<decltype(request.moveMode)>>(params.moveMode.unsignedCharValue);
                if (params.rate == nil) {
                    request.rate.SetNull();
                } else {
                    auto & nonNullValue_0 = request.rate.SetNonNull();
                    nonNullValue_0 = params.rate.unsignedCharValue;
                }
                request.optionsMask
                    = static_cast<std::remove_reference_t<decltype(request.optionsMask)>>(params.optionsMask.unsignedCharValue);
                request.optionsOverride = static_cast<std::remove_reference_t<decltype(request.optionsOverride)>>(
                    params.optionsOverride.unsignedCharValue);

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)stepWithParams:(MTRLevelControlClusterStepParams *)params
           expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
               completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix =
        [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex, _endpoint,
                  (unsigned int) MTRClusterIDTypeLevelControlID, (unsigned int) MTRCommandIDTypeClusterLevelControlCommandStepID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                LevelControl::Commands::Step::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.stepMode
                    = static_cast<std::remove_reference_t<decltype(request.stepMode)>>(params.stepMode.unsignedCharValue);
                request.stepSize = params.stepSize.unsignedCharValue;
                if (params.transitionTime == nil) {
                    request.transitionTime.SetNull();
                } else {
                    auto & nonNullValue_0 = request.transitionTime.SetNonNull();
                    nonNullValue_0 = params.transitionTime.unsignedShortValue;
                }
                request.optionsMask
                    = static_cast<std::remove_reference_t<decltype(request.optionsMask)>>(params.optionsMask.unsignedCharValue);
                request.optionsOverride = static_cast<std::remove_reference_t<decltype(request.optionsOverride)>>(
                    params.optionsOverride.unsignedCharValue);

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)stopWithParams:(MTRLevelControlClusterStopParams *)params
           expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
               completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix =
        [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex, _endpoint,
                  (unsigned int) MTRClusterIDTypeLevelControlID, (unsigned int) MTRCommandIDTypeClusterLevelControlCommandStopID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                LevelControl::Commands::Stop::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.optionsMask
                    = static_cast<std::remove_reference_t<decltype(request.optionsMask)>>(params.optionsMask.unsignedCharValue);
                request.optionsOverride = static_cast<std::remove_reference_t<decltype(request.optionsOverride)>>(
                    params.optionsOverride.unsignedCharValue);

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)moveToLevelWithOnOffWithParams:(MTRLevelControlClusterMoveToLevelWithOnOffParams *)params
                        expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                 expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                            completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeLevelControlID,
                                     (unsigned int) MTRCommandIDTypeClusterLevelControlCommandMoveToLevelWithOnOffID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                LevelControl::Commands::MoveToLevelWithOnOff::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.level = params.level.unsignedCharValue;
                if (params.transitionTime == nil) {
                    request.transitionTime.SetNull();
                } else {
                    auto & nonNullValue_0 = request.transitionTime.SetNonNull();
                    nonNullValue_0 = params.transitionTime.unsignedShortValue;
                }
                request.optionsMask
                    = static_cast<std::remove_reference_t<decltype(request.optionsMask)>>(params.optionsMask.unsignedCharValue);
                request.optionsOverride = static_cast<std::remove_reference_t<decltype(request.optionsOverride)>>(
                    params.optionsOverride.unsignedCharValue);

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)moveWithOnOffWithParams:(MTRLevelControlClusterMoveWithOnOffParams *)params
                 expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
          expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                     completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeLevelControlID,
                                     (unsigned int) MTRCommandIDTypeClusterLevelControlCommandMoveWithOnOffID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                LevelControl::Commands::MoveWithOnOff::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.moveMode
                    = static_cast<std::remove_reference_t<decltype(request.moveMode)>>(params.moveMode.unsignedCharValue);
                if (params.rate == nil) {
                    request.rate.SetNull();
                } else {
                    auto & nonNullValue_0 = request.rate.SetNonNull();
                    nonNullValue_0 = params.rate.unsignedCharValue;
                }
                request.optionsMask
                    = static_cast<std::remove_reference_t<decltype(request.optionsMask)>>(params.optionsMask.unsignedCharValue);
                request.optionsOverride = static_cast<std::remove_reference_t<decltype(request.optionsOverride)>>(
                    params.optionsOverride.unsignedCharValue);

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)stepWithOnOffWithParams:(MTRLevelControlClusterStepWithOnOffParams *)params
                 expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
          expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                     completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeLevelControlID,
                                     (unsigned int) MTRCommandIDTypeClusterLevelControlCommandStepWithOnOffID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                LevelControl::Commands::StepWithOnOff::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.stepMode
                    = static_cast<std::remove_reference_t<decltype(request.stepMode)>>(params.stepMode.unsignedCharValue);
                request.stepSize = params.stepSize.unsignedCharValue;
                if (params.transitionTime == nil) {
                    request.transitionTime.SetNull();
                } else {
                    auto & nonNullValue_0 = request.transitionTime.SetNonNull();
                    nonNullValue_0 = params.transitionTime.unsignedShortValue;
                }
                request.optionsMask
                    = static_cast<std::remove_reference_t<decltype(request.optionsMask)>>(params.optionsMask.unsignedCharValue);
                request.optionsOverride = static_cast<std::remove_reference_t<decltype(request.optionsOverride)>>(
                    params.optionsOverride.unsignedCharValue);

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)stopWithOnOffWithParams:(MTRLevelControlClusterStopWithOnOffParams *)params
                 expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
          expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                     completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeLevelControlID,
                                     (unsigned int) MTRCommandIDTypeClusterLevelControlCommandStopWithOnOffID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                LevelControl::Commands::StopWithOnOff::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.optionsMask
                    = static_cast<std::remove_reference_t<decltype(request.optionsMask)>>(params.optionsMask.unsignedCharValue);
                request.optionsOverride = static_cast<std::remove_reference_t<decltype(request.optionsOverride)>>(
                    params.optionsOverride.unsignedCharValue);

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)moveToClosestFrequencyWithParams:(MTRLevelControlClusterMoveToClosestFrequencyParams *)params
                          expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                   expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                              completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeLevelControlID,
                                     (unsigned int) MTRCommandIDTypeClusterLevelControlCommandMoveToClosestFrequencyID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                LevelControl::Commands::MoveToClosestFrequency::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.frequency = params.frequency.unsignedShortValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (NSDictionary<NSString *, id> *)readAttributeCurrentLevelWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeLevelControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterLevelControlAttributeCurrentLevelID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeRemainingTimeWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeLevelControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterLevelControlAttributeRemainingTimeID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeMinLevelWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeLevelControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterLevelControlAttributeMinLevelID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeMaxLevelWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeLevelControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterLevelControlAttributeMaxLevelID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeCurrentFrequencyWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeLevelControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterLevelControlAttributeCurrentFrequencyID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeMinFrequencyWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeLevelControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterLevelControlAttributeMinFrequencyID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeMaxFrequencyWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeLevelControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterLevelControlAttributeMaxFrequencyID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeOptionsWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeLevelControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterLevelControlAttributeOptionsID)
                                             params:params];
}

- (void)writeAttributeOptionsWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                 expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeOptionsWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeOptionsWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                 expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeLevelControlID)
                                  attributeID:@(MTRAttributeIDTypeClusterLevelControlAttributeOptionsID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeOnOffTransitionTimeWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeLevelControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterLevelControlAttributeOnOffTransitionTimeID)
                                             params:params];
}

- (void)writeAttributeOnOffTransitionTimeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                             expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeOnOffTransitionTimeWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeOnOffTransitionTimeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                             expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                            params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeLevelControlID)
                                  attributeID:@(MTRAttributeIDTypeClusterLevelControlAttributeOnOffTransitionTimeID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeOnLevelWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeLevelControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterLevelControlAttributeOnLevelID)
                                             params:params];
}

- (void)writeAttributeOnLevelWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                 expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeOnLevelWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeOnLevelWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                 expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeLevelControlID)
                                  attributeID:@(MTRAttributeIDTypeClusterLevelControlAttributeOnLevelID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeOnTransitionTimeWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeLevelControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterLevelControlAttributeOnTransitionTimeID)
                                             params:params];
}

- (void)writeAttributeOnTransitionTimeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                          expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeOnTransitionTimeWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeOnTransitionTimeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                          expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                         params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeLevelControlID)
                                  attributeID:@(MTRAttributeIDTypeClusterLevelControlAttributeOnTransitionTimeID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeOffTransitionTimeWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeLevelControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterLevelControlAttributeOffTransitionTimeID)
                                             params:params];
}

- (void)writeAttributeOffTransitionTimeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                           expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeOffTransitionTimeWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeOffTransitionTimeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                           expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                          params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeLevelControlID)
                                  attributeID:@(MTRAttributeIDTypeClusterLevelControlAttributeOffTransitionTimeID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeDefaultMoveRateWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeLevelControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterLevelControlAttributeDefaultMoveRateID)
                                             params:params];
}

- (void)writeAttributeDefaultMoveRateWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                         expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeDefaultMoveRateWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeDefaultMoveRateWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                         expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                        params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeLevelControlID)
                                  attributeID:@(MTRAttributeIDTypeClusterLevelControlAttributeDefaultMoveRateID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeStartUpCurrentLevelWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeLevelControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterLevelControlAttributeStartUpCurrentLevelID)
                                             params:params];
}

- (void)writeAttributeStartUpCurrentLevelWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                             expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeStartUpCurrentLevelWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeStartUpCurrentLevelWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                             expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                            params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeLevelControlID)
                                  attributeID:@(MTRAttributeIDTypeClusterLevelControlAttributeStartUpCurrentLevelID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeLevelControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterLevelControlAttributeGeneratedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeLevelControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterLevelControlAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeLevelControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterLevelControlAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeLevelControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterLevelControlAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeLevelControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterLevelControlAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterLevelControl (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

- (void)moveToLevelWithParams:(MTRLevelControlClusterMoveToLevelParams *)params
               expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
        expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
            completionHandler:(MTRStatusCompletion)completionHandler
{
    [self moveToLevelWithParams:params
                 expectedValues:expectedDataValueDictionaries
          expectedValueInterval:expectedValueIntervalMs
                     completion:completionHandler];
}
- (void)moveWithParams:(MTRLevelControlClusterMoveParams *)params
           expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
    expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
        completionHandler:(MTRStatusCompletion)completionHandler
{
    [self moveWithParams:params
               expectedValues:expectedDataValueDictionaries
        expectedValueInterval:expectedValueIntervalMs
                   completion:completionHandler];
}
- (void)stepWithParams:(MTRLevelControlClusterStepParams *)params
           expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
    expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
        completionHandler:(MTRStatusCompletion)completionHandler
{
    [self stepWithParams:params
               expectedValues:expectedDataValueDictionaries
        expectedValueInterval:expectedValueIntervalMs
                   completion:completionHandler];
}
- (void)stopWithParams:(MTRLevelControlClusterStopParams *)params
           expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
    expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
        completionHandler:(MTRStatusCompletion)completionHandler
{
    [self stopWithParams:params
               expectedValues:expectedDataValueDictionaries
        expectedValueInterval:expectedValueIntervalMs
                   completion:completionHandler];
}
- (void)moveToLevelWithOnOffWithParams:(MTRLevelControlClusterMoveToLevelWithOnOffParams *)params
                        expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
                 expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                     completionHandler:(MTRStatusCompletion)completionHandler
{
    [self moveToLevelWithOnOffWithParams:params
                          expectedValues:expectedDataValueDictionaries
                   expectedValueInterval:expectedValueIntervalMs
                              completion:completionHandler];
}
- (void)moveWithOnOffWithParams:(MTRLevelControlClusterMoveWithOnOffParams *)params
                 expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
          expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
              completionHandler:(MTRStatusCompletion)completionHandler
{
    [self moveWithOnOffWithParams:params
                   expectedValues:expectedDataValueDictionaries
            expectedValueInterval:expectedValueIntervalMs
                       completion:completionHandler];
}
- (void)stepWithOnOffWithParams:(MTRLevelControlClusterStepWithOnOffParams *)params
                 expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
          expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
              completionHandler:(MTRStatusCompletion)completionHandler
{
    [self stepWithOnOffWithParams:params
                   expectedValues:expectedDataValueDictionaries
            expectedValueInterval:expectedValueIntervalMs
                       completion:completionHandler];
}
- (void)stopWithOnOffWithParams:(MTRLevelControlClusterStopWithOnOffParams *)params
                 expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
          expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
              completionHandler:(MTRStatusCompletion)completionHandler
{
    [self stopWithOnOffWithParams:params
                   expectedValues:expectedDataValueDictionaries
            expectedValueInterval:expectedValueIntervalMs
                       completion:completionHandler];
}
- (void)moveToClosestFrequencyWithParams:(MTRLevelControlClusterMoveToClosestFrequencyParams *)params
                          expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
                   expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                       completionHandler:(MTRStatusCompletion)completionHandler
{
    [self moveToClosestFrequencyWithParams:params
                            expectedValues:expectedDataValueDictionaries
                     expectedValueInterval:expectedValueIntervalMs
                                completion:completionHandler];
}
@end

@implementation MTRClusterBinaryInputBasic

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (NSDictionary<NSString *, id> *)readAttributeActiveTextWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBinaryInputBasicID)
                                        attributeID:@(MTRAttributeIDTypeClusterBinaryInputBasicAttributeActiveTextID)
                                             params:params];
}

- (void)writeAttributeActiveTextWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeActiveTextWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeActiveTextWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                   params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeBinaryInputBasicID)
                                  attributeID:@(MTRAttributeIDTypeClusterBinaryInputBasicAttributeActiveTextID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeDescriptionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBinaryInputBasicID)
                                        attributeID:@(MTRAttributeIDTypeClusterBinaryInputBasicAttributeDescriptionID)
                                             params:params];
}

- (void)writeAttributeDescriptionWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                     expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeDescriptionWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeDescriptionWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                     expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                    params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeBinaryInputBasicID)
                                  attributeID:@(MTRAttributeIDTypeClusterBinaryInputBasicAttributeDescriptionID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeInactiveTextWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBinaryInputBasicID)
                                        attributeID:@(MTRAttributeIDTypeClusterBinaryInputBasicAttributeInactiveTextID)
                                             params:params];
}

- (void)writeAttributeInactiveTextWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeInactiveTextWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeInactiveTextWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                     params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeBinaryInputBasicID)
                                  attributeID:@(MTRAttributeIDTypeClusterBinaryInputBasicAttributeInactiveTextID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeOutOfServiceWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBinaryInputBasicID)
                                        attributeID:@(MTRAttributeIDTypeClusterBinaryInputBasicAttributeOutOfServiceID)
                                             params:params];
}

- (void)writeAttributeOutOfServiceWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeOutOfServiceWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeOutOfServiceWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                     params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeBinaryInputBasicID)
                                  attributeID:@(MTRAttributeIDTypeClusterBinaryInputBasicAttributeOutOfServiceID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributePolarityWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBinaryInputBasicID)
                                        attributeID:@(MTRAttributeIDTypeClusterBinaryInputBasicAttributePolarityID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributePresentValueWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBinaryInputBasicID)
                                        attributeID:@(MTRAttributeIDTypeClusterBinaryInputBasicAttributePresentValueID)
                                             params:params];
}

- (void)writeAttributePresentValueWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributePresentValueWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributePresentValueWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                     params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeBinaryInputBasicID)
                                  attributeID:@(MTRAttributeIDTypeClusterBinaryInputBasicAttributePresentValueID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeReliabilityWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBinaryInputBasicID)
                                        attributeID:@(MTRAttributeIDTypeClusterBinaryInputBasicAttributeReliabilityID)
                                             params:params];
}

- (void)writeAttributeReliabilityWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                     expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeReliabilityWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeReliabilityWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                     expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                    params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeBinaryInputBasicID)
                                  attributeID:@(MTRAttributeIDTypeClusterBinaryInputBasicAttributeReliabilityID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeStatusFlagsWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBinaryInputBasicID)
                                        attributeID:@(MTRAttributeIDTypeClusterBinaryInputBasicAttributeStatusFlagsID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeApplicationTypeWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBinaryInputBasicID)
                                        attributeID:@(MTRAttributeIDTypeClusterBinaryInputBasicAttributeApplicationTypeID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBinaryInputBasicID)
                                        attributeID:@(MTRAttributeIDTypeClusterBinaryInputBasicAttributeGeneratedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBinaryInputBasicID)
                                        attributeID:@(MTRAttributeIDTypeClusterBinaryInputBasicAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBinaryInputBasicID)
                                        attributeID:@(MTRAttributeIDTypeClusterBinaryInputBasicAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBinaryInputBasicID)
                                        attributeID:@(MTRAttributeIDTypeClusterBinaryInputBasicAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBinaryInputBasicID)
                                        attributeID:@(MTRAttributeIDTypeClusterBinaryInputBasicAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterBinaryInputBasic (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

@end

@implementation MTRClusterDescriptor

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (NSDictionary<NSString *, id> *)readAttributeDeviceTypeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeDescriptorID)
                                        attributeID:@(MTRAttributeIDTypeClusterDescriptorAttributeDeviceTypeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeServerListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeDescriptorID)
                                        attributeID:@(MTRAttributeIDTypeClusterDescriptorAttributeServerListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClientListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeDescriptorID)
                                        attributeID:@(MTRAttributeIDTypeClusterDescriptorAttributeClientListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributePartsListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeDescriptorID)
                                        attributeID:@(MTRAttributeIDTypeClusterDescriptorAttributePartsListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeDescriptorID)
                                        attributeID:@(MTRAttributeIDTypeClusterDescriptorAttributeGeneratedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeDescriptorID)
                                        attributeID:@(MTRAttributeIDTypeClusterDescriptorAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeDescriptorID)
                                        attributeID:@(MTRAttributeIDTypeClusterDescriptorAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeDescriptorID)
                                        attributeID:@(MTRAttributeIDTypeClusterDescriptorAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeDescriptorID)
                                        attributeID:@(MTRAttributeIDTypeClusterDescriptorAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterDescriptor (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

- (NSDictionary<NSString *, id> *)readAttributeDeviceListWithParams:(MTRReadParams * _Nullable)params
{
    return [self readAttributeDeviceTypeListWithParams:params];
}
@end

@implementation MTRClusterBinding

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (NSDictionary<NSString *, id> *)readAttributeBindingWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBindingID)
                                        attributeID:@(MTRAttributeIDTypeClusterBindingAttributeBindingID)
                                             params:params];
}

- (void)writeAttributeBindingWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                 expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeBindingWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeBindingWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                 expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeBindingID)
                                  attributeID:@(MTRAttributeIDTypeClusterBindingAttributeBindingID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBindingID)
                                        attributeID:@(MTRAttributeIDTypeClusterBindingAttributeGeneratedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBindingID)
                                        attributeID:@(MTRAttributeIDTypeClusterBindingAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBindingID)
                                        attributeID:@(MTRAttributeIDTypeClusterBindingAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBindingID)
                                        attributeID:@(MTRAttributeIDTypeClusterBindingAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBindingID)
                                        attributeID:@(MTRAttributeIDTypeClusterBindingAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterBinding (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

@end

@implementation MTRClusterAccessControl

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (NSDictionary<NSString *, id> *)readAttributeACLWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeAccessControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterAccessControlAttributeACLID)
                                             params:params];
}

- (void)writeAttributeACLWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
             expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeACLWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeACLWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
             expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                            params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeAccessControlID)
                                  attributeID:@(MTRAttributeIDTypeClusterAccessControlAttributeACLID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeExtensionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeAccessControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterAccessControlAttributeExtensionID)
                                             params:params];
}

- (void)writeAttributeExtensionWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                   expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeExtensionWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeExtensionWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                   expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                  params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeAccessControlID)
                                  attributeID:@(MTRAttributeIDTypeClusterAccessControlAttributeExtensionID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeSubjectsPerAccessControlEntryWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeAccessControlID)
                                     attributeID:@(MTRAttributeIDTypeClusterAccessControlAttributeSubjectsPerAccessControlEntryID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeTargetsPerAccessControlEntryWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeAccessControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterAccessControlAttributeTargetsPerAccessControlEntryID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAccessControlEntriesPerFabricWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeAccessControlID)
                                     attributeID:@(MTRAttributeIDTypeClusterAccessControlAttributeAccessControlEntriesPerFabricID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeAccessControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterAccessControlAttributeGeneratedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeAccessControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterAccessControlAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeAccessControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterAccessControlAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeAccessControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterAccessControlAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeAccessControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterAccessControlAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterAccessControl (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

- (NSDictionary<NSString *, id> *)readAttributeAclWithParams:(MTRReadParams * _Nullable)params
{
    return [self readAttributeACLWithParams:params];
}
- (void)writeAttributeAclWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
             expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeACLWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs];
}
- (void)writeAttributeAclWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
             expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                            params:(MTRWriteParams * _Nullable)params
{
    [self writeAttributeACLWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:params];
}
@end

@implementation MTRClusterActions

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (void)instantActionWithParams:(MTRActionsClusterInstantActionParams *)params
                 expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
          expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                     completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix =
        [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex, _endpoint,
                  (unsigned int) MTRClusterIDTypeActionsID, (unsigned int) MTRCommandIDTypeClusterActionsCommandInstantActionID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                Actions::Commands::InstantAction::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.actionID = params.actionID.unsignedShortValue;
                if (params.invokeID != nil) {
                    auto & definedValue_0 = request.invokeID.Emplace();
                    definedValue_0 = params.invokeID.unsignedIntValue;
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)instantActionWithTransitionWithParams:(MTRActionsClusterInstantActionWithTransitionParams *)params
                               expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                   completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeActionsID,
                                     (unsigned int) MTRCommandIDTypeClusterActionsCommandInstantActionWithTransitionID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                Actions::Commands::InstantActionWithTransition::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.actionID = params.actionID.unsignedShortValue;
                if (params.invokeID != nil) {
                    auto & definedValue_0 = request.invokeID.Emplace();
                    definedValue_0 = params.invokeID.unsignedIntValue;
                }
                request.transitionTime = params.transitionTime.unsignedShortValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)startActionWithParams:(MTRActionsClusterStartActionParams *)params
               expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                   completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix =
        [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex, _endpoint,
                  (unsigned int) MTRClusterIDTypeActionsID, (unsigned int) MTRCommandIDTypeClusterActionsCommandStartActionID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                Actions::Commands::StartAction::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.actionID = params.actionID.unsignedShortValue;
                if (params.invokeID != nil) {
                    auto & definedValue_0 = request.invokeID.Emplace();
                    definedValue_0 = params.invokeID.unsignedIntValue;
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)startActionWithDurationWithParams:(MTRActionsClusterStartActionWithDurationParams *)params
                           expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                               completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeActionsID,
                                     (unsigned int) MTRCommandIDTypeClusterActionsCommandStartActionWithDurationID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                Actions::Commands::StartActionWithDuration::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.actionID = params.actionID.unsignedShortValue;
                if (params.invokeID != nil) {
                    auto & definedValue_0 = request.invokeID.Emplace();
                    definedValue_0 = params.invokeID.unsignedIntValue;
                }
                request.duration = params.duration.unsignedIntValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)stopActionWithParams:(MTRActionsClusterStopActionParams *)params
              expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
       expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                  completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix =
        [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex, _endpoint,
                  (unsigned int) MTRClusterIDTypeActionsID, (unsigned int) MTRCommandIDTypeClusterActionsCommandStopActionID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                Actions::Commands::StopAction::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.actionID = params.actionID.unsignedShortValue;
                if (params.invokeID != nil) {
                    auto & definedValue_0 = request.invokeID.Emplace();
                    definedValue_0 = params.invokeID.unsignedIntValue;
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)pauseActionWithParams:(MTRActionsClusterPauseActionParams *)params
               expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                   completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix =
        [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex, _endpoint,
                  (unsigned int) MTRClusterIDTypeActionsID, (unsigned int) MTRCommandIDTypeClusterActionsCommandPauseActionID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                Actions::Commands::PauseAction::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.actionID = params.actionID.unsignedShortValue;
                if (params.invokeID != nil) {
                    auto & definedValue_0 = request.invokeID.Emplace();
                    definedValue_0 = params.invokeID.unsignedIntValue;
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)pauseActionWithDurationWithParams:(MTRActionsClusterPauseActionWithDurationParams *)params
                           expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                               completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeActionsID,
                                     (unsigned int) MTRCommandIDTypeClusterActionsCommandPauseActionWithDurationID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                Actions::Commands::PauseActionWithDuration::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.actionID = params.actionID.unsignedShortValue;
                if (params.invokeID != nil) {
                    auto & definedValue_0 = request.invokeID.Emplace();
                    definedValue_0 = params.invokeID.unsignedIntValue;
                }
                request.duration = params.duration.unsignedIntValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)resumeActionWithParams:(MTRActionsClusterResumeActionParams *)params
                expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
         expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                    completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix =
        [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex, _endpoint,
                  (unsigned int) MTRClusterIDTypeActionsID, (unsigned int) MTRCommandIDTypeClusterActionsCommandResumeActionID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                Actions::Commands::ResumeAction::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.actionID = params.actionID.unsignedShortValue;
                if (params.invokeID != nil) {
                    auto & definedValue_0 = request.invokeID.Emplace();
                    definedValue_0 = params.invokeID.unsignedIntValue;
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)enableActionWithParams:(MTRActionsClusterEnableActionParams *)params
                expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
         expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                    completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix =
        [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex, _endpoint,
                  (unsigned int) MTRClusterIDTypeActionsID, (unsigned int) MTRCommandIDTypeClusterActionsCommandEnableActionID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                Actions::Commands::EnableAction::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.actionID = params.actionID.unsignedShortValue;
                if (params.invokeID != nil) {
                    auto & definedValue_0 = request.invokeID.Emplace();
                    definedValue_0 = params.invokeID.unsignedIntValue;
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)enableActionWithDurationWithParams:(MTRActionsClusterEnableActionWithDurationParams *)params
                            expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                     expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeActionsID,
                                     (unsigned int) MTRCommandIDTypeClusterActionsCommandEnableActionWithDurationID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                Actions::Commands::EnableActionWithDuration::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.actionID = params.actionID.unsignedShortValue;
                if (params.invokeID != nil) {
                    auto & definedValue_0 = request.invokeID.Emplace();
                    definedValue_0 = params.invokeID.unsignedIntValue;
                }
                request.duration = params.duration.unsignedIntValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)disableActionWithParams:(MTRActionsClusterDisableActionParams *)params
                 expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
          expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                     completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix =
        [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex, _endpoint,
                  (unsigned int) MTRClusterIDTypeActionsID, (unsigned int) MTRCommandIDTypeClusterActionsCommandDisableActionID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                Actions::Commands::DisableAction::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.actionID = params.actionID.unsignedShortValue;
                if (params.invokeID != nil) {
                    auto & definedValue_0 = request.invokeID.Emplace();
                    definedValue_0 = params.invokeID.unsignedIntValue;
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)disableActionWithDurationWithParams:(MTRActionsClusterDisableActionWithDurationParams *)params
                             expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                 completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeActionsID,
                                     (unsigned int) MTRCommandIDTypeClusterActionsCommandDisableActionWithDurationID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                Actions::Commands::DisableActionWithDuration::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.actionID = params.actionID.unsignedShortValue;
                if (params.invokeID != nil) {
                    auto & definedValue_0 = request.invokeID.Emplace();
                    definedValue_0 = params.invokeID.unsignedIntValue;
                }
                request.duration = params.duration.unsignedIntValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (NSDictionary<NSString *, id> *)readAttributeActionListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeActionsID)
                                        attributeID:@(MTRAttributeIDTypeClusterActionsAttributeActionListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeEndpointListsWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeActionsID)
                                        attributeID:@(MTRAttributeIDTypeClusterActionsAttributeEndpointListsID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeSetupURLWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeActionsID)
                                        attributeID:@(MTRAttributeIDTypeClusterActionsAttributeSetupURLID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeActionsID)
                                        attributeID:@(MTRAttributeIDTypeClusterActionsAttributeGeneratedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeActionsID)
                                        attributeID:@(MTRAttributeIDTypeClusterActionsAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeActionsID)
                                        attributeID:@(MTRAttributeIDTypeClusterActionsAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeActionsID)
                                        attributeID:@(MTRAttributeIDTypeClusterActionsAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeActionsID)
                                        attributeID:@(MTRAttributeIDTypeClusterActionsAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterActions (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

- (void)instantActionWithParams:(MTRActionsClusterInstantActionParams *)params
                 expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
          expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
              completionHandler:(MTRStatusCompletion)completionHandler
{
    [self instantActionWithParams:params
                   expectedValues:expectedDataValueDictionaries
            expectedValueInterval:expectedValueIntervalMs
                       completion:completionHandler];
}
- (void)instantActionWithTransitionWithParams:(MTRActionsClusterInstantActionWithTransitionParams *)params
                               expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
                        expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                            completionHandler:(MTRStatusCompletion)completionHandler
{
    [self instantActionWithTransitionWithParams:params
                                 expectedValues:expectedDataValueDictionaries
                          expectedValueInterval:expectedValueIntervalMs
                                     completion:completionHandler];
}
- (void)startActionWithParams:(MTRActionsClusterStartActionParams *)params
               expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
        expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
            completionHandler:(MTRStatusCompletion)completionHandler
{
    [self startActionWithParams:params
                 expectedValues:expectedDataValueDictionaries
          expectedValueInterval:expectedValueIntervalMs
                     completion:completionHandler];
}
- (void)startActionWithDurationWithParams:(MTRActionsClusterStartActionWithDurationParams *)params
                           expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
                    expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                        completionHandler:(MTRStatusCompletion)completionHandler
{
    [self startActionWithDurationWithParams:params
                             expectedValues:expectedDataValueDictionaries
                      expectedValueInterval:expectedValueIntervalMs
                                 completion:completionHandler];
}
- (void)stopActionWithParams:(MTRActionsClusterStopActionParams *)params
              expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
       expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
           completionHandler:(MTRStatusCompletion)completionHandler
{
    [self stopActionWithParams:params
                expectedValues:expectedDataValueDictionaries
         expectedValueInterval:expectedValueIntervalMs
                    completion:completionHandler];
}
- (void)pauseActionWithParams:(MTRActionsClusterPauseActionParams *)params
               expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
        expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
            completionHandler:(MTRStatusCompletion)completionHandler
{
    [self pauseActionWithParams:params
                 expectedValues:expectedDataValueDictionaries
          expectedValueInterval:expectedValueIntervalMs
                     completion:completionHandler];
}
- (void)pauseActionWithDurationWithParams:(MTRActionsClusterPauseActionWithDurationParams *)params
                           expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
                    expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                        completionHandler:(MTRStatusCompletion)completionHandler
{
    [self pauseActionWithDurationWithParams:params
                             expectedValues:expectedDataValueDictionaries
                      expectedValueInterval:expectedValueIntervalMs
                                 completion:completionHandler];
}
- (void)resumeActionWithParams:(MTRActionsClusterResumeActionParams *)params
                expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
         expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
             completionHandler:(MTRStatusCompletion)completionHandler
{
    [self resumeActionWithParams:params
                  expectedValues:expectedDataValueDictionaries
           expectedValueInterval:expectedValueIntervalMs
                      completion:completionHandler];
}
- (void)enableActionWithParams:(MTRActionsClusterEnableActionParams *)params
                expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
         expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
             completionHandler:(MTRStatusCompletion)completionHandler
{
    [self enableActionWithParams:params
                  expectedValues:expectedDataValueDictionaries
           expectedValueInterval:expectedValueIntervalMs
                      completion:completionHandler];
}
- (void)enableActionWithDurationWithParams:(MTRActionsClusterEnableActionWithDurationParams *)params
                            expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
                     expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                         completionHandler:(MTRStatusCompletion)completionHandler
{
    [self enableActionWithDurationWithParams:params
                              expectedValues:expectedDataValueDictionaries
                       expectedValueInterval:expectedValueIntervalMs
                                  completion:completionHandler];
}
- (void)disableActionWithParams:(MTRActionsClusterDisableActionParams *)params
                 expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
          expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
              completionHandler:(MTRStatusCompletion)completionHandler
{
    [self disableActionWithParams:params
                   expectedValues:expectedDataValueDictionaries
            expectedValueInterval:expectedValueIntervalMs
                       completion:completionHandler];
}
- (void)disableActionWithDurationWithParams:(MTRActionsClusterDisableActionWithDurationParams *)params
                             expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
                      expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                          completionHandler:(MTRStatusCompletion)completionHandler
{
    [self disableActionWithDurationWithParams:params
                               expectedValues:expectedDataValueDictionaries
                        expectedValueInterval:expectedValueIntervalMs
                                   completion:completionHandler];
}
@end

@implementation MTRClusterBasicInformation

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (void)mfgSpecificPingWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                               completion:(MTRStatusCompletion)completion
{
    [self mfgSpecificPingWithParams:nil
                     expectedValues:expectedValues
              expectedValueInterval:expectedValueIntervalMs
                         completion:completion];
}
- (void)mfgSpecificPingWithParams:(MTRBasicClusterMfgSpecificPingParams * _Nullable)params
                   expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
            expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                       completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) 0x00000028, (unsigned int) 0x10020000];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                BasicInformation::Commands::MfgSpecificPing::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (NSDictionary<NSString *, id> *)readAttributeDataModelRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBasicInformationID)
                                        attributeID:@(MTRAttributeIDTypeClusterBasicInformationAttributeDataModelRevisionID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeVendorNameWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBasicInformationID)
                                        attributeID:@(MTRAttributeIDTypeClusterBasicInformationAttributeVendorNameID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeVendorIDWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBasicInformationID)
                                        attributeID:@(MTRAttributeIDTypeClusterBasicInformationAttributeVendorIDID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeProductNameWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBasicInformationID)
                                        attributeID:@(MTRAttributeIDTypeClusterBasicInformationAttributeProductNameID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeProductIDWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBasicInformationID)
                                        attributeID:@(MTRAttributeIDTypeClusterBasicInformationAttributeProductIDID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeNodeLabelWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBasicInformationID)
                                        attributeID:@(MTRAttributeIDTypeClusterBasicInformationAttributeNodeLabelID)
                                             params:params];
}

- (void)writeAttributeNodeLabelWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                   expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeNodeLabelWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeNodeLabelWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                   expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                  params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeBasicInformationID)
                                  attributeID:@(MTRAttributeIDTypeClusterBasicInformationAttributeNodeLabelID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeLocationWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBasicInformationID)
                                        attributeID:@(MTRAttributeIDTypeClusterBasicInformationAttributeLocationID)
                                             params:params];
}

- (void)writeAttributeLocationWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                  expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeLocationWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeLocationWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                  expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                 params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeBasicInformationID)
                                  attributeID:@(MTRAttributeIDTypeClusterBasicInformationAttributeLocationID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeHardwareVersionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBasicInformationID)
                                        attributeID:@(MTRAttributeIDTypeClusterBasicInformationAttributeHardwareVersionID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeHardwareVersionStringWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBasicInformationID)
                                        attributeID:@(MTRAttributeIDTypeClusterBasicInformationAttributeHardwareVersionStringID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeSoftwareVersionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBasicInformationID)
                                        attributeID:@(MTRAttributeIDTypeClusterBasicInformationAttributeSoftwareVersionID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeSoftwareVersionStringWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBasicInformationID)
                                        attributeID:@(MTRAttributeIDTypeClusterBasicInformationAttributeSoftwareVersionStringID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeManufacturingDateWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBasicInformationID)
                                        attributeID:@(MTRAttributeIDTypeClusterBasicInformationAttributeManufacturingDateID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributePartNumberWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBasicInformationID)
                                        attributeID:@(MTRAttributeIDTypeClusterBasicInformationAttributePartNumberID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeProductURLWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBasicInformationID)
                                        attributeID:@(MTRAttributeIDTypeClusterBasicInformationAttributeProductURLID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeProductLabelWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBasicInformationID)
                                        attributeID:@(MTRAttributeIDTypeClusterBasicInformationAttributeProductLabelID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeSerialNumberWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBasicInformationID)
                                        attributeID:@(MTRAttributeIDTypeClusterBasicInformationAttributeSerialNumberID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeLocalConfigDisabledWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBasicInformationID)
                                        attributeID:@(MTRAttributeIDTypeClusterBasicInformationAttributeLocalConfigDisabledID)
                                             params:params];
}

- (void)writeAttributeLocalConfigDisabledWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                             expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeLocalConfigDisabledWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeLocalConfigDisabledWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                             expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                            params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeBasicInformationID)
                                  attributeID:@(MTRAttributeIDTypeClusterBasicInformationAttributeLocalConfigDisabledID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeReachableWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBasicInformationID)
                                        attributeID:@(MTRAttributeIDTypeClusterBasicInformationAttributeReachableID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeUniqueIDWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBasicInformationID)
                                        attributeID:@(MTRAttributeIDTypeClusterBasicInformationAttributeUniqueIDID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeCapabilityMinimaWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBasicInformationID)
                                        attributeID:@(MTRAttributeIDTypeClusterBasicInformationAttributeCapabilityMinimaID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeProductAppearanceWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBasicInformationID)
                                        attributeID:@(MTRAttributeIDTypeClusterBasicInformationAttributeProductAppearanceID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBasicInformationID)
                                        attributeID:@(MTRAttributeIDTypeClusterBasicInformationAttributeGeneratedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBasicInformationID)
                                        attributeID:@(MTRAttributeIDTypeClusterBasicInformationAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBasicInformationID)
                                        attributeID:@(MTRAttributeIDTypeClusterBasicInformationAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBasicInformationID)
                                        attributeID:@(MTRAttributeIDTypeClusterBasicInformationAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBasicInformationID)
                                        attributeID:@(MTRAttributeIDTypeClusterBasicInformationAttributeClusterRevisionID)
                                             params:params];
}

@end
@implementation MTRClusterBasic
@end

@implementation MTRClusterBasic (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

- (void)mfgSpecificPingWithParams:(MTRBasicClusterMfgSpecificPingParams * _Nullable)params
                   expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
            expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                completionHandler:(MTRStatusCompletion)completionHandler
{
    [self mfgSpecificPingWithParams:params
                     expectedValues:expectedDataValueDictionaries
              expectedValueInterval:expectedValueIntervalMs
                         completion:completionHandler];
}
- (void)mfgSpecificPingWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                        completionHandler:(MTRStatusCompletion)completionHandler
{
    [self mfgSpecificPingWithParams:nil
                     expectedValues:expectedValues
              expectedValueInterval:expectedValueIntervalMs
                  completionHandler:completionHandler];
}
@end

@implementation MTRClusterOTASoftwareUpdateProvider

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (void)queryImageWithParams:(MTROTASoftwareUpdateProviderClusterQueryImageParams *)params
              expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
       expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                  completion:(void (^)(MTROTASoftwareUpdateProviderClusterQueryImageResponseParams * _Nullable data,
                                 NSError * _Nullable error))completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeOTASoftwareUpdateProviderID,
                                     (unsigned int) MTRCommandIDTypeClusterOTASoftwareUpdateProviderCommandQueryImageID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTROTASoftwareUpdateProviderClusterQueryImageResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                OTASoftwareUpdateProviderClusterQueryImageResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTROTASoftwareUpdateProviderClusterQueryImageResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                OtaSoftwareUpdateProvider::Commands::QueryImage::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.vendorID
                    = static_cast<std::remove_reference_t<decltype(request.vendorID)>>(params.vendorID.unsignedShortValue);
                request.productID = params.productID.unsignedShortValue;
                request.softwareVersion = params.softwareVersion.unsignedIntValue;
                {
                    using ListType_0 = std::remove_reference_t<decltype(request.protocolsSupported)>;
                    using ListMemberType_0 = ListMemberTypeGetter<ListType_0>::Type;
                    if (params.protocolsSupported.count != 0) {
                        auto * listHolder_0 = new ListHolder<ListMemberType_0>(params.protocolsSupported.count);
                        if (listHolder_0 == nullptr || listHolder_0->mList == nullptr) {
                            return CHIP_ERROR_INVALID_ARGUMENT;
                        }
                        listFreer.add(listHolder_0);
                        for (size_t i_0 = 0; i_0 < params.protocolsSupported.count; ++i_0) {
                            if (![params.protocolsSupported[i_0] isKindOfClass:[NSNumber class]]) {
                                // Wrong kind of value.
                                return CHIP_ERROR_INVALID_ARGUMENT;
                            }
                            auto element_0 = (NSNumber *) params.protocolsSupported[i_0];
                            listHolder_0->mList[i_0] = static_cast<std::remove_reference_t<decltype(listHolder_0->mList[i_0])>>(
                                element_0.unsignedCharValue);
                        }
                        request.protocolsSupported = ListType_0(listHolder_0->mList, params.protocolsSupported.count);
                    } else {
                        request.protocolsSupported = ListType_0();
                    }
                }
                if (params.hardwareVersion != nil) {
                    auto & definedValue_0 = request.hardwareVersion.Emplace();
                    definedValue_0 = params.hardwareVersion.unsignedShortValue;
                }
                if (params.location != nil) {
                    auto & definedValue_0 = request.location.Emplace();
                    definedValue_0 = [self asCharSpan:params.location];
                }
                if (params.requestorCanConsent != nil) {
                    auto & definedValue_0 = request.requestorCanConsent.Emplace();
                    definedValue_0 = params.requestorCanConsent.boolValue;
                }
                if (params.metadataForProvider != nil) {
                    auto & definedValue_0 = request.metadataForProvider.Emplace();
                    definedValue_0 = [self asByteSpan:params.metadataForProvider];
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)applyUpdateRequestWithParams:(MTROTASoftwareUpdateProviderClusterApplyUpdateRequestParams *)params
                      expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
               expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                          completion:(void (^)(MTROTASoftwareUpdateProviderClusterApplyUpdateResponseParams * _Nullable data,
                                         NSError * _Nullable error))completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeOTASoftwareUpdateProviderID,
                                     (unsigned int) MTRCommandIDTypeClusterOTASoftwareUpdateProviderCommandApplyUpdateRequestID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTROTASoftwareUpdateProviderClusterApplyUpdateResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                OTASoftwareUpdateProviderClusterApplyUpdateResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTROTASoftwareUpdateProviderClusterApplyUpdateResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                OtaSoftwareUpdateProvider::Commands::ApplyUpdateRequest::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.updateToken = [self asByteSpan:params.updateToken];
                request.newVersion = params.newVersion.unsignedIntValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)notifyUpdateAppliedWithParams:(MTROTASoftwareUpdateProviderClusterNotifyUpdateAppliedParams *)params
                       expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                           completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeOTASoftwareUpdateProviderID,
                                     (unsigned int) MTRCommandIDTypeClusterOTASoftwareUpdateProviderCommandNotifyUpdateAppliedID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                OtaSoftwareUpdateProvider::Commands::NotifyUpdateApplied::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.updateToken = [self asByteSpan:params.updateToken];
                request.softwareVersion = params.softwareVersion.unsignedIntValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeOTASoftwareUpdateProviderID)
                        attributeID:@(MTRAttributeIDTypeClusterOTASoftwareUpdateProviderAttributeGeneratedCommandListID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeOTASoftwareUpdateProviderID)
                                     attributeID:@(MTRAttributeIDTypeClusterOTASoftwareUpdateProviderAttributeAcceptedCommandListID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeOTASoftwareUpdateProviderID)
                                        attributeID:@(MTRAttributeIDTypeClusterOTASoftwareUpdateProviderAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeOTASoftwareUpdateProviderID)
                                        attributeID:@(MTRAttributeIDTypeClusterOTASoftwareUpdateProviderAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeOTASoftwareUpdateProviderID)
                                        attributeID:@(MTRAttributeIDTypeClusterOTASoftwareUpdateProviderAttributeClusterRevisionID)
                                             params:params];
}

@end
@implementation MTRClusterOtaSoftwareUpdateProvider
@end

@implementation MTRClusterOtaSoftwareUpdateProvider (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

- (void)queryImageWithParams:(MTROtaSoftwareUpdateProviderClusterQueryImageParams *)params
              expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
       expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
           completionHandler:(void (^)(MTROtaSoftwareUpdateProviderClusterQueryImageResponseParams * _Nullable data,
                                 NSError * _Nullable error))completionHandler
{
    [self queryImageWithParams:params
                expectedValues:expectedDataValueDictionaries
         expectedValueInterval:expectedValueIntervalMs
                    completion:^(
                        MTROTASoftwareUpdateProviderClusterQueryImageResponseParams * _Nullable data, NSError * _Nullable error) {
                        // Cast is safe because subclass does not add any selectors.
                        completionHandler(static_cast<MTROtaSoftwareUpdateProviderClusterQueryImageResponseParams *>(data), error);
                    }];
}
- (void)applyUpdateRequestWithParams:(MTROtaSoftwareUpdateProviderClusterApplyUpdateRequestParams *)params
                      expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
               expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                   completionHandler:(void (^)(MTROtaSoftwareUpdateProviderClusterApplyUpdateResponseParams * _Nullable data,
                                         NSError * _Nullable error))completionHandler
{
    [self applyUpdateRequestWithParams:params
                        expectedValues:expectedDataValueDictionaries
                 expectedValueInterval:expectedValueIntervalMs
                            completion:^(MTROTASoftwareUpdateProviderClusterApplyUpdateResponseParams * _Nullable data,
                                NSError * _Nullable error) {
                                // Cast is safe because subclass does not add any selectors.
                                completionHandler(
                                    static_cast<MTROtaSoftwareUpdateProviderClusterApplyUpdateResponseParams *>(data), error);
                            }];
}
- (void)notifyUpdateAppliedWithParams:(MTROtaSoftwareUpdateProviderClusterNotifyUpdateAppliedParams *)params
                       expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
                expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                    completionHandler:(MTRStatusCompletion)completionHandler
{
    [self notifyUpdateAppliedWithParams:params
                         expectedValues:expectedDataValueDictionaries
                  expectedValueInterval:expectedValueIntervalMs
                             completion:completionHandler];
}
@end

@implementation MTRClusterOTASoftwareUpdateRequestor

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (void)announceOTAProviderWithParams:(MTROTASoftwareUpdateRequestorClusterAnnounceOTAProviderParams *)params
                       expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                           completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeOTASoftwareUpdateRequestorID,
                                     (unsigned int) MTRCommandIDTypeClusterOTASoftwareUpdateRequestorCommandAnnounceOTAProviderID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                OtaSoftwareUpdateRequestor::Commands::AnnounceOTAProvider::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.providerNodeID = params.providerNodeID.unsignedLongLongValue;
                request.vendorID
                    = static_cast<std::remove_reference_t<decltype(request.vendorID)>>(params.vendorID.unsignedShortValue);
                request.announcementReason = static_cast<std::remove_reference_t<decltype(request.announcementReason)>>(
                    params.announcementReason.unsignedCharValue);
                if (params.metadataForNode != nil) {
                    auto & definedValue_0 = request.metadataForNode.Emplace();
                    definedValue_0 = [self asByteSpan:params.metadataForNode];
                }
                request.endpoint = params.endpoint.unsignedShortValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (NSDictionary<NSString *, id> *)readAttributeDefaultOTAProvidersWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeOTASoftwareUpdateRequestorID)
                        attributeID:@(MTRAttributeIDTypeClusterOTASoftwareUpdateRequestorAttributeDefaultOTAProvidersID)
                             params:params];
}

- (void)writeAttributeDefaultOTAProvidersWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                             expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeDefaultOTAProvidersWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeDefaultOTAProvidersWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                             expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                            params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeOTASoftwareUpdateRequestorID)
                                  attributeID:@(MTRAttributeIDTypeClusterOTASoftwareUpdateRequestorAttributeDefaultOTAProvidersID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeUpdatePossibleWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeOTASoftwareUpdateRequestorID)
                                        attributeID:@(MTRAttributeIDTypeClusterOTASoftwareUpdateRequestorAttributeUpdatePossibleID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeUpdateStateWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeOTASoftwareUpdateRequestorID)
                                        attributeID:@(MTRAttributeIDTypeClusterOTASoftwareUpdateRequestorAttributeUpdateStateID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeUpdateStateProgressWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeOTASoftwareUpdateRequestorID)
                        attributeID:@(MTRAttributeIDTypeClusterOTASoftwareUpdateRequestorAttributeUpdateStateProgressID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeOTASoftwareUpdateRequestorID)
                        attributeID:@(MTRAttributeIDTypeClusterOTASoftwareUpdateRequestorAttributeGeneratedCommandListID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeOTASoftwareUpdateRequestorID)
                        attributeID:@(MTRAttributeIDTypeClusterOTASoftwareUpdateRequestorAttributeAcceptedCommandListID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeOTASoftwareUpdateRequestorID)
                                        attributeID:@(MTRAttributeIDTypeClusterOTASoftwareUpdateRequestorAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeOTASoftwareUpdateRequestorID)
                                        attributeID:@(MTRAttributeIDTypeClusterOTASoftwareUpdateRequestorAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeOTASoftwareUpdateRequestorID)
                                        attributeID:@(MTRAttributeIDTypeClusterOTASoftwareUpdateRequestorAttributeClusterRevisionID)
                                             params:params];
}

@end
@implementation MTRClusterOtaSoftwareUpdateRequestor
@end

@implementation MTRClusterOtaSoftwareUpdateRequestor (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

- (void)announceOtaProviderWithParams:(MTROtaSoftwareUpdateRequestorClusterAnnounceOtaProviderParams *)params
                       expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
                expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                    completionHandler:(MTRStatusCompletion)completionHandler
{
    [self announceOTAProviderWithParams:params
                         expectedValues:expectedDataValueDictionaries
                  expectedValueInterval:expectedValueIntervalMs
                             completion:completionHandler];
}
- (NSDictionary<NSString *, id> *)readAttributeDefaultOtaProvidersWithParams:(MTRReadParams * _Nullable)params
{
    return [self readAttributeDefaultOTAProvidersWithParams:params];
}
- (void)writeAttributeDefaultOtaProvidersWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                             expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeDefaultOTAProvidersWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs];
}
- (void)writeAttributeDefaultOtaProvidersWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                             expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                            params:(MTRWriteParams * _Nullable)params
{
    [self writeAttributeDefaultOTAProvidersWithValue:dataValueDictionary
                               expectedValueInterval:expectedValueIntervalMs
                                              params:params];
}
@end

@implementation MTRClusterLocalizationConfiguration

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (NSDictionary<NSString *, id> *)readAttributeActiveLocaleWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeLocalizationConfigurationID)
                                        attributeID:@(MTRAttributeIDTypeClusterLocalizationConfigurationAttributeActiveLocaleID)
                                             params:params];
}

- (void)writeAttributeActiveLocaleWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeActiveLocaleWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeActiveLocaleWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                     params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeLocalizationConfigurationID)
                                  attributeID:@(MTRAttributeIDTypeClusterLocalizationConfigurationAttributeActiveLocaleID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeSupportedLocalesWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeLocalizationConfigurationID)
                                        attributeID:@(MTRAttributeIDTypeClusterLocalizationConfigurationAttributeSupportedLocalesID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeLocalizationConfigurationID)
                        attributeID:@(MTRAttributeIDTypeClusterLocalizationConfigurationAttributeGeneratedCommandListID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeLocalizationConfigurationID)
                                     attributeID:@(MTRAttributeIDTypeClusterLocalizationConfigurationAttributeAcceptedCommandListID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeLocalizationConfigurationID)
                                        attributeID:@(MTRAttributeIDTypeClusterLocalizationConfigurationAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeLocalizationConfigurationID)
                                        attributeID:@(MTRAttributeIDTypeClusterLocalizationConfigurationAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeLocalizationConfigurationID)
                                        attributeID:@(MTRAttributeIDTypeClusterLocalizationConfigurationAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterLocalizationConfiguration (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

@end

@implementation MTRClusterTimeFormatLocalization

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (NSDictionary<NSString *, id> *)readAttributeHourFormatWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeTimeFormatLocalizationID)
                                        attributeID:@(MTRAttributeIDTypeClusterTimeFormatLocalizationAttributeHourFormatID)
                                             params:params];
}

- (void)writeAttributeHourFormatWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeHourFormatWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeHourFormatWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                   params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeTimeFormatLocalizationID)
                                  attributeID:@(MTRAttributeIDTypeClusterTimeFormatLocalizationAttributeHourFormatID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeActiveCalendarTypeWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeTimeFormatLocalizationID)
                                        attributeID:@(MTRAttributeIDTypeClusterTimeFormatLocalizationAttributeActiveCalendarTypeID)
                                             params:params];
}

- (void)writeAttributeActiveCalendarTypeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                            expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeActiveCalendarTypeWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeActiveCalendarTypeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                            expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                           params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeTimeFormatLocalizationID)
                                  attributeID:@(MTRAttributeIDTypeClusterTimeFormatLocalizationAttributeActiveCalendarTypeID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeSupportedCalendarTypesWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeTimeFormatLocalizationID)
                                     attributeID:@(MTRAttributeIDTypeClusterTimeFormatLocalizationAttributeSupportedCalendarTypesID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeTimeFormatLocalizationID)
                                     attributeID:@(MTRAttributeIDTypeClusterTimeFormatLocalizationAttributeGeneratedCommandListID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeTimeFormatLocalizationID)
                                        attributeID:@(MTRAttributeIDTypeClusterTimeFormatLocalizationAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeTimeFormatLocalizationID)
                                        attributeID:@(MTRAttributeIDTypeClusterTimeFormatLocalizationAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeTimeFormatLocalizationID)
                                        attributeID:@(MTRAttributeIDTypeClusterTimeFormatLocalizationAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeTimeFormatLocalizationID)
                                        attributeID:@(MTRAttributeIDTypeClusterTimeFormatLocalizationAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterTimeFormatLocalization (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

@end

@implementation MTRClusterUnitLocalization

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (NSDictionary<NSString *, id> *)readAttributeTemperatureUnitWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitLocalizationID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitLocalizationAttributeTemperatureUnitID)
                                             params:params];
}

- (void)writeAttributeTemperatureUnitWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                         expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeTemperatureUnitWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeTemperatureUnitWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                         expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                        params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitLocalizationID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitLocalizationAttributeTemperatureUnitID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitLocalizationID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitLocalizationAttributeGeneratedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitLocalizationID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitLocalizationAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitLocalizationID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitLocalizationAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitLocalizationID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitLocalizationAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitLocalizationID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitLocalizationAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterUnitLocalization (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

@end

@implementation MTRClusterPowerSourceConfiguration

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (NSDictionary<NSString *, id> *)readAttributeSourcesWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePowerSourceConfigurationID)
                                        attributeID:@(MTRAttributeIDTypeClusterPowerSourceConfigurationAttributeSourcesID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypePowerSourceConfigurationID)
                                     attributeID:@(MTRAttributeIDTypeClusterPowerSourceConfigurationAttributeGeneratedCommandListID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypePowerSourceConfigurationID)
                                     attributeID:@(MTRAttributeIDTypeClusterPowerSourceConfigurationAttributeAcceptedCommandListID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePowerSourceConfigurationID)
                                        attributeID:@(MTRAttributeIDTypeClusterPowerSourceConfigurationAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePowerSourceConfigurationID)
                                        attributeID:@(MTRAttributeIDTypeClusterPowerSourceConfigurationAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePowerSourceConfigurationID)
                                        attributeID:@(MTRAttributeIDTypeClusterPowerSourceConfigurationAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterPowerSourceConfiguration (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

@end

@implementation MTRClusterPowerSource

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (NSDictionary<NSString *, id> *)readAttributeStatusWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePowerSourceID)
                                        attributeID:@(MTRAttributeIDTypeClusterPowerSourceAttributeStatusID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeOrderWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePowerSourceID)
                                        attributeID:@(MTRAttributeIDTypeClusterPowerSourceAttributeOrderID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeDescriptionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePowerSourceID)
                                        attributeID:@(MTRAttributeIDTypeClusterPowerSourceAttributeDescriptionID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeWiredAssessedInputVoltageWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePowerSourceID)
                                        attributeID:@(MTRAttributeIDTypeClusterPowerSourceAttributeWiredAssessedInputVoltageID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeWiredAssessedInputFrequencyWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePowerSourceID)
                                        attributeID:@(MTRAttributeIDTypeClusterPowerSourceAttributeWiredAssessedInputFrequencyID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeWiredCurrentTypeWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePowerSourceID)
                                        attributeID:@(MTRAttributeIDTypeClusterPowerSourceAttributeWiredCurrentTypeID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeWiredAssessedCurrentWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePowerSourceID)
                                        attributeID:@(MTRAttributeIDTypeClusterPowerSourceAttributeWiredAssessedCurrentID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeWiredNominalVoltageWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePowerSourceID)
                                        attributeID:@(MTRAttributeIDTypeClusterPowerSourceAttributeWiredNominalVoltageID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeWiredMaximumCurrentWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePowerSourceID)
                                        attributeID:@(MTRAttributeIDTypeClusterPowerSourceAttributeWiredMaximumCurrentID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeWiredPresentWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePowerSourceID)
                                        attributeID:@(MTRAttributeIDTypeClusterPowerSourceAttributeWiredPresentID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeActiveWiredFaultsWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePowerSourceID)
                                        attributeID:@(MTRAttributeIDTypeClusterPowerSourceAttributeActiveWiredFaultsID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeBatVoltageWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePowerSourceID)
                                        attributeID:@(MTRAttributeIDTypeClusterPowerSourceAttributeBatVoltageID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeBatPercentRemainingWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePowerSourceID)
                                        attributeID:@(MTRAttributeIDTypeClusterPowerSourceAttributeBatPercentRemainingID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeBatTimeRemainingWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePowerSourceID)
                                        attributeID:@(MTRAttributeIDTypeClusterPowerSourceAttributeBatTimeRemainingID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeBatChargeLevelWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePowerSourceID)
                                        attributeID:@(MTRAttributeIDTypeClusterPowerSourceAttributeBatChargeLevelID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeBatReplacementNeededWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePowerSourceID)
                                        attributeID:@(MTRAttributeIDTypeClusterPowerSourceAttributeBatReplacementNeededID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeBatReplaceabilityWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePowerSourceID)
                                        attributeID:@(MTRAttributeIDTypeClusterPowerSourceAttributeBatReplaceabilityID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeBatPresentWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePowerSourceID)
                                        attributeID:@(MTRAttributeIDTypeClusterPowerSourceAttributeBatPresentID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeActiveBatFaultsWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePowerSourceID)
                                        attributeID:@(MTRAttributeIDTypeClusterPowerSourceAttributeActiveBatFaultsID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeBatReplacementDescriptionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePowerSourceID)
                                        attributeID:@(MTRAttributeIDTypeClusterPowerSourceAttributeBatReplacementDescriptionID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeBatCommonDesignationWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePowerSourceID)
                                        attributeID:@(MTRAttributeIDTypeClusterPowerSourceAttributeBatCommonDesignationID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeBatANSIDesignationWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePowerSourceID)
                                        attributeID:@(MTRAttributeIDTypeClusterPowerSourceAttributeBatANSIDesignationID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeBatIECDesignationWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePowerSourceID)
                                        attributeID:@(MTRAttributeIDTypeClusterPowerSourceAttributeBatIECDesignationID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeBatApprovedChemistryWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePowerSourceID)
                                        attributeID:@(MTRAttributeIDTypeClusterPowerSourceAttributeBatApprovedChemistryID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeBatCapacityWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePowerSourceID)
                                        attributeID:@(MTRAttributeIDTypeClusterPowerSourceAttributeBatCapacityID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeBatQuantityWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePowerSourceID)
                                        attributeID:@(MTRAttributeIDTypeClusterPowerSourceAttributeBatQuantityID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeBatChargeStateWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePowerSourceID)
                                        attributeID:@(MTRAttributeIDTypeClusterPowerSourceAttributeBatChargeStateID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeBatTimeToFullChargeWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePowerSourceID)
                                        attributeID:@(MTRAttributeIDTypeClusterPowerSourceAttributeBatTimeToFullChargeID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeBatFunctionalWhileChargingWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePowerSourceID)
                                        attributeID:@(MTRAttributeIDTypeClusterPowerSourceAttributeBatFunctionalWhileChargingID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeBatChargingCurrentWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePowerSourceID)
                                        attributeID:@(MTRAttributeIDTypeClusterPowerSourceAttributeBatChargingCurrentID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeActiveBatChargeFaultsWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePowerSourceID)
                                        attributeID:@(MTRAttributeIDTypeClusterPowerSourceAttributeActiveBatChargeFaultsID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePowerSourceID)
                                        attributeID:@(MTRAttributeIDTypeClusterPowerSourceAttributeGeneratedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePowerSourceID)
                                        attributeID:@(MTRAttributeIDTypeClusterPowerSourceAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePowerSourceID)
                                        attributeID:@(MTRAttributeIDTypeClusterPowerSourceAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePowerSourceID)
                                        attributeID:@(MTRAttributeIDTypeClusterPowerSourceAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePowerSourceID)
                                        attributeID:@(MTRAttributeIDTypeClusterPowerSourceAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterPowerSource (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

@end

@implementation MTRClusterGeneralCommissioning

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (void)armFailSafeWithParams:(MTRGeneralCommissioningClusterArmFailSafeParams *)params
               expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                   completion:(void (^)(MTRGeneralCommissioningClusterArmFailSafeResponseParams * _Nullable data,
                                  NSError * _Nullable error))completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeGeneralCommissioningID,
                                     (unsigned int) MTRCommandIDTypeClusterGeneralCommissioningCommandArmFailSafeID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRGeneralCommissioningClusterArmFailSafeResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                GeneralCommissioningClusterArmFailSafeResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRGeneralCommissioningClusterArmFailSafeResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                GeneralCommissioning::Commands::ArmFailSafe::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.expiryLengthSeconds = params.expiryLengthSeconds.unsignedShortValue;
                request.breadcrumb = params.breadcrumb.unsignedLongLongValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)setRegulatoryConfigWithParams:(MTRGeneralCommissioningClusterSetRegulatoryConfigParams *)params
                       expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                           completion:(void (^)(MTRGeneralCommissioningClusterSetRegulatoryConfigResponseParams * _Nullable data,
                                          NSError * _Nullable error))completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeGeneralCommissioningID,
                                     (unsigned int) MTRCommandIDTypeClusterGeneralCommissioningCommandSetRegulatoryConfigID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRGeneralCommissioningClusterSetRegulatoryConfigResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                GeneralCommissioningClusterSetRegulatoryConfigResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRGeneralCommissioningClusterSetRegulatoryConfigResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                GeneralCommissioning::Commands::SetRegulatoryConfig::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.newRegulatoryConfig = static_cast<std::remove_reference_t<decltype(request.newRegulatoryConfig)>>(
                    params.newRegulatoryConfig.unsignedCharValue);
                request.countryCode = [self asCharSpan:params.countryCode];
                request.breadcrumb = params.breadcrumb.unsignedLongLongValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)commissioningCompleteWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                          expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                     completion:
                                         (void (^)(
                                             MTRGeneralCommissioningClusterCommissioningCompleteResponseParams * _Nullable data,
                                             NSError * _Nullable error))completion
{
    [self commissioningCompleteWithParams:nil
                           expectedValues:expectedValues
                    expectedValueInterval:expectedValueIntervalMs
                               completion:completion];
}
- (void)commissioningCompleteWithParams:(MTRGeneralCommissioningClusterCommissioningCompleteParams * _Nullable)params
                         expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                  expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                             completion:
                                 (void (^)(MTRGeneralCommissioningClusterCommissioningCompleteResponseParams * _Nullable data,
                                     NSError * _Nullable error))completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeGeneralCommissioningID,
                                     (unsigned int) MTRCommandIDTypeClusterGeneralCommissioningCommandCommissioningCompleteID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRGeneralCommissioningClusterCommissioningCompleteResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                GeneralCommissioningClusterCommissioningCompleteResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge
                    = static_cast<MTRGeneralCommissioningClusterCommissioningCompleteResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                GeneralCommissioning::Commands::CommissioningComplete::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (NSDictionary<NSString *, id> *)readAttributeBreadcrumbWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeGeneralCommissioningID)
                                        attributeID:@(MTRAttributeIDTypeClusterGeneralCommissioningAttributeBreadcrumbID)
                                             params:params];
}

- (void)writeAttributeBreadcrumbWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeBreadcrumbWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeBreadcrumbWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                   params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeGeneralCommissioningID)
                                  attributeID:@(MTRAttributeIDTypeClusterGeneralCommissioningAttributeBreadcrumbID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeBasicCommissioningInfoWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeGeneralCommissioningID)
                                     attributeID:@(MTRAttributeIDTypeClusterGeneralCommissioningAttributeBasicCommissioningInfoID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeRegulatoryConfigWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeGeneralCommissioningID)
                                        attributeID:@(MTRAttributeIDTypeClusterGeneralCommissioningAttributeRegulatoryConfigID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeLocationCapabilityWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeGeneralCommissioningID)
                                        attributeID:@(MTRAttributeIDTypeClusterGeneralCommissioningAttributeLocationCapabilityID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeSupportsConcurrentConnectionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeGeneralCommissioningID)
                        attributeID:@(MTRAttributeIDTypeClusterGeneralCommissioningAttributeSupportsConcurrentConnectionID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeGeneralCommissioningID)
                                        attributeID:@(MTRAttributeIDTypeClusterGeneralCommissioningAttributeGeneratedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeGeneralCommissioningID)
                                        attributeID:@(MTRAttributeIDTypeClusterGeneralCommissioningAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeGeneralCommissioningID)
                                        attributeID:@(MTRAttributeIDTypeClusterGeneralCommissioningAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeGeneralCommissioningID)
                                        attributeID:@(MTRAttributeIDTypeClusterGeneralCommissioningAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeGeneralCommissioningID)
                                        attributeID:@(MTRAttributeIDTypeClusterGeneralCommissioningAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterGeneralCommissioning (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

- (void)armFailSafeWithParams:(MTRGeneralCommissioningClusterArmFailSafeParams *)params
               expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
        expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
            completionHandler:(void (^)(MTRGeneralCommissioningClusterArmFailSafeResponseParams * _Nullable data,
                                  NSError * _Nullable error))completionHandler
{
    [self armFailSafeWithParams:params
                 expectedValues:expectedDataValueDictionaries
          expectedValueInterval:expectedValueIntervalMs
                     completion:^(
                         MTRGeneralCommissioningClusterArmFailSafeResponseParams * _Nullable data, NSError * _Nullable error) {
                         // Cast is safe because subclass does not add any selectors.
                         completionHandler(static_cast<MTRGeneralCommissioningClusterArmFailSafeResponseParams *>(data), error);
                     }];
}
- (void)setRegulatoryConfigWithParams:(MTRGeneralCommissioningClusterSetRegulatoryConfigParams *)params
                       expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
                expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                    completionHandler:(void (^)(MTRGeneralCommissioningClusterSetRegulatoryConfigResponseParams * _Nullable data,
                                          NSError * _Nullable error))completionHandler
{
    [self setRegulatoryConfigWithParams:params
                         expectedValues:expectedDataValueDictionaries
                  expectedValueInterval:expectedValueIntervalMs
                             completion:^(MTRGeneralCommissioningClusterSetRegulatoryConfigResponseParams * _Nullable data,
                                 NSError * _Nullable error) {
                                 // Cast is safe because subclass does not add any selectors.
                                 completionHandler(
                                     static_cast<MTRGeneralCommissioningClusterSetRegulatoryConfigResponseParams *>(data), error);
                             }];
}
- (void)commissioningCompleteWithParams:(MTRGeneralCommissioningClusterCommissioningCompleteParams * _Nullable)params
                         expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
                  expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                      completionHandler:
                          (void (^)(MTRGeneralCommissioningClusterCommissioningCompleteResponseParams * _Nullable data,
                              NSError * _Nullable error))completionHandler
{
    [self
        commissioningCompleteWithParams:params
                         expectedValues:expectedDataValueDictionaries
                  expectedValueInterval:expectedValueIntervalMs
                             completion:^(MTRGeneralCommissioningClusterCommissioningCompleteResponseParams * _Nullable data,
                                 NSError * _Nullable error) {
                                 // Cast is safe because subclass does not add any selectors.
                                 completionHandler(
                                     static_cast<MTRGeneralCommissioningClusterCommissioningCompleteResponseParams *>(data), error);
                             }];
}
- (void)commissioningCompleteWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                          expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                              completionHandler:
                                  (void (^)(MTRGeneralCommissioningClusterCommissioningCompleteResponseParams * _Nullable data,
                                      NSError * _Nullable error))completionHandler
{
    [self commissioningCompleteWithParams:nil
                           expectedValues:expectedValues
                    expectedValueInterval:expectedValueIntervalMs
                        completionHandler:completionHandler];
}
@end

@implementation MTRClusterNetworkCommissioning

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (void)scanNetworksWithParams:(MTRNetworkCommissioningClusterScanNetworksParams * _Nullable)params
                expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
         expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                    completion:(void (^)(MTRNetworkCommissioningClusterScanNetworksResponseParams * _Nullable data,
                                   NSError * _Nullable error))completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeNetworkCommissioningID,
                                     (unsigned int) MTRCommandIDTypeClusterNetworkCommissioningCommandScanNetworksID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRNetworkCommissioningClusterScanNetworksResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                NetworkCommissioningClusterScanNetworksResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRNetworkCommissioningClusterScanNetworksResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                NetworkCommissioning::Commands::ScanNetworks::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                if (params != nil) {
                    if (params.ssid != nil) {
                        auto & definedValue_0 = request.ssid.Emplace();
                        if (params.ssid == nil) {
                            definedValue_0.SetNull();
                        } else {
                            auto & nonNullValue_1 = definedValue_0.SetNonNull();
                            nonNullValue_1 = [self asByteSpan:params.ssid];
                        }
                    }
                    if (params.breadcrumb != nil) {
                        auto & definedValue_0 = request.breadcrumb.Emplace();
                        definedValue_0 = params.breadcrumb.unsignedLongLongValue;
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)addOrUpdateWiFiNetworkWithParams:(MTRNetworkCommissioningClusterAddOrUpdateWiFiNetworkParams *)params
                          expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                   expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                              completion:(void (^)(MTRNetworkCommissioningClusterNetworkConfigResponseParams * _Nullable data,
                                             NSError * _Nullable error))completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeNetworkCommissioningID,
                                     (unsigned int) MTRCommandIDTypeClusterNetworkCommissioningCommandAddOrUpdateWiFiNetworkID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRNetworkCommissioningClusterNetworkConfigResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                NetworkCommissioningClusterNetworkConfigResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRNetworkCommissioningClusterNetworkConfigResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                NetworkCommissioning::Commands::AddOrUpdateWiFiNetwork::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.ssid = [self asByteSpan:params.ssid];
                request.credentials = [self asByteSpan:params.credentials];
                if (params.breadcrumb != nil) {
                    auto & definedValue_0 = request.breadcrumb.Emplace();
                    definedValue_0 = params.breadcrumb.unsignedLongLongValue;
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)addOrUpdateThreadNetworkWithParams:(MTRNetworkCommissioningClusterAddOrUpdateThreadNetworkParams *)params
                            expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                     expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                completion:(void (^)(MTRNetworkCommissioningClusterNetworkConfigResponseParams * _Nullable data,
                                               NSError * _Nullable error))completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeNetworkCommissioningID,
                                     (unsigned int) MTRCommandIDTypeClusterNetworkCommissioningCommandAddOrUpdateThreadNetworkID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRNetworkCommissioningClusterNetworkConfigResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                NetworkCommissioningClusterNetworkConfigResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRNetworkCommissioningClusterNetworkConfigResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                NetworkCommissioning::Commands::AddOrUpdateThreadNetwork::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.operationalDataset = [self asByteSpan:params.operationalDataset];
                if (params.breadcrumb != nil) {
                    auto & definedValue_0 = request.breadcrumb.Emplace();
                    definedValue_0 = params.breadcrumb.unsignedLongLongValue;
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)removeNetworkWithParams:(MTRNetworkCommissioningClusterRemoveNetworkParams *)params
                 expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
          expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                     completion:(void (^)(MTRNetworkCommissioningClusterNetworkConfigResponseParams * _Nullable data,
                                    NSError * _Nullable error))completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeNetworkCommissioningID,
                                     (unsigned int) MTRCommandIDTypeClusterNetworkCommissioningCommandRemoveNetworkID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRNetworkCommissioningClusterNetworkConfigResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                NetworkCommissioningClusterNetworkConfigResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRNetworkCommissioningClusterNetworkConfigResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                NetworkCommissioning::Commands::RemoveNetwork::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.networkID = [self asByteSpan:params.networkID];
                if (params.breadcrumb != nil) {
                    auto & definedValue_0 = request.breadcrumb.Emplace();
                    definedValue_0 = params.breadcrumb.unsignedLongLongValue;
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)connectNetworkWithParams:(MTRNetworkCommissioningClusterConnectNetworkParams *)params
                  expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
           expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                      completion:(void (^)(MTRNetworkCommissioningClusterConnectNetworkResponseParams * _Nullable data,
                                     NSError * _Nullable error))completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeNetworkCommissioningID,
                                     (unsigned int) MTRCommandIDTypeClusterNetworkCommissioningCommandConnectNetworkID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRNetworkCommissioningClusterConnectNetworkResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                NetworkCommissioningClusterConnectNetworkResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRNetworkCommissioningClusterConnectNetworkResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                NetworkCommissioning::Commands::ConnectNetwork::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.networkID = [self asByteSpan:params.networkID];
                if (params.breadcrumb != nil) {
                    auto & definedValue_0 = request.breadcrumb.Emplace();
                    definedValue_0 = params.breadcrumb.unsignedLongLongValue;
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)reorderNetworkWithParams:(MTRNetworkCommissioningClusterReorderNetworkParams *)params
                  expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
           expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                      completion:(void (^)(MTRNetworkCommissioningClusterNetworkConfigResponseParams * _Nullable data,
                                     NSError * _Nullable error))completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeNetworkCommissioningID,
                                     (unsigned int) MTRCommandIDTypeClusterNetworkCommissioningCommandReorderNetworkID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRNetworkCommissioningClusterNetworkConfigResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                NetworkCommissioningClusterNetworkConfigResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRNetworkCommissioningClusterNetworkConfigResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                NetworkCommissioning::Commands::ReorderNetwork::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.networkID = [self asByteSpan:params.networkID];
                request.networkIndex = params.networkIndex.unsignedCharValue;
                if (params.breadcrumb != nil) {
                    auto & definedValue_0 = request.breadcrumb.Emplace();
                    definedValue_0 = params.breadcrumb.unsignedLongLongValue;
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (NSDictionary<NSString *, id> *)readAttributeMaxNetworksWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeNetworkCommissioningID)
                                        attributeID:@(MTRAttributeIDTypeClusterNetworkCommissioningAttributeMaxNetworksID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeNetworksWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeNetworkCommissioningID)
                                        attributeID:@(MTRAttributeIDTypeClusterNetworkCommissioningAttributeNetworksID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeScanMaxTimeSecondsWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeNetworkCommissioningID)
                                        attributeID:@(MTRAttributeIDTypeClusterNetworkCommissioningAttributeScanMaxTimeSecondsID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeConnectMaxTimeSecondsWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeNetworkCommissioningID)
                                        attributeID:@(MTRAttributeIDTypeClusterNetworkCommissioningAttributeConnectMaxTimeSecondsID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeInterfaceEnabledWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeNetworkCommissioningID)
                                        attributeID:@(MTRAttributeIDTypeClusterNetworkCommissioningAttributeInterfaceEnabledID)
                                             params:params];
}

- (void)writeAttributeInterfaceEnabledWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                          expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeInterfaceEnabledWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeInterfaceEnabledWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                          expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                         params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeNetworkCommissioningID)
                                  attributeID:@(MTRAttributeIDTypeClusterNetworkCommissioningAttributeInterfaceEnabledID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeLastNetworkingStatusWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeNetworkCommissioningID)
                                        attributeID:@(MTRAttributeIDTypeClusterNetworkCommissioningAttributeLastNetworkingStatusID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeLastNetworkIDWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeNetworkCommissioningID)
                                        attributeID:@(MTRAttributeIDTypeClusterNetworkCommissioningAttributeLastNetworkIDID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeLastConnectErrorValueWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeNetworkCommissioningID)
                                        attributeID:@(MTRAttributeIDTypeClusterNetworkCommissioningAttributeLastConnectErrorValueID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeNetworkCommissioningID)
                                        attributeID:@(MTRAttributeIDTypeClusterNetworkCommissioningAttributeGeneratedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeNetworkCommissioningID)
                                        attributeID:@(MTRAttributeIDTypeClusterNetworkCommissioningAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeNetworkCommissioningID)
                                        attributeID:@(MTRAttributeIDTypeClusterNetworkCommissioningAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeNetworkCommissioningID)
                                        attributeID:@(MTRAttributeIDTypeClusterNetworkCommissioningAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeNetworkCommissioningID)
                                        attributeID:@(MTRAttributeIDTypeClusterNetworkCommissioningAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterNetworkCommissioning (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

- (void)scanNetworksWithParams:(MTRNetworkCommissioningClusterScanNetworksParams * _Nullable)params
                expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
         expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
             completionHandler:(void (^)(MTRNetworkCommissioningClusterScanNetworksResponseParams * _Nullable data,
                                   NSError * _Nullable error))completionHandler
{
    [self scanNetworksWithParams:params
                  expectedValues:expectedDataValueDictionaries
           expectedValueInterval:expectedValueIntervalMs
                      completion:^(
                          MTRNetworkCommissioningClusterScanNetworksResponseParams * _Nullable data, NSError * _Nullable error) {
                          // Cast is safe because subclass does not add any selectors.
                          completionHandler(static_cast<MTRNetworkCommissioningClusterScanNetworksResponseParams *>(data), error);
                      }];
}
- (void)addOrUpdateWiFiNetworkWithParams:(MTRNetworkCommissioningClusterAddOrUpdateWiFiNetworkParams *)params
                          expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
                   expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                       completionHandler:(void (^)(MTRNetworkCommissioningClusterNetworkConfigResponseParams * _Nullable data,
                                             NSError * _Nullable error))completionHandler
{
    [self addOrUpdateWiFiNetworkWithParams:params
                            expectedValues:expectedDataValueDictionaries
                     expectedValueInterval:expectedValueIntervalMs
                                completion:^(MTRNetworkCommissioningClusterNetworkConfigResponseParams * _Nullable data,
                                    NSError * _Nullable error) {
                                    // Cast is safe because subclass does not add any selectors.
                                    completionHandler(
                                        static_cast<MTRNetworkCommissioningClusterNetworkConfigResponseParams *>(data), error);
                                }];
}
- (void)addOrUpdateThreadNetworkWithParams:(MTRNetworkCommissioningClusterAddOrUpdateThreadNetworkParams *)params
                            expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
                     expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                         completionHandler:(void (^)(MTRNetworkCommissioningClusterNetworkConfigResponseParams * _Nullable data,
                                               NSError * _Nullable error))completionHandler
{
    [self addOrUpdateThreadNetworkWithParams:params
                              expectedValues:expectedDataValueDictionaries
                       expectedValueInterval:expectedValueIntervalMs
                                  completion:^(MTRNetworkCommissioningClusterNetworkConfigResponseParams * _Nullable data,
                                      NSError * _Nullable error) {
                                      // Cast is safe because subclass does not add any selectors.
                                      completionHandler(
                                          static_cast<MTRNetworkCommissioningClusterNetworkConfigResponseParams *>(data), error);
                                  }];
}
- (void)removeNetworkWithParams:(MTRNetworkCommissioningClusterRemoveNetworkParams *)params
                 expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
          expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
              completionHandler:(void (^)(MTRNetworkCommissioningClusterNetworkConfigResponseParams * _Nullable data,
                                    NSError * _Nullable error))completionHandler
{
    [self removeNetworkWithParams:params
                   expectedValues:expectedDataValueDictionaries
            expectedValueInterval:expectedValueIntervalMs
                       completion:^(
                           MTRNetworkCommissioningClusterNetworkConfigResponseParams * _Nullable data, NSError * _Nullable error) {
                           // Cast is safe because subclass does not add any selectors.
                           completionHandler(static_cast<MTRNetworkCommissioningClusterNetworkConfigResponseParams *>(data), error);
                       }];
}
- (void)connectNetworkWithParams:(MTRNetworkCommissioningClusterConnectNetworkParams *)params
                  expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
           expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
               completionHandler:(void (^)(MTRNetworkCommissioningClusterConnectNetworkResponseParams * _Nullable data,
                                     NSError * _Nullable error))completionHandler
{
    [self
        connectNetworkWithParams:params
                  expectedValues:expectedDataValueDictionaries
           expectedValueInterval:expectedValueIntervalMs
                      completion:^(
                          MTRNetworkCommissioningClusterConnectNetworkResponseParams * _Nullable data, NSError * _Nullable error) {
                          // Cast is safe because subclass does not add any selectors.
                          completionHandler(static_cast<MTRNetworkCommissioningClusterConnectNetworkResponseParams *>(data), error);
                      }];
}
- (void)reorderNetworkWithParams:(MTRNetworkCommissioningClusterReorderNetworkParams *)params
                  expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
           expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
               completionHandler:(void (^)(MTRNetworkCommissioningClusterNetworkConfigResponseParams * _Nullable data,
                                     NSError * _Nullable error))completionHandler
{
    [self
        reorderNetworkWithParams:params
                  expectedValues:expectedDataValueDictionaries
           expectedValueInterval:expectedValueIntervalMs
                      completion:^(
                          MTRNetworkCommissioningClusterNetworkConfigResponseParams * _Nullable data, NSError * _Nullable error) {
                          // Cast is safe because subclass does not add any selectors.
                          completionHandler(static_cast<MTRNetworkCommissioningClusterNetworkConfigResponseParams *>(data), error);
                      }];
}
@end

@implementation MTRClusterDiagnosticLogs

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (void)retrieveLogsRequestWithParams:(MTRDiagnosticLogsClusterRetrieveLogsRequestParams *)params
                       expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                           completion:(void (^)(MTRDiagnosticLogsClusterRetrieveLogsResponseParams * _Nullable data,
                                          NSError * _Nullable error))completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeDiagnosticLogsID,
                                     (unsigned int) MTRCommandIDTypeClusterDiagnosticLogsCommandRetrieveLogsRequestID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRDiagnosticLogsClusterRetrieveLogsResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                DiagnosticLogsClusterRetrieveLogsResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRDiagnosticLogsClusterRetrieveLogsResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                DiagnosticLogs::Commands::RetrieveLogsRequest::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.intent = static_cast<std::remove_reference_t<decltype(request.intent)>>(params.intent.unsignedCharValue);
                request.requestedProtocol = static_cast<std::remove_reference_t<decltype(request.requestedProtocol)>>(
                    params.requestedProtocol.unsignedCharValue);
                if (params.transferFileDesignator != nil) {
                    auto & definedValue_0 = request.transferFileDesignator.Emplace();
                    definedValue_0 = [self asCharSpan:params.transferFileDesignator];
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeDiagnosticLogsID)
                                        attributeID:@(MTRAttributeIDTypeClusterDiagnosticLogsAttributeGeneratedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeDiagnosticLogsID)
                                        attributeID:@(MTRAttributeIDTypeClusterDiagnosticLogsAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeDiagnosticLogsID)
                                        attributeID:@(MTRAttributeIDTypeClusterDiagnosticLogsAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeDiagnosticLogsID)
                                        attributeID:@(MTRAttributeIDTypeClusterDiagnosticLogsAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeDiagnosticLogsID)
                                        attributeID:@(MTRAttributeIDTypeClusterDiagnosticLogsAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterDiagnosticLogs (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

- (void)retrieveLogsRequestWithParams:(MTRDiagnosticLogsClusterRetrieveLogsRequestParams *)params
                       expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
                expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                    completionHandler:(void (^)(MTRDiagnosticLogsClusterRetrieveLogsResponseParams * _Nullable data,
                                          NSError * _Nullable error))completionHandler
{
    [self retrieveLogsRequestWithParams:params
                         expectedValues:expectedDataValueDictionaries
                  expectedValueInterval:expectedValueIntervalMs
                             completion:^(
                                 MTRDiagnosticLogsClusterRetrieveLogsResponseParams * _Nullable data, NSError * _Nullable error) {
                                 // Cast is safe because subclass does not add any selectors.
                                 completionHandler(static_cast<MTRDiagnosticLogsClusterRetrieveLogsResponseParams *>(data), error);
                             }];
}
@end

@implementation MTRClusterGeneralDiagnostics

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (void)testEventTriggerWithParams:(MTRGeneralDiagnosticsClusterTestEventTriggerParams *)params
                    expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
             expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                        completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeGeneralDiagnosticsID,
                                     (unsigned int) MTRCommandIDTypeClusterGeneralDiagnosticsCommandTestEventTriggerID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                GeneralDiagnostics::Commands::TestEventTrigger::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.enableKey = [self asByteSpan:params.enableKey];
                request.eventTrigger = params.eventTrigger.unsignedLongLongValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (NSDictionary<NSString *, id> *)readAttributeNetworkInterfacesWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeGeneralDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterGeneralDiagnosticsAttributeNetworkInterfacesID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeRebootCountWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeGeneralDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterGeneralDiagnosticsAttributeRebootCountID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeUpTimeWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeGeneralDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterGeneralDiagnosticsAttributeUpTimeID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeTotalOperationalHoursWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeGeneralDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterGeneralDiagnosticsAttributeTotalOperationalHoursID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeBootReasonWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeGeneralDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterGeneralDiagnosticsAttributeBootReasonID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeActiveHardwareFaultsWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeGeneralDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterGeneralDiagnosticsAttributeActiveHardwareFaultsID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeActiveRadioFaultsWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeGeneralDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterGeneralDiagnosticsAttributeActiveRadioFaultsID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeActiveNetworkFaultsWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeGeneralDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterGeneralDiagnosticsAttributeActiveNetworkFaultsID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeTestEventTriggersEnabledWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeGeneralDiagnosticsID)
                                     attributeID:@(MTRAttributeIDTypeClusterGeneralDiagnosticsAttributeTestEventTriggersEnabledID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeGeneralDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterGeneralDiagnosticsAttributeGeneratedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeGeneralDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterGeneralDiagnosticsAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeGeneralDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterGeneralDiagnosticsAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeGeneralDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterGeneralDiagnosticsAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeGeneralDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterGeneralDiagnosticsAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterGeneralDiagnostics (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

- (void)testEventTriggerWithParams:(MTRGeneralDiagnosticsClusterTestEventTriggerParams *)params
                    expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
             expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                 completionHandler:(MTRStatusCompletion)completionHandler
{
    [self testEventTriggerWithParams:params
                      expectedValues:expectedDataValueDictionaries
               expectedValueInterval:expectedValueIntervalMs
                          completion:completionHandler];
}
- (NSDictionary<NSString *, id> *)readAttributeBootReasonsWithParams:(MTRReadParams * _Nullable)params
{
    return [self readAttributeBootReasonWithParams:params];
}
@end

@implementation MTRClusterSoftwareDiagnostics

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (void)resetWatermarksWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                               completion:(MTRStatusCompletion)completion
{
    [self resetWatermarksWithParams:nil
                     expectedValues:expectedValues
              expectedValueInterval:expectedValueIntervalMs
                         completion:completion];
}
- (void)resetWatermarksWithParams:(MTRSoftwareDiagnosticsClusterResetWatermarksParams * _Nullable)params
                   expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
            expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                       completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeSoftwareDiagnosticsID,
                                     (unsigned int) MTRCommandIDTypeClusterSoftwareDiagnosticsCommandResetWatermarksID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                SoftwareDiagnostics::Commands::ResetWatermarks::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (NSDictionary<NSString *, id> *)readAttributeThreadMetricsWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeSoftwareDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterSoftwareDiagnosticsAttributeThreadMetricsID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeCurrentHeapFreeWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeSoftwareDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterSoftwareDiagnosticsAttributeCurrentHeapFreeID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeCurrentHeapUsedWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeSoftwareDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterSoftwareDiagnosticsAttributeCurrentHeapUsedID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeCurrentHeapHighWatermarkWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeSoftwareDiagnosticsID)
                                     attributeID:@(MTRAttributeIDTypeClusterSoftwareDiagnosticsAttributeCurrentHeapHighWatermarkID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeSoftwareDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterSoftwareDiagnosticsAttributeGeneratedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeSoftwareDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterSoftwareDiagnosticsAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeSoftwareDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterSoftwareDiagnosticsAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeSoftwareDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterSoftwareDiagnosticsAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeSoftwareDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterSoftwareDiagnosticsAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterSoftwareDiagnostics (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

- (void)resetWatermarksWithParams:(MTRSoftwareDiagnosticsClusterResetWatermarksParams * _Nullable)params
                   expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
            expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                completionHandler:(MTRStatusCompletion)completionHandler
{
    [self resetWatermarksWithParams:params
                     expectedValues:expectedDataValueDictionaries
              expectedValueInterval:expectedValueIntervalMs
                         completion:completionHandler];
}
- (void)resetWatermarksWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                        completionHandler:(MTRStatusCompletion)completionHandler
{
    [self resetWatermarksWithParams:nil
                     expectedValues:expectedValues
              expectedValueInterval:expectedValueIntervalMs
                  completionHandler:completionHandler];
}
@end

@implementation MTRClusterThreadNetworkDiagnostics

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (void)resetCountsWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                           completion:(MTRStatusCompletion)completion
{
    [self resetCountsWithParams:nil
                 expectedValues:expectedValues
          expectedValueInterval:expectedValueIntervalMs
                     completion:completion];
}
- (void)resetCountsWithParams:(MTRThreadNetworkDiagnosticsClusterResetCountsParams * _Nullable)params
               expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                   completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeThreadNetworkDiagnosticsID,
                                     (unsigned int) MTRCommandIDTypeClusterThreadNetworkDiagnosticsCommandResetCountsID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                ThreadNetworkDiagnostics::Commands::ResetCounts::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (NSDictionary<NSString *, id> *)readAttributeChannelWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeChannelID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeRoutingRoleWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeRoutingRoleID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeNetworkNameWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeNetworkNameID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributePanIdWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributePanIdID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeExtendedPanIdWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeExtendedPanIdID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeMeshLocalPrefixWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeMeshLocalPrefixID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeOverrunCountWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeOverrunCountID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeNeighborTableWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeNeighborTableID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeRouteTableWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeRouteTableID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributePartitionIdWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributePartitionIdID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeWeightingWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeWeightingID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeDataVersionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeDataVersionID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeStableDataVersionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeStableDataVersionID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeLeaderRouterIdWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeLeaderRouterIdID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeDetachedRoleCountWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeDetachedRoleCountID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeChildRoleCountWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeChildRoleCountID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeRouterRoleCountWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeRouterRoleCountID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeLeaderRoleCountWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeLeaderRoleCountID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttachAttemptCountWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                                     attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeAttachAttemptCountID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributePartitionIdChangeCountWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributePartitionIdChangeCountID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeBetterPartitionAttachAttemptCountWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeBetterPartitionAttachAttemptCountID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeParentChangeCountWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeParentChangeCountID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeTxTotalCountWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeTxTotalCountID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeTxUnicastCountWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeTxUnicastCountID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeTxBroadcastCountWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeTxBroadcastCountID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeTxAckRequestedCountWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                                     attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeTxAckRequestedCountID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeTxAckedCountWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeTxAckedCountID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeTxNoAckRequestedCountWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeTxNoAckRequestedCountID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeTxDataCountWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeTxDataCountID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeTxDataPollCountWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeTxDataPollCountID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeTxBeaconCountWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeTxBeaconCountID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeTxBeaconRequestCountWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                                     attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeTxBeaconRequestCountID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeTxOtherCountWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeTxOtherCountID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeTxRetryCountWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeTxRetryCountID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeTxDirectMaxRetryExpiryCountWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeTxDirectMaxRetryExpiryCountID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeTxIndirectMaxRetryExpiryCountWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeTxIndirectMaxRetryExpiryCountID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeTxErrCcaCountWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeTxErrCcaCountID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeTxErrAbortCountWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeTxErrAbortCountID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeTxErrBusyChannelCountWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeTxErrBusyChannelCountID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeRxTotalCountWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeRxTotalCountID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeRxUnicastCountWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeRxUnicastCountID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeRxBroadcastCountWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeRxBroadcastCountID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeRxDataCountWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeRxDataCountID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeRxDataPollCountWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeRxDataPollCountID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeRxBeaconCountWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeRxBeaconCountID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeRxBeaconRequestCountWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                                     attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeRxBeaconRequestCountID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeRxOtherCountWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeRxOtherCountID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeRxAddressFilteredCountWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeRxAddressFilteredCountID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeRxDestAddrFilteredCountWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeRxDestAddrFilteredCountID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeRxDuplicatedCountWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeRxDuplicatedCountID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeRxErrNoFrameCountWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeRxErrNoFrameCountID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeRxErrUnknownNeighborCountWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeRxErrUnknownNeighborCountID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeRxErrInvalidSrcAddrCountWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeRxErrInvalidSrcAddrCountID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeRxErrSecCountWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeRxErrSecCountID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeRxErrFcsCountWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeRxErrFcsCountID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeRxErrOtherCountWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeRxErrOtherCountID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeActiveTimestampWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeActiveTimestampID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributePendingTimestampWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributePendingTimestampID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeDelayWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeDelayID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeSecurityPolicyWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeSecurityPolicyID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeChannelPage0MaskWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeChannelPage0MaskID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeOperationalDatasetComponentsWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeOperationalDatasetComponentsID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeActiveNetworkFaultsListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeActiveNetworkFaultsListID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                                     attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeGeneratedCommandListID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                                     attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeAcceptedCommandListID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThreadNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterThreadNetworkDiagnosticsAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterThreadNetworkDiagnostics (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

- (void)resetCountsWithParams:(MTRThreadNetworkDiagnosticsClusterResetCountsParams * _Nullable)params
               expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
        expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
            completionHandler:(MTRStatusCompletion)completionHandler
{
    [self resetCountsWithParams:params
                 expectedValues:expectedDataValueDictionaries
          expectedValueInterval:expectedValueIntervalMs
                     completion:completionHandler];
}
- (void)resetCountsWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                    completionHandler:(MTRStatusCompletion)completionHandler
{
    [self resetCountsWithParams:nil
                 expectedValues:expectedValues
          expectedValueInterval:expectedValueIntervalMs
              completionHandler:completionHandler];
}
- (NSDictionary<NSString *, id> *)readAttributeNeighborTableListWithParams:(MTRReadParams * _Nullable)params
{
    return [self readAttributeNeighborTableWithParams:params];
}
- (NSDictionary<NSString *, id> *)readAttributeRouteTableListWithParams:(MTRReadParams * _Nullable)params
{
    return [self readAttributeRouteTableWithParams:params];
}
@end

@implementation MTRClusterWiFiNetworkDiagnostics

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (void)resetCountsWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                           completion:(MTRStatusCompletion)completion
{
    [self resetCountsWithParams:nil
                 expectedValues:expectedValues
          expectedValueInterval:expectedValueIntervalMs
                     completion:completion];
}
- (void)resetCountsWithParams:(MTRWiFiNetworkDiagnosticsClusterResetCountsParams * _Nullable)params
               expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                   completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeWiFiNetworkDiagnosticsID,
                                     (unsigned int) MTRCommandIDTypeClusterWiFiNetworkDiagnosticsCommandResetCountsID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                WiFiNetworkDiagnostics::Commands::ResetCounts::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (NSDictionary<NSString *, id> *)readAttributeBSSIDWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeWiFiNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterWiFiNetworkDiagnosticsAttributeBSSIDID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeSecurityTypeWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeWiFiNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterWiFiNetworkDiagnosticsAttributeSecurityTypeID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeWiFiVersionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeWiFiNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterWiFiNetworkDiagnosticsAttributeWiFiVersionID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeChannelNumberWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeWiFiNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterWiFiNetworkDiagnosticsAttributeChannelNumberID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeRSSIWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeWiFiNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterWiFiNetworkDiagnosticsAttributeRSSIID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeBeaconLostCountWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeWiFiNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterWiFiNetworkDiagnosticsAttributeBeaconLostCountID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeBeaconRxCountWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeWiFiNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterWiFiNetworkDiagnosticsAttributeBeaconRxCountID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributePacketMulticastRxCountWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeWiFiNetworkDiagnosticsID)
                                     attributeID:@(MTRAttributeIDTypeClusterWiFiNetworkDiagnosticsAttributePacketMulticastRxCountID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributePacketMulticastTxCountWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeWiFiNetworkDiagnosticsID)
                                     attributeID:@(MTRAttributeIDTypeClusterWiFiNetworkDiagnosticsAttributePacketMulticastTxCountID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributePacketUnicastRxCountWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeWiFiNetworkDiagnosticsID)
                                     attributeID:@(MTRAttributeIDTypeClusterWiFiNetworkDiagnosticsAttributePacketUnicastRxCountID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributePacketUnicastTxCountWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeWiFiNetworkDiagnosticsID)
                                     attributeID:@(MTRAttributeIDTypeClusterWiFiNetworkDiagnosticsAttributePacketUnicastTxCountID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeCurrentMaxRateWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeWiFiNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterWiFiNetworkDiagnosticsAttributeCurrentMaxRateID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeOverrunCountWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeWiFiNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterWiFiNetworkDiagnosticsAttributeOverrunCountID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeWiFiNetworkDiagnosticsID)
                                     attributeID:@(MTRAttributeIDTypeClusterWiFiNetworkDiagnosticsAttributeGeneratedCommandListID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeWiFiNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterWiFiNetworkDiagnosticsAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeWiFiNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterWiFiNetworkDiagnosticsAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeWiFiNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterWiFiNetworkDiagnosticsAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeWiFiNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterWiFiNetworkDiagnosticsAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterWiFiNetworkDiagnostics (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

- (void)resetCountsWithParams:(MTRWiFiNetworkDiagnosticsClusterResetCountsParams * _Nullable)params
               expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
        expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
            completionHandler:(MTRStatusCompletion)completionHandler
{
    [self resetCountsWithParams:params
                 expectedValues:expectedDataValueDictionaries
          expectedValueInterval:expectedValueIntervalMs
                     completion:completionHandler];
}
- (void)resetCountsWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                    completionHandler:(MTRStatusCompletion)completionHandler
{
    [self resetCountsWithParams:nil
                 expectedValues:expectedValues
          expectedValueInterval:expectedValueIntervalMs
              completionHandler:completionHandler];
}
- (NSDictionary<NSString *, id> *)readAttributeBssidWithParams:(MTRReadParams * _Nullable)params
{
    return [self readAttributeBSSIDWithParams:params];
}
- (NSDictionary<NSString *, id> *)readAttributeRssiWithParams:(MTRReadParams * _Nullable)params
{
    return [self readAttributeRSSIWithParams:params];
}
@end

@implementation MTRClusterEthernetNetworkDiagnostics

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (void)resetCountsWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                           completion:(MTRStatusCompletion)completion
{
    [self resetCountsWithParams:nil
                 expectedValues:expectedValues
          expectedValueInterval:expectedValueIntervalMs
                     completion:completion];
}
- (void)resetCountsWithParams:(MTREthernetNetworkDiagnosticsClusterResetCountsParams * _Nullable)params
               expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                   completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeEthernetNetworkDiagnosticsID,
                                     (unsigned int) MTRCommandIDTypeClusterEthernetNetworkDiagnosticsCommandResetCountsID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                EthernetNetworkDiagnostics::Commands::ResetCounts::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (NSDictionary<NSString *, id> *)readAttributePHYRateWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeEthernetNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterEthernetNetworkDiagnosticsAttributePHYRateID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFullDuplexWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeEthernetNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterEthernetNetworkDiagnosticsAttributeFullDuplexID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributePacketRxCountWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeEthernetNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterEthernetNetworkDiagnosticsAttributePacketRxCountID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributePacketTxCountWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeEthernetNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterEthernetNetworkDiagnosticsAttributePacketTxCountID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeTxErrCountWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeEthernetNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterEthernetNetworkDiagnosticsAttributeTxErrCountID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeCollisionCountWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeEthernetNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterEthernetNetworkDiagnosticsAttributeCollisionCountID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeOverrunCountWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeEthernetNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterEthernetNetworkDiagnosticsAttributeOverrunCountID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeCarrierDetectWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeEthernetNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterEthernetNetworkDiagnosticsAttributeCarrierDetectID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeTimeSinceResetWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeEthernetNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterEthernetNetworkDiagnosticsAttributeTimeSinceResetID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeEthernetNetworkDiagnosticsID)
                        attributeID:@(MTRAttributeIDTypeClusterEthernetNetworkDiagnosticsAttributeGeneratedCommandListID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeEthernetNetworkDiagnosticsID)
                        attributeID:@(MTRAttributeIDTypeClusterEthernetNetworkDiagnosticsAttributeAcceptedCommandListID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeEthernetNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterEthernetNetworkDiagnosticsAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeEthernetNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterEthernetNetworkDiagnosticsAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeEthernetNetworkDiagnosticsID)
                                        attributeID:@(MTRAttributeIDTypeClusterEthernetNetworkDiagnosticsAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterEthernetNetworkDiagnostics (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

- (void)resetCountsWithParams:(MTREthernetNetworkDiagnosticsClusterResetCountsParams * _Nullable)params
               expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
        expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
            completionHandler:(MTRStatusCompletion)completionHandler
{
    [self resetCountsWithParams:params
                 expectedValues:expectedDataValueDictionaries
          expectedValueInterval:expectedValueIntervalMs
                     completion:completionHandler];
}
- (void)resetCountsWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                    completionHandler:(MTRStatusCompletion)completionHandler
{
    [self resetCountsWithParams:nil
                 expectedValues:expectedValues
          expectedValueInterval:expectedValueIntervalMs
              completionHandler:completionHandler];
}
@end

@implementation MTRClusterBridgedDeviceBasicInformation

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (NSDictionary<NSString *, id> *)readAttributeVendorNameWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBridgedDeviceBasicInformationID)
                                        attributeID:@(MTRAttributeIDTypeClusterBridgedDeviceBasicInformationAttributeVendorNameID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeVendorIDWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBridgedDeviceBasicInformationID)
                                        attributeID:@(MTRAttributeIDTypeClusterBridgedDeviceBasicInformationAttributeVendorIDID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeProductNameWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBridgedDeviceBasicInformationID)
                                        attributeID:@(MTRAttributeIDTypeClusterBridgedDeviceBasicInformationAttributeProductNameID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeNodeLabelWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBridgedDeviceBasicInformationID)
                                        attributeID:@(MTRAttributeIDTypeClusterBridgedDeviceBasicInformationAttributeNodeLabelID)
                                             params:params];
}

- (void)writeAttributeNodeLabelWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                   expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeNodeLabelWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeNodeLabelWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                   expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                  params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeBridgedDeviceBasicInformationID)
                                  attributeID:@(MTRAttributeIDTypeClusterBridgedDeviceBasicInformationAttributeNodeLabelID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeHardwareVersionWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeBridgedDeviceBasicInformationID)
                                     attributeID:@(MTRAttributeIDTypeClusterBridgedDeviceBasicInformationAttributeHardwareVersionID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeHardwareVersionStringWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeBridgedDeviceBasicInformationID)
                        attributeID:@(MTRAttributeIDTypeClusterBridgedDeviceBasicInformationAttributeHardwareVersionStringID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeSoftwareVersionWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeBridgedDeviceBasicInformationID)
                                     attributeID:@(MTRAttributeIDTypeClusterBridgedDeviceBasicInformationAttributeSoftwareVersionID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeSoftwareVersionStringWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeBridgedDeviceBasicInformationID)
                        attributeID:@(MTRAttributeIDTypeClusterBridgedDeviceBasicInformationAttributeSoftwareVersionStringID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeManufacturingDateWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeBridgedDeviceBasicInformationID)
                        attributeID:@(MTRAttributeIDTypeClusterBridgedDeviceBasicInformationAttributeManufacturingDateID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributePartNumberWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBridgedDeviceBasicInformationID)
                                        attributeID:@(MTRAttributeIDTypeClusterBridgedDeviceBasicInformationAttributePartNumberID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeProductURLWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBridgedDeviceBasicInformationID)
                                        attributeID:@(MTRAttributeIDTypeClusterBridgedDeviceBasicInformationAttributeProductURLID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeProductLabelWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBridgedDeviceBasicInformationID)
                                        attributeID:@(MTRAttributeIDTypeClusterBridgedDeviceBasicInformationAttributeProductLabelID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeSerialNumberWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBridgedDeviceBasicInformationID)
                                        attributeID:@(MTRAttributeIDTypeClusterBridgedDeviceBasicInformationAttributeSerialNumberID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeReachableWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBridgedDeviceBasicInformationID)
                                        attributeID:@(MTRAttributeIDTypeClusterBridgedDeviceBasicInformationAttributeReachableID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeUniqueIDWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBridgedDeviceBasicInformationID)
                                        attributeID:@(MTRAttributeIDTypeClusterBridgedDeviceBasicInformationAttributeUniqueIDID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeProductAppearanceWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeBridgedDeviceBasicInformationID)
                        attributeID:@(MTRAttributeIDTypeClusterBridgedDeviceBasicInformationAttributeProductAppearanceID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeBridgedDeviceBasicInformationID)
                        attributeID:@(MTRAttributeIDTypeClusterBridgedDeviceBasicInformationAttributeGeneratedCommandListID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeBridgedDeviceBasicInformationID)
                        attributeID:@(MTRAttributeIDTypeClusterBridgedDeviceBasicInformationAttributeAcceptedCommandListID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeBridgedDeviceBasicInformationID)
                                     attributeID:@(MTRAttributeIDTypeClusterBridgedDeviceBasicInformationAttributeAttributeListID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBridgedDeviceBasicInformationID)
                                        attributeID:@(MTRAttributeIDTypeClusterBridgedDeviceBasicInformationAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeBridgedDeviceBasicInformationID)
                                     attributeID:@(MTRAttributeIDTypeClusterBridgedDeviceBasicInformationAttributeClusterRevisionID)
                                          params:params];
}

@end
@implementation MTRClusterBridgedDeviceBasic
@end

@implementation MTRClusterBridgedDeviceBasic (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

@end

@implementation MTRClusterSwitch

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (NSDictionary<NSString *, id> *)readAttributeNumberOfPositionsWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeSwitchID)
                                        attributeID:@(MTRAttributeIDTypeClusterSwitchAttributeNumberOfPositionsID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeCurrentPositionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeSwitchID)
                                        attributeID:@(MTRAttributeIDTypeClusterSwitchAttributeCurrentPositionID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeMultiPressMaxWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeSwitchID)
                                        attributeID:@(MTRAttributeIDTypeClusterSwitchAttributeMultiPressMaxID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeSwitchID)
                                        attributeID:@(MTRAttributeIDTypeClusterSwitchAttributeGeneratedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeSwitchID)
                                        attributeID:@(MTRAttributeIDTypeClusterSwitchAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeSwitchID)
                                        attributeID:@(MTRAttributeIDTypeClusterSwitchAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeSwitchID)
                                        attributeID:@(MTRAttributeIDTypeClusterSwitchAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeSwitchID)
                                        attributeID:@(MTRAttributeIDTypeClusterSwitchAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterSwitch (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

@end

@implementation MTRClusterAdministratorCommissioning

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (void)openCommissioningWindowWithParams:(MTRAdministratorCommissioningClusterOpenCommissioningWindowParams *)params
                           expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                               completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix =
        [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex, _endpoint,
                  (unsigned int) MTRClusterIDTypeAdministratorCommissioningID,
                  (unsigned int) MTRCommandIDTypeClusterAdministratorCommissioningCommandOpenCommissioningWindowID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                AdministratorCommissioning::Commands::OpenCommissioningWindow::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                if (!timedInvokeTimeoutMs.HasValue()) {
                    timedInvokeTimeoutMs.SetValue(10000);
                }
                request.commissioningTimeout = params.commissioningTimeout.unsignedShortValue;
                request.PAKEPasscodeVerifier = [self asByteSpan:params.pakePasscodeVerifier];
                request.discriminator = params.discriminator.unsignedShortValue;
                request.iterations = params.iterations.unsignedIntValue;
                request.salt = [self asByteSpan:params.salt];

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)openBasicCommissioningWindowWithParams:(MTRAdministratorCommissioningClusterOpenBasicCommissioningWindowParams *)params
                                expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                         expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                    completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix =
        [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex, _endpoint,
                  (unsigned int) MTRClusterIDTypeAdministratorCommissioningID,
                  (unsigned int) MTRCommandIDTypeClusterAdministratorCommissioningCommandOpenBasicCommissioningWindowID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                if (!timedInvokeTimeoutMs.HasValue()) {
                    timedInvokeTimeoutMs.SetValue(10000);
                }
                request.commissioningTimeout = params.commissioningTimeout.unsignedShortValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)revokeCommissioningWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                   completion:(MTRStatusCompletion)completion
{
    [self revokeCommissioningWithParams:nil
                         expectedValues:expectedValues
                  expectedValueInterval:expectedValueIntervalMs
                             completion:completion];
}
- (void)revokeCommissioningWithParams:(MTRAdministratorCommissioningClusterRevokeCommissioningParams * _Nullable)params
                       expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                           completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeAdministratorCommissioningID,
                                     (unsigned int) MTRCommandIDTypeClusterAdministratorCommissioningCommandRevokeCommissioningID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                AdministratorCommissioning::Commands::RevokeCommissioning::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                if (!timedInvokeTimeoutMs.HasValue()) {
                    timedInvokeTimeoutMs.SetValue(10000);
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (NSDictionary<NSString *, id> *)readAttributeWindowStatusWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeAdministratorCommissioningID)
                                        attributeID:@(MTRAttributeIDTypeClusterAdministratorCommissioningAttributeWindowStatusID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAdminFabricIndexWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeAdministratorCommissioningID)
                                     attributeID:@(MTRAttributeIDTypeClusterAdministratorCommissioningAttributeAdminFabricIndexID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAdminVendorIdWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeAdministratorCommissioningID)
                                        attributeID:@(MTRAttributeIDTypeClusterAdministratorCommissioningAttributeAdminVendorIdID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeAdministratorCommissioningID)
                        attributeID:@(MTRAttributeIDTypeClusterAdministratorCommissioningAttributeGeneratedCommandListID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeAdministratorCommissioningID)
                        attributeID:@(MTRAttributeIDTypeClusterAdministratorCommissioningAttributeAcceptedCommandListID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeAdministratorCommissioningID)
                                        attributeID:@(MTRAttributeIDTypeClusterAdministratorCommissioningAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeAdministratorCommissioningID)
                                        attributeID:@(MTRAttributeIDTypeClusterAdministratorCommissioningAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeAdministratorCommissioningID)
                                        attributeID:@(MTRAttributeIDTypeClusterAdministratorCommissioningAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterAdministratorCommissioning (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

- (void)openCommissioningWindowWithParams:(MTRAdministratorCommissioningClusterOpenCommissioningWindowParams *)params
                           expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
                    expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                        completionHandler:(MTRStatusCompletion)completionHandler
{
    [self openCommissioningWindowWithParams:params
                             expectedValues:expectedDataValueDictionaries
                      expectedValueInterval:expectedValueIntervalMs
                                 completion:completionHandler];
}
- (void)openBasicCommissioningWindowWithParams:(MTRAdministratorCommissioningClusterOpenBasicCommissioningWindowParams *)params
                                expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
                         expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                             completionHandler:(MTRStatusCompletion)completionHandler
{
    [self openBasicCommissioningWindowWithParams:params
                                  expectedValues:expectedDataValueDictionaries
                           expectedValueInterval:expectedValueIntervalMs
                                      completion:completionHandler];
}
- (void)revokeCommissioningWithParams:(MTRAdministratorCommissioningClusterRevokeCommissioningParams * _Nullable)params
                       expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
                expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                    completionHandler:(MTRStatusCompletion)completionHandler
{
    [self revokeCommissioningWithParams:params
                         expectedValues:expectedDataValueDictionaries
                  expectedValueInterval:expectedValueIntervalMs
                             completion:completionHandler];
}
- (void)revokeCommissioningWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                            completionHandler:(MTRStatusCompletion)completionHandler
{
    [self revokeCommissioningWithParams:nil
                         expectedValues:expectedValues
                  expectedValueInterval:expectedValueIntervalMs
                      completionHandler:completionHandler];
}
@end

@implementation MTRClusterOperationalCredentials

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (void)attestationRequestWithParams:(MTROperationalCredentialsClusterAttestationRequestParams *)params
                      expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
               expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                          completion:(void (^)(MTROperationalCredentialsClusterAttestationResponseParams * _Nullable data,
                                         NSError * _Nullable error))completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeOperationalCredentialsID,
                                     (unsigned int) MTRCommandIDTypeClusterOperationalCredentialsCommandAttestationRequestID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTROperationalCredentialsClusterAttestationResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                OperationalCredentialsClusterAttestationResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTROperationalCredentialsClusterAttestationResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                OperationalCredentials::Commands::AttestationRequest::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.attestationNonce = [self asByteSpan:params.attestationNonce];

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)certificateChainRequestWithParams:(MTROperationalCredentialsClusterCertificateChainRequestParams *)params
                           expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                               completion:(void (^)(MTROperationalCredentialsClusterCertificateChainResponseParams * _Nullable data,
                                              NSError * _Nullable error))completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeOperationalCredentialsID,
                                     (unsigned int) MTRCommandIDTypeClusterOperationalCredentialsCommandCertificateChainRequestID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTROperationalCredentialsClusterCertificateChainResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                OperationalCredentialsClusterCertificateChainResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTROperationalCredentialsClusterCertificateChainResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                OperationalCredentials::Commands::CertificateChainRequest::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.certificateType = static_cast<std::remove_reference_t<decltype(request.certificateType)>>(
                    params.certificateType.unsignedCharValue);

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)CSRRequestWithParams:(MTROperationalCredentialsClusterCSRRequestParams *)params
              expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
       expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                  completion:(void (^)(MTROperationalCredentialsClusterCSRResponseParams * _Nullable data,
                                 NSError * _Nullable error))completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeOperationalCredentialsID,
                                     (unsigned int) MTRCommandIDTypeClusterOperationalCredentialsCommandCSRRequestID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTROperationalCredentialsClusterCSRResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                OperationalCredentialsClusterCSRResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTROperationalCredentialsClusterCSRResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                OperationalCredentials::Commands::CSRRequest::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.CSRNonce = [self asByteSpan:params.csrNonce];
                if (params.isForUpdateNOC != nil) {
                    auto & definedValue_0 = request.isForUpdateNOC.Emplace();
                    definedValue_0 = params.isForUpdateNOC.boolValue;
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)addNOCWithParams:(MTROperationalCredentialsClusterAddNOCParams *)params
           expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
               completion:(void (^)(MTROperationalCredentialsClusterNOCResponseParams * _Nullable data,
                              NSError * _Nullable error))completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeOperationalCredentialsID,
                                     (unsigned int) MTRCommandIDTypeClusterOperationalCredentialsCommandAddNOCID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTROperationalCredentialsClusterNOCResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                OperationalCredentialsClusterNOCResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTROperationalCredentialsClusterNOCResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                OperationalCredentials::Commands::AddNOC::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.NOCValue = [self asByteSpan:params.nocValue];
                if (params.icacValue != nil) {
                    auto & definedValue_0 = request.ICACValue.Emplace();
                    definedValue_0 = [self asByteSpan:params.icacValue];
                }
                request.IPKValue = [self asByteSpan:params.ipkValue];
                request.caseAdminSubject = params.caseAdminSubject.unsignedLongLongValue;
                request.adminVendorId = static_cast<std::remove_reference_t<decltype(request.adminVendorId)>>(
                    params.adminVendorId.unsignedShortValue);

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)updateNOCWithParams:(MTROperationalCredentialsClusterUpdateNOCParams *)params
             expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                 completion:(void (^)(MTROperationalCredentialsClusterNOCResponseParams * _Nullable data,
                                NSError * _Nullable error))completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeOperationalCredentialsID,
                                     (unsigned int) MTRCommandIDTypeClusterOperationalCredentialsCommandUpdateNOCID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTROperationalCredentialsClusterNOCResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                OperationalCredentialsClusterNOCResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTROperationalCredentialsClusterNOCResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                OperationalCredentials::Commands::UpdateNOC::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.NOCValue = [self asByteSpan:params.nocValue];
                if (params.icacValue != nil) {
                    auto & definedValue_0 = request.ICACValue.Emplace();
                    definedValue_0 = [self asByteSpan:params.icacValue];
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)updateFabricLabelWithParams:(MTROperationalCredentialsClusterUpdateFabricLabelParams *)params
                     expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
              expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                         completion:(void (^)(MTROperationalCredentialsClusterNOCResponseParams * _Nullable data,
                                        NSError * _Nullable error))completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeOperationalCredentialsID,
                                     (unsigned int) MTRCommandIDTypeClusterOperationalCredentialsCommandUpdateFabricLabelID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTROperationalCredentialsClusterNOCResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                OperationalCredentialsClusterNOCResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTROperationalCredentialsClusterNOCResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                OperationalCredentials::Commands::UpdateFabricLabel::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.label = [self asCharSpan:params.label];

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)removeFabricWithParams:(MTROperationalCredentialsClusterRemoveFabricParams *)params
                expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
         expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                    completion:(void (^)(MTROperationalCredentialsClusterNOCResponseParams * _Nullable data,
                                   NSError * _Nullable error))completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeOperationalCredentialsID,
                                     (unsigned int) MTRCommandIDTypeClusterOperationalCredentialsCommandRemoveFabricID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTROperationalCredentialsClusterNOCResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                OperationalCredentialsClusterNOCResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTROperationalCredentialsClusterNOCResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                OperationalCredentials::Commands::RemoveFabric::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.fabricIndex = params.fabricIndex.unsignedCharValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)addTrustedRootCertificateWithParams:(MTROperationalCredentialsClusterAddTrustedRootCertificateParams *)params
                             expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                 completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix =
        [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex, _endpoint,
                  (unsigned int) MTRClusterIDTypeOperationalCredentialsID,
                  (unsigned int) MTRCommandIDTypeClusterOperationalCredentialsCommandAddTrustedRootCertificateID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                OperationalCredentials::Commands::AddTrustedRootCertificate::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.rootCACertificate = [self asByteSpan:params.rootCACertificate];

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (NSDictionary<NSString *, id> *)readAttributeNOCsWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeOperationalCredentialsID)
                                        attributeID:@(MTRAttributeIDTypeClusterOperationalCredentialsAttributeNOCsID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFabricsWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeOperationalCredentialsID)
                                        attributeID:@(MTRAttributeIDTypeClusterOperationalCredentialsAttributeFabricsID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeSupportedFabricsWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeOperationalCredentialsID)
                                        attributeID:@(MTRAttributeIDTypeClusterOperationalCredentialsAttributeSupportedFabricsID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeCommissionedFabricsWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeOperationalCredentialsID)
                                        attributeID:@(MTRAttributeIDTypeClusterOperationalCredentialsAttributeCommissionedFabricsID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeTrustedRootCertificatesWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeOperationalCredentialsID)
                        attributeID:@(MTRAttributeIDTypeClusterOperationalCredentialsAttributeTrustedRootCertificatesID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeCurrentFabricIndexWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeOperationalCredentialsID)
                                        attributeID:@(MTRAttributeIDTypeClusterOperationalCredentialsAttributeCurrentFabricIndexID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeOperationalCredentialsID)
                                     attributeID:@(MTRAttributeIDTypeClusterOperationalCredentialsAttributeGeneratedCommandListID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeOperationalCredentialsID)
                                        attributeID:@(MTRAttributeIDTypeClusterOperationalCredentialsAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeOperationalCredentialsID)
                                        attributeID:@(MTRAttributeIDTypeClusterOperationalCredentialsAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeOperationalCredentialsID)
                                        attributeID:@(MTRAttributeIDTypeClusterOperationalCredentialsAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeOperationalCredentialsID)
                                        attributeID:@(MTRAttributeIDTypeClusterOperationalCredentialsAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterOperationalCredentials (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

- (void)attestationRequestWithParams:(MTROperationalCredentialsClusterAttestationRequestParams *)params
                      expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
               expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                   completionHandler:(void (^)(MTROperationalCredentialsClusterAttestationResponseParams * _Nullable data,
                                         NSError * _Nullable error))completionHandler
{
    [self attestationRequestWithParams:params
                        expectedValues:expectedDataValueDictionaries
                 expectedValueInterval:expectedValueIntervalMs
                            completion:^(MTROperationalCredentialsClusterAttestationResponseParams * _Nullable data,
                                NSError * _Nullable error) {
                                // Cast is safe because subclass does not add any selectors.
                                completionHandler(
                                    static_cast<MTROperationalCredentialsClusterAttestationResponseParams *>(data), error);
                            }];
}
- (void)certificateChainRequestWithParams:(MTROperationalCredentialsClusterCertificateChainRequestParams *)params
                           expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
                    expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                        completionHandler:(void (^)(MTROperationalCredentialsClusterCertificateChainResponseParams * _Nullable data,
                                              NSError * _Nullable error))completionHandler
{
    [self
        certificateChainRequestWithParams:params
                           expectedValues:expectedDataValueDictionaries
                    expectedValueInterval:expectedValueIntervalMs
                               completion:^(MTROperationalCredentialsClusterCertificateChainResponseParams * _Nullable data,
                                   NSError * _Nullable error) {
                                   // Cast is safe because subclass does not add any selectors.
                                   completionHandler(
                                       static_cast<MTROperationalCredentialsClusterCertificateChainResponseParams *>(data), error);
                               }];
}
- (void)CSRRequestWithParams:(MTROperationalCredentialsClusterCSRRequestParams *)params
              expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
       expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
           completionHandler:(void (^)(MTROperationalCredentialsClusterCSRResponseParams * _Nullable data,
                                 NSError * _Nullable error))completionHandler
{
    [self CSRRequestWithParams:params
                expectedValues:expectedDataValueDictionaries
         expectedValueInterval:expectedValueIntervalMs
                    completion:^(MTROperationalCredentialsClusterCSRResponseParams * _Nullable data, NSError * _Nullable error) {
                        // Cast is safe because subclass does not add any selectors.
                        completionHandler(static_cast<MTROperationalCredentialsClusterCSRResponseParams *>(data), error);
                    }];
}
- (void)addNOCWithParams:(MTROperationalCredentialsClusterAddNOCParams *)params
           expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
    expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
        completionHandler:(void (^)(MTROperationalCredentialsClusterNOCResponseParams * _Nullable data,
                              NSError * _Nullable error))completionHandler
{
    [self addNOCWithParams:params
               expectedValues:expectedDataValueDictionaries
        expectedValueInterval:expectedValueIntervalMs
                   completion:^(MTROperationalCredentialsClusterNOCResponseParams * _Nullable data, NSError * _Nullable error) {
                       // Cast is safe because subclass does not add any selectors.
                       completionHandler(static_cast<MTROperationalCredentialsClusterNOCResponseParams *>(data), error);
                   }];
}
- (void)updateNOCWithParams:(MTROperationalCredentialsClusterUpdateNOCParams *)params
             expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
      expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
          completionHandler:(void (^)(MTROperationalCredentialsClusterNOCResponseParams * _Nullable data,
                                NSError * _Nullable error))completionHandler
{
    [self updateNOCWithParams:params
               expectedValues:expectedDataValueDictionaries
        expectedValueInterval:expectedValueIntervalMs
                   completion:^(MTROperationalCredentialsClusterNOCResponseParams * _Nullable data, NSError * _Nullable error) {
                       // Cast is safe because subclass does not add any selectors.
                       completionHandler(static_cast<MTROperationalCredentialsClusterNOCResponseParams *>(data), error);
                   }];
}
- (void)updateFabricLabelWithParams:(MTROperationalCredentialsClusterUpdateFabricLabelParams *)params
                     expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
              expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                  completionHandler:(void (^)(MTROperationalCredentialsClusterNOCResponseParams * _Nullable data,
                                        NSError * _Nullable error))completionHandler
{
    [self updateFabricLabelWithParams:params
                       expectedValues:expectedDataValueDictionaries
                expectedValueInterval:expectedValueIntervalMs
                           completion:^(
                               MTROperationalCredentialsClusterNOCResponseParams * _Nullable data, NSError * _Nullable error) {
                               // Cast is safe because subclass does not add any selectors.
                               completionHandler(static_cast<MTROperationalCredentialsClusterNOCResponseParams *>(data), error);
                           }];
}
- (void)removeFabricWithParams:(MTROperationalCredentialsClusterRemoveFabricParams *)params
                expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
         expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
             completionHandler:(void (^)(MTROperationalCredentialsClusterNOCResponseParams * _Nullable data,
                                   NSError * _Nullable error))completionHandler
{
    [self removeFabricWithParams:params
                  expectedValues:expectedDataValueDictionaries
           expectedValueInterval:expectedValueIntervalMs
                      completion:^(MTROperationalCredentialsClusterNOCResponseParams * _Nullable data, NSError * _Nullable error) {
                          // Cast is safe because subclass does not add any selectors.
                          completionHandler(static_cast<MTROperationalCredentialsClusterNOCResponseParams *>(data), error);
                      }];
}
- (void)addTrustedRootCertificateWithParams:(MTROperationalCredentialsClusterAddTrustedRootCertificateParams *)params
                             expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
                      expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                          completionHandler:(MTRStatusCompletion)completionHandler
{
    [self addTrustedRootCertificateWithParams:params
                               expectedValues:expectedDataValueDictionaries
                        expectedValueInterval:expectedValueIntervalMs
                                   completion:completionHandler];
}
@end

@implementation MTRClusterGroupKeyManagement

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (void)keySetWriteWithParams:(MTRGroupKeyManagementClusterKeySetWriteParams *)params
               expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                   completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeGroupKeyManagementID,
                                     (unsigned int) MTRCommandIDTypeClusterGroupKeyManagementCommandKeySetWriteID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                GroupKeyManagement::Commands::KeySetWrite::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.groupKeySet.groupKeySetID = params.groupKeySet.groupKeySetID.unsignedShortValue;
                request.groupKeySet.groupKeySecurityPolicy
                    = static_cast<std::remove_reference_t<decltype(request.groupKeySet.groupKeySecurityPolicy)>>(
                        params.groupKeySet.groupKeySecurityPolicy.unsignedCharValue);
                if (params.groupKeySet.epochKey0 == nil) {
                    request.groupKeySet.epochKey0.SetNull();
                } else {
                    auto & nonNullValue_1 = request.groupKeySet.epochKey0.SetNonNull();
                    nonNullValue_1 = [self asByteSpan:params.groupKeySet.epochKey0];
                }
                if (params.groupKeySet.epochStartTime0 == nil) {
                    request.groupKeySet.epochStartTime0.SetNull();
                } else {
                    auto & nonNullValue_1 = request.groupKeySet.epochStartTime0.SetNonNull();
                    nonNullValue_1 = params.groupKeySet.epochStartTime0.unsignedLongLongValue;
                }
                if (params.groupKeySet.epochKey1 == nil) {
                    request.groupKeySet.epochKey1.SetNull();
                } else {
                    auto & nonNullValue_1 = request.groupKeySet.epochKey1.SetNonNull();
                    nonNullValue_1 = [self asByteSpan:params.groupKeySet.epochKey1];
                }
                if (params.groupKeySet.epochStartTime1 == nil) {
                    request.groupKeySet.epochStartTime1.SetNull();
                } else {
                    auto & nonNullValue_1 = request.groupKeySet.epochStartTime1.SetNonNull();
                    nonNullValue_1 = params.groupKeySet.epochStartTime1.unsignedLongLongValue;
                }
                if (params.groupKeySet.epochKey2 == nil) {
                    request.groupKeySet.epochKey2.SetNull();
                } else {
                    auto & nonNullValue_1 = request.groupKeySet.epochKey2.SetNonNull();
                    nonNullValue_1 = [self asByteSpan:params.groupKeySet.epochKey2];
                }
                if (params.groupKeySet.epochStartTime2 == nil) {
                    request.groupKeySet.epochStartTime2.SetNull();
                } else {
                    auto & nonNullValue_1 = request.groupKeySet.epochStartTime2.SetNonNull();
                    nonNullValue_1 = params.groupKeySet.epochStartTime2.unsignedLongLongValue;
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)keySetReadWithParams:(MTRGroupKeyManagementClusterKeySetReadParams *)params
              expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
       expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                  completion:(void (^)(MTRGroupKeyManagementClusterKeySetReadResponseParams * _Nullable data,
                                 NSError * _Nullable error))completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeGroupKeyManagementID,
                                     (unsigned int) MTRCommandIDTypeClusterGroupKeyManagementCommandKeySetReadID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRGroupKeyManagementClusterKeySetReadResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                GroupKeyManagementClusterKeySetReadResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRGroupKeyManagementClusterKeySetReadResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                GroupKeyManagement::Commands::KeySetRead::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.groupKeySetID = params.groupKeySetID.unsignedShortValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)keySetRemoveWithParams:(MTRGroupKeyManagementClusterKeySetRemoveParams *)params
                expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
         expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                    completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeGroupKeyManagementID,
                                     (unsigned int) MTRCommandIDTypeClusterGroupKeyManagementCommandKeySetRemoveID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                GroupKeyManagement::Commands::KeySetRemove::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.groupKeySetID = params.groupKeySetID.unsignedShortValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)keySetReadAllIndicesWithParams:(MTRGroupKeyManagementClusterKeySetReadAllIndicesParams *)params
                        expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                 expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                            completion:(void (^)(MTRGroupKeyManagementClusterKeySetReadAllIndicesResponseParams * _Nullable data,
                                           NSError * _Nullable error))completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeGroupKeyManagementID,
                                     (unsigned int) MTRCommandIDTypeClusterGroupKeyManagementCommandKeySetReadAllIndicesID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRGroupKeyManagementClusterKeySetReadAllIndicesResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                GroupKeyManagementClusterKeySetReadAllIndicesResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRGroupKeyManagementClusterKeySetReadAllIndicesResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                GroupKeyManagement::Commands::KeySetReadAllIndices::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                {
                    using ListType_0 = std::remove_reference_t<decltype(request.groupKeySetIDs)>;
                    using ListMemberType_0 = ListMemberTypeGetter<ListType_0>::Type;
                    if (params.groupKeySetIDs.count != 0) {
                        auto * listHolder_0 = new ListHolder<ListMemberType_0>(params.groupKeySetIDs.count);
                        if (listHolder_0 == nullptr || listHolder_0->mList == nullptr) {
                            return CHIP_ERROR_INVALID_ARGUMENT;
                        }
                        listFreer.add(listHolder_0);
                        for (size_t i_0 = 0; i_0 < params.groupKeySetIDs.count; ++i_0) {
                            if (![params.groupKeySetIDs[i_0] isKindOfClass:[NSNumber class]]) {
                                // Wrong kind of value.
                                return CHIP_ERROR_INVALID_ARGUMENT;
                            }
                            auto element_0 = (NSNumber *) params.groupKeySetIDs[i_0];
                            listHolder_0->mList[i_0] = element_0.unsignedShortValue;
                        }
                        request.groupKeySetIDs = ListType_0(listHolder_0->mList, params.groupKeySetIDs.count);
                    } else {
                        request.groupKeySetIDs = ListType_0();
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (NSDictionary<NSString *, id> *)readAttributeGroupKeyMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeGroupKeyManagementID)
                                        attributeID:@(MTRAttributeIDTypeClusterGroupKeyManagementAttributeGroupKeyMapID)
                                             params:params];
}

- (void)writeAttributeGroupKeyMapWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                     expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeGroupKeyMapWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeGroupKeyMapWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                     expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                    params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeGroupKeyManagementID)
                                  attributeID:@(MTRAttributeIDTypeClusterGroupKeyManagementAttributeGroupKeyMapID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeGroupTableWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeGroupKeyManagementID)
                                        attributeID:@(MTRAttributeIDTypeClusterGroupKeyManagementAttributeGroupTableID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeMaxGroupsPerFabricWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeGroupKeyManagementID)
                                        attributeID:@(MTRAttributeIDTypeClusterGroupKeyManagementAttributeMaxGroupsPerFabricID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeMaxGroupKeysPerFabricWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeGroupKeyManagementID)
                                        attributeID:@(MTRAttributeIDTypeClusterGroupKeyManagementAttributeMaxGroupKeysPerFabricID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeGroupKeyManagementID)
                                        attributeID:@(MTRAttributeIDTypeClusterGroupKeyManagementAttributeGeneratedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeGroupKeyManagementID)
                                        attributeID:@(MTRAttributeIDTypeClusterGroupKeyManagementAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeGroupKeyManagementID)
                                        attributeID:@(MTRAttributeIDTypeClusterGroupKeyManagementAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeGroupKeyManagementID)
                                        attributeID:@(MTRAttributeIDTypeClusterGroupKeyManagementAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeGroupKeyManagementID)
                                        attributeID:@(MTRAttributeIDTypeClusterGroupKeyManagementAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterGroupKeyManagement (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

- (void)keySetWriteWithParams:(MTRGroupKeyManagementClusterKeySetWriteParams *)params
               expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
        expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
            completionHandler:(MTRStatusCompletion)completionHandler
{
    [self keySetWriteWithParams:params
                 expectedValues:expectedDataValueDictionaries
          expectedValueInterval:expectedValueIntervalMs
                     completion:completionHandler];
}
- (void)keySetReadWithParams:(MTRGroupKeyManagementClusterKeySetReadParams *)params
              expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
       expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
           completionHandler:(void (^)(MTRGroupKeyManagementClusterKeySetReadResponseParams * _Nullable data,
                                 NSError * _Nullable error))completionHandler
{
    [self keySetReadWithParams:params
                expectedValues:expectedDataValueDictionaries
         expectedValueInterval:expectedValueIntervalMs
                    completion:^(MTRGroupKeyManagementClusterKeySetReadResponseParams * _Nullable data, NSError * _Nullable error) {
                        // Cast is safe because subclass does not add any selectors.
                        completionHandler(static_cast<MTRGroupKeyManagementClusterKeySetReadResponseParams *>(data), error);
                    }];
}
- (void)keySetRemoveWithParams:(MTRGroupKeyManagementClusterKeySetRemoveParams *)params
                expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
         expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
             completionHandler:(MTRStatusCompletion)completionHandler
{
    [self keySetRemoveWithParams:params
                  expectedValues:expectedDataValueDictionaries
           expectedValueInterval:expectedValueIntervalMs
                      completion:completionHandler];
}
- (void)keySetReadAllIndicesWithParams:(MTRGroupKeyManagementClusterKeySetReadAllIndicesParams *)params
                        expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
                 expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                     completionHandler:(void (^)(MTRGroupKeyManagementClusterKeySetReadAllIndicesResponseParams * _Nullable data,
                                           NSError * _Nullable error))completionHandler
{
    [self keySetReadAllIndicesWithParams:params
                          expectedValues:expectedDataValueDictionaries
                   expectedValueInterval:expectedValueIntervalMs
                              completion:^(MTRGroupKeyManagementClusterKeySetReadAllIndicesResponseParams * _Nullable data,
                                  NSError * _Nullable error) {
                                  // Cast is safe because subclass does not add any selectors.
                                  completionHandler(
                                      static_cast<MTRGroupKeyManagementClusterKeySetReadAllIndicesResponseParams *>(data), error);
                              }];
}
@end

@implementation MTRClusterFixedLabel

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (NSDictionary<NSString *, id> *)readAttributeLabelListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeFixedLabelID)
                                        attributeID:@(MTRAttributeIDTypeClusterFixedLabelAttributeLabelListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeFixedLabelID)
                                        attributeID:@(MTRAttributeIDTypeClusterFixedLabelAttributeGeneratedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeFixedLabelID)
                                        attributeID:@(MTRAttributeIDTypeClusterFixedLabelAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeFixedLabelID)
                                        attributeID:@(MTRAttributeIDTypeClusterFixedLabelAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeFixedLabelID)
                                        attributeID:@(MTRAttributeIDTypeClusterFixedLabelAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeFixedLabelID)
                                        attributeID:@(MTRAttributeIDTypeClusterFixedLabelAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterFixedLabel (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

@end

@implementation MTRClusterUserLabel

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (NSDictionary<NSString *, id> *)readAttributeLabelListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUserLabelID)
                                        attributeID:@(MTRAttributeIDTypeClusterUserLabelAttributeLabelListID)
                                             params:params];
}

- (void)writeAttributeLabelListWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                   expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeLabelListWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeLabelListWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                   expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                  params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUserLabelID)
                                  attributeID:@(MTRAttributeIDTypeClusterUserLabelAttributeLabelListID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUserLabelID)
                                        attributeID:@(MTRAttributeIDTypeClusterUserLabelAttributeGeneratedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUserLabelID)
                                        attributeID:@(MTRAttributeIDTypeClusterUserLabelAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUserLabelID)
                                        attributeID:@(MTRAttributeIDTypeClusterUserLabelAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUserLabelID)
                                        attributeID:@(MTRAttributeIDTypeClusterUserLabelAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUserLabelID)
                                        attributeID:@(MTRAttributeIDTypeClusterUserLabelAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterUserLabel (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

@end

@implementation MTRClusterBooleanState

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (NSDictionary<NSString *, id> *)readAttributeStateValueWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBooleanStateID)
                                        attributeID:@(MTRAttributeIDTypeClusterBooleanStateAttributeStateValueID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBooleanStateID)
                                        attributeID:@(MTRAttributeIDTypeClusterBooleanStateAttributeGeneratedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBooleanStateID)
                                        attributeID:@(MTRAttributeIDTypeClusterBooleanStateAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBooleanStateID)
                                        attributeID:@(MTRAttributeIDTypeClusterBooleanStateAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBooleanStateID)
                                        attributeID:@(MTRAttributeIDTypeClusterBooleanStateAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBooleanStateID)
                                        attributeID:@(MTRAttributeIDTypeClusterBooleanStateAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterBooleanState (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

@end

@implementation MTRClusterModeSelect

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (void)changeToModeWithParams:(MTRModeSelectClusterChangeToModeParams *)params
                expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
         expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                    completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeModeSelectID,
                                     (unsigned int) MTRCommandIDTypeClusterModeSelectCommandChangeToModeID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                ModeSelect::Commands::ChangeToMode::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.newMode = params.newMode.unsignedCharValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (NSDictionary<NSString *, id> *)readAttributeDescriptionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeModeSelectID)
                                        attributeID:@(MTRAttributeIDTypeClusterModeSelectAttributeDescriptionID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeStandardNamespaceWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeModeSelectID)
                                        attributeID:@(MTRAttributeIDTypeClusterModeSelectAttributeStandardNamespaceID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeSupportedModesWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeModeSelectID)
                                        attributeID:@(MTRAttributeIDTypeClusterModeSelectAttributeSupportedModesID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeCurrentModeWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeModeSelectID)
                                        attributeID:@(MTRAttributeIDTypeClusterModeSelectAttributeCurrentModeID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeStartUpModeWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeModeSelectID)
                                        attributeID:@(MTRAttributeIDTypeClusterModeSelectAttributeStartUpModeID)
                                             params:params];
}

- (void)writeAttributeStartUpModeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                     expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeStartUpModeWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeStartUpModeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                     expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                    params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeModeSelectID)
                                  attributeID:@(MTRAttributeIDTypeClusterModeSelectAttributeStartUpModeID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeOnModeWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeModeSelectID)
                                        attributeID:@(MTRAttributeIDTypeClusterModeSelectAttributeOnModeID)
                                             params:params];
}

- (void)writeAttributeOnModeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeOnModeWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeOnModeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                               params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeModeSelectID)
                                  attributeID:@(MTRAttributeIDTypeClusterModeSelectAttributeOnModeID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeModeSelectID)
                                        attributeID:@(MTRAttributeIDTypeClusterModeSelectAttributeGeneratedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeModeSelectID)
                                        attributeID:@(MTRAttributeIDTypeClusterModeSelectAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeModeSelectID)
                                        attributeID:@(MTRAttributeIDTypeClusterModeSelectAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeModeSelectID)
                                        attributeID:@(MTRAttributeIDTypeClusterModeSelectAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeModeSelectID)
                                        attributeID:@(MTRAttributeIDTypeClusterModeSelectAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterModeSelect (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

- (void)changeToModeWithParams:(MTRModeSelectClusterChangeToModeParams *)params
                expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
         expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
             completionHandler:(MTRStatusCompletion)completionHandler
{
    [self changeToModeWithParams:params
                  expectedValues:expectedDataValueDictionaries
           expectedValueInterval:expectedValueIntervalMs
                      completion:completionHandler];
}
@end

@implementation MTRClusterAirQuality

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (NSDictionary<NSString *, id> *)readAttributeAirQualityWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeAirQualityID)
                                        attributeID:@(MTRAttributeIDTypeClusterAirQualityAttributeAirQualityID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeAirQualityID)
                                        attributeID:@(MTRAttributeIDTypeClusterAirQualityAttributeGeneratedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeAirQualityID)
                                        attributeID:@(MTRAttributeIDTypeClusterAirQualityAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeAirQualityID)
                                        attributeID:@(MTRAttributeIDTypeClusterAirQualityAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeAirQualityID)
                                        attributeID:@(MTRAttributeIDTypeClusterAirQualityAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeAirQualityID)
                                        attributeID:@(MTRAttributeIDTypeClusterAirQualityAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterHEPAFilterMonitoring

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (void)resetConditionWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                   expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                              completion:(MTRStatusCompletion)completion
{
    [self resetConditionWithParams:nil
                    expectedValues:expectedValues
             expectedValueInterval:expectedValueIntervalMs
                        completion:completion];
}
- (void)resetConditionWithParams:(MTRHEPAFilterMonitoringClusterResetConditionParams * _Nullable)params
                  expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
           expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                      completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeHEPAFilterMonitoringID,
                                     (unsigned int) MTRCommandIDTypeClusterHEPAFilterMonitoringCommandResetConditionID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                HepaFilterMonitoring::Commands::ResetCondition::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (NSDictionary<NSString *, id> *)readAttributeConditionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeHEPAFilterMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterHEPAFilterMonitoringAttributeConditionID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeDegradationDirectionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeHEPAFilterMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterHEPAFilterMonitoringAttributeDegradationDirectionID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeChangeIndicationWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeHEPAFilterMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterHEPAFilterMonitoringAttributeChangeIndicationID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeInPlaceIndicatorWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeHEPAFilterMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterHEPAFilterMonitoringAttributeInPlaceIndicatorID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeHEPAFilterMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterHEPAFilterMonitoringAttributeGeneratedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeHEPAFilterMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterHEPAFilterMonitoringAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeHEPAFilterMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterHEPAFilterMonitoringAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeHEPAFilterMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterHEPAFilterMonitoringAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeHEPAFilterMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterHEPAFilterMonitoringAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterActivatedCarbonFilterMonitoring

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (void)resetConditionWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                   expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                              completion:(MTRStatusCompletion)completion
{
    [self resetConditionWithParams:nil
                    expectedValues:expectedValues
             expectedValueInterval:expectedValueIntervalMs
                        completion:completion];
}
- (void)resetConditionWithParams:(MTRActivatedCarbonFilterMonitoringClusterResetConditionParams * _Nullable)params
                  expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
           expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                      completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeActivatedCarbonFilterMonitoringID,
                                     (unsigned int) MTRCommandIDTypeClusterActivatedCarbonFilterMonitoringCommandResetConditionID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                ActivatedCarbonFilterMonitoring::Commands::ResetCondition::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (NSDictionary<NSString *, id> *)readAttributeConditionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeActivatedCarbonFilterMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterActivatedCarbonFilterMonitoringAttributeConditionID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeDegradationDirectionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeActivatedCarbonFilterMonitoringID)
                        attributeID:@(MTRAttributeIDTypeClusterActivatedCarbonFilterMonitoringAttributeDegradationDirectionID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeChangeIndicationWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeActivatedCarbonFilterMonitoringID)
                        attributeID:@(MTRAttributeIDTypeClusterActivatedCarbonFilterMonitoringAttributeChangeIndicationID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeInPlaceIndicatorWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeActivatedCarbonFilterMonitoringID)
                        attributeID:@(MTRAttributeIDTypeClusterActivatedCarbonFilterMonitoringAttributeInPlaceIndicatorID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeActivatedCarbonFilterMonitoringID)
                        attributeID:@(MTRAttributeIDTypeClusterActivatedCarbonFilterMonitoringAttributeGeneratedCommandListID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeActivatedCarbonFilterMonitoringID)
                        attributeID:@(MTRAttributeIDTypeClusterActivatedCarbonFilterMonitoringAttributeAcceptedCommandListID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeActivatedCarbonFilterMonitoringID)
                                     attributeID:@(MTRAttributeIDTypeClusterActivatedCarbonFilterMonitoringAttributeAttributeListID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeActivatedCarbonFilterMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterActivatedCarbonFilterMonitoringAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeActivatedCarbonFilterMonitoringID)
                        attributeID:@(MTRAttributeIDTypeClusterActivatedCarbonFilterMonitoringAttributeClusterRevisionID)
                             params:params];
}

@end

@implementation MTRClusterCeramicFilterMonitoring

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (void)resetConditionWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                   expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                              completion:(MTRStatusCompletion)completion
{
    [self resetConditionWithParams:nil
                    expectedValues:expectedValues
             expectedValueInterval:expectedValueIntervalMs
                        completion:completion];
}
- (void)resetConditionWithParams:(MTRCeramicFilterMonitoringClusterResetConditionParams * _Nullable)params
                  expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
           expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                      completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeCeramicFilterMonitoringID,
                                     (unsigned int) MTRCommandIDTypeClusterCeramicFilterMonitoringCommandResetConditionID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                CeramicFilterMonitoring::Commands::ResetCondition::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (NSDictionary<NSString *, id> *)readAttributeConditionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeCeramicFilterMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterCeramicFilterMonitoringAttributeConditionID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeDegradationDirectionWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeCeramicFilterMonitoringID)
                                     attributeID:@(MTRAttributeIDTypeClusterCeramicFilterMonitoringAttributeDegradationDirectionID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeChangeIndicationWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeCeramicFilterMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterCeramicFilterMonitoringAttributeChangeIndicationID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeInPlaceIndicatorWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeCeramicFilterMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterCeramicFilterMonitoringAttributeInPlaceIndicatorID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeCeramicFilterMonitoringID)
                                     attributeID:@(MTRAttributeIDTypeClusterCeramicFilterMonitoringAttributeGeneratedCommandListID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeCeramicFilterMonitoringID)
                                     attributeID:@(MTRAttributeIDTypeClusterCeramicFilterMonitoringAttributeAcceptedCommandListID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeCeramicFilterMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterCeramicFilterMonitoringAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeCeramicFilterMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterCeramicFilterMonitoringAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeCeramicFilterMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterCeramicFilterMonitoringAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterElectrostaticFilterMonitoring

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (void)resetConditionWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                   expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                              completion:(MTRStatusCompletion)completion
{
    [self resetConditionWithParams:nil
                    expectedValues:expectedValues
             expectedValueInterval:expectedValueIntervalMs
                        completion:completion];
}
- (void)resetConditionWithParams:(MTRElectrostaticFilterMonitoringClusterResetConditionParams * _Nullable)params
                  expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
           expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                      completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeElectrostaticFilterMonitoringID,
                                     (unsigned int) MTRCommandIDTypeClusterElectrostaticFilterMonitoringCommandResetConditionID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                ElectrostaticFilterMonitoring::Commands::ResetCondition::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (NSDictionary<NSString *, id> *)readAttributeConditionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectrostaticFilterMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectrostaticFilterMonitoringAttributeConditionID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeDegradationDirectionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeElectrostaticFilterMonitoringID)
                        attributeID:@(MTRAttributeIDTypeClusterElectrostaticFilterMonitoringAttributeDegradationDirectionID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeChangeIndicationWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeElectrostaticFilterMonitoringID)
                        attributeID:@(MTRAttributeIDTypeClusterElectrostaticFilterMonitoringAttributeChangeIndicationID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeInPlaceIndicatorWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeElectrostaticFilterMonitoringID)
                        attributeID:@(MTRAttributeIDTypeClusterElectrostaticFilterMonitoringAttributeInPlaceIndicatorID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeElectrostaticFilterMonitoringID)
                        attributeID:@(MTRAttributeIDTypeClusterElectrostaticFilterMonitoringAttributeGeneratedCommandListID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeElectrostaticFilterMonitoringID)
                        attributeID:@(MTRAttributeIDTypeClusterElectrostaticFilterMonitoringAttributeAcceptedCommandListID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeElectrostaticFilterMonitoringID)
                                     attributeID:@(MTRAttributeIDTypeClusterElectrostaticFilterMonitoringAttributeAttributeListID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectrostaticFilterMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectrostaticFilterMonitoringAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeElectrostaticFilterMonitoringID)
                                     attributeID:@(MTRAttributeIDTypeClusterElectrostaticFilterMonitoringAttributeClusterRevisionID)
                                          params:params];
}

@end

@implementation MTRClusterUVFilterMonitoring

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (void)resetConditionWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                   expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                              completion:(MTRStatusCompletion)completion
{
    [self resetConditionWithParams:nil
                    expectedValues:expectedValues
             expectedValueInterval:expectedValueIntervalMs
                        completion:completion];
}
- (void)resetConditionWithParams:(MTRUVFilterMonitoringClusterResetConditionParams * _Nullable)params
                  expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
           expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                      completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeUVFilterMonitoringID,
                                     (unsigned int) MTRCommandIDTypeClusterUVFilterMonitoringCommandResetConditionID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                UvFilterMonitoring::Commands::ResetCondition::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (NSDictionary<NSString *, id> *)readAttributeConditionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUVFilterMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterUVFilterMonitoringAttributeConditionID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeDegradationDirectionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUVFilterMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterUVFilterMonitoringAttributeDegradationDirectionID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeChangeIndicationWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUVFilterMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterUVFilterMonitoringAttributeChangeIndicationID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeInPlaceIndicatorWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUVFilterMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterUVFilterMonitoringAttributeInPlaceIndicatorID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUVFilterMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterUVFilterMonitoringAttributeGeneratedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUVFilterMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterUVFilterMonitoringAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUVFilterMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterUVFilterMonitoringAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUVFilterMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterUVFilterMonitoringAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUVFilterMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterUVFilterMonitoringAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterIonizingFilterMonitoring

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (void)resetConditionWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                   expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                              completion:(MTRStatusCompletion)completion
{
    [self resetConditionWithParams:nil
                    expectedValues:expectedValues
             expectedValueInterval:expectedValueIntervalMs
                        completion:completion];
}
- (void)resetConditionWithParams:(MTRIonizingFilterMonitoringClusterResetConditionParams * _Nullable)params
                  expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
           expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                      completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeIonizingFilterMonitoringID,
                                     (unsigned int) MTRCommandIDTypeClusterIonizingFilterMonitoringCommandResetConditionID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                IonizingFilterMonitoring::Commands::ResetCondition::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (NSDictionary<NSString *, id> *)readAttributeConditionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeIonizingFilterMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterIonizingFilterMonitoringAttributeConditionID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeDegradationDirectionWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeIonizingFilterMonitoringID)
                                     attributeID:@(MTRAttributeIDTypeClusterIonizingFilterMonitoringAttributeDegradationDirectionID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeChangeIndicationWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeIonizingFilterMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterIonizingFilterMonitoringAttributeChangeIndicationID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeInPlaceIndicatorWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeIonizingFilterMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterIonizingFilterMonitoringAttributeInPlaceIndicatorID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeIonizingFilterMonitoringID)
                                     attributeID:@(MTRAttributeIDTypeClusterIonizingFilterMonitoringAttributeGeneratedCommandListID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeIonizingFilterMonitoringID)
                                     attributeID:@(MTRAttributeIDTypeClusterIonizingFilterMonitoringAttributeAcceptedCommandListID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeIonizingFilterMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterIonizingFilterMonitoringAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeIonizingFilterMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterIonizingFilterMonitoringAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeIonizingFilterMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterIonizingFilterMonitoringAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterZeoliteFilterMonitoring

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (void)resetConditionWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                   expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                              completion:(MTRStatusCompletion)completion
{
    [self resetConditionWithParams:nil
                    expectedValues:expectedValues
             expectedValueInterval:expectedValueIntervalMs
                        completion:completion];
}
- (void)resetConditionWithParams:(MTRZeoliteFilterMonitoringClusterResetConditionParams * _Nullable)params
                  expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
           expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                      completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeZeoliteFilterMonitoringID,
                                     (unsigned int) MTRCommandIDTypeClusterZeoliteFilterMonitoringCommandResetConditionID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                ZeoliteFilterMonitoring::Commands::ResetCondition::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (NSDictionary<NSString *, id> *)readAttributeConditionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeZeoliteFilterMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterZeoliteFilterMonitoringAttributeConditionID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeDegradationDirectionWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeZeoliteFilterMonitoringID)
                                     attributeID:@(MTRAttributeIDTypeClusterZeoliteFilterMonitoringAttributeDegradationDirectionID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeChangeIndicationWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeZeoliteFilterMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterZeoliteFilterMonitoringAttributeChangeIndicationID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeInPlaceIndicatorWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeZeoliteFilterMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterZeoliteFilterMonitoringAttributeInPlaceIndicatorID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeZeoliteFilterMonitoringID)
                                     attributeID:@(MTRAttributeIDTypeClusterZeoliteFilterMonitoringAttributeGeneratedCommandListID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeZeoliteFilterMonitoringID)
                                     attributeID:@(MTRAttributeIDTypeClusterZeoliteFilterMonitoringAttributeAcceptedCommandListID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeZeoliteFilterMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterZeoliteFilterMonitoringAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeZeoliteFilterMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterZeoliteFilterMonitoringAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeZeoliteFilterMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterZeoliteFilterMonitoringAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterOzoneFilterMonitoring

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (void)resetConditionWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                   expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                              completion:(MTRStatusCompletion)completion
{
    [self resetConditionWithParams:nil
                    expectedValues:expectedValues
             expectedValueInterval:expectedValueIntervalMs
                        completion:completion];
}
- (void)resetConditionWithParams:(MTROzoneFilterMonitoringClusterResetConditionParams * _Nullable)params
                  expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
           expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                      completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeOzoneFilterMonitoringID,
                                     (unsigned int) MTRCommandIDTypeClusterOzoneFilterMonitoringCommandResetConditionID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                OzoneFilterMonitoring::Commands::ResetCondition::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (NSDictionary<NSString *, id> *)readAttributeConditionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeOzoneFilterMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterOzoneFilterMonitoringAttributeConditionID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeDegradationDirectionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeOzoneFilterMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterOzoneFilterMonitoringAttributeDegradationDirectionID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeChangeIndicationWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeOzoneFilterMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterOzoneFilterMonitoringAttributeChangeIndicationID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeInPlaceIndicatorWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeOzoneFilterMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterOzoneFilterMonitoringAttributeInPlaceIndicatorID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeOzoneFilterMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterOzoneFilterMonitoringAttributeGeneratedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeOzoneFilterMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterOzoneFilterMonitoringAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeOzoneFilterMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterOzoneFilterMonitoringAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeOzoneFilterMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterOzoneFilterMonitoringAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeOzoneFilterMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterOzoneFilterMonitoringAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterWaterTankMonitoring

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (void)resetConditionWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                   expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                              completion:(MTRStatusCompletion)completion
{
    [self resetConditionWithParams:nil
                    expectedValues:expectedValues
             expectedValueInterval:expectedValueIntervalMs
                        completion:completion];
}
- (void)resetConditionWithParams:(MTRWaterTankMonitoringClusterResetConditionParams * _Nullable)params
                  expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
           expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                      completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeWaterTankMonitoringID,
                                     (unsigned int) MTRCommandIDTypeClusterWaterTankMonitoringCommandResetConditionID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                WaterTankMonitoring::Commands::ResetCondition::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (NSDictionary<NSString *, id> *)readAttributeConditionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeWaterTankMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterWaterTankMonitoringAttributeConditionID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeDegradationDirectionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeWaterTankMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterWaterTankMonitoringAttributeDegradationDirectionID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeChangeIndicationWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeWaterTankMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterWaterTankMonitoringAttributeChangeIndicationID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeInPlaceIndicatorWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeWaterTankMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterWaterTankMonitoringAttributeInPlaceIndicatorID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeWaterTankMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterWaterTankMonitoringAttributeGeneratedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeWaterTankMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterWaterTankMonitoringAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeWaterTankMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterWaterTankMonitoringAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeWaterTankMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterWaterTankMonitoringAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeWaterTankMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterWaterTankMonitoringAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterFuelTankMonitoring

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (void)resetConditionWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                   expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                              completion:(MTRStatusCompletion)completion
{
    [self resetConditionWithParams:nil
                    expectedValues:expectedValues
             expectedValueInterval:expectedValueIntervalMs
                        completion:completion];
}
- (void)resetConditionWithParams:(MTRFuelTankMonitoringClusterResetConditionParams * _Nullable)params
                  expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
           expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                      completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeFuelTankMonitoringID,
                                     (unsigned int) MTRCommandIDTypeClusterFuelTankMonitoringCommandResetConditionID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                FuelTankMonitoring::Commands::ResetCondition::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (NSDictionary<NSString *, id> *)readAttributeConditionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeFuelTankMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterFuelTankMonitoringAttributeConditionID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeDegradationDirectionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeFuelTankMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterFuelTankMonitoringAttributeDegradationDirectionID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeChangeIndicationWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeFuelTankMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterFuelTankMonitoringAttributeChangeIndicationID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeInPlaceIndicatorWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeFuelTankMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterFuelTankMonitoringAttributeInPlaceIndicatorID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeFuelTankMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterFuelTankMonitoringAttributeGeneratedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeFuelTankMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterFuelTankMonitoringAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeFuelTankMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterFuelTankMonitoringAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeFuelTankMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterFuelTankMonitoringAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeFuelTankMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterFuelTankMonitoringAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterInkCartridgeMonitoring

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (void)resetConditionWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                   expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                              completion:(MTRStatusCompletion)completion
{
    [self resetConditionWithParams:nil
                    expectedValues:expectedValues
             expectedValueInterval:expectedValueIntervalMs
                        completion:completion];
}
- (void)resetConditionWithParams:(MTRInkCartridgeMonitoringClusterResetConditionParams * _Nullable)params
                  expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
           expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                      completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeInkCartridgeMonitoringID,
                                     (unsigned int) MTRCommandIDTypeClusterInkCartridgeMonitoringCommandResetConditionID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                InkCartridgeMonitoring::Commands::ResetCondition::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (NSDictionary<NSString *, id> *)readAttributeConditionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeInkCartridgeMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterInkCartridgeMonitoringAttributeConditionID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeDegradationDirectionWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeInkCartridgeMonitoringID)
                                     attributeID:@(MTRAttributeIDTypeClusterInkCartridgeMonitoringAttributeDegradationDirectionID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeChangeIndicationWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeInkCartridgeMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterInkCartridgeMonitoringAttributeChangeIndicationID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeInPlaceIndicatorWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeInkCartridgeMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterInkCartridgeMonitoringAttributeInPlaceIndicatorID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeInkCartridgeMonitoringID)
                                     attributeID:@(MTRAttributeIDTypeClusterInkCartridgeMonitoringAttributeGeneratedCommandListID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeInkCartridgeMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterInkCartridgeMonitoringAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeInkCartridgeMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterInkCartridgeMonitoringAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeInkCartridgeMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterInkCartridgeMonitoringAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeInkCartridgeMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterInkCartridgeMonitoringAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterTonerCartridgeMonitoring

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (void)resetConditionWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                   expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                              completion:(MTRStatusCompletion)completion
{
    [self resetConditionWithParams:nil
                    expectedValues:expectedValues
             expectedValueInterval:expectedValueIntervalMs
                        completion:completion];
}
- (void)resetConditionWithParams:(MTRTonerCartridgeMonitoringClusterResetConditionParams * _Nullable)params
                  expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
           expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                      completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeTonerCartridgeMonitoringID,
                                     (unsigned int) MTRCommandIDTypeClusterTonerCartridgeMonitoringCommandResetConditionID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                TonerCartridgeMonitoring::Commands::ResetCondition::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (NSDictionary<NSString *, id> *)readAttributeConditionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeTonerCartridgeMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterTonerCartridgeMonitoringAttributeConditionID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeDegradationDirectionWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeTonerCartridgeMonitoringID)
                                     attributeID:@(MTRAttributeIDTypeClusterTonerCartridgeMonitoringAttributeDegradationDirectionID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeChangeIndicationWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeTonerCartridgeMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterTonerCartridgeMonitoringAttributeChangeIndicationID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeInPlaceIndicatorWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeTonerCartridgeMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterTonerCartridgeMonitoringAttributeInPlaceIndicatorID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeTonerCartridgeMonitoringID)
                                     attributeID:@(MTRAttributeIDTypeClusterTonerCartridgeMonitoringAttributeGeneratedCommandListID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeTonerCartridgeMonitoringID)
                                     attributeID:@(MTRAttributeIDTypeClusterTonerCartridgeMonitoringAttributeAcceptedCommandListID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeTonerCartridgeMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterTonerCartridgeMonitoringAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeTonerCartridgeMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterTonerCartridgeMonitoringAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeTonerCartridgeMonitoringID)
                                        attributeID:@(MTRAttributeIDTypeClusterTonerCartridgeMonitoringAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterDoorLock

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (void)lockDoorWithParams:(MTRDoorLockClusterLockDoorParams * _Nullable)params
            expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
     expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix =
        [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex, _endpoint,
                  (unsigned int) MTRClusterIDTypeDoorLockID, (unsigned int) MTRCommandIDTypeClusterDoorLockCommandLockDoorID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                DoorLock::Commands::LockDoor::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                if (!timedInvokeTimeoutMs.HasValue()) {
                    timedInvokeTimeoutMs.SetValue(10000);
                }
                if (params != nil) {
                    if (params.pinCode != nil) {
                        auto & definedValue_0 = request.PINCode.Emplace();
                        definedValue_0 = [self asByteSpan:params.pinCode];
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)unlockDoorWithParams:(MTRDoorLockClusterUnlockDoorParams * _Nullable)params
              expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
       expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                  completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix =
        [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex, _endpoint,
                  (unsigned int) MTRClusterIDTypeDoorLockID, (unsigned int) MTRCommandIDTypeClusterDoorLockCommandUnlockDoorID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                DoorLock::Commands::UnlockDoor::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                if (!timedInvokeTimeoutMs.HasValue()) {
                    timedInvokeTimeoutMs.SetValue(10000);
                }
                if (params != nil) {
                    if (params.pinCode != nil) {
                        auto & definedValue_0 = request.PINCode.Emplace();
                        definedValue_0 = [self asByteSpan:params.pinCode];
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)unlockWithTimeoutWithParams:(MTRDoorLockClusterUnlockWithTimeoutParams *)params
                     expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
              expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                         completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeDoorLockID,
                                     (unsigned int) MTRCommandIDTypeClusterDoorLockCommandUnlockWithTimeoutID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                DoorLock::Commands::UnlockWithTimeout::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                if (!timedInvokeTimeoutMs.HasValue()) {
                    timedInvokeTimeoutMs.SetValue(10000);
                }
                request.timeout = params.timeout.unsignedShortValue;
                if (params.pinCode != nil) {
                    auto & definedValue_0 = request.PINCode.Emplace();
                    definedValue_0 = [self asByteSpan:params.pinCode];
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)setWeekDayScheduleWithParams:(MTRDoorLockClusterSetWeekDayScheduleParams *)params
                      expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
               expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                          completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeDoorLockID,
                                     (unsigned int) MTRCommandIDTypeClusterDoorLockCommandSetWeekDayScheduleID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                DoorLock::Commands::SetWeekDaySchedule::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.weekDayIndex = params.weekDayIndex.unsignedCharValue;
                request.userIndex = params.userIndex.unsignedShortValue;
                request.daysMask
                    = static_cast<std::remove_reference_t<decltype(request.daysMask)>>(params.daysMask.unsignedCharValue);
                request.startHour = params.startHour.unsignedCharValue;
                request.startMinute = params.startMinute.unsignedCharValue;
                request.endHour = params.endHour.unsignedCharValue;
                request.endMinute = params.endMinute.unsignedCharValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)getWeekDayScheduleWithParams:(MTRDoorLockClusterGetWeekDayScheduleParams *)params
                      expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
               expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                          completion:(void (^)(MTRDoorLockClusterGetWeekDayScheduleResponseParams * _Nullable data,
                                         NSError * _Nullable error))completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeDoorLockID,
                                     (unsigned int) MTRCommandIDTypeClusterDoorLockCommandGetWeekDayScheduleID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRDoorLockClusterGetWeekDayScheduleResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                DoorLockClusterGetWeekDayScheduleResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRDoorLockClusterGetWeekDayScheduleResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                DoorLock::Commands::GetWeekDaySchedule::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.weekDayIndex = params.weekDayIndex.unsignedCharValue;
                request.userIndex = params.userIndex.unsignedShortValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)clearWeekDayScheduleWithParams:(MTRDoorLockClusterClearWeekDayScheduleParams *)params
                        expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                 expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                            completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeDoorLockID,
                                     (unsigned int) MTRCommandIDTypeClusterDoorLockCommandClearWeekDayScheduleID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                DoorLock::Commands::ClearWeekDaySchedule::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.weekDayIndex = params.weekDayIndex.unsignedCharValue;
                request.userIndex = params.userIndex.unsignedShortValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)setYearDayScheduleWithParams:(MTRDoorLockClusterSetYearDayScheduleParams *)params
                      expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
               expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                          completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeDoorLockID,
                                     (unsigned int) MTRCommandIDTypeClusterDoorLockCommandSetYearDayScheduleID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                DoorLock::Commands::SetYearDaySchedule::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.yearDayIndex = params.yearDayIndex.unsignedCharValue;
                request.userIndex = params.userIndex.unsignedShortValue;
                request.localStartTime = params.localStartTime.unsignedIntValue;
                request.localEndTime = params.localEndTime.unsignedIntValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)getYearDayScheduleWithParams:(MTRDoorLockClusterGetYearDayScheduleParams *)params
                      expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
               expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                          completion:(void (^)(MTRDoorLockClusterGetYearDayScheduleResponseParams * _Nullable data,
                                         NSError * _Nullable error))completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeDoorLockID,
                                     (unsigned int) MTRCommandIDTypeClusterDoorLockCommandGetYearDayScheduleID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRDoorLockClusterGetYearDayScheduleResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                DoorLockClusterGetYearDayScheduleResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRDoorLockClusterGetYearDayScheduleResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                DoorLock::Commands::GetYearDaySchedule::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.yearDayIndex = params.yearDayIndex.unsignedCharValue;
                request.userIndex = params.userIndex.unsignedShortValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)clearYearDayScheduleWithParams:(MTRDoorLockClusterClearYearDayScheduleParams *)params
                        expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                 expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                            completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeDoorLockID,
                                     (unsigned int) MTRCommandIDTypeClusterDoorLockCommandClearYearDayScheduleID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                DoorLock::Commands::ClearYearDaySchedule::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.yearDayIndex = params.yearDayIndex.unsignedCharValue;
                request.userIndex = params.userIndex.unsignedShortValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)setHolidayScheduleWithParams:(MTRDoorLockClusterSetHolidayScheduleParams *)params
                      expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
               expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                          completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeDoorLockID,
                                     (unsigned int) MTRCommandIDTypeClusterDoorLockCommandSetHolidayScheduleID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                DoorLock::Commands::SetHolidaySchedule::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.holidayIndex = params.holidayIndex.unsignedCharValue;
                request.localStartTime = params.localStartTime.unsignedIntValue;
                request.localEndTime = params.localEndTime.unsignedIntValue;
                request.operatingMode
                    = static_cast<std::remove_reference_t<decltype(request.operatingMode)>>(params.operatingMode.unsignedCharValue);

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)getHolidayScheduleWithParams:(MTRDoorLockClusterGetHolidayScheduleParams *)params
                      expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
               expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                          completion:(void (^)(MTRDoorLockClusterGetHolidayScheduleResponseParams * _Nullable data,
                                         NSError * _Nullable error))completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeDoorLockID,
                                     (unsigned int) MTRCommandIDTypeClusterDoorLockCommandGetHolidayScheduleID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRDoorLockClusterGetHolidayScheduleResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                DoorLockClusterGetHolidayScheduleResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRDoorLockClusterGetHolidayScheduleResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                DoorLock::Commands::GetHolidaySchedule::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.holidayIndex = params.holidayIndex.unsignedCharValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)clearHolidayScheduleWithParams:(MTRDoorLockClusterClearHolidayScheduleParams *)params
                        expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                 expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                            completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeDoorLockID,
                                     (unsigned int) MTRCommandIDTypeClusterDoorLockCommandClearHolidayScheduleID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                DoorLock::Commands::ClearHolidaySchedule::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.holidayIndex = params.holidayIndex.unsignedCharValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)setUserWithParams:(MTRDoorLockClusterSetUserParams *)params
           expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
               completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix =
        [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex, _endpoint,
                  (unsigned int) MTRClusterIDTypeDoorLockID, (unsigned int) MTRCommandIDTypeClusterDoorLockCommandSetUserID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                DoorLock::Commands::SetUser::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                if (!timedInvokeTimeoutMs.HasValue()) {
                    timedInvokeTimeoutMs.SetValue(10000);
                }
                request.operationType
                    = static_cast<std::remove_reference_t<decltype(request.operationType)>>(params.operationType.unsignedCharValue);
                request.userIndex = params.userIndex.unsignedShortValue;
                if (params.userName == nil) {
                    request.userName.SetNull();
                } else {
                    auto & nonNullValue_0 = request.userName.SetNonNull();
                    nonNullValue_0 = [self asCharSpan:params.userName];
                }
                if (params.userUniqueID == nil) {
                    request.userUniqueID.SetNull();
                } else {
                    auto & nonNullValue_0 = request.userUniqueID.SetNonNull();
                    nonNullValue_0 = params.userUniqueID.unsignedIntValue;
                }
                if (params.userStatus == nil) {
                    request.userStatus.SetNull();
                } else {
                    auto & nonNullValue_0 = request.userStatus.SetNonNull();
                    nonNullValue_0
                        = static_cast<std::remove_reference_t<decltype(nonNullValue_0)>>(params.userStatus.unsignedCharValue);
                }
                if (params.userType == nil) {
                    request.userType.SetNull();
                } else {
                    auto & nonNullValue_0 = request.userType.SetNonNull();
                    nonNullValue_0
                        = static_cast<std::remove_reference_t<decltype(nonNullValue_0)>>(params.userType.unsignedCharValue);
                }
                if (params.credentialRule == nil) {
                    request.credentialRule.SetNull();
                } else {
                    auto & nonNullValue_0 = request.credentialRule.SetNonNull();
                    nonNullValue_0
                        = static_cast<std::remove_reference_t<decltype(nonNullValue_0)>>(params.credentialRule.unsignedCharValue);
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)getUserWithParams:(MTRDoorLockClusterGetUserParams *)params
           expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
               completion:(void (^)(MTRDoorLockClusterGetUserResponseParams * _Nullable data, NSError * _Nullable error))completion
{
    NSString * logPrefix =
        [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex, _endpoint,
                  (unsigned int) MTRClusterIDTypeDoorLockID, (unsigned int) MTRCommandIDTypeClusterDoorLockCommandGetUserID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRDoorLockClusterGetUserResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                DoorLockClusterGetUserResponseCallbackType successCb, MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRDoorLockClusterGetUserResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                DoorLock::Commands::GetUser::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.userIndex = params.userIndex.unsignedShortValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)clearUserWithParams:(MTRDoorLockClusterClearUserParams *)params
             expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                 completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix =
        [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex, _endpoint,
                  (unsigned int) MTRClusterIDTypeDoorLockID, (unsigned int) MTRCommandIDTypeClusterDoorLockCommandClearUserID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                DoorLock::Commands::ClearUser::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                if (!timedInvokeTimeoutMs.HasValue()) {
                    timedInvokeTimeoutMs.SetValue(10000);
                }
                request.userIndex = params.userIndex.unsignedShortValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)setCredentialWithParams:(MTRDoorLockClusterSetCredentialParams *)params
                 expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
          expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                     completion:(void (^)(MTRDoorLockClusterSetCredentialResponseParams * _Nullable data,
                                    NSError * _Nullable error))completion
{
    NSString * logPrefix =
        [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex, _endpoint,
                  (unsigned int) MTRClusterIDTypeDoorLockID, (unsigned int) MTRCommandIDTypeClusterDoorLockCommandSetCredentialID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRDoorLockClusterSetCredentialResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                DoorLockClusterSetCredentialResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRDoorLockClusterSetCredentialResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                DoorLock::Commands::SetCredential::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                if (!timedInvokeTimeoutMs.HasValue()) {
                    timedInvokeTimeoutMs.SetValue(10000);
                }
                request.operationType
                    = static_cast<std::remove_reference_t<decltype(request.operationType)>>(params.operationType.unsignedCharValue);
                request.credential.credentialType
                    = static_cast<std::remove_reference_t<decltype(request.credential.credentialType)>>(
                        params.credential.credentialType.unsignedCharValue);
                request.credential.credentialIndex = params.credential.credentialIndex.unsignedShortValue;
                request.credentialData = [self asByteSpan:params.credentialData];
                if (params.userIndex == nil) {
                    request.userIndex.SetNull();
                } else {
                    auto & nonNullValue_0 = request.userIndex.SetNonNull();
                    nonNullValue_0 = params.userIndex.unsignedShortValue;
                }
                if (params.userStatus == nil) {
                    request.userStatus.SetNull();
                } else {
                    auto & nonNullValue_0 = request.userStatus.SetNonNull();
                    nonNullValue_0
                        = static_cast<std::remove_reference_t<decltype(nonNullValue_0)>>(params.userStatus.unsignedCharValue);
                }
                if (params.userType == nil) {
                    request.userType.SetNull();
                } else {
                    auto & nonNullValue_0 = request.userType.SetNonNull();
                    nonNullValue_0
                        = static_cast<std::remove_reference_t<decltype(nonNullValue_0)>>(params.userType.unsignedCharValue);
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)getCredentialStatusWithParams:(MTRDoorLockClusterGetCredentialStatusParams *)params
                       expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                           completion:(void (^)(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable data,
                                          NSError * _Nullable error))completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeDoorLockID,
                                     (unsigned int) MTRCommandIDTypeClusterDoorLockCommandGetCredentialStatusID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRDoorLockClusterGetCredentialStatusResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                DoorLockClusterGetCredentialStatusResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRDoorLockClusterGetCredentialStatusResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                DoorLock::Commands::GetCredentialStatus::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.credential.credentialType
                    = static_cast<std::remove_reference_t<decltype(request.credential.credentialType)>>(
                        params.credential.credentialType.unsignedCharValue);
                request.credential.credentialIndex = params.credential.credentialIndex.unsignedShortValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)clearCredentialWithParams:(MTRDoorLockClusterClearCredentialParams *)params
                   expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
            expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                       completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeDoorLockID,
                                     (unsigned int) MTRCommandIDTypeClusterDoorLockCommandClearCredentialID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                DoorLock::Commands::ClearCredential::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                if (!timedInvokeTimeoutMs.HasValue()) {
                    timedInvokeTimeoutMs.SetValue(10000);
                }
                if (params.credential == nil) {
                    request.credential.SetNull();
                } else {
                    auto & nonNullValue_0 = request.credential.SetNonNull();
                    nonNullValue_0.credentialType = static_cast<std::remove_reference_t<decltype(nonNullValue_0.credentialType)>>(
                        params.credential.credentialType.unsignedCharValue);
                    nonNullValue_0.credentialIndex = params.credential.credentialIndex.unsignedShortValue;
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (NSDictionary<NSString *, id> *)readAttributeLockStateWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeDoorLockID)
                                        attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeLockStateID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeLockTypeWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeDoorLockID)
                                        attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeLockTypeID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeActuatorEnabledWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeDoorLockID)
                                        attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeActuatorEnabledID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeDoorStateWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeDoorLockID)
                                        attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeDoorStateID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeDoorOpenEventsWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeDoorLockID)
                                        attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeDoorOpenEventsID)
                                             params:params];
}

- (void)writeAttributeDoorOpenEventsWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeDoorOpenEventsWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeDoorOpenEventsWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                       params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeDoorLockID)
                                  attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeDoorOpenEventsID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeDoorClosedEventsWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeDoorLockID)
                                        attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeDoorClosedEventsID)
                                             params:params];
}

- (void)writeAttributeDoorClosedEventsWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                          expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeDoorClosedEventsWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeDoorClosedEventsWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                          expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                         params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeDoorLockID)
                                  attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeDoorClosedEventsID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeOpenPeriodWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeDoorLockID)
                                        attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeOpenPeriodID)
                                             params:params];
}

- (void)writeAttributeOpenPeriodWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeOpenPeriodWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeOpenPeriodWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                   params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeDoorLockID)
                                  attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeOpenPeriodID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeNumberOfTotalUsersSupportedWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeDoorLockID)
                                        attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeNumberOfTotalUsersSupportedID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeNumberOfPINUsersSupportedWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeDoorLockID)
                                        attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeNumberOfPINUsersSupportedID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeNumberOfRFIDUsersSupportedWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeDoorLockID)
                                        attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeNumberOfRFIDUsersSupportedID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeNumberOfWeekDaySchedulesSupportedPerUserWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeDoorLockID)
                        attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeNumberOfWeekDaySchedulesSupportedPerUserID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeNumberOfYearDaySchedulesSupportedPerUserWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeDoorLockID)
                        attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeNumberOfYearDaySchedulesSupportedPerUserID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeNumberOfHolidaySchedulesSupportedWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeDoorLockID)
                                        attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeNumberOfHolidaySchedulesSupportedID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeMaxPINCodeLengthWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeDoorLockID)
                                        attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeMaxPINCodeLengthID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeMinPINCodeLengthWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeDoorLockID)
                                        attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeMinPINCodeLengthID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeMaxRFIDCodeLengthWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeDoorLockID)
                                        attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeMaxRFIDCodeLengthID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeMinRFIDCodeLengthWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeDoorLockID)
                                        attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeMinRFIDCodeLengthID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeCredentialRulesSupportWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeDoorLockID)
                                        attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeCredentialRulesSupportID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeNumberOfCredentialsSupportedPerUserWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeDoorLockID)
                                     attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeNumberOfCredentialsSupportedPerUserID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeLanguageWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeDoorLockID)
                                        attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeLanguageID)
                                             params:params];
}

- (void)writeAttributeLanguageWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                  expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeLanguageWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeLanguageWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                  expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                 params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeDoorLockID)
                                  attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeLanguageID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeLEDSettingsWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeDoorLockID)
                                        attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeLEDSettingsID)
                                             params:params];
}

- (void)writeAttributeLEDSettingsWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                     expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeLEDSettingsWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeLEDSettingsWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                     expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                    params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeDoorLockID)
                                  attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeLEDSettingsID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeAutoRelockTimeWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeDoorLockID)
                                        attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeAutoRelockTimeID)
                                             params:params];
}

- (void)writeAttributeAutoRelockTimeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeAutoRelockTimeWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeAutoRelockTimeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                       params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeDoorLockID)
                                  attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeAutoRelockTimeID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeSoundVolumeWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeDoorLockID)
                                        attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeSoundVolumeID)
                                             params:params];
}

- (void)writeAttributeSoundVolumeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                     expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeSoundVolumeWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeSoundVolumeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                     expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                    params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeDoorLockID)
                                  attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeSoundVolumeID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeOperatingModeWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeDoorLockID)
                                        attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeOperatingModeID)
                                             params:params];
}

- (void)writeAttributeOperatingModeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                       expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeOperatingModeWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeOperatingModeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                       expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                      params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeDoorLockID)
                                  attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeOperatingModeID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeSupportedOperatingModesWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeDoorLockID)
                                        attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeSupportedOperatingModesID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeDefaultConfigurationRegisterWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeDoorLockID)
                                        attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeDefaultConfigurationRegisterID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeEnableLocalProgrammingWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeDoorLockID)
                                        attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeEnableLocalProgrammingID)
                                             params:params];
}

- (void)writeAttributeEnableLocalProgrammingWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeEnableLocalProgrammingWithValue:dataValueDictionary
                                  expectedValueInterval:expectedValueIntervalMs
                                                 params:nil];
}
- (void)writeAttributeEnableLocalProgrammingWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                               params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeDoorLockID)
                                  attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeEnableLocalProgrammingID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeEnableOneTouchLockingWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeDoorLockID)
                                        attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeEnableOneTouchLockingID)
                                             params:params];
}

- (void)writeAttributeEnableOneTouchLockingWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                               expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeEnableOneTouchLockingWithValue:dataValueDictionary
                                 expectedValueInterval:expectedValueIntervalMs
                                                params:nil];
}
- (void)writeAttributeEnableOneTouchLockingWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                               expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                              params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeDoorLockID)
                                  attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeEnableOneTouchLockingID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeEnableInsideStatusLEDWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeDoorLockID)
                                        attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeEnableInsideStatusLEDID)
                                             params:params];
}

- (void)writeAttributeEnableInsideStatusLEDWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                               expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeEnableInsideStatusLEDWithValue:dataValueDictionary
                                 expectedValueInterval:expectedValueIntervalMs
                                                params:nil];
}
- (void)writeAttributeEnableInsideStatusLEDWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                               expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                              params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeDoorLockID)
                                  attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeEnableInsideStatusLEDID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeEnablePrivacyModeButtonWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeDoorLockID)
                                        attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeEnablePrivacyModeButtonID)
                                             params:params];
}

- (void)writeAttributeEnablePrivacyModeButtonWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                 expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeEnablePrivacyModeButtonWithValue:dataValueDictionary
                                   expectedValueInterval:expectedValueIntervalMs
                                                  params:nil];
}
- (void)writeAttributeEnablePrivacyModeButtonWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                 expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                                params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeDoorLockID)
                                  attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeEnablePrivacyModeButtonID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeLocalProgrammingFeaturesWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeDoorLockID)
                                        attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeLocalProgrammingFeaturesID)
                                             params:params];
}

- (void)writeAttributeLocalProgrammingFeaturesWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                  expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeLocalProgrammingFeaturesWithValue:dataValueDictionary
                                    expectedValueInterval:expectedValueIntervalMs
                                                   params:nil];
}
- (void)writeAttributeLocalProgrammingFeaturesWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                  expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                                 params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeDoorLockID)
                                  attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeLocalProgrammingFeaturesID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeWrongCodeEntryLimitWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeDoorLockID)
                                        attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeWrongCodeEntryLimitID)
                                             params:params];
}

- (void)writeAttributeWrongCodeEntryLimitWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                             expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeWrongCodeEntryLimitWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeWrongCodeEntryLimitWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                             expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                            params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeDoorLockID)
                                  attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeWrongCodeEntryLimitID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeUserCodeTemporaryDisableTimeWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeDoorLockID)
                                        attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeUserCodeTemporaryDisableTimeID)
                                             params:params];
}

- (void)writeAttributeUserCodeTemporaryDisableTimeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeUserCodeTemporaryDisableTimeWithValue:dataValueDictionary
                                        expectedValueInterval:expectedValueIntervalMs
                                                       params:nil];
}
- (void)writeAttributeUserCodeTemporaryDisableTimeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                                     params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeDoorLockID)
                                  attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeUserCodeTemporaryDisableTimeID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeSendPINOverTheAirWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeDoorLockID)
                                        attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeSendPINOverTheAirID)
                                             params:params];
}

- (void)writeAttributeSendPINOverTheAirWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                           expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeSendPINOverTheAirWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeSendPINOverTheAirWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                           expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                          params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeDoorLockID)
                                  attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeSendPINOverTheAirID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeRequirePINforRemoteOperationWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeDoorLockID)
                                        attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeRequirePINforRemoteOperationID)
                                             params:params];
}

- (void)writeAttributeRequirePINforRemoteOperationWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeRequirePINforRemoteOperationWithValue:dataValueDictionary
                                        expectedValueInterval:expectedValueIntervalMs
                                                       params:nil];
}
- (void)writeAttributeRequirePINforRemoteOperationWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                                     params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeDoorLockID)
                                  attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeRequirePINforRemoteOperationID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeExpiringUserTimeoutWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeDoorLockID)
                                        attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeExpiringUserTimeoutID)
                                             params:params];
}

- (void)writeAttributeExpiringUserTimeoutWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                             expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeExpiringUserTimeoutWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeExpiringUserTimeoutWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                             expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                            params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeDoorLockID)
                                  attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeExpiringUserTimeoutID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeDoorLockID)
                                        attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeGeneratedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeDoorLockID)
                                        attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeDoorLockID)
                                        attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeDoorLockID)
                                        attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeDoorLockID)
                                        attributeID:@(MTRAttributeIDTypeClusterDoorLockAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterDoorLock (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

- (void)lockDoorWithParams:(MTRDoorLockClusterLockDoorParams * _Nullable)params
            expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
     expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
         completionHandler:(MTRStatusCompletion)completionHandler
{
    [self lockDoorWithParams:params
               expectedValues:expectedDataValueDictionaries
        expectedValueInterval:expectedValueIntervalMs
                   completion:completionHandler];
}
- (void)unlockDoorWithParams:(MTRDoorLockClusterUnlockDoorParams * _Nullable)params
              expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
       expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
           completionHandler:(MTRStatusCompletion)completionHandler
{
    [self unlockDoorWithParams:params
                expectedValues:expectedDataValueDictionaries
         expectedValueInterval:expectedValueIntervalMs
                    completion:completionHandler];
}
- (void)unlockWithTimeoutWithParams:(MTRDoorLockClusterUnlockWithTimeoutParams *)params
                     expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
              expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                  completionHandler:(MTRStatusCompletion)completionHandler
{
    [self unlockWithTimeoutWithParams:params
                       expectedValues:expectedDataValueDictionaries
                expectedValueInterval:expectedValueIntervalMs
                           completion:completionHandler];
}
- (void)setWeekDayScheduleWithParams:(MTRDoorLockClusterSetWeekDayScheduleParams *)params
                      expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
               expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                   completionHandler:(MTRStatusCompletion)completionHandler
{
    [self setWeekDayScheduleWithParams:params
                        expectedValues:expectedDataValueDictionaries
                 expectedValueInterval:expectedValueIntervalMs
                            completion:completionHandler];
}
- (void)getWeekDayScheduleWithParams:(MTRDoorLockClusterGetWeekDayScheduleParams *)params
                      expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
               expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                   completionHandler:(void (^)(MTRDoorLockClusterGetWeekDayScheduleResponseParams * _Nullable data,
                                         NSError * _Nullable error))completionHandler
{
    [self getWeekDayScheduleWithParams:params
                        expectedValues:expectedDataValueDictionaries
                 expectedValueInterval:expectedValueIntervalMs
                            completion:^(
                                MTRDoorLockClusterGetWeekDayScheduleResponseParams * _Nullable data, NSError * _Nullable error) {
                                // Cast is safe because subclass does not add any selectors.
                                completionHandler(static_cast<MTRDoorLockClusterGetWeekDayScheduleResponseParams *>(data), error);
                            }];
}
- (void)clearWeekDayScheduleWithParams:(MTRDoorLockClusterClearWeekDayScheduleParams *)params
                        expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
                 expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                     completionHandler:(MTRStatusCompletion)completionHandler
{
    [self clearWeekDayScheduleWithParams:params
                          expectedValues:expectedDataValueDictionaries
                   expectedValueInterval:expectedValueIntervalMs
                              completion:completionHandler];
}
- (void)setYearDayScheduleWithParams:(MTRDoorLockClusterSetYearDayScheduleParams *)params
                      expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
               expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                   completionHandler:(MTRStatusCompletion)completionHandler
{
    [self setYearDayScheduleWithParams:params
                        expectedValues:expectedDataValueDictionaries
                 expectedValueInterval:expectedValueIntervalMs
                            completion:completionHandler];
}
- (void)getYearDayScheduleWithParams:(MTRDoorLockClusterGetYearDayScheduleParams *)params
                      expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
               expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                   completionHandler:(void (^)(MTRDoorLockClusterGetYearDayScheduleResponseParams * _Nullable data,
                                         NSError * _Nullable error))completionHandler
{
    [self getYearDayScheduleWithParams:params
                        expectedValues:expectedDataValueDictionaries
                 expectedValueInterval:expectedValueIntervalMs
                            completion:^(
                                MTRDoorLockClusterGetYearDayScheduleResponseParams * _Nullable data, NSError * _Nullable error) {
                                // Cast is safe because subclass does not add any selectors.
                                completionHandler(static_cast<MTRDoorLockClusterGetYearDayScheduleResponseParams *>(data), error);
                            }];
}
- (void)clearYearDayScheduleWithParams:(MTRDoorLockClusterClearYearDayScheduleParams *)params
                        expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
                 expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                     completionHandler:(MTRStatusCompletion)completionHandler
{
    [self clearYearDayScheduleWithParams:params
                          expectedValues:expectedDataValueDictionaries
                   expectedValueInterval:expectedValueIntervalMs
                              completion:completionHandler];
}
- (void)setHolidayScheduleWithParams:(MTRDoorLockClusterSetHolidayScheduleParams *)params
                      expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
               expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                   completionHandler:(MTRStatusCompletion)completionHandler
{
    [self setHolidayScheduleWithParams:params
                        expectedValues:expectedDataValueDictionaries
                 expectedValueInterval:expectedValueIntervalMs
                            completion:completionHandler];
}
- (void)getHolidayScheduleWithParams:(MTRDoorLockClusterGetHolidayScheduleParams *)params
                      expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
               expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                   completionHandler:(void (^)(MTRDoorLockClusterGetHolidayScheduleResponseParams * _Nullable data,
                                         NSError * _Nullable error))completionHandler
{
    [self getHolidayScheduleWithParams:params
                        expectedValues:expectedDataValueDictionaries
                 expectedValueInterval:expectedValueIntervalMs
                            completion:^(
                                MTRDoorLockClusterGetHolidayScheduleResponseParams * _Nullable data, NSError * _Nullable error) {
                                // Cast is safe because subclass does not add any selectors.
                                completionHandler(static_cast<MTRDoorLockClusterGetHolidayScheduleResponseParams *>(data), error);
                            }];
}
- (void)clearHolidayScheduleWithParams:(MTRDoorLockClusterClearHolidayScheduleParams *)params
                        expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
                 expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                     completionHandler:(MTRStatusCompletion)completionHandler
{
    [self clearHolidayScheduleWithParams:params
                          expectedValues:expectedDataValueDictionaries
                   expectedValueInterval:expectedValueIntervalMs
                              completion:completionHandler];
}
- (void)setUserWithParams:(MTRDoorLockClusterSetUserParams *)params
           expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
    expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
        completionHandler:(MTRStatusCompletion)completionHandler
{
    [self setUserWithParams:params
               expectedValues:expectedDataValueDictionaries
        expectedValueInterval:expectedValueIntervalMs
                   completion:completionHandler];
}
- (void)getUserWithParams:(MTRDoorLockClusterGetUserParams *)params
           expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
    expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
        completionHandler:
            (void (^)(MTRDoorLockClusterGetUserResponseParams * _Nullable data, NSError * _Nullable error))completionHandler
{
    [self getUserWithParams:params
               expectedValues:expectedDataValueDictionaries
        expectedValueInterval:expectedValueIntervalMs
                   completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable data, NSError * _Nullable error) {
                       // Cast is safe because subclass does not add any selectors.
                       completionHandler(static_cast<MTRDoorLockClusterGetUserResponseParams *>(data), error);
                   }];
}
- (void)clearUserWithParams:(MTRDoorLockClusterClearUserParams *)params
             expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
      expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
          completionHandler:(MTRStatusCompletion)completionHandler
{
    [self clearUserWithParams:params
               expectedValues:expectedDataValueDictionaries
        expectedValueInterval:expectedValueIntervalMs
                   completion:completionHandler];
}
- (void)setCredentialWithParams:(MTRDoorLockClusterSetCredentialParams *)params
                 expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
          expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
              completionHandler:(void (^)(MTRDoorLockClusterSetCredentialResponseParams * _Nullable data,
                                    NSError * _Nullable error))completionHandler
{
    [self setCredentialWithParams:params
                   expectedValues:expectedDataValueDictionaries
            expectedValueInterval:expectedValueIntervalMs
                       completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable data, NSError * _Nullable error) {
                           // Cast is safe because subclass does not add any selectors.
                           completionHandler(static_cast<MTRDoorLockClusterSetCredentialResponseParams *>(data), error);
                       }];
}
- (void)getCredentialStatusWithParams:(MTRDoorLockClusterGetCredentialStatusParams *)params
                       expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
                expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                    completionHandler:(void (^)(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable data,
                                          NSError * _Nullable error))completionHandler
{
    [self getCredentialStatusWithParams:params
                         expectedValues:expectedDataValueDictionaries
                  expectedValueInterval:expectedValueIntervalMs
                             completion:^(
                                 MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable data, NSError * _Nullable error) {
                                 // Cast is safe because subclass does not add any selectors.
                                 completionHandler(static_cast<MTRDoorLockClusterGetCredentialStatusResponseParams *>(data), error);
                             }];
}
- (void)clearCredentialWithParams:(MTRDoorLockClusterClearCredentialParams *)params
                   expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
            expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                completionHandler:(MTRStatusCompletion)completionHandler
{
    [self clearCredentialWithParams:params
                     expectedValues:expectedDataValueDictionaries
              expectedValueInterval:expectedValueIntervalMs
                         completion:completionHandler];
}
@end

@implementation MTRClusterWindowCovering

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (void)upOrOpenWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
             expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                        completion:(MTRStatusCompletion)completion
{
    [self upOrOpenWithParams:nil expectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs completion:completion];
}
- (void)upOrOpenWithParams:(MTRWindowCoveringClusterUpOrOpenParams * _Nullable)params
            expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
     expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeWindowCoveringID,
                                     (unsigned int) MTRCommandIDTypeClusterWindowCoveringCommandUpOrOpenID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                WindowCovering::Commands::UpOrOpen::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)downOrCloseWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                           completion:(MTRStatusCompletion)completion
{
    [self downOrCloseWithParams:nil
                 expectedValues:expectedValues
          expectedValueInterval:expectedValueIntervalMs
                     completion:completion];
}
- (void)downOrCloseWithParams:(MTRWindowCoveringClusterDownOrCloseParams * _Nullable)params
               expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                   completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeWindowCoveringID,
                                     (unsigned int) MTRCommandIDTypeClusterWindowCoveringCommandDownOrCloseID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                WindowCovering::Commands::DownOrClose::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)stopMotionWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
               expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                          completion:(MTRStatusCompletion)completion
{
    [self stopMotionWithParams:nil
                expectedValues:expectedValues
         expectedValueInterval:expectedValueIntervalMs
                    completion:completion];
}
- (void)stopMotionWithParams:(MTRWindowCoveringClusterStopMotionParams * _Nullable)params
              expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
       expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                  completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeWindowCoveringID,
                                     (unsigned int) MTRCommandIDTypeClusterWindowCoveringCommandStopMotionID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                WindowCovering::Commands::StopMotion::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)goToLiftValueWithParams:(MTRWindowCoveringClusterGoToLiftValueParams *)params
                 expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
          expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                     completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeWindowCoveringID,
                                     (unsigned int) MTRCommandIDTypeClusterWindowCoveringCommandGoToLiftValueID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                WindowCovering::Commands::GoToLiftValue::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.liftValue = params.liftValue.unsignedShortValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)goToLiftPercentageWithParams:(MTRWindowCoveringClusterGoToLiftPercentageParams *)params
                      expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
               expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                          completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeWindowCoveringID,
                                     (unsigned int) MTRCommandIDTypeClusterWindowCoveringCommandGoToLiftPercentageID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                WindowCovering::Commands::GoToLiftPercentage::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.liftPercent100thsValue = params.liftPercent100thsValue.unsignedShortValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)goToTiltValueWithParams:(MTRWindowCoveringClusterGoToTiltValueParams *)params
                 expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
          expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                     completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeWindowCoveringID,
                                     (unsigned int) MTRCommandIDTypeClusterWindowCoveringCommandGoToTiltValueID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                WindowCovering::Commands::GoToTiltValue::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.tiltValue = params.tiltValue.unsignedShortValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)goToTiltPercentageWithParams:(MTRWindowCoveringClusterGoToTiltPercentageParams *)params
                      expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
               expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                          completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeWindowCoveringID,
                                     (unsigned int) MTRCommandIDTypeClusterWindowCoveringCommandGoToTiltPercentageID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                WindowCovering::Commands::GoToTiltPercentage::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.tiltPercent100thsValue = params.tiltPercent100thsValue.unsignedShortValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (NSDictionary<NSString *, id> *)readAttributeTypeWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeWindowCoveringID)
                                        attributeID:@(MTRAttributeIDTypeClusterWindowCoveringAttributeTypeID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributePhysicalClosedLimitLiftWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeWindowCoveringID)
                                        attributeID:@(MTRAttributeIDTypeClusterWindowCoveringAttributePhysicalClosedLimitLiftID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributePhysicalClosedLimitTiltWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeWindowCoveringID)
                                        attributeID:@(MTRAttributeIDTypeClusterWindowCoveringAttributePhysicalClosedLimitTiltID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeCurrentPositionLiftWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeWindowCoveringID)
                                        attributeID:@(MTRAttributeIDTypeClusterWindowCoveringAttributeCurrentPositionLiftID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeCurrentPositionTiltWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeWindowCoveringID)
                                        attributeID:@(MTRAttributeIDTypeClusterWindowCoveringAttributeCurrentPositionTiltID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeNumberOfActuationsLiftWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeWindowCoveringID)
                                        attributeID:@(MTRAttributeIDTypeClusterWindowCoveringAttributeNumberOfActuationsLiftID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeNumberOfActuationsTiltWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeWindowCoveringID)
                                        attributeID:@(MTRAttributeIDTypeClusterWindowCoveringAttributeNumberOfActuationsTiltID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeConfigStatusWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeWindowCoveringID)
                                        attributeID:@(MTRAttributeIDTypeClusterWindowCoveringAttributeConfigStatusID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeCurrentPositionLiftPercentageWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeWindowCoveringID)
                                     attributeID:@(MTRAttributeIDTypeClusterWindowCoveringAttributeCurrentPositionLiftPercentageID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeCurrentPositionTiltPercentageWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeWindowCoveringID)
                                     attributeID:@(MTRAttributeIDTypeClusterWindowCoveringAttributeCurrentPositionTiltPercentageID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeOperationalStatusWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeWindowCoveringID)
                                        attributeID:@(MTRAttributeIDTypeClusterWindowCoveringAttributeOperationalStatusID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeTargetPositionLiftPercent100thsWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeWindowCoveringID)
                        attributeID:@(MTRAttributeIDTypeClusterWindowCoveringAttributeTargetPositionLiftPercent100thsID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeTargetPositionTiltPercent100thsWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeWindowCoveringID)
                        attributeID:@(MTRAttributeIDTypeClusterWindowCoveringAttributeTargetPositionTiltPercent100thsID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeEndProductTypeWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeWindowCoveringID)
                                        attributeID:@(MTRAttributeIDTypeClusterWindowCoveringAttributeEndProductTypeID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeCurrentPositionLiftPercent100thsWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeWindowCoveringID)
                        attributeID:@(MTRAttributeIDTypeClusterWindowCoveringAttributeCurrentPositionLiftPercent100thsID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeCurrentPositionTiltPercent100thsWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeWindowCoveringID)
                        attributeID:@(MTRAttributeIDTypeClusterWindowCoveringAttributeCurrentPositionTiltPercent100thsID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeInstalledOpenLimitLiftWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeWindowCoveringID)
                                        attributeID:@(MTRAttributeIDTypeClusterWindowCoveringAttributeInstalledOpenLimitLiftID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeInstalledClosedLimitLiftWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeWindowCoveringID)
                                        attributeID:@(MTRAttributeIDTypeClusterWindowCoveringAttributeInstalledClosedLimitLiftID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeInstalledOpenLimitTiltWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeWindowCoveringID)
                                        attributeID:@(MTRAttributeIDTypeClusterWindowCoveringAttributeInstalledOpenLimitTiltID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeInstalledClosedLimitTiltWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeWindowCoveringID)
                                        attributeID:@(MTRAttributeIDTypeClusterWindowCoveringAttributeInstalledClosedLimitTiltID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeModeWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeWindowCoveringID)
                                        attributeID:@(MTRAttributeIDTypeClusterWindowCoveringAttributeModeID)
                                             params:params];
}

- (void)writeAttributeModeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
              expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeModeWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeModeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
              expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                             params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeWindowCoveringID)
                                  attributeID:@(MTRAttributeIDTypeClusterWindowCoveringAttributeModeID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeSafetyStatusWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeWindowCoveringID)
                                        attributeID:@(MTRAttributeIDTypeClusterWindowCoveringAttributeSafetyStatusID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeWindowCoveringID)
                                        attributeID:@(MTRAttributeIDTypeClusterWindowCoveringAttributeGeneratedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeWindowCoveringID)
                                        attributeID:@(MTRAttributeIDTypeClusterWindowCoveringAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeWindowCoveringID)
                                        attributeID:@(MTRAttributeIDTypeClusterWindowCoveringAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeWindowCoveringID)
                                        attributeID:@(MTRAttributeIDTypeClusterWindowCoveringAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeWindowCoveringID)
                                        attributeID:@(MTRAttributeIDTypeClusterWindowCoveringAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterWindowCovering (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

- (void)upOrOpenWithParams:(MTRWindowCoveringClusterUpOrOpenParams * _Nullable)params
            expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
     expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
         completionHandler:(MTRStatusCompletion)completionHandler
{
    [self upOrOpenWithParams:params
               expectedValues:expectedDataValueDictionaries
        expectedValueInterval:expectedValueIntervalMs
                   completion:completionHandler];
}
- (void)upOrOpenWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
             expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                 completionHandler:(MTRStatusCompletion)completionHandler
{
    [self upOrOpenWithParams:nil
               expectedValues:expectedValues
        expectedValueInterval:expectedValueIntervalMs
            completionHandler:completionHandler];
}
- (void)downOrCloseWithParams:(MTRWindowCoveringClusterDownOrCloseParams * _Nullable)params
               expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
        expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
            completionHandler:(MTRStatusCompletion)completionHandler
{
    [self downOrCloseWithParams:params
                 expectedValues:expectedDataValueDictionaries
          expectedValueInterval:expectedValueIntervalMs
                     completion:completionHandler];
}
- (void)downOrCloseWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                    completionHandler:(MTRStatusCompletion)completionHandler
{
    [self downOrCloseWithParams:nil
                 expectedValues:expectedValues
          expectedValueInterval:expectedValueIntervalMs
              completionHandler:completionHandler];
}
- (void)stopMotionWithParams:(MTRWindowCoveringClusterStopMotionParams * _Nullable)params
              expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
       expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
           completionHandler:(MTRStatusCompletion)completionHandler
{
    [self stopMotionWithParams:params
                expectedValues:expectedDataValueDictionaries
         expectedValueInterval:expectedValueIntervalMs
                    completion:completionHandler];
}
- (void)stopMotionWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
               expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                   completionHandler:(MTRStatusCompletion)completionHandler
{
    [self stopMotionWithParams:nil
                expectedValues:expectedValues
         expectedValueInterval:expectedValueIntervalMs
             completionHandler:completionHandler];
}
- (void)goToLiftValueWithParams:(MTRWindowCoveringClusterGoToLiftValueParams *)params
                 expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
          expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
              completionHandler:(MTRStatusCompletion)completionHandler
{
    [self goToLiftValueWithParams:params
                   expectedValues:expectedDataValueDictionaries
            expectedValueInterval:expectedValueIntervalMs
                       completion:completionHandler];
}
- (void)goToLiftPercentageWithParams:(MTRWindowCoveringClusterGoToLiftPercentageParams *)params
                      expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
               expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                   completionHandler:(MTRStatusCompletion)completionHandler
{
    [self goToLiftPercentageWithParams:params
                        expectedValues:expectedDataValueDictionaries
                 expectedValueInterval:expectedValueIntervalMs
                            completion:completionHandler];
}
- (void)goToTiltValueWithParams:(MTRWindowCoveringClusterGoToTiltValueParams *)params
                 expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
          expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
              completionHandler:(MTRStatusCompletion)completionHandler
{
    [self goToTiltValueWithParams:params
                   expectedValues:expectedDataValueDictionaries
            expectedValueInterval:expectedValueIntervalMs
                       completion:completionHandler];
}
- (void)goToTiltPercentageWithParams:(MTRWindowCoveringClusterGoToTiltPercentageParams *)params
                      expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
               expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                   completionHandler:(MTRStatusCompletion)completionHandler
{
    [self goToTiltPercentageWithParams:params
                        expectedValues:expectedDataValueDictionaries
                 expectedValueInterval:expectedValueIntervalMs
                            completion:completionHandler];
}
@end

@implementation MTRClusterBarrierControl

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (void)barrierControlGoToPercentWithParams:(MTRBarrierControlClusterBarrierControlGoToPercentParams *)params
                             expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                 completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeBarrierControlID,
                                     (unsigned int) MTRCommandIDTypeClusterBarrierControlCommandBarrierControlGoToPercentID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                BarrierControl::Commands::BarrierControlGoToPercent::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.percentOpen = params.percentOpen.unsignedCharValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)barrierControlStopWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                       expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                  completion:(MTRStatusCompletion)completion
{
    [self barrierControlStopWithParams:nil
                        expectedValues:expectedValues
                 expectedValueInterval:expectedValueIntervalMs
                            completion:completion];
}
- (void)barrierControlStopWithParams:(MTRBarrierControlClusterBarrierControlStopParams * _Nullable)params
                      expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
               expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                          completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeBarrierControlID,
                                     (unsigned int) MTRCommandIDTypeClusterBarrierControlCommandBarrierControlStopID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                BarrierControl::Commands::BarrierControlStop::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (NSDictionary<NSString *, id> *)readAttributeBarrierMovingStateWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBarrierControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterBarrierControlAttributeBarrierMovingStateID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeBarrierSafetyStatusWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBarrierControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterBarrierControlAttributeBarrierSafetyStatusID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeBarrierCapabilitiesWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBarrierControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterBarrierControlAttributeBarrierCapabilitiesID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeBarrierOpenEventsWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBarrierControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterBarrierControlAttributeBarrierOpenEventsID)
                                             params:params];
}

- (void)writeAttributeBarrierOpenEventsWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                           expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeBarrierOpenEventsWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeBarrierOpenEventsWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                           expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                          params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeBarrierControlID)
                                  attributeID:@(MTRAttributeIDTypeClusterBarrierControlAttributeBarrierOpenEventsID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeBarrierCloseEventsWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBarrierControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterBarrierControlAttributeBarrierCloseEventsID)
                                             params:params];
}

- (void)writeAttributeBarrierCloseEventsWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                            expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeBarrierCloseEventsWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeBarrierCloseEventsWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                            expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                           params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeBarrierControlID)
                                  attributeID:@(MTRAttributeIDTypeClusterBarrierControlAttributeBarrierCloseEventsID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeBarrierCommandOpenEventsWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBarrierControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterBarrierControlAttributeBarrierCommandOpenEventsID)
                                             params:params];
}

- (void)writeAttributeBarrierCommandOpenEventsWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                  expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeBarrierCommandOpenEventsWithValue:dataValueDictionary
                                    expectedValueInterval:expectedValueIntervalMs
                                                   params:nil];
}
- (void)writeAttributeBarrierCommandOpenEventsWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                  expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                                 params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeBarrierControlID)
                                  attributeID:@(MTRAttributeIDTypeClusterBarrierControlAttributeBarrierCommandOpenEventsID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeBarrierCommandCloseEventsWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBarrierControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterBarrierControlAttributeBarrierCommandCloseEventsID)
                                             params:params];
}

- (void)writeAttributeBarrierCommandCloseEventsWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                   expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeBarrierCommandCloseEventsWithValue:dataValueDictionary
                                     expectedValueInterval:expectedValueIntervalMs
                                                    params:nil];
}
- (void)writeAttributeBarrierCommandCloseEventsWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                   expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                                  params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeBarrierControlID)
                                  attributeID:@(MTRAttributeIDTypeClusterBarrierControlAttributeBarrierCommandCloseEventsID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeBarrierOpenPeriodWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBarrierControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterBarrierControlAttributeBarrierOpenPeriodID)
                                             params:params];
}

- (void)writeAttributeBarrierOpenPeriodWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                           expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeBarrierOpenPeriodWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeBarrierOpenPeriodWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                           expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                          params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeBarrierControlID)
                                  attributeID:@(MTRAttributeIDTypeClusterBarrierControlAttributeBarrierOpenPeriodID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeBarrierClosePeriodWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBarrierControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterBarrierControlAttributeBarrierClosePeriodID)
                                             params:params];
}

- (void)writeAttributeBarrierClosePeriodWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                            expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeBarrierClosePeriodWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeBarrierClosePeriodWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                            expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                           params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeBarrierControlID)
                                  attributeID:@(MTRAttributeIDTypeClusterBarrierControlAttributeBarrierClosePeriodID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeBarrierPositionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBarrierControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterBarrierControlAttributeBarrierPositionID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBarrierControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterBarrierControlAttributeGeneratedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBarrierControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterBarrierControlAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBarrierControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterBarrierControlAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBarrierControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterBarrierControlAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBarrierControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterBarrierControlAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterBarrierControl (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

- (void)barrierControlGoToPercentWithParams:(MTRBarrierControlClusterBarrierControlGoToPercentParams *)params
                             expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
                      expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                          completionHandler:(MTRStatusCompletion)completionHandler
{
    [self barrierControlGoToPercentWithParams:params
                               expectedValues:expectedDataValueDictionaries
                        expectedValueInterval:expectedValueIntervalMs
                                   completion:completionHandler];
}
- (void)barrierControlStopWithParams:(MTRBarrierControlClusterBarrierControlStopParams * _Nullable)params
                      expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
               expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                   completionHandler:(MTRStatusCompletion)completionHandler
{
    [self barrierControlStopWithParams:params
                        expectedValues:expectedDataValueDictionaries
                 expectedValueInterval:expectedValueIntervalMs
                            completion:completionHandler];
}
- (void)barrierControlStopWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                       expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                           completionHandler:(MTRStatusCompletion)completionHandler
{
    [self barrierControlStopWithParams:nil
                        expectedValues:expectedValues
                 expectedValueInterval:expectedValueIntervalMs
                     completionHandler:completionHandler];
}
@end

@implementation MTRClusterPumpConfigurationAndControl

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (NSDictionary<NSString *, id> *)readAttributeMaxPressureWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePumpConfigurationAndControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterPumpConfigurationAndControlAttributeMaxPressureID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeMaxSpeedWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePumpConfigurationAndControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterPumpConfigurationAndControlAttributeMaxSpeedID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeMaxFlowWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePumpConfigurationAndControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterPumpConfigurationAndControlAttributeMaxFlowID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeMinConstPressureWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypePumpConfigurationAndControlID)
                                     attributeID:@(MTRAttributeIDTypeClusterPumpConfigurationAndControlAttributeMinConstPressureID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeMaxConstPressureWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypePumpConfigurationAndControlID)
                                     attributeID:@(MTRAttributeIDTypeClusterPumpConfigurationAndControlAttributeMaxConstPressureID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeMinCompPressureWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypePumpConfigurationAndControlID)
                                     attributeID:@(MTRAttributeIDTypeClusterPumpConfigurationAndControlAttributeMinCompPressureID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeMaxCompPressureWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypePumpConfigurationAndControlID)
                                     attributeID:@(MTRAttributeIDTypeClusterPumpConfigurationAndControlAttributeMaxCompPressureID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeMinConstSpeedWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePumpConfigurationAndControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterPumpConfigurationAndControlAttributeMinConstSpeedID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeMaxConstSpeedWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePumpConfigurationAndControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterPumpConfigurationAndControlAttributeMaxConstSpeedID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeMinConstFlowWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePumpConfigurationAndControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterPumpConfigurationAndControlAttributeMinConstFlowID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeMaxConstFlowWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePumpConfigurationAndControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterPumpConfigurationAndControlAttributeMaxConstFlowID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeMinConstTempWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePumpConfigurationAndControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterPumpConfigurationAndControlAttributeMinConstTempID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeMaxConstTempWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePumpConfigurationAndControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterPumpConfigurationAndControlAttributeMaxConstTempID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributePumpStatusWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePumpConfigurationAndControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterPumpConfigurationAndControlAttributePumpStatusID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeEffectiveOperationModeWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypePumpConfigurationAndControlID)
                        attributeID:@(MTRAttributeIDTypeClusterPumpConfigurationAndControlAttributeEffectiveOperationModeID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeEffectiveControlModeWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypePumpConfigurationAndControlID)
                        attributeID:@(MTRAttributeIDTypeClusterPumpConfigurationAndControlAttributeEffectiveControlModeID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeCapacityWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePumpConfigurationAndControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterPumpConfigurationAndControlAttributeCapacityID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeSpeedWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePumpConfigurationAndControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterPumpConfigurationAndControlAttributeSpeedID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeLifetimeRunningHoursWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypePumpConfigurationAndControlID)
                        attributeID:@(MTRAttributeIDTypeClusterPumpConfigurationAndControlAttributeLifetimeRunningHoursID)
                             params:params];
}

- (void)writeAttributeLifetimeRunningHoursWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                              expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeLifetimeRunningHoursWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeLifetimeRunningHoursWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                              expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                             params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypePumpConfigurationAndControlID)
                                  attributeID:@(MTRAttributeIDTypeClusterPumpConfigurationAndControlAttributeLifetimeRunningHoursID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributePowerWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePumpConfigurationAndControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterPumpConfigurationAndControlAttributePowerID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeLifetimeEnergyConsumedWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypePumpConfigurationAndControlID)
                        attributeID:@(MTRAttributeIDTypeClusterPumpConfigurationAndControlAttributeLifetimeEnergyConsumedID)
                             params:params];
}

- (void)writeAttributeLifetimeEnergyConsumedWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeLifetimeEnergyConsumedWithValue:dataValueDictionary
                                  expectedValueInterval:expectedValueIntervalMs
                                                 params:nil];
}
- (void)writeAttributeLifetimeEnergyConsumedWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                               params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device
        writeAttributeWithEndpointID:@(_endpoint)
                           clusterID:@(MTRClusterIDTypePumpConfigurationAndControlID)
                         attributeID:@(MTRAttributeIDTypeClusterPumpConfigurationAndControlAttributeLifetimeEnergyConsumedID)
                               value:dataValueDictionary
               expectedValueInterval:expectedValueIntervalMs
                   timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeOperationModeWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePumpConfigurationAndControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterPumpConfigurationAndControlAttributeOperationModeID)
                                             params:params];
}

- (void)writeAttributeOperationModeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                       expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeOperationModeWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeOperationModeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                       expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                      params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypePumpConfigurationAndControlID)
                                  attributeID:@(MTRAttributeIDTypeClusterPumpConfigurationAndControlAttributeOperationModeID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeControlModeWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePumpConfigurationAndControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterPumpConfigurationAndControlAttributeControlModeID)
                                             params:params];
}

- (void)writeAttributeControlModeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                     expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeControlModeWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeControlModeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                     expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                    params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypePumpConfigurationAndControlID)
                                  attributeID:@(MTRAttributeIDTypeClusterPumpConfigurationAndControlAttributeControlModeID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypePumpConfigurationAndControlID)
                        attributeID:@(MTRAttributeIDTypeClusterPumpConfigurationAndControlAttributeGeneratedCommandListID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypePumpConfigurationAndControlID)
                        attributeID:@(MTRAttributeIDTypeClusterPumpConfigurationAndControlAttributeAcceptedCommandListID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePumpConfigurationAndControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterPumpConfigurationAndControlAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePumpConfigurationAndControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterPumpConfigurationAndControlAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypePumpConfigurationAndControlID)
                                     attributeID:@(MTRAttributeIDTypeClusterPumpConfigurationAndControlAttributeClusterRevisionID)
                                          params:params];
}

@end

@implementation MTRClusterPumpConfigurationAndControl (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

@end

@implementation MTRClusterThermostat

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (void)setpointRaiseLowerWithParams:(MTRThermostatClusterSetpointRaiseLowerParams *)params
                      expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
               expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                          completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeThermostatID,
                                     (unsigned int) MTRCommandIDTypeClusterThermostatCommandSetpointRaiseLowerID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                Thermostat::Commands::SetpointRaiseLower::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.mode = static_cast<std::remove_reference_t<decltype(request.mode)>>(params.mode.unsignedCharValue);
                request.amount = params.amount.charValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)setWeeklyScheduleWithParams:(MTRThermostatClusterSetWeeklyScheduleParams *)params
                     expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
              expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                         completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeThermostatID,
                                     (unsigned int) MTRCommandIDTypeClusterThermostatCommandSetWeeklyScheduleID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                Thermostat::Commands::SetWeeklySchedule::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.numberOfTransitionsForSequence = params.numberOfTransitionsForSequence.unsignedCharValue;
                request.dayOfWeekForSequence = static_cast<std::remove_reference_t<decltype(request.dayOfWeekForSequence)>>(
                    params.dayOfWeekForSequence.unsignedCharValue);
                request.modeForSequence = static_cast<std::remove_reference_t<decltype(request.modeForSequence)>>(
                    params.modeForSequence.unsignedCharValue);
                {
                    using ListType_0 = std::remove_reference_t<decltype(request.transitions)>;
                    using ListMemberType_0 = ListMemberTypeGetter<ListType_0>::Type;
                    if (params.transitions.count != 0) {
                        auto * listHolder_0 = new ListHolder<ListMemberType_0>(params.transitions.count);
                        if (listHolder_0 == nullptr || listHolder_0->mList == nullptr) {
                            return CHIP_ERROR_INVALID_ARGUMENT;
                        }
                        listFreer.add(listHolder_0);
                        for (size_t i_0 = 0; i_0 < params.transitions.count; ++i_0) {
                            if (![params.transitions[i_0] isKindOfClass:[MTRThermostatClusterThermostatScheduleTransition class]]) {
                                // Wrong kind of value.
                                return CHIP_ERROR_INVALID_ARGUMENT;
                            }
                            auto element_0 = (MTRThermostatClusterThermostatScheduleTransition *) params.transitions[i_0];
                            listHolder_0->mList[i_0].transitionTime = element_0.transitionTime.unsignedShortValue;
                            if (element_0.heatSetpoint == nil) {
                                listHolder_0->mList[i_0].heatSetpoint.SetNull();
                            } else {
                                auto & nonNullValue_2 = listHolder_0->mList[i_0].heatSetpoint.SetNonNull();
                                nonNullValue_2 = element_0.heatSetpoint.shortValue;
                            }
                            if (element_0.coolSetpoint == nil) {
                                listHolder_0->mList[i_0].coolSetpoint.SetNull();
                            } else {
                                auto & nonNullValue_2 = listHolder_0->mList[i_0].coolSetpoint.SetNonNull();
                                nonNullValue_2 = element_0.coolSetpoint.shortValue;
                            }
                        }
                        request.transitions = ListType_0(listHolder_0->mList, params.transitions.count);
                    } else {
                        request.transitions = ListType_0();
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)getWeeklyScheduleWithParams:(MTRThermostatClusterGetWeeklyScheduleParams *)params
                     expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
              expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                         completion:(void (^)(MTRThermostatClusterGetWeeklyScheduleResponseParams * _Nullable data,
                                        NSError * _Nullable error))completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeThermostatID,
                                     (unsigned int) MTRCommandIDTypeClusterThermostatCommandGetWeeklyScheduleID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRThermostatClusterGetWeeklyScheduleResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                ThermostatClusterGetWeeklyScheduleResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRThermostatClusterGetWeeklyScheduleResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                Thermostat::Commands::GetWeeklySchedule::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.daysToReturn
                    = static_cast<std::remove_reference_t<decltype(request.daysToReturn)>>(params.daysToReturn.unsignedCharValue);
                request.modeToReturn
                    = static_cast<std::remove_reference_t<decltype(request.modeToReturn)>>(params.modeToReturn.unsignedCharValue);

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)clearWeeklyScheduleWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                   completion:(MTRStatusCompletion)completion
{
    [self clearWeeklyScheduleWithParams:nil
                         expectedValues:expectedValues
                  expectedValueInterval:expectedValueIntervalMs
                             completion:completion];
}
- (void)clearWeeklyScheduleWithParams:(MTRThermostatClusterClearWeeklyScheduleParams * _Nullable)params
                       expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                           completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeThermostatID,
                                     (unsigned int) MTRCommandIDTypeClusterThermostatCommandClearWeeklyScheduleID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                Thermostat::Commands::ClearWeeklySchedule::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (NSDictionary<NSString *, id> *)readAttributeLocalTemperatureWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThermostatID)
                                        attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeLocalTemperatureID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeOutdoorTemperatureWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThermostatID)
                                        attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeOutdoorTemperatureID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeOccupancyWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThermostatID)
                                        attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeOccupancyID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAbsMinHeatSetpointLimitWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThermostatID)
                                        attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeAbsMinHeatSetpointLimitID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAbsMaxHeatSetpointLimitWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThermostatID)
                                        attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeAbsMaxHeatSetpointLimitID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAbsMinCoolSetpointLimitWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThermostatID)
                                        attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeAbsMinCoolSetpointLimitID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAbsMaxCoolSetpointLimitWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThermostatID)
                                        attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeAbsMaxCoolSetpointLimitID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributePICoolingDemandWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThermostatID)
                                        attributeID:@(MTRAttributeIDTypeClusterThermostatAttributePICoolingDemandID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributePIHeatingDemandWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThermostatID)
                                        attributeID:@(MTRAttributeIDTypeClusterThermostatAttributePIHeatingDemandID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeHVACSystemTypeConfigurationWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThermostatID)
                                        attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeHVACSystemTypeConfigurationID)
                                             params:params];
}

- (void)writeAttributeHVACSystemTypeConfigurationWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                     expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeHVACSystemTypeConfigurationWithValue:dataValueDictionary
                                       expectedValueInterval:expectedValueIntervalMs
                                                      params:nil];
}
- (void)writeAttributeHVACSystemTypeConfigurationWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                     expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                                    params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeThermostatID)
                                  attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeHVACSystemTypeConfigurationID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeLocalTemperatureCalibrationWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThermostatID)
                                        attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeLocalTemperatureCalibrationID)
                                             params:params];
}

- (void)writeAttributeLocalTemperatureCalibrationWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                     expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeLocalTemperatureCalibrationWithValue:dataValueDictionary
                                       expectedValueInterval:expectedValueIntervalMs
                                                      params:nil];
}
- (void)writeAttributeLocalTemperatureCalibrationWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                     expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                                    params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeThermostatID)
                                  attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeLocalTemperatureCalibrationID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeOccupiedCoolingSetpointWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThermostatID)
                                        attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeOccupiedCoolingSetpointID)
                                             params:params];
}

- (void)writeAttributeOccupiedCoolingSetpointWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                 expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeOccupiedCoolingSetpointWithValue:dataValueDictionary
                                   expectedValueInterval:expectedValueIntervalMs
                                                  params:nil];
}
- (void)writeAttributeOccupiedCoolingSetpointWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                 expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                                params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeThermostatID)
                                  attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeOccupiedCoolingSetpointID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeOccupiedHeatingSetpointWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThermostatID)
                                        attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeOccupiedHeatingSetpointID)
                                             params:params];
}

- (void)writeAttributeOccupiedHeatingSetpointWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                 expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeOccupiedHeatingSetpointWithValue:dataValueDictionary
                                   expectedValueInterval:expectedValueIntervalMs
                                                  params:nil];
}
- (void)writeAttributeOccupiedHeatingSetpointWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                 expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                                params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeThermostatID)
                                  attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeOccupiedHeatingSetpointID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeUnoccupiedCoolingSetpointWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThermostatID)
                                        attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeUnoccupiedCoolingSetpointID)
                                             params:params];
}

- (void)writeAttributeUnoccupiedCoolingSetpointWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                   expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeUnoccupiedCoolingSetpointWithValue:dataValueDictionary
                                     expectedValueInterval:expectedValueIntervalMs
                                                    params:nil];
}
- (void)writeAttributeUnoccupiedCoolingSetpointWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                   expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                                  params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeThermostatID)
                                  attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeUnoccupiedCoolingSetpointID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeUnoccupiedHeatingSetpointWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThermostatID)
                                        attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeUnoccupiedHeatingSetpointID)
                                             params:params];
}

- (void)writeAttributeUnoccupiedHeatingSetpointWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                   expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeUnoccupiedHeatingSetpointWithValue:dataValueDictionary
                                     expectedValueInterval:expectedValueIntervalMs
                                                    params:nil];
}
- (void)writeAttributeUnoccupiedHeatingSetpointWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                   expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                                  params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeThermostatID)
                                  attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeUnoccupiedHeatingSetpointID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeMinHeatSetpointLimitWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThermostatID)
                                        attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeMinHeatSetpointLimitID)
                                             params:params];
}

- (void)writeAttributeMinHeatSetpointLimitWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                              expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeMinHeatSetpointLimitWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeMinHeatSetpointLimitWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                              expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                             params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeThermostatID)
                                  attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeMinHeatSetpointLimitID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeMaxHeatSetpointLimitWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThermostatID)
                                        attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeMaxHeatSetpointLimitID)
                                             params:params];
}

- (void)writeAttributeMaxHeatSetpointLimitWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                              expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeMaxHeatSetpointLimitWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeMaxHeatSetpointLimitWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                              expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                             params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeThermostatID)
                                  attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeMaxHeatSetpointLimitID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeMinCoolSetpointLimitWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThermostatID)
                                        attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeMinCoolSetpointLimitID)
                                             params:params];
}

- (void)writeAttributeMinCoolSetpointLimitWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                              expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeMinCoolSetpointLimitWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeMinCoolSetpointLimitWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                              expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                             params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeThermostatID)
                                  attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeMinCoolSetpointLimitID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeMaxCoolSetpointLimitWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThermostatID)
                                        attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeMaxCoolSetpointLimitID)
                                             params:params];
}

- (void)writeAttributeMaxCoolSetpointLimitWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                              expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeMaxCoolSetpointLimitWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeMaxCoolSetpointLimitWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                              expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                             params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeThermostatID)
                                  attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeMaxCoolSetpointLimitID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeMinSetpointDeadBandWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThermostatID)
                                        attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeMinSetpointDeadBandID)
                                             params:params];
}

- (void)writeAttributeMinSetpointDeadBandWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                             expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeMinSetpointDeadBandWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeMinSetpointDeadBandWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                             expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                            params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeThermostatID)
                                  attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeMinSetpointDeadBandID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeRemoteSensingWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThermostatID)
                                        attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeRemoteSensingID)
                                             params:params];
}

- (void)writeAttributeRemoteSensingWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                       expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeRemoteSensingWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeRemoteSensingWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                       expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                      params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeThermostatID)
                                  attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeRemoteSensingID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeControlSequenceOfOperationWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThermostatID)
                                        attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeControlSequenceOfOperationID)
                                             params:params];
}

- (void)writeAttributeControlSequenceOfOperationWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeControlSequenceOfOperationWithValue:dataValueDictionary
                                      expectedValueInterval:expectedValueIntervalMs
                                                     params:nil];
}
- (void)writeAttributeControlSequenceOfOperationWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                                   params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeThermostatID)
                                  attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeControlSequenceOfOperationID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeSystemModeWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThermostatID)
                                        attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeSystemModeID)
                                             params:params];
}

- (void)writeAttributeSystemModeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeSystemModeWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeSystemModeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                   params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeThermostatID)
                                  attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeSystemModeID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeThermostatRunningModeWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThermostatID)
                                        attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeThermostatRunningModeID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeStartOfWeekWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThermostatID)
                                        attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeStartOfWeekID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeNumberOfWeeklyTransitionsWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThermostatID)
                                        attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeNumberOfWeeklyTransitionsID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeNumberOfDailyTransitionsWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThermostatID)
                                        attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeNumberOfDailyTransitionsID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeTemperatureSetpointHoldWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThermostatID)
                                        attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeTemperatureSetpointHoldID)
                                             params:params];
}

- (void)writeAttributeTemperatureSetpointHoldWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                 expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeTemperatureSetpointHoldWithValue:dataValueDictionary
                                   expectedValueInterval:expectedValueIntervalMs
                                                  params:nil];
}
- (void)writeAttributeTemperatureSetpointHoldWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                 expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                                params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeThermostatID)
                                  attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeTemperatureSetpointHoldID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeTemperatureSetpointHoldDurationWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThermostatID)
                                        attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeTemperatureSetpointHoldDurationID)
                                             params:params];
}

- (void)writeAttributeTemperatureSetpointHoldDurationWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                         expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeTemperatureSetpointHoldDurationWithValue:dataValueDictionary
                                           expectedValueInterval:expectedValueIntervalMs
                                                          params:nil];
}
- (void)writeAttributeTemperatureSetpointHoldDurationWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                         expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                                        params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeThermostatID)
                                  attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeTemperatureSetpointHoldDurationID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeThermostatProgrammingOperationModeWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeThermostatID)
                                     attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeThermostatProgrammingOperationModeID)
                                          params:params];
}

- (void)writeAttributeThermostatProgrammingOperationModeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                            expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeThermostatProgrammingOperationModeWithValue:dataValueDictionary
                                              expectedValueInterval:expectedValueIntervalMs
                                                             params:nil];
}
- (void)writeAttributeThermostatProgrammingOperationModeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                            expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                                           params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeThermostatID)
                                  attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeThermostatProgrammingOperationModeID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeThermostatRunningStateWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThermostatID)
                                        attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeThermostatRunningStateID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeSetpointChangeSourceWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThermostatID)
                                        attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeSetpointChangeSourceID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeSetpointChangeAmountWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThermostatID)
                                        attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeSetpointChangeAmountID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeSetpointChangeSourceTimestampWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThermostatID)
                                        attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeSetpointChangeSourceTimestampID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeOccupiedSetbackWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThermostatID)
                                        attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeOccupiedSetbackID)
                                             params:params];
}

- (void)writeAttributeOccupiedSetbackWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                         expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeOccupiedSetbackWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeOccupiedSetbackWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                         expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                        params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeThermostatID)
                                  attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeOccupiedSetbackID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeOccupiedSetbackMinWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThermostatID)
                                        attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeOccupiedSetbackMinID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeOccupiedSetbackMaxWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThermostatID)
                                        attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeOccupiedSetbackMaxID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeUnoccupiedSetbackWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThermostatID)
                                        attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeUnoccupiedSetbackID)
                                             params:params];
}

- (void)writeAttributeUnoccupiedSetbackWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                           expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeUnoccupiedSetbackWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeUnoccupiedSetbackWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                           expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                          params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeThermostatID)
                                  attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeUnoccupiedSetbackID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeUnoccupiedSetbackMinWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThermostatID)
                                        attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeUnoccupiedSetbackMinID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeUnoccupiedSetbackMaxWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThermostatID)
                                        attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeUnoccupiedSetbackMaxID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeEmergencyHeatDeltaWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThermostatID)
                                        attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeEmergencyHeatDeltaID)
                                             params:params];
}

- (void)writeAttributeEmergencyHeatDeltaWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                            expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeEmergencyHeatDeltaWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeEmergencyHeatDeltaWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                            expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                           params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeThermostatID)
                                  attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeEmergencyHeatDeltaID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeACTypeWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThermostatID)
                                        attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeACTypeID)
                                             params:params];
}

- (void)writeAttributeACTypeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeACTypeWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeACTypeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                               params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeThermostatID)
                                  attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeACTypeID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeACCapacityWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThermostatID)
                                        attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeACCapacityID)
                                             params:params];
}

- (void)writeAttributeACCapacityWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeACCapacityWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeACCapacityWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                   params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeThermostatID)
                                  attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeACCapacityID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeACRefrigerantTypeWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThermostatID)
                                        attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeACRefrigerantTypeID)
                                             params:params];
}

- (void)writeAttributeACRefrigerantTypeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                           expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeACRefrigerantTypeWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeACRefrigerantTypeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                           expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                          params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeThermostatID)
                                  attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeACRefrigerantTypeID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeACCompressorTypeWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThermostatID)
                                        attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeACCompressorTypeID)
                                             params:params];
}

- (void)writeAttributeACCompressorTypeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                          expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeACCompressorTypeWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeACCompressorTypeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                          expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                         params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeThermostatID)
                                  attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeACCompressorTypeID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeACErrorCodeWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThermostatID)
                                        attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeACErrorCodeID)
                                             params:params];
}

- (void)writeAttributeACErrorCodeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                     expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeACErrorCodeWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeACErrorCodeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                     expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                    params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeThermostatID)
                                  attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeACErrorCodeID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeACLouverPositionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThermostatID)
                                        attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeACLouverPositionID)
                                             params:params];
}

- (void)writeAttributeACLouverPositionWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                          expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeACLouverPositionWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeACLouverPositionWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                          expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                         params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeThermostatID)
                                  attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeACLouverPositionID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeACCoilTemperatureWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThermostatID)
                                        attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeACCoilTemperatureID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeACCapacityformatWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThermostatID)
                                        attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeACCapacityformatID)
                                             params:params];
}

- (void)writeAttributeACCapacityformatWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                          expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeACCapacityformatWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeACCapacityformatWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                          expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                         params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeThermostatID)
                                  attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeACCapacityformatID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThermostatID)
                                        attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeGeneratedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThermostatID)
                                        attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThermostatID)
                                        attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThermostatID)
                                        attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeThermostatID)
                                        attributeID:@(MTRAttributeIDTypeClusterThermostatAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterThermostat (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

- (void)setpointRaiseLowerWithParams:(MTRThermostatClusterSetpointRaiseLowerParams *)params
                      expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
               expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                   completionHandler:(MTRStatusCompletion)completionHandler
{
    [self setpointRaiseLowerWithParams:params
                        expectedValues:expectedDataValueDictionaries
                 expectedValueInterval:expectedValueIntervalMs
                            completion:completionHandler];
}
- (void)setWeeklyScheduleWithParams:(MTRThermostatClusterSetWeeklyScheduleParams *)params
                     expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
              expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                  completionHandler:(MTRStatusCompletion)completionHandler
{
    [self setWeeklyScheduleWithParams:params
                       expectedValues:expectedDataValueDictionaries
                expectedValueInterval:expectedValueIntervalMs
                           completion:completionHandler];
}
- (void)getWeeklyScheduleWithParams:(MTRThermostatClusterGetWeeklyScheduleParams *)params
                     expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
              expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                  completionHandler:(void (^)(MTRThermostatClusterGetWeeklyScheduleResponseParams * _Nullable data,
                                        NSError * _Nullable error))completionHandler
{
    [self getWeeklyScheduleWithParams:params
                       expectedValues:expectedDataValueDictionaries
                expectedValueInterval:expectedValueIntervalMs
                           completion:^(
                               MTRThermostatClusterGetWeeklyScheduleResponseParams * _Nullable data, NSError * _Nullable error) {
                               // Cast is safe because subclass does not add any selectors.
                               completionHandler(static_cast<MTRThermostatClusterGetWeeklyScheduleResponseParams *>(data), error);
                           }];
}
- (void)clearWeeklyScheduleWithParams:(MTRThermostatClusterClearWeeklyScheduleParams * _Nullable)params
                       expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
                expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                    completionHandler:(MTRStatusCompletion)completionHandler
{
    [self clearWeeklyScheduleWithParams:params
                         expectedValues:expectedDataValueDictionaries
                  expectedValueInterval:expectedValueIntervalMs
                             completion:completionHandler];
}
- (void)clearWeeklyScheduleWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                            completionHandler:(MTRStatusCompletion)completionHandler
{
    [self clearWeeklyScheduleWithParams:nil
                         expectedValues:expectedValues
                  expectedValueInterval:expectedValueIntervalMs
                      completionHandler:completionHandler];
}
@end

@implementation MTRClusterFanControl

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (NSDictionary<NSString *, id> *)readAttributeFanModeWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeFanControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterFanControlAttributeFanModeID)
                                             params:params];
}

- (void)writeAttributeFanModeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                 expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeFanModeWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeFanModeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                 expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeFanControlID)
                                  attributeID:@(MTRAttributeIDTypeClusterFanControlAttributeFanModeID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeFanModeSequenceWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeFanControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterFanControlAttributeFanModeSequenceID)
                                             params:params];
}

- (void)writeAttributeFanModeSequenceWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                         expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeFanModeSequenceWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeFanModeSequenceWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                         expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                        params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeFanControlID)
                                  attributeID:@(MTRAttributeIDTypeClusterFanControlAttributeFanModeSequenceID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributePercentSettingWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeFanControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterFanControlAttributePercentSettingID)
                                             params:params];
}

- (void)writeAttributePercentSettingWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributePercentSettingWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributePercentSettingWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                       params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeFanControlID)
                                  attributeID:@(MTRAttributeIDTypeClusterFanControlAttributePercentSettingID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributePercentCurrentWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeFanControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterFanControlAttributePercentCurrentID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeSpeedMaxWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeFanControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterFanControlAttributeSpeedMaxID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeSpeedSettingWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeFanControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterFanControlAttributeSpeedSettingID)
                                             params:params];
}

- (void)writeAttributeSpeedSettingWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeSpeedSettingWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeSpeedSettingWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                     params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeFanControlID)
                                  attributeID:@(MTRAttributeIDTypeClusterFanControlAttributeSpeedSettingID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeSpeedCurrentWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeFanControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterFanControlAttributeSpeedCurrentID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeRockSupportWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeFanControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterFanControlAttributeRockSupportID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeRockSettingWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeFanControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterFanControlAttributeRockSettingID)
                                             params:params];
}

- (void)writeAttributeRockSettingWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                     expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeRockSettingWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeRockSettingWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                     expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                    params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeFanControlID)
                                  attributeID:@(MTRAttributeIDTypeClusterFanControlAttributeRockSettingID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeWindSupportWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeFanControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterFanControlAttributeWindSupportID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeWindSettingWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeFanControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterFanControlAttributeWindSettingID)
                                             params:params];
}

- (void)writeAttributeWindSettingWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                     expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeWindSettingWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeWindSettingWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                     expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                    params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeFanControlID)
                                  attributeID:@(MTRAttributeIDTypeClusterFanControlAttributeWindSettingID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeFanControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterFanControlAttributeGeneratedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeFanControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterFanControlAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeFanControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterFanControlAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeFanControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterFanControlAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeFanControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterFanControlAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterFanControl (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

@end

@implementation MTRClusterThermostatUserInterfaceConfiguration

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (NSDictionary<NSString *, id> *)readAttributeTemperatureDisplayModeWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeThermostatUserInterfaceConfigurationID)
                        attributeID:
                            @(MTRAttributeIDTypeClusterThermostatUserInterfaceConfigurationAttributeTemperatureDisplayModeID)
                             params:params];
}

- (void)writeAttributeTemperatureDisplayModeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeTemperatureDisplayModeWithValue:dataValueDictionary
                                  expectedValueInterval:expectedValueIntervalMs
                                                 params:nil];
}
- (void)writeAttributeTemperatureDisplayModeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                               params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device
        writeAttributeWithEndpointID:@(_endpoint)
                           clusterID:@(MTRClusterIDTypeThermostatUserInterfaceConfigurationID)
                         attributeID:
                             @(MTRAttributeIDTypeClusterThermostatUserInterfaceConfigurationAttributeTemperatureDisplayModeID)
                               value:dataValueDictionary
               expectedValueInterval:expectedValueIntervalMs
                   timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeKeypadLockoutWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeThermostatUserInterfaceConfigurationID)
                        attributeID:@(MTRAttributeIDTypeClusterThermostatUserInterfaceConfigurationAttributeKeypadLockoutID)
                             params:params];
}

- (void)writeAttributeKeypadLockoutWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                       expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeKeypadLockoutWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeKeypadLockoutWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                       expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                      params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device
        writeAttributeWithEndpointID:@(_endpoint)
                           clusterID:@(MTRClusterIDTypeThermostatUserInterfaceConfigurationID)
                         attributeID:@(MTRAttributeIDTypeClusterThermostatUserInterfaceConfigurationAttributeKeypadLockoutID)
                               value:dataValueDictionary
               expectedValueInterval:expectedValueIntervalMs
                   timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeScheduleProgrammingVisibilityWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeThermostatUserInterfaceConfigurationID)
                        attributeID:
                            @(MTRAttributeIDTypeClusterThermostatUserInterfaceConfigurationAttributeScheduleProgrammingVisibilityID)
                             params:params];
}

- (void)writeAttributeScheduleProgrammingVisibilityWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                       expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeScheduleProgrammingVisibilityWithValue:dataValueDictionary
                                         expectedValueInterval:expectedValueIntervalMs
                                                        params:nil];
}
- (void)writeAttributeScheduleProgrammingVisibilityWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                       expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                                      params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device
        writeAttributeWithEndpointID:@(_endpoint)
                           clusterID:@(MTRClusterIDTypeThermostatUserInterfaceConfigurationID)
                         attributeID:
                             @(MTRAttributeIDTypeClusterThermostatUserInterfaceConfigurationAttributeScheduleProgrammingVisibilityID)
                               value:dataValueDictionary
               expectedValueInterval:expectedValueIntervalMs
                   timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeThermostatUserInterfaceConfigurationID)
                        attributeID:@(MTRAttributeIDTypeClusterThermostatUserInterfaceConfigurationAttributeGeneratedCommandListID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeThermostatUserInterfaceConfigurationID)
                        attributeID:@(MTRAttributeIDTypeClusterThermostatUserInterfaceConfigurationAttributeAcceptedCommandListID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeThermostatUserInterfaceConfigurationID)
                        attributeID:@(MTRAttributeIDTypeClusterThermostatUserInterfaceConfigurationAttributeAttributeListID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeThermostatUserInterfaceConfigurationID)
                        attributeID:@(MTRAttributeIDTypeClusterThermostatUserInterfaceConfigurationAttributeFeatureMapID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeThermostatUserInterfaceConfigurationID)
                        attributeID:@(MTRAttributeIDTypeClusterThermostatUserInterfaceConfigurationAttributeClusterRevisionID)
                             params:params];
}

@end

@implementation MTRClusterThermostatUserInterfaceConfiguration (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

@end

@implementation MTRClusterColorControl

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (void)moveToHueWithParams:(MTRColorControlClusterMoveToHueParams *)params
             expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                 completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeColorControlID,
                                     (unsigned int) MTRCommandIDTypeClusterColorControlCommandMoveToHueID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                ColorControl::Commands::MoveToHue::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.hue = params.hue.unsignedCharValue;
                request.direction
                    = static_cast<std::remove_reference_t<decltype(request.direction)>>(params.direction.unsignedCharValue);
                request.transitionTime = params.transitionTime.unsignedShortValue;
                request.optionsMask = params.optionsMask.unsignedCharValue;
                request.optionsOverride = params.optionsOverride.unsignedCharValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)moveHueWithParams:(MTRColorControlClusterMoveHueParams *)params
           expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
               completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeColorControlID,
                                     (unsigned int) MTRCommandIDTypeClusterColorControlCommandMoveHueID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                ColorControl::Commands::MoveHue::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.moveMode
                    = static_cast<std::remove_reference_t<decltype(request.moveMode)>>(params.moveMode.unsignedCharValue);
                request.rate = params.rate.unsignedCharValue;
                request.optionsMask = params.optionsMask.unsignedCharValue;
                request.optionsOverride = params.optionsOverride.unsignedCharValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)stepHueWithParams:(MTRColorControlClusterStepHueParams *)params
           expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
               completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeColorControlID,
                                     (unsigned int) MTRCommandIDTypeClusterColorControlCommandStepHueID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                ColorControl::Commands::StepHue::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.stepMode
                    = static_cast<std::remove_reference_t<decltype(request.stepMode)>>(params.stepMode.unsignedCharValue);
                request.stepSize = params.stepSize.unsignedCharValue;
                request.transitionTime = params.transitionTime.unsignedCharValue;
                request.optionsMask = params.optionsMask.unsignedCharValue;
                request.optionsOverride = params.optionsOverride.unsignedCharValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)moveToSaturationWithParams:(MTRColorControlClusterMoveToSaturationParams *)params
                    expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
             expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                        completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeColorControlID,
                                     (unsigned int) MTRCommandIDTypeClusterColorControlCommandMoveToSaturationID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                ColorControl::Commands::MoveToSaturation::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.saturation = params.saturation.unsignedCharValue;
                request.transitionTime = params.transitionTime.unsignedShortValue;
                request.optionsMask = params.optionsMask.unsignedCharValue;
                request.optionsOverride = params.optionsOverride.unsignedCharValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)moveSaturationWithParams:(MTRColorControlClusterMoveSaturationParams *)params
                  expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
           expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                      completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeColorControlID,
                                     (unsigned int) MTRCommandIDTypeClusterColorControlCommandMoveSaturationID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                ColorControl::Commands::MoveSaturation::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.moveMode
                    = static_cast<std::remove_reference_t<decltype(request.moveMode)>>(params.moveMode.unsignedCharValue);
                request.rate = params.rate.unsignedCharValue;
                request.optionsMask = params.optionsMask.unsignedCharValue;
                request.optionsOverride = params.optionsOverride.unsignedCharValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)stepSaturationWithParams:(MTRColorControlClusterStepSaturationParams *)params
                  expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
           expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                      completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeColorControlID,
                                     (unsigned int) MTRCommandIDTypeClusterColorControlCommandStepSaturationID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                ColorControl::Commands::StepSaturation::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.stepMode
                    = static_cast<std::remove_reference_t<decltype(request.stepMode)>>(params.stepMode.unsignedCharValue);
                request.stepSize = params.stepSize.unsignedCharValue;
                request.transitionTime = params.transitionTime.unsignedCharValue;
                request.optionsMask = params.optionsMask.unsignedCharValue;
                request.optionsOverride = params.optionsOverride.unsignedCharValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)moveToHueAndSaturationWithParams:(MTRColorControlClusterMoveToHueAndSaturationParams *)params
                          expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                   expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                              completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeColorControlID,
                                     (unsigned int) MTRCommandIDTypeClusterColorControlCommandMoveToHueAndSaturationID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                ColorControl::Commands::MoveToHueAndSaturation::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.hue = params.hue.unsignedCharValue;
                request.saturation = params.saturation.unsignedCharValue;
                request.transitionTime = params.transitionTime.unsignedShortValue;
                request.optionsMask = params.optionsMask.unsignedCharValue;
                request.optionsOverride = params.optionsOverride.unsignedCharValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)moveToColorWithParams:(MTRColorControlClusterMoveToColorParams *)params
               expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                   completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeColorControlID,
                                     (unsigned int) MTRCommandIDTypeClusterColorControlCommandMoveToColorID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                ColorControl::Commands::MoveToColor::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.colorX = params.colorX.unsignedShortValue;
                request.colorY = params.colorY.unsignedShortValue;
                request.transitionTime = params.transitionTime.unsignedShortValue;
                request.optionsMask = params.optionsMask.unsignedCharValue;
                request.optionsOverride = params.optionsOverride.unsignedCharValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)moveColorWithParams:(MTRColorControlClusterMoveColorParams *)params
             expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                 completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeColorControlID,
                                     (unsigned int) MTRCommandIDTypeClusterColorControlCommandMoveColorID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                ColorControl::Commands::MoveColor::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.rateX = params.rateX.shortValue;
                request.rateY = params.rateY.shortValue;
                request.optionsMask = params.optionsMask.unsignedCharValue;
                request.optionsOverride = params.optionsOverride.unsignedCharValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)stepColorWithParams:(MTRColorControlClusterStepColorParams *)params
             expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                 completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeColorControlID,
                                     (unsigned int) MTRCommandIDTypeClusterColorControlCommandStepColorID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                ColorControl::Commands::StepColor::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.stepX = params.stepX.shortValue;
                request.stepY = params.stepY.shortValue;
                request.transitionTime = params.transitionTime.unsignedShortValue;
                request.optionsMask = params.optionsMask.unsignedCharValue;
                request.optionsOverride = params.optionsOverride.unsignedCharValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)moveToColorTemperatureWithParams:(MTRColorControlClusterMoveToColorTemperatureParams *)params
                          expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                   expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                              completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeColorControlID,
                                     (unsigned int) MTRCommandIDTypeClusterColorControlCommandMoveToColorTemperatureID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                ColorControl::Commands::MoveToColorTemperature::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.colorTemperatureMireds = params.colorTemperatureMireds.unsignedShortValue;
                request.transitionTime = params.transitionTime.unsignedShortValue;
                request.optionsMask = params.optionsMask.unsignedCharValue;
                request.optionsOverride = params.optionsOverride.unsignedCharValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)enhancedMoveToHueWithParams:(MTRColorControlClusterEnhancedMoveToHueParams *)params
                     expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
              expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                         completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeColorControlID,
                                     (unsigned int) MTRCommandIDTypeClusterColorControlCommandEnhancedMoveToHueID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                ColorControl::Commands::EnhancedMoveToHue::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.enhancedHue = params.enhancedHue.unsignedShortValue;
                request.direction
                    = static_cast<std::remove_reference_t<decltype(request.direction)>>(params.direction.unsignedCharValue);
                request.transitionTime = params.transitionTime.unsignedShortValue;
                request.optionsMask = params.optionsMask.unsignedCharValue;
                request.optionsOverride = params.optionsOverride.unsignedCharValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)enhancedMoveHueWithParams:(MTRColorControlClusterEnhancedMoveHueParams *)params
                   expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
            expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                       completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeColorControlID,
                                     (unsigned int) MTRCommandIDTypeClusterColorControlCommandEnhancedMoveHueID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                ColorControl::Commands::EnhancedMoveHue::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.moveMode
                    = static_cast<std::remove_reference_t<decltype(request.moveMode)>>(params.moveMode.unsignedCharValue);
                request.rate = params.rate.unsignedShortValue;
                request.optionsMask = params.optionsMask.unsignedCharValue;
                request.optionsOverride = params.optionsOverride.unsignedCharValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)enhancedStepHueWithParams:(MTRColorControlClusterEnhancedStepHueParams *)params
                   expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
            expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                       completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeColorControlID,
                                     (unsigned int) MTRCommandIDTypeClusterColorControlCommandEnhancedStepHueID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                ColorControl::Commands::EnhancedStepHue::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.stepMode
                    = static_cast<std::remove_reference_t<decltype(request.stepMode)>>(params.stepMode.unsignedCharValue);
                request.stepSize = params.stepSize.unsignedShortValue;
                request.transitionTime = params.transitionTime.unsignedShortValue;
                request.optionsMask = params.optionsMask.unsignedCharValue;
                request.optionsOverride = params.optionsOverride.unsignedCharValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)enhancedMoveToHueAndSaturationWithParams:(MTRColorControlClusterEnhancedMoveToHueAndSaturationParams *)params
                                  expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                           expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                      completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeColorControlID,
                                     (unsigned int) MTRCommandIDTypeClusterColorControlCommandEnhancedMoveToHueAndSaturationID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                ColorControl::Commands::EnhancedMoveToHueAndSaturation::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.enhancedHue = params.enhancedHue.unsignedShortValue;
                request.saturation = params.saturation.unsignedCharValue;
                request.transitionTime = params.transitionTime.unsignedShortValue;
                request.optionsMask = params.optionsMask.unsignedCharValue;
                request.optionsOverride = params.optionsOverride.unsignedCharValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)colorLoopSetWithParams:(MTRColorControlClusterColorLoopSetParams *)params
                expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
         expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                    completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeColorControlID,
                                     (unsigned int) MTRCommandIDTypeClusterColorControlCommandColorLoopSetID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                ColorControl::Commands::ColorLoopSet::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.updateFlags
                    = static_cast<std::remove_reference_t<decltype(request.updateFlags)>>(params.updateFlags.unsignedCharValue);
                request.action = static_cast<std::remove_reference_t<decltype(request.action)>>(params.action.unsignedCharValue);
                request.direction
                    = static_cast<std::remove_reference_t<decltype(request.direction)>>(params.direction.unsignedCharValue);
                request.time = params.time.unsignedShortValue;
                request.startHue = params.startHue.unsignedShortValue;
                request.optionsMask = params.optionsMask.unsignedCharValue;
                request.optionsOverride = params.optionsOverride.unsignedCharValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)stopMoveStepWithParams:(MTRColorControlClusterStopMoveStepParams *)params
                expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
         expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                    completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeColorControlID,
                                     (unsigned int) MTRCommandIDTypeClusterColorControlCommandStopMoveStepID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                ColorControl::Commands::StopMoveStep::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.optionsMask = params.optionsMask.unsignedCharValue;
                request.optionsOverride = params.optionsOverride.unsignedCharValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)moveColorTemperatureWithParams:(MTRColorControlClusterMoveColorTemperatureParams *)params
                        expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                 expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                            completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeColorControlID,
                                     (unsigned int) MTRCommandIDTypeClusterColorControlCommandMoveColorTemperatureID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                ColorControl::Commands::MoveColorTemperature::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.moveMode
                    = static_cast<std::remove_reference_t<decltype(request.moveMode)>>(params.moveMode.unsignedCharValue);
                request.rate = params.rate.unsignedShortValue;
                request.colorTemperatureMinimumMireds = params.colorTemperatureMinimumMireds.unsignedShortValue;
                request.colorTemperatureMaximumMireds = params.colorTemperatureMaximumMireds.unsignedShortValue;
                request.optionsMask = params.optionsMask.unsignedCharValue;
                request.optionsOverride = params.optionsOverride.unsignedCharValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)stepColorTemperatureWithParams:(MTRColorControlClusterStepColorTemperatureParams *)params
                        expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                 expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                            completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeColorControlID,
                                     (unsigned int) MTRCommandIDTypeClusterColorControlCommandStepColorTemperatureID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                ColorControl::Commands::StepColorTemperature::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.stepMode
                    = static_cast<std::remove_reference_t<decltype(request.stepMode)>>(params.stepMode.unsignedCharValue);
                request.stepSize = params.stepSize.unsignedShortValue;
                request.transitionTime = params.transitionTime.unsignedShortValue;
                request.colorTemperatureMinimumMireds = params.colorTemperatureMinimumMireds.unsignedShortValue;
                request.colorTemperatureMaximumMireds = params.colorTemperatureMaximumMireds.unsignedShortValue;
                request.optionsMask = params.optionsMask.unsignedCharValue;
                request.optionsOverride = params.optionsOverride.unsignedCharValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (NSDictionary<NSString *, id> *)readAttributeCurrentHueWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeColorControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterColorControlAttributeCurrentHueID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeCurrentSaturationWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeColorControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterColorControlAttributeCurrentSaturationID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeRemainingTimeWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeColorControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterColorControlAttributeRemainingTimeID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeCurrentXWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeColorControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterColorControlAttributeCurrentXID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeCurrentYWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeColorControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterColorControlAttributeCurrentYID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeDriftCompensationWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeColorControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterColorControlAttributeDriftCompensationID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeCompensationTextWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeColorControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterColorControlAttributeCompensationTextID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeColorTemperatureMiredsWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeColorControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterColorControlAttributeColorTemperatureMiredsID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeColorModeWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeColorControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterColorControlAttributeColorModeID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeOptionsWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeColorControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterColorControlAttributeOptionsID)
                                             params:params];
}

- (void)writeAttributeOptionsWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                 expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeOptionsWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeOptionsWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                 expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeColorControlID)
                                  attributeID:@(MTRAttributeIDTypeClusterColorControlAttributeOptionsID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeNumberOfPrimariesWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeColorControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterColorControlAttributeNumberOfPrimariesID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributePrimary1XWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeColorControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterColorControlAttributePrimary1XID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributePrimary1YWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeColorControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterColorControlAttributePrimary1YID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributePrimary1IntensityWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeColorControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterColorControlAttributePrimary1IntensityID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributePrimary2XWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeColorControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterColorControlAttributePrimary2XID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributePrimary2YWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeColorControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterColorControlAttributePrimary2YID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributePrimary2IntensityWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeColorControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterColorControlAttributePrimary2IntensityID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributePrimary3XWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeColorControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterColorControlAttributePrimary3XID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributePrimary3YWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeColorControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterColorControlAttributePrimary3YID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributePrimary3IntensityWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeColorControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterColorControlAttributePrimary3IntensityID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributePrimary4XWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeColorControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterColorControlAttributePrimary4XID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributePrimary4YWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeColorControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterColorControlAttributePrimary4YID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributePrimary4IntensityWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeColorControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterColorControlAttributePrimary4IntensityID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributePrimary5XWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeColorControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterColorControlAttributePrimary5XID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributePrimary5YWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeColorControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterColorControlAttributePrimary5YID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributePrimary5IntensityWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeColorControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterColorControlAttributePrimary5IntensityID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributePrimary6XWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeColorControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterColorControlAttributePrimary6XID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributePrimary6YWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeColorControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterColorControlAttributePrimary6YID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributePrimary6IntensityWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeColorControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterColorControlAttributePrimary6IntensityID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeWhitePointXWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeColorControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterColorControlAttributeWhitePointXID)
                                             params:params];
}

- (void)writeAttributeWhitePointXWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                     expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeWhitePointXWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeWhitePointXWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                     expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                    params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeColorControlID)
                                  attributeID:@(MTRAttributeIDTypeClusterColorControlAttributeWhitePointXID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeWhitePointYWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeColorControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterColorControlAttributeWhitePointYID)
                                             params:params];
}

- (void)writeAttributeWhitePointYWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                     expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeWhitePointYWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeWhitePointYWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                     expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                    params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeColorControlID)
                                  attributeID:@(MTRAttributeIDTypeClusterColorControlAttributeWhitePointYID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeColorPointRXWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeColorControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterColorControlAttributeColorPointRXID)
                                             params:params];
}

- (void)writeAttributeColorPointRXWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeColorPointRXWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeColorPointRXWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                     params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeColorControlID)
                                  attributeID:@(MTRAttributeIDTypeClusterColorControlAttributeColorPointRXID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeColorPointRYWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeColorControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterColorControlAttributeColorPointRYID)
                                             params:params];
}

- (void)writeAttributeColorPointRYWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeColorPointRYWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeColorPointRYWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                     params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeColorControlID)
                                  attributeID:@(MTRAttributeIDTypeClusterColorControlAttributeColorPointRYID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeColorPointRIntensityWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeColorControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterColorControlAttributeColorPointRIntensityID)
                                             params:params];
}

- (void)writeAttributeColorPointRIntensityWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                              expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeColorPointRIntensityWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeColorPointRIntensityWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                              expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                             params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeColorControlID)
                                  attributeID:@(MTRAttributeIDTypeClusterColorControlAttributeColorPointRIntensityID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeColorPointGXWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeColorControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterColorControlAttributeColorPointGXID)
                                             params:params];
}

- (void)writeAttributeColorPointGXWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeColorPointGXWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeColorPointGXWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                     params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeColorControlID)
                                  attributeID:@(MTRAttributeIDTypeClusterColorControlAttributeColorPointGXID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeColorPointGYWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeColorControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterColorControlAttributeColorPointGYID)
                                             params:params];
}

- (void)writeAttributeColorPointGYWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeColorPointGYWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeColorPointGYWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                     params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeColorControlID)
                                  attributeID:@(MTRAttributeIDTypeClusterColorControlAttributeColorPointGYID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeColorPointGIntensityWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeColorControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterColorControlAttributeColorPointGIntensityID)
                                             params:params];
}

- (void)writeAttributeColorPointGIntensityWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                              expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeColorPointGIntensityWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeColorPointGIntensityWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                              expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                             params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeColorControlID)
                                  attributeID:@(MTRAttributeIDTypeClusterColorControlAttributeColorPointGIntensityID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeColorPointBXWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeColorControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterColorControlAttributeColorPointBXID)
                                             params:params];
}

- (void)writeAttributeColorPointBXWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeColorPointBXWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeColorPointBXWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                     params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeColorControlID)
                                  attributeID:@(MTRAttributeIDTypeClusterColorControlAttributeColorPointBXID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeColorPointBYWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeColorControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterColorControlAttributeColorPointBYID)
                                             params:params];
}

- (void)writeAttributeColorPointBYWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeColorPointBYWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeColorPointBYWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                     params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeColorControlID)
                                  attributeID:@(MTRAttributeIDTypeClusterColorControlAttributeColorPointBYID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeColorPointBIntensityWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeColorControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterColorControlAttributeColorPointBIntensityID)
                                             params:params];
}

- (void)writeAttributeColorPointBIntensityWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                              expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeColorPointBIntensityWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeColorPointBIntensityWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                              expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                             params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeColorControlID)
                                  attributeID:@(MTRAttributeIDTypeClusterColorControlAttributeColorPointBIntensityID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeEnhancedCurrentHueWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeColorControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterColorControlAttributeEnhancedCurrentHueID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeEnhancedColorModeWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeColorControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterColorControlAttributeEnhancedColorModeID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeColorLoopActiveWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeColorControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterColorControlAttributeColorLoopActiveID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeColorLoopDirectionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeColorControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterColorControlAttributeColorLoopDirectionID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeColorLoopTimeWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeColorControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterColorControlAttributeColorLoopTimeID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeColorLoopStartEnhancedHueWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeColorControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterColorControlAttributeColorLoopStartEnhancedHueID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeColorLoopStoredEnhancedHueWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeColorControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterColorControlAttributeColorLoopStoredEnhancedHueID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeColorCapabilitiesWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeColorControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterColorControlAttributeColorCapabilitiesID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeColorTempPhysicalMinMiredsWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeColorControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterColorControlAttributeColorTempPhysicalMinMiredsID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeColorTempPhysicalMaxMiredsWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeColorControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterColorControlAttributeColorTempPhysicalMaxMiredsID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeCoupleColorTempToLevelMinMiredsWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeColorControlID)
                                     attributeID:@(MTRAttributeIDTypeClusterColorControlAttributeCoupleColorTempToLevelMinMiredsID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeStartUpColorTemperatureMiredsWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeColorControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterColorControlAttributeStartUpColorTemperatureMiredsID)
                                             params:params];
}

- (void)writeAttributeStartUpColorTemperatureMiredsWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                       expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeStartUpColorTemperatureMiredsWithValue:dataValueDictionary
                                         expectedValueInterval:expectedValueIntervalMs
                                                        params:nil];
}
- (void)writeAttributeStartUpColorTemperatureMiredsWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                       expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                                      params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeColorControlID)
                                  attributeID:@(MTRAttributeIDTypeClusterColorControlAttributeStartUpColorTemperatureMiredsID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeColorControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterColorControlAttributeGeneratedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeColorControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterColorControlAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeColorControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterColorControlAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeColorControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterColorControlAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeColorControlID)
                                        attributeID:@(MTRAttributeIDTypeClusterColorControlAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterColorControl (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

- (void)moveToHueWithParams:(MTRColorControlClusterMoveToHueParams *)params
             expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
      expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
          completionHandler:(MTRStatusCompletion)completionHandler
{
    [self moveToHueWithParams:params
               expectedValues:expectedDataValueDictionaries
        expectedValueInterval:expectedValueIntervalMs
                   completion:completionHandler];
}
- (void)moveHueWithParams:(MTRColorControlClusterMoveHueParams *)params
           expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
    expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
        completionHandler:(MTRStatusCompletion)completionHandler
{
    [self moveHueWithParams:params
               expectedValues:expectedDataValueDictionaries
        expectedValueInterval:expectedValueIntervalMs
                   completion:completionHandler];
}
- (void)stepHueWithParams:(MTRColorControlClusterStepHueParams *)params
           expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
    expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
        completionHandler:(MTRStatusCompletion)completionHandler
{
    [self stepHueWithParams:params
               expectedValues:expectedDataValueDictionaries
        expectedValueInterval:expectedValueIntervalMs
                   completion:completionHandler];
}
- (void)moveToSaturationWithParams:(MTRColorControlClusterMoveToSaturationParams *)params
                    expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
             expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                 completionHandler:(MTRStatusCompletion)completionHandler
{
    [self moveToSaturationWithParams:params
                      expectedValues:expectedDataValueDictionaries
               expectedValueInterval:expectedValueIntervalMs
                          completion:completionHandler];
}
- (void)moveSaturationWithParams:(MTRColorControlClusterMoveSaturationParams *)params
                  expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
           expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
               completionHandler:(MTRStatusCompletion)completionHandler
{
    [self moveSaturationWithParams:params
                    expectedValues:expectedDataValueDictionaries
             expectedValueInterval:expectedValueIntervalMs
                        completion:completionHandler];
}
- (void)stepSaturationWithParams:(MTRColorControlClusterStepSaturationParams *)params
                  expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
           expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
               completionHandler:(MTRStatusCompletion)completionHandler
{
    [self stepSaturationWithParams:params
                    expectedValues:expectedDataValueDictionaries
             expectedValueInterval:expectedValueIntervalMs
                        completion:completionHandler];
}
- (void)moveToHueAndSaturationWithParams:(MTRColorControlClusterMoveToHueAndSaturationParams *)params
                          expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
                   expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                       completionHandler:(MTRStatusCompletion)completionHandler
{
    [self moveToHueAndSaturationWithParams:params
                            expectedValues:expectedDataValueDictionaries
                     expectedValueInterval:expectedValueIntervalMs
                                completion:completionHandler];
}
- (void)moveToColorWithParams:(MTRColorControlClusterMoveToColorParams *)params
               expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
        expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
            completionHandler:(MTRStatusCompletion)completionHandler
{
    [self moveToColorWithParams:params
                 expectedValues:expectedDataValueDictionaries
          expectedValueInterval:expectedValueIntervalMs
                     completion:completionHandler];
}
- (void)moveColorWithParams:(MTRColorControlClusterMoveColorParams *)params
             expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
      expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
          completionHandler:(MTRStatusCompletion)completionHandler
{
    [self moveColorWithParams:params
               expectedValues:expectedDataValueDictionaries
        expectedValueInterval:expectedValueIntervalMs
                   completion:completionHandler];
}
- (void)stepColorWithParams:(MTRColorControlClusterStepColorParams *)params
             expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
      expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
          completionHandler:(MTRStatusCompletion)completionHandler
{
    [self stepColorWithParams:params
               expectedValues:expectedDataValueDictionaries
        expectedValueInterval:expectedValueIntervalMs
                   completion:completionHandler];
}
- (void)moveToColorTemperatureWithParams:(MTRColorControlClusterMoveToColorTemperatureParams *)params
                          expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
                   expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                       completionHandler:(MTRStatusCompletion)completionHandler
{
    [self moveToColorTemperatureWithParams:params
                            expectedValues:expectedDataValueDictionaries
                     expectedValueInterval:expectedValueIntervalMs
                                completion:completionHandler];
}
- (void)enhancedMoveToHueWithParams:(MTRColorControlClusterEnhancedMoveToHueParams *)params
                     expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
              expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                  completionHandler:(MTRStatusCompletion)completionHandler
{
    [self enhancedMoveToHueWithParams:params
                       expectedValues:expectedDataValueDictionaries
                expectedValueInterval:expectedValueIntervalMs
                           completion:completionHandler];
}
- (void)enhancedMoveHueWithParams:(MTRColorControlClusterEnhancedMoveHueParams *)params
                   expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
            expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                completionHandler:(MTRStatusCompletion)completionHandler
{
    [self enhancedMoveHueWithParams:params
                     expectedValues:expectedDataValueDictionaries
              expectedValueInterval:expectedValueIntervalMs
                         completion:completionHandler];
}
- (void)enhancedStepHueWithParams:(MTRColorControlClusterEnhancedStepHueParams *)params
                   expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
            expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                completionHandler:(MTRStatusCompletion)completionHandler
{
    [self enhancedStepHueWithParams:params
                     expectedValues:expectedDataValueDictionaries
              expectedValueInterval:expectedValueIntervalMs
                         completion:completionHandler];
}
- (void)enhancedMoveToHueAndSaturationWithParams:(MTRColorControlClusterEnhancedMoveToHueAndSaturationParams *)params
                                  expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
                           expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                               completionHandler:(MTRStatusCompletion)completionHandler
{
    [self enhancedMoveToHueAndSaturationWithParams:params
                                    expectedValues:expectedDataValueDictionaries
                             expectedValueInterval:expectedValueIntervalMs
                                        completion:completionHandler];
}
- (void)colorLoopSetWithParams:(MTRColorControlClusterColorLoopSetParams *)params
                expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
         expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
             completionHandler:(MTRStatusCompletion)completionHandler
{
    [self colorLoopSetWithParams:params
                  expectedValues:expectedDataValueDictionaries
           expectedValueInterval:expectedValueIntervalMs
                      completion:completionHandler];
}
- (void)stopMoveStepWithParams:(MTRColorControlClusterStopMoveStepParams *)params
                expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
         expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
             completionHandler:(MTRStatusCompletion)completionHandler
{
    [self stopMoveStepWithParams:params
                  expectedValues:expectedDataValueDictionaries
           expectedValueInterval:expectedValueIntervalMs
                      completion:completionHandler];
}
- (void)moveColorTemperatureWithParams:(MTRColorControlClusterMoveColorTemperatureParams *)params
                        expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
                 expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                     completionHandler:(MTRStatusCompletion)completionHandler
{
    [self moveColorTemperatureWithParams:params
                          expectedValues:expectedDataValueDictionaries
                   expectedValueInterval:expectedValueIntervalMs
                              completion:completionHandler];
}
- (void)stepColorTemperatureWithParams:(MTRColorControlClusterStepColorTemperatureParams *)params
                        expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
                 expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                     completionHandler:(MTRStatusCompletion)completionHandler
{
    [self stepColorTemperatureWithParams:params
                          expectedValues:expectedDataValueDictionaries
                   expectedValueInterval:expectedValueIntervalMs
                              completion:completionHandler];
}
@end

@implementation MTRClusterBallastConfiguration

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (NSDictionary<NSString *, id> *)readAttributePhysicalMinLevelWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBallastConfigurationID)
                                        attributeID:@(MTRAttributeIDTypeClusterBallastConfigurationAttributePhysicalMinLevelID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributePhysicalMaxLevelWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBallastConfigurationID)
                                        attributeID:@(MTRAttributeIDTypeClusterBallastConfigurationAttributePhysicalMaxLevelID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeBallastStatusWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBallastConfigurationID)
                                        attributeID:@(MTRAttributeIDTypeClusterBallastConfigurationAttributeBallastStatusID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeMinLevelWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBallastConfigurationID)
                                        attributeID:@(MTRAttributeIDTypeClusterBallastConfigurationAttributeMinLevelID)
                                             params:params];
}

- (void)writeAttributeMinLevelWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                  expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeMinLevelWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeMinLevelWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                  expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                 params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeBallastConfigurationID)
                                  attributeID:@(MTRAttributeIDTypeClusterBallastConfigurationAttributeMinLevelID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeMaxLevelWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBallastConfigurationID)
                                        attributeID:@(MTRAttributeIDTypeClusterBallastConfigurationAttributeMaxLevelID)
                                             params:params];
}

- (void)writeAttributeMaxLevelWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                  expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeMaxLevelWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeMaxLevelWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                  expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                 params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeBallastConfigurationID)
                                  attributeID:@(MTRAttributeIDTypeClusterBallastConfigurationAttributeMaxLevelID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeIntrinsicBallastFactorWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeBallastConfigurationID)
                                     attributeID:@(MTRAttributeIDTypeClusterBallastConfigurationAttributeIntrinsicBallastFactorID)
                                          params:params];
}

- (void)writeAttributeIntrinsicBallastFactorWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeIntrinsicBallastFactorWithValue:dataValueDictionary
                                  expectedValueInterval:expectedValueIntervalMs
                                                 params:nil];
}
- (void)writeAttributeIntrinsicBallastFactorWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                               params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeBallastConfigurationID)
                                  attributeID:@(MTRAttributeIDTypeClusterBallastConfigurationAttributeIntrinsicBallastFactorID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeBallastFactorAdjustmentWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeBallastConfigurationID)
                                     attributeID:@(MTRAttributeIDTypeClusterBallastConfigurationAttributeBallastFactorAdjustmentID)
                                          params:params];
}

- (void)writeAttributeBallastFactorAdjustmentWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                 expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeBallastFactorAdjustmentWithValue:dataValueDictionary
                                   expectedValueInterval:expectedValueIntervalMs
                                                  params:nil];
}
- (void)writeAttributeBallastFactorAdjustmentWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                 expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                                params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeBallastConfigurationID)
                                  attributeID:@(MTRAttributeIDTypeClusterBallastConfigurationAttributeBallastFactorAdjustmentID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeLampQuantityWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBallastConfigurationID)
                                        attributeID:@(MTRAttributeIDTypeClusterBallastConfigurationAttributeLampQuantityID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeLampTypeWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBallastConfigurationID)
                                        attributeID:@(MTRAttributeIDTypeClusterBallastConfigurationAttributeLampTypeID)
                                             params:params];
}

- (void)writeAttributeLampTypeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                  expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeLampTypeWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeLampTypeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                  expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                 params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeBallastConfigurationID)
                                  attributeID:@(MTRAttributeIDTypeClusterBallastConfigurationAttributeLampTypeID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeLampManufacturerWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBallastConfigurationID)
                                        attributeID:@(MTRAttributeIDTypeClusterBallastConfigurationAttributeLampManufacturerID)
                                             params:params];
}

- (void)writeAttributeLampManufacturerWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                          expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeLampManufacturerWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeLampManufacturerWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                          expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                         params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeBallastConfigurationID)
                                  attributeID:@(MTRAttributeIDTypeClusterBallastConfigurationAttributeLampManufacturerID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeLampRatedHoursWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBallastConfigurationID)
                                        attributeID:@(MTRAttributeIDTypeClusterBallastConfigurationAttributeLampRatedHoursID)
                                             params:params];
}

- (void)writeAttributeLampRatedHoursWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeLampRatedHoursWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeLampRatedHoursWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                       params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeBallastConfigurationID)
                                  attributeID:@(MTRAttributeIDTypeClusterBallastConfigurationAttributeLampRatedHoursID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeLampBurnHoursWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBallastConfigurationID)
                                        attributeID:@(MTRAttributeIDTypeClusterBallastConfigurationAttributeLampBurnHoursID)
                                             params:params];
}

- (void)writeAttributeLampBurnHoursWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                       expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeLampBurnHoursWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeLampBurnHoursWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                       expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                      params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeBallastConfigurationID)
                                  attributeID:@(MTRAttributeIDTypeClusterBallastConfigurationAttributeLampBurnHoursID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeLampAlarmModeWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBallastConfigurationID)
                                        attributeID:@(MTRAttributeIDTypeClusterBallastConfigurationAttributeLampAlarmModeID)
                                             params:params];
}

- (void)writeAttributeLampAlarmModeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                       expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeLampAlarmModeWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeLampAlarmModeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                       expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                      params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeBallastConfigurationID)
                                  attributeID:@(MTRAttributeIDTypeClusterBallastConfigurationAttributeLampAlarmModeID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeLampBurnHoursTripPointWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeBallastConfigurationID)
                                     attributeID:@(MTRAttributeIDTypeClusterBallastConfigurationAttributeLampBurnHoursTripPointID)
                                          params:params];
}

- (void)writeAttributeLampBurnHoursTripPointWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeLampBurnHoursTripPointWithValue:dataValueDictionary
                                  expectedValueInterval:expectedValueIntervalMs
                                                 params:nil];
}
- (void)writeAttributeLampBurnHoursTripPointWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                               params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeBallastConfigurationID)
                                  attributeID:@(MTRAttributeIDTypeClusterBallastConfigurationAttributeLampBurnHoursTripPointID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBallastConfigurationID)
                                        attributeID:@(MTRAttributeIDTypeClusterBallastConfigurationAttributeGeneratedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBallastConfigurationID)
                                        attributeID:@(MTRAttributeIDTypeClusterBallastConfigurationAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBallastConfigurationID)
                                        attributeID:@(MTRAttributeIDTypeClusterBallastConfigurationAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBallastConfigurationID)
                                        attributeID:@(MTRAttributeIDTypeClusterBallastConfigurationAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeBallastConfigurationID)
                                        attributeID:@(MTRAttributeIDTypeClusterBallastConfigurationAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterBallastConfiguration (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

- (NSDictionary<NSString *, id> *)readAttributeIntrinsicBalanceFactorWithParams:(MTRReadParams * _Nullable)params
{
    return [self readAttributeIntrinsicBallastFactorWithParams:params];
}
- (void)writeAttributeIntrinsicBalanceFactorWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeIntrinsicBallastFactorWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs];
}
- (void)writeAttributeIntrinsicBalanceFactorWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                               params:(MTRWriteParams * _Nullable)params
{
    [self writeAttributeIntrinsicBallastFactorWithValue:dataValueDictionary
                                  expectedValueInterval:expectedValueIntervalMs
                                                 params:params];
}
@end

@implementation MTRClusterIlluminanceMeasurement

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (NSDictionary<NSString *, id> *)readAttributeMeasuredValueWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeIlluminanceMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterIlluminanceMeasurementAttributeMeasuredValueID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeMinMeasuredValueWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeIlluminanceMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterIlluminanceMeasurementAttributeMinMeasuredValueID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeMaxMeasuredValueWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeIlluminanceMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterIlluminanceMeasurementAttributeMaxMeasuredValueID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeToleranceWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeIlluminanceMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterIlluminanceMeasurementAttributeToleranceID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeLightSensorTypeWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeIlluminanceMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterIlluminanceMeasurementAttributeLightSensorTypeID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeIlluminanceMeasurementID)
                                     attributeID:@(MTRAttributeIDTypeClusterIlluminanceMeasurementAttributeGeneratedCommandListID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeIlluminanceMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterIlluminanceMeasurementAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeIlluminanceMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterIlluminanceMeasurementAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeIlluminanceMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterIlluminanceMeasurementAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeIlluminanceMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterIlluminanceMeasurementAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterIlluminanceMeasurement (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

@end

@implementation MTRClusterTemperatureMeasurement

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (NSDictionary<NSString *, id> *)readAttributeMeasuredValueWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeTemperatureMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterTemperatureMeasurementAttributeMeasuredValueID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeMinMeasuredValueWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeTemperatureMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterTemperatureMeasurementAttributeMinMeasuredValueID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeMaxMeasuredValueWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeTemperatureMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterTemperatureMeasurementAttributeMaxMeasuredValueID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeToleranceWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeTemperatureMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterTemperatureMeasurementAttributeToleranceID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeTemperatureMeasurementID)
                                     attributeID:@(MTRAttributeIDTypeClusterTemperatureMeasurementAttributeGeneratedCommandListID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeTemperatureMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterTemperatureMeasurementAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeTemperatureMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterTemperatureMeasurementAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeTemperatureMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterTemperatureMeasurementAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeTemperatureMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterTemperatureMeasurementAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterTemperatureMeasurement (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

@end

@implementation MTRClusterPressureMeasurement

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (NSDictionary<NSString *, id> *)readAttributeMeasuredValueWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePressureMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterPressureMeasurementAttributeMeasuredValueID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeMinMeasuredValueWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePressureMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterPressureMeasurementAttributeMinMeasuredValueID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeMaxMeasuredValueWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePressureMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterPressureMeasurementAttributeMaxMeasuredValueID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeToleranceWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePressureMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterPressureMeasurementAttributeToleranceID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeScaledValueWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePressureMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterPressureMeasurementAttributeScaledValueID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeMinScaledValueWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePressureMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterPressureMeasurementAttributeMinScaledValueID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeMaxScaledValueWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePressureMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterPressureMeasurementAttributeMaxScaledValueID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeScaledToleranceWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePressureMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterPressureMeasurementAttributeScaledToleranceID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeScaleWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePressureMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterPressureMeasurementAttributeScaleID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePressureMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterPressureMeasurementAttributeGeneratedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePressureMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterPressureMeasurementAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePressureMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterPressureMeasurementAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePressureMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterPressureMeasurementAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypePressureMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterPressureMeasurementAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterPressureMeasurement (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

@end

@implementation MTRClusterFlowMeasurement

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (NSDictionary<NSString *, id> *)readAttributeMeasuredValueWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeFlowMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterFlowMeasurementAttributeMeasuredValueID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeMinMeasuredValueWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeFlowMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterFlowMeasurementAttributeMinMeasuredValueID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeMaxMeasuredValueWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeFlowMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterFlowMeasurementAttributeMaxMeasuredValueID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeToleranceWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeFlowMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterFlowMeasurementAttributeToleranceID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeFlowMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterFlowMeasurementAttributeGeneratedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeFlowMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterFlowMeasurementAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeFlowMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterFlowMeasurementAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeFlowMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterFlowMeasurementAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeFlowMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterFlowMeasurementAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterFlowMeasurement (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

@end

@implementation MTRClusterRelativeHumidityMeasurement

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (NSDictionary<NSString *, id> *)readAttributeMeasuredValueWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeRelativeHumidityMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterRelativeHumidityMeasurementAttributeMeasuredValueID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeMinMeasuredValueWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeRelativeHumidityMeasurementID)
                                     attributeID:@(MTRAttributeIDTypeClusterRelativeHumidityMeasurementAttributeMinMeasuredValueID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeMaxMeasuredValueWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeRelativeHumidityMeasurementID)
                                     attributeID:@(MTRAttributeIDTypeClusterRelativeHumidityMeasurementAttributeMaxMeasuredValueID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeToleranceWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeRelativeHumidityMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterRelativeHumidityMeasurementAttributeToleranceID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeRelativeHumidityMeasurementID)
                        attributeID:@(MTRAttributeIDTypeClusterRelativeHumidityMeasurementAttributeGeneratedCommandListID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeRelativeHumidityMeasurementID)
                        attributeID:@(MTRAttributeIDTypeClusterRelativeHumidityMeasurementAttributeAcceptedCommandListID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeRelativeHumidityMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterRelativeHumidityMeasurementAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeRelativeHumidityMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterRelativeHumidityMeasurementAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeRelativeHumidityMeasurementID)
                                     attributeID:@(MTRAttributeIDTypeClusterRelativeHumidityMeasurementAttributeClusterRevisionID)
                                          params:params];
}

@end

@implementation MTRClusterRelativeHumidityMeasurement (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

@end

@implementation MTRClusterOccupancySensing

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (NSDictionary<NSString *, id> *)readAttributeOccupancyWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeOccupancySensingID)
                                        attributeID:@(MTRAttributeIDTypeClusterOccupancySensingAttributeOccupancyID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeOccupancySensorTypeWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeOccupancySensingID)
                                        attributeID:@(MTRAttributeIDTypeClusterOccupancySensingAttributeOccupancySensorTypeID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeOccupancySensorTypeBitmapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeOccupancySensingID)
                                        attributeID:@(MTRAttributeIDTypeClusterOccupancySensingAttributeOccupancySensorTypeBitmapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributePIROccupiedToUnoccupiedDelayWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeOccupancySensingID)
                                     attributeID:@(MTRAttributeIDTypeClusterOccupancySensingAttributePIROccupiedToUnoccupiedDelayID)
                                          params:params];
}

- (void)writeAttributePIROccupiedToUnoccupiedDelayWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributePIROccupiedToUnoccupiedDelayWithValue:dataValueDictionary
                                        expectedValueInterval:expectedValueIntervalMs
                                                       params:nil];
}
- (void)writeAttributePIROccupiedToUnoccupiedDelayWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                                     params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeOccupancySensingID)
                                  attributeID:@(MTRAttributeIDTypeClusterOccupancySensingAttributePIROccupiedToUnoccupiedDelayID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributePIRUnoccupiedToOccupiedDelayWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeOccupancySensingID)
                                     attributeID:@(MTRAttributeIDTypeClusterOccupancySensingAttributePIRUnoccupiedToOccupiedDelayID)
                                          params:params];
}

- (void)writeAttributePIRUnoccupiedToOccupiedDelayWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributePIRUnoccupiedToOccupiedDelayWithValue:dataValueDictionary
                                        expectedValueInterval:expectedValueIntervalMs
                                                       params:nil];
}
- (void)writeAttributePIRUnoccupiedToOccupiedDelayWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                                     params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeOccupancySensingID)
                                  attributeID:@(MTRAttributeIDTypeClusterOccupancySensingAttributePIRUnoccupiedToOccupiedDelayID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributePIRUnoccupiedToOccupiedThresholdWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeOccupancySensingID)
                        attributeID:@(MTRAttributeIDTypeClusterOccupancySensingAttributePIRUnoccupiedToOccupiedThresholdID)
                             params:params];
}

- (void)writeAttributePIRUnoccupiedToOccupiedThresholdWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                          expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributePIRUnoccupiedToOccupiedThresholdWithValue:dataValueDictionary
                                            expectedValueInterval:expectedValueIntervalMs
                                                           params:nil];
}
- (void)writeAttributePIRUnoccupiedToOccupiedThresholdWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                          expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                                         params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device
        writeAttributeWithEndpointID:@(_endpoint)
                           clusterID:@(MTRClusterIDTypeOccupancySensingID)
                         attributeID:@(MTRAttributeIDTypeClusterOccupancySensingAttributePIRUnoccupiedToOccupiedThresholdID)
                               value:dataValueDictionary
               expectedValueInterval:expectedValueIntervalMs
                   timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeUltrasonicOccupiedToUnoccupiedDelayWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeOccupancySensingID)
                        attributeID:@(MTRAttributeIDTypeClusterOccupancySensingAttributeUltrasonicOccupiedToUnoccupiedDelayID)
                             params:params];
}

- (void)writeAttributeUltrasonicOccupiedToUnoccupiedDelayWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                             expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeUltrasonicOccupiedToUnoccupiedDelayWithValue:dataValueDictionary
                                               expectedValueInterval:expectedValueIntervalMs
                                                              params:nil];
}
- (void)writeAttributeUltrasonicOccupiedToUnoccupiedDelayWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                             expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                                            params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device
        writeAttributeWithEndpointID:@(_endpoint)
                           clusterID:@(MTRClusterIDTypeOccupancySensingID)
                         attributeID:@(MTRAttributeIDTypeClusterOccupancySensingAttributeUltrasonicOccupiedToUnoccupiedDelayID)
                               value:dataValueDictionary
               expectedValueInterval:expectedValueIntervalMs
                   timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeUltrasonicUnoccupiedToOccupiedDelayWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeOccupancySensingID)
                        attributeID:@(MTRAttributeIDTypeClusterOccupancySensingAttributeUltrasonicUnoccupiedToOccupiedDelayID)
                             params:params];
}

- (void)writeAttributeUltrasonicUnoccupiedToOccupiedDelayWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                             expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeUltrasonicUnoccupiedToOccupiedDelayWithValue:dataValueDictionary
                                               expectedValueInterval:expectedValueIntervalMs
                                                              params:nil];
}
- (void)writeAttributeUltrasonicUnoccupiedToOccupiedDelayWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                             expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                                            params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device
        writeAttributeWithEndpointID:@(_endpoint)
                           clusterID:@(MTRClusterIDTypeOccupancySensingID)
                         attributeID:@(MTRAttributeIDTypeClusterOccupancySensingAttributeUltrasonicUnoccupiedToOccupiedDelayID)
                               value:dataValueDictionary
               expectedValueInterval:expectedValueIntervalMs
                   timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeUltrasonicUnoccupiedToOccupiedThresholdWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeOccupancySensingID)
                        attributeID:@(MTRAttributeIDTypeClusterOccupancySensingAttributeUltrasonicUnoccupiedToOccupiedThresholdID)
                             params:params];
}

- (void)writeAttributeUltrasonicUnoccupiedToOccupiedThresholdWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                                 expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeUltrasonicUnoccupiedToOccupiedThresholdWithValue:dataValueDictionary
                                                   expectedValueInterval:expectedValueIntervalMs
                                                                  params:nil];
}
- (void)writeAttributeUltrasonicUnoccupiedToOccupiedThresholdWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                                 expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                                                params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device
        writeAttributeWithEndpointID:@(_endpoint)
                           clusterID:@(MTRClusterIDTypeOccupancySensingID)
                         attributeID:@(MTRAttributeIDTypeClusterOccupancySensingAttributeUltrasonicUnoccupiedToOccupiedThresholdID)
                               value:dataValueDictionary
               expectedValueInterval:expectedValueIntervalMs
                   timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributePhysicalContactOccupiedToUnoccupiedDelayWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeOccupancySensingID)
                        attributeID:@(MTRAttributeIDTypeClusterOccupancySensingAttributePhysicalContactOccupiedToUnoccupiedDelayID)
                             params:params];
}

- (void)writeAttributePhysicalContactOccupiedToUnoccupiedDelayWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                                  expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributePhysicalContactOccupiedToUnoccupiedDelayWithValue:dataValueDictionary
                                                    expectedValueInterval:expectedValueIntervalMs
                                                                   params:nil];
}
- (void)writeAttributePhysicalContactOccupiedToUnoccupiedDelayWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                                  expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                                                 params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device
        writeAttributeWithEndpointID:@(_endpoint)
                           clusterID:@(MTRClusterIDTypeOccupancySensingID)
                         attributeID:@(MTRAttributeIDTypeClusterOccupancySensingAttributePhysicalContactOccupiedToUnoccupiedDelayID)
                               value:dataValueDictionary
               expectedValueInterval:expectedValueIntervalMs
                   timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributePhysicalContactUnoccupiedToOccupiedDelayWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeOccupancySensingID)
                        attributeID:@(MTRAttributeIDTypeClusterOccupancySensingAttributePhysicalContactUnoccupiedToOccupiedDelayID)
                             params:params];
}

- (void)writeAttributePhysicalContactUnoccupiedToOccupiedDelayWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                                  expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributePhysicalContactUnoccupiedToOccupiedDelayWithValue:dataValueDictionary
                                                    expectedValueInterval:expectedValueIntervalMs
                                                                   params:nil];
}
- (void)writeAttributePhysicalContactUnoccupiedToOccupiedDelayWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                                  expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                                                 params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device
        writeAttributeWithEndpointID:@(_endpoint)
                           clusterID:@(MTRClusterIDTypeOccupancySensingID)
                         attributeID:@(MTRAttributeIDTypeClusterOccupancySensingAttributePhysicalContactUnoccupiedToOccupiedDelayID)
                               value:dataValueDictionary
               expectedValueInterval:expectedValueIntervalMs
                   timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributePhysicalContactUnoccupiedToOccupiedThresholdWithParams:
    (MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeOccupancySensingID)
                        attributeID:
                            @(MTRAttributeIDTypeClusterOccupancySensingAttributePhysicalContactUnoccupiedToOccupiedThresholdID)
                             params:params];
}

- (void)writeAttributePhysicalContactUnoccupiedToOccupiedThresholdWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributePhysicalContactUnoccupiedToOccupiedThresholdWithValue:dataValueDictionary
                                                        expectedValueInterval:expectedValueIntervalMs
                                                                       params:nil];
}
- (void)writeAttributePhysicalContactUnoccupiedToOccupiedThresholdWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                                                     params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device
        writeAttributeWithEndpointID:@(_endpoint)
                           clusterID:@(MTRClusterIDTypeOccupancySensingID)
                         attributeID:
                             @(MTRAttributeIDTypeClusterOccupancySensingAttributePhysicalContactUnoccupiedToOccupiedThresholdID)
                               value:dataValueDictionary
               expectedValueInterval:expectedValueIntervalMs
                   timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeOccupancySensingID)
                                        attributeID:@(MTRAttributeIDTypeClusterOccupancySensingAttributeGeneratedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeOccupancySensingID)
                                        attributeID:@(MTRAttributeIDTypeClusterOccupancySensingAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeOccupancySensingID)
                                        attributeID:@(MTRAttributeIDTypeClusterOccupancySensingAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeOccupancySensingID)
                                        attributeID:@(MTRAttributeIDTypeClusterOccupancySensingAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeOccupancySensingID)
                                        attributeID:@(MTRAttributeIDTypeClusterOccupancySensingAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterOccupancySensing (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

- (NSDictionary<NSString *, id> *)readAttributePirOccupiedToUnoccupiedDelayWithParams:(MTRReadParams * _Nullable)params
{
    return [self readAttributePIROccupiedToUnoccupiedDelayWithParams:params];
}
- (void)writeAttributePirOccupiedToUnoccupiedDelayWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributePIROccupiedToUnoccupiedDelayWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs];
}
- (void)writeAttributePirOccupiedToUnoccupiedDelayWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                                     params:(MTRWriteParams * _Nullable)params
{
    [self writeAttributePIROccupiedToUnoccupiedDelayWithValue:dataValueDictionary
                                        expectedValueInterval:expectedValueIntervalMs
                                                       params:params];
}
- (NSDictionary<NSString *, id> *)readAttributePirUnoccupiedToOccupiedDelayWithParams:(MTRReadParams * _Nullable)params
{
    return [self readAttributePIRUnoccupiedToOccupiedDelayWithParams:params];
}
- (void)writeAttributePirUnoccupiedToOccupiedDelayWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributePIRUnoccupiedToOccupiedDelayWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs];
}
- (void)writeAttributePirUnoccupiedToOccupiedDelayWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                                     params:(MTRWriteParams * _Nullable)params
{
    [self writeAttributePIRUnoccupiedToOccupiedDelayWithValue:dataValueDictionary
                                        expectedValueInterval:expectedValueIntervalMs
                                                       params:params];
}
- (NSDictionary<NSString *, id> *)readAttributePirUnoccupiedToOccupiedThresholdWithParams:(MTRReadParams * _Nullable)params
{
    return [self readAttributePIRUnoccupiedToOccupiedThresholdWithParams:params];
}
- (void)writeAttributePirUnoccupiedToOccupiedThresholdWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                          expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributePIRUnoccupiedToOccupiedThresholdWithValue:dataValueDictionary
                                            expectedValueInterval:expectedValueIntervalMs];
}
- (void)writeAttributePirUnoccupiedToOccupiedThresholdWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                          expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                                         params:(MTRWriteParams * _Nullable)params
{
    [self writeAttributePIRUnoccupiedToOccupiedThresholdWithValue:dataValueDictionary
                                            expectedValueInterval:expectedValueIntervalMs
                                                           params:params];
}
@end

@implementation MTRClusterWakeOnLAN

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (NSDictionary<NSString *, id> *)readAttributeMACAddressWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeWakeOnLANID)
                                        attributeID:@(MTRAttributeIDTypeClusterWakeOnLANAttributeMACAddressID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeWakeOnLANID)
                                        attributeID:@(MTRAttributeIDTypeClusterWakeOnLANAttributeGeneratedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeWakeOnLANID)
                                        attributeID:@(MTRAttributeIDTypeClusterWakeOnLANAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeWakeOnLANID)
                                        attributeID:@(MTRAttributeIDTypeClusterWakeOnLANAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeWakeOnLANID)
                                        attributeID:@(MTRAttributeIDTypeClusterWakeOnLANAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeWakeOnLANID)
                                        attributeID:@(MTRAttributeIDTypeClusterWakeOnLANAttributeClusterRevisionID)
                                             params:params];
}

@end
@implementation MTRClusterWakeOnLan
@end

@implementation MTRClusterWakeOnLan (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

@end

@implementation MTRClusterChannel

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (void)changeChannelWithParams:(MTRChannelClusterChangeChannelParams *)params
                 expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
          expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                     completion:(void (^)(MTRChannelClusterChangeChannelResponseParams * _Nullable data,
                                    NSError * _Nullable error))completion
{
    NSString * logPrefix =
        [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex, _endpoint,
                  (unsigned int) MTRClusterIDTypeChannelID, (unsigned int) MTRCommandIDTypeClusterChannelCommandChangeChannelID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRChannelClusterChangeChannelResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                ChannelClusterChangeChannelResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRChannelClusterChangeChannelResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                Channel::Commands::ChangeChannel::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.match = [self asCharSpan:params.match];

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)changeChannelByNumberWithParams:(MTRChannelClusterChangeChannelByNumberParams *)params
                         expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                  expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                             completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeChannelID,
                                     (unsigned int) MTRCommandIDTypeClusterChannelCommandChangeChannelByNumberID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                Channel::Commands::ChangeChannelByNumber::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.majorNumber = params.majorNumber.unsignedShortValue;
                request.minorNumber = params.minorNumber.unsignedShortValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)skipChannelWithParams:(MTRChannelClusterSkipChannelParams *)params
               expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                   completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix =
        [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex, _endpoint,
                  (unsigned int) MTRClusterIDTypeChannelID, (unsigned int) MTRCommandIDTypeClusterChannelCommandSkipChannelID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                Channel::Commands::SkipChannel::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.count = params.count.unsignedShortValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (NSDictionary<NSString *, id> *)readAttributeChannelListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeChannelID)
                                        attributeID:@(MTRAttributeIDTypeClusterChannelAttributeChannelListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeLineupWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeChannelID)
                                        attributeID:@(MTRAttributeIDTypeClusterChannelAttributeLineupID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeCurrentChannelWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeChannelID)
                                        attributeID:@(MTRAttributeIDTypeClusterChannelAttributeCurrentChannelID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeChannelID)
                                        attributeID:@(MTRAttributeIDTypeClusterChannelAttributeGeneratedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeChannelID)
                                        attributeID:@(MTRAttributeIDTypeClusterChannelAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeChannelID)
                                        attributeID:@(MTRAttributeIDTypeClusterChannelAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeChannelID)
                                        attributeID:@(MTRAttributeIDTypeClusterChannelAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeChannelID)
                                        attributeID:@(MTRAttributeIDTypeClusterChannelAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterChannel (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

- (void)changeChannelWithParams:(MTRChannelClusterChangeChannelParams *)params
                 expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
          expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
              completionHandler:(void (^)(MTRChannelClusterChangeChannelResponseParams * _Nullable data,
                                    NSError * _Nullable error))completionHandler
{
    [self changeChannelWithParams:params
                   expectedValues:expectedDataValueDictionaries
            expectedValueInterval:expectedValueIntervalMs
                       completion:^(MTRChannelClusterChangeChannelResponseParams * _Nullable data, NSError * _Nullable error) {
                           // Cast is safe because subclass does not add any selectors.
                           completionHandler(static_cast<MTRChannelClusterChangeChannelResponseParams *>(data), error);
                       }];
}
- (void)changeChannelByNumberWithParams:(MTRChannelClusterChangeChannelByNumberParams *)params
                         expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
                  expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                      completionHandler:(MTRStatusCompletion)completionHandler
{
    [self changeChannelByNumberWithParams:params
                           expectedValues:expectedDataValueDictionaries
                    expectedValueInterval:expectedValueIntervalMs
                               completion:completionHandler];
}
- (void)skipChannelWithParams:(MTRChannelClusterSkipChannelParams *)params
               expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
        expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
            completionHandler:(MTRStatusCompletion)completionHandler
{
    [self skipChannelWithParams:params
                 expectedValues:expectedDataValueDictionaries
          expectedValueInterval:expectedValueIntervalMs
                     completion:completionHandler];
}
@end

@implementation MTRClusterTargetNavigator

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (void)navigateTargetWithParams:(MTRTargetNavigatorClusterNavigateTargetParams *)params
                  expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
           expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                      completion:(void (^)(MTRTargetNavigatorClusterNavigateTargetResponseParams * _Nullable data,
                                     NSError * _Nullable error))completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeTargetNavigatorID,
                                     (unsigned int) MTRCommandIDTypeClusterTargetNavigatorCommandNavigateTargetID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRTargetNavigatorClusterNavigateTargetResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                TargetNavigatorClusterNavigateTargetResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRTargetNavigatorClusterNavigateTargetResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                TargetNavigator::Commands::NavigateTarget::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.target = params.target.unsignedCharValue;
                if (params.data != nil) {
                    auto & definedValue_0 = request.data.Emplace();
                    definedValue_0 = [self asCharSpan:params.data];
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (NSDictionary<NSString *, id> *)readAttributeTargetListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeTargetNavigatorID)
                                        attributeID:@(MTRAttributeIDTypeClusterTargetNavigatorAttributeTargetListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeCurrentTargetWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeTargetNavigatorID)
                                        attributeID:@(MTRAttributeIDTypeClusterTargetNavigatorAttributeCurrentTargetID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeTargetNavigatorID)
                                        attributeID:@(MTRAttributeIDTypeClusterTargetNavigatorAttributeGeneratedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeTargetNavigatorID)
                                        attributeID:@(MTRAttributeIDTypeClusterTargetNavigatorAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeTargetNavigatorID)
                                        attributeID:@(MTRAttributeIDTypeClusterTargetNavigatorAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeTargetNavigatorID)
                                        attributeID:@(MTRAttributeIDTypeClusterTargetNavigatorAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeTargetNavigatorID)
                                        attributeID:@(MTRAttributeIDTypeClusterTargetNavigatorAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterTargetNavigator (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

- (void)navigateTargetWithParams:(MTRTargetNavigatorClusterNavigateTargetParams *)params
                  expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
           expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
               completionHandler:(void (^)(MTRTargetNavigatorClusterNavigateTargetResponseParams * _Nullable data,
                                     NSError * _Nullable error))completionHandler
{
    [self navigateTargetWithParams:params
                    expectedValues:expectedDataValueDictionaries
             expectedValueInterval:expectedValueIntervalMs
                        completion:^(
                            MTRTargetNavigatorClusterNavigateTargetResponseParams * _Nullable data, NSError * _Nullable error) {
                            // Cast is safe because subclass does not add any selectors.
                            completionHandler(static_cast<MTRTargetNavigatorClusterNavigateTargetResponseParams *>(data), error);
                        }];
}
@end

@implementation MTRClusterMediaPlayback

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (void)playWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
         expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                    completion:(void (^)(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable data,
                                   NSError * _Nullable error))completion
{
    [self playWithParams:nil expectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs completion:completion];
}
- (void)playWithParams:(MTRMediaPlaybackClusterPlayParams * _Nullable)params
           expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
               completion:
                   (void (^)(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable data, NSError * _Nullable error))completion
{
    NSString * logPrefix =
        [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex, _endpoint,
                  (unsigned int) MTRClusterIDTypeMediaPlaybackID, (unsigned int) MTRCommandIDTypeClusterMediaPlaybackCommandPlayID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRMediaPlaybackClusterPlaybackResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                MediaPlaybackClusterPlaybackResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRMediaPlaybackClusterPlaybackResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                MediaPlayback::Commands::Play::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)pauseWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
          expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                     completion:(void (^)(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable data,
                                    NSError * _Nullable error))completion
{
    [self pauseWithParams:nil expectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs completion:completion];
}
- (void)pauseWithParams:(MTRMediaPlaybackClusterPauseParams * _Nullable)params
           expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
               completion:
                   (void (^)(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable data, NSError * _Nullable error))completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeMediaPlaybackID,
                                     (unsigned int) MTRCommandIDTypeClusterMediaPlaybackCommandPauseID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRMediaPlaybackClusterPlaybackResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                MediaPlaybackClusterPlaybackResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRMediaPlaybackClusterPlaybackResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                MediaPlayback::Commands::Pause::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)stopWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
         expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                    completion:(void (^)(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable data,
                                   NSError * _Nullable error))completion
{
    [self stopWithParams:nil expectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs completion:completion];
}
- (void)stopWithParams:(MTRMediaPlaybackClusterStopParams * _Nullable)params
           expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
               completion:
                   (void (^)(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable data, NSError * _Nullable error))completion
{
    NSString * logPrefix =
        [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex, _endpoint,
                  (unsigned int) MTRClusterIDTypeMediaPlaybackID, (unsigned int) MTRCommandIDTypeClusterMediaPlaybackCommandStopID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRMediaPlaybackClusterPlaybackResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                MediaPlaybackClusterPlaybackResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRMediaPlaybackClusterPlaybackResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                MediaPlayback::Commands::Stop::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)startOverWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
              expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                         completion:(void (^)(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable data,
                                        NSError * _Nullable error))completion
{
    [self startOverWithParams:nil
               expectedValues:expectedValues
        expectedValueInterval:expectedValueIntervalMs
                   completion:completion];
}
- (void)startOverWithParams:(MTRMediaPlaybackClusterStartOverParams * _Nullable)params
             expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                 completion:
                     (void (^)(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable data, NSError * _Nullable error))completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeMediaPlaybackID,
                                     (unsigned int) MTRCommandIDTypeClusterMediaPlaybackCommandStartOverID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRMediaPlaybackClusterPlaybackResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                MediaPlaybackClusterPlaybackResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRMediaPlaybackClusterPlaybackResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                MediaPlayback::Commands::StartOver::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)previousWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
             expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                        completion:(void (^)(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable data,
                                       NSError * _Nullable error))completion
{
    [self previousWithParams:nil expectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs completion:completion];
}
- (void)previousWithParams:(MTRMediaPlaybackClusterPreviousParams * _Nullable)params
            expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
     expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                completion:
                    (void (^)(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable data, NSError * _Nullable error))completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeMediaPlaybackID,
                                     (unsigned int) MTRCommandIDTypeClusterMediaPlaybackCommandPreviousID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRMediaPlaybackClusterPlaybackResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                MediaPlaybackClusterPlaybackResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRMediaPlaybackClusterPlaybackResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                MediaPlayback::Commands::Previous::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)nextWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
         expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                    completion:(void (^)(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable data,
                                   NSError * _Nullable error))completion
{
    [self nextWithParams:nil expectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs completion:completion];
}
- (void)nextWithParams:(MTRMediaPlaybackClusterNextParams * _Nullable)params
           expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
               completion:
                   (void (^)(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable data, NSError * _Nullable error))completion
{
    NSString * logPrefix =
        [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex, _endpoint,
                  (unsigned int) MTRClusterIDTypeMediaPlaybackID, (unsigned int) MTRCommandIDTypeClusterMediaPlaybackCommandNextID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRMediaPlaybackClusterPlaybackResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                MediaPlaybackClusterPlaybackResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRMediaPlaybackClusterPlaybackResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                MediaPlayback::Commands::Next::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)rewindWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
           expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                      completion:(void (^)(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable data,
                                     NSError * _Nullable error))completion
{
    [self rewindWithParams:nil expectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs completion:completion];
}
- (void)rewindWithParams:(MTRMediaPlaybackClusterRewindParams * _Nullable)params
           expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
               completion:
                   (void (^)(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable data, NSError * _Nullable error))completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeMediaPlaybackID,
                                     (unsigned int) MTRCommandIDTypeClusterMediaPlaybackCommandRewindID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRMediaPlaybackClusterPlaybackResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                MediaPlaybackClusterPlaybackResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRMediaPlaybackClusterPlaybackResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                MediaPlayback::Commands::Rewind::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)fastForwardWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                           completion:(void (^)(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable data,
                                          NSError * _Nullable error))completion
{
    [self fastForwardWithParams:nil
                 expectedValues:expectedValues
          expectedValueInterval:expectedValueIntervalMs
                     completion:completion];
}
- (void)fastForwardWithParams:(MTRMediaPlaybackClusterFastForwardParams * _Nullable)params
               expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                   completion:(void (^)(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable data,
                                  NSError * _Nullable error))completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeMediaPlaybackID,
                                     (unsigned int) MTRCommandIDTypeClusterMediaPlaybackCommandFastForwardID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRMediaPlaybackClusterPlaybackResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                MediaPlaybackClusterPlaybackResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRMediaPlaybackClusterPlaybackResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                MediaPlayback::Commands::FastForward::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)skipForwardWithParams:(MTRMediaPlaybackClusterSkipForwardParams *)params
               expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                   completion:(void (^)(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable data,
                                  NSError * _Nullable error))completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeMediaPlaybackID,
                                     (unsigned int) MTRCommandIDTypeClusterMediaPlaybackCommandSkipForwardID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRMediaPlaybackClusterPlaybackResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                MediaPlaybackClusterPlaybackResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRMediaPlaybackClusterPlaybackResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                MediaPlayback::Commands::SkipForward::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.deltaPositionMilliseconds = params.deltaPositionMilliseconds.unsignedLongLongValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)skipBackwardWithParams:(MTRMediaPlaybackClusterSkipBackwardParams *)params
                expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
         expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                    completion:(void (^)(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable data,
                                   NSError * _Nullable error))completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeMediaPlaybackID,
                                     (unsigned int) MTRCommandIDTypeClusterMediaPlaybackCommandSkipBackwardID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRMediaPlaybackClusterPlaybackResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                MediaPlaybackClusterPlaybackResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRMediaPlaybackClusterPlaybackResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                MediaPlayback::Commands::SkipBackward::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.deltaPositionMilliseconds = params.deltaPositionMilliseconds.unsignedLongLongValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)seekWithParams:(MTRMediaPlaybackClusterSeekParams *)params
           expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
               completion:
                   (void (^)(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable data, NSError * _Nullable error))completion
{
    NSString * logPrefix =
        [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex, _endpoint,
                  (unsigned int) MTRClusterIDTypeMediaPlaybackID, (unsigned int) MTRCommandIDTypeClusterMediaPlaybackCommandSeekID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRMediaPlaybackClusterPlaybackResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                MediaPlaybackClusterPlaybackResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRMediaPlaybackClusterPlaybackResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                MediaPlayback::Commands::Seek::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.position = params.position.unsignedLongLongValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (NSDictionary<NSString *, id> *)readAttributeCurrentStateWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeMediaPlaybackID)
                                        attributeID:@(MTRAttributeIDTypeClusterMediaPlaybackAttributeCurrentStateID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeStartTimeWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeMediaPlaybackID)
                                        attributeID:@(MTRAttributeIDTypeClusterMediaPlaybackAttributeStartTimeID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeDurationWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeMediaPlaybackID)
                                        attributeID:@(MTRAttributeIDTypeClusterMediaPlaybackAttributeDurationID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeSampledPositionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeMediaPlaybackID)
                                        attributeID:@(MTRAttributeIDTypeClusterMediaPlaybackAttributeSampledPositionID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributePlaybackSpeedWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeMediaPlaybackID)
                                        attributeID:@(MTRAttributeIDTypeClusterMediaPlaybackAttributePlaybackSpeedID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeSeekRangeEndWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeMediaPlaybackID)
                                        attributeID:@(MTRAttributeIDTypeClusterMediaPlaybackAttributeSeekRangeEndID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeSeekRangeStartWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeMediaPlaybackID)
                                        attributeID:@(MTRAttributeIDTypeClusterMediaPlaybackAttributeSeekRangeStartID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeMediaPlaybackID)
                                        attributeID:@(MTRAttributeIDTypeClusterMediaPlaybackAttributeGeneratedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeMediaPlaybackID)
                                        attributeID:@(MTRAttributeIDTypeClusterMediaPlaybackAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeMediaPlaybackID)
                                        attributeID:@(MTRAttributeIDTypeClusterMediaPlaybackAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeMediaPlaybackID)
                                        attributeID:@(MTRAttributeIDTypeClusterMediaPlaybackAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeMediaPlaybackID)
                                        attributeID:@(MTRAttributeIDTypeClusterMediaPlaybackAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterMediaPlayback (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

- (void)playWithParams:(MTRMediaPlaybackClusterPlayParams * _Nullable)params
           expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
    expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
        completionHandler:
            (void (^)(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable data, NSError * _Nullable error))completionHandler
{
    [self playWithParams:params
               expectedValues:expectedDataValueDictionaries
        expectedValueInterval:expectedValueIntervalMs
                   completion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable data, NSError * _Nullable error) {
                       // Cast is safe because subclass does not add any selectors.
                       completionHandler(static_cast<MTRMediaPlaybackClusterPlaybackResponseParams *>(data), error);
                   }];
}
- (void)playWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
         expectedValueInterval:(NSNumber *)expectedValueIntervalMs
             completionHandler:(void (^)(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable data,
                                   NSError * _Nullable error))completionHandler
{
    [self playWithParams:nil
               expectedValues:expectedValues
        expectedValueInterval:expectedValueIntervalMs
            completionHandler:completionHandler];
}
- (void)pauseWithParams:(MTRMediaPlaybackClusterPauseParams * _Nullable)params
           expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
    expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
        completionHandler:
            (void (^)(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable data, NSError * _Nullable error))completionHandler
{
    [self pauseWithParams:params
               expectedValues:expectedDataValueDictionaries
        expectedValueInterval:expectedValueIntervalMs
                   completion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable data, NSError * _Nullable error) {
                       // Cast is safe because subclass does not add any selectors.
                       completionHandler(static_cast<MTRMediaPlaybackClusterPlaybackResponseParams *>(data), error);
                   }];
}
- (void)pauseWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
          expectedValueInterval:(NSNumber *)expectedValueIntervalMs
              completionHandler:(void (^)(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable data,
                                    NSError * _Nullable error))completionHandler
{
    [self pauseWithParams:nil
               expectedValues:expectedValues
        expectedValueInterval:expectedValueIntervalMs
            completionHandler:completionHandler];
}
- (void)stopPlaybackWithParams:(MTRMediaPlaybackClusterStopPlaybackParams * _Nullable)params
                expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
         expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
             completionHandler:(void (^)(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable data,
                                   NSError * _Nullable error))completionHandler
{
    [self stopWithParams:params
               expectedValues:expectedDataValueDictionaries
        expectedValueInterval:expectedValueIntervalMs
                   completion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable data, NSError * _Nullable error) {
                       // Cast is safe because subclass does not add any selectors.
                       completionHandler(static_cast<MTRMediaPlaybackClusterPlaybackResponseParams *>(data), error);
                   }];
}
- (void)stopPlaybackWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                 expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                     completionHandler:(void (^)(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable data,
                                           NSError * _Nullable error))completionHandler
{
    [self stopPlaybackWithParams:nil
                  expectedValues:expectedValues
           expectedValueInterval:expectedValueIntervalMs
               completionHandler:completionHandler];
}
- (void)startOverWithParams:(MTRMediaPlaybackClusterStartOverParams * _Nullable)params
             expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
      expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
          completionHandler:
              (void (^)(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable data, NSError * _Nullable error))completionHandler
{
    [self startOverWithParams:params
               expectedValues:expectedDataValueDictionaries
        expectedValueInterval:expectedValueIntervalMs
                   completion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable data, NSError * _Nullable error) {
                       // Cast is safe because subclass does not add any selectors.
                       completionHandler(static_cast<MTRMediaPlaybackClusterPlaybackResponseParams *>(data), error);
                   }];
}
- (void)startOverWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
              expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                  completionHandler:(void (^)(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable data,
                                        NSError * _Nullable error))completionHandler
{
    [self startOverWithParams:nil
               expectedValues:expectedValues
        expectedValueInterval:expectedValueIntervalMs
            completionHandler:completionHandler];
}
- (void)previousWithParams:(MTRMediaPlaybackClusterPreviousParams * _Nullable)params
            expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
     expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
         completionHandler:
             (void (^)(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable data, NSError * _Nullable error))completionHandler
{
    [self previousWithParams:params
               expectedValues:expectedDataValueDictionaries
        expectedValueInterval:expectedValueIntervalMs
                   completion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable data, NSError * _Nullable error) {
                       // Cast is safe because subclass does not add any selectors.
                       completionHandler(static_cast<MTRMediaPlaybackClusterPlaybackResponseParams *>(data), error);
                   }];
}
- (void)previousWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
             expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                 completionHandler:(void (^)(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable data,
                                       NSError * _Nullable error))completionHandler
{
    [self previousWithParams:nil
               expectedValues:expectedValues
        expectedValueInterval:expectedValueIntervalMs
            completionHandler:completionHandler];
}
- (void)nextWithParams:(MTRMediaPlaybackClusterNextParams * _Nullable)params
           expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
    expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
        completionHandler:
            (void (^)(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable data, NSError * _Nullable error))completionHandler
{
    [self nextWithParams:params
               expectedValues:expectedDataValueDictionaries
        expectedValueInterval:expectedValueIntervalMs
                   completion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable data, NSError * _Nullable error) {
                       // Cast is safe because subclass does not add any selectors.
                       completionHandler(static_cast<MTRMediaPlaybackClusterPlaybackResponseParams *>(data), error);
                   }];
}
- (void)nextWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
         expectedValueInterval:(NSNumber *)expectedValueIntervalMs
             completionHandler:(void (^)(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable data,
                                   NSError * _Nullable error))completionHandler
{
    [self nextWithParams:nil
               expectedValues:expectedValues
        expectedValueInterval:expectedValueIntervalMs
            completionHandler:completionHandler];
}
- (void)rewindWithParams:(MTRMediaPlaybackClusterRewindParams * _Nullable)params
           expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
    expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
        completionHandler:
            (void (^)(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable data, NSError * _Nullable error))completionHandler
{
    [self rewindWithParams:params
               expectedValues:expectedDataValueDictionaries
        expectedValueInterval:expectedValueIntervalMs
                   completion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable data, NSError * _Nullable error) {
                       // Cast is safe because subclass does not add any selectors.
                       completionHandler(static_cast<MTRMediaPlaybackClusterPlaybackResponseParams *>(data), error);
                   }];
}
- (void)rewindWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
           expectedValueInterval:(NSNumber *)expectedValueIntervalMs
               completionHandler:(void (^)(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable data,
                                     NSError * _Nullable error))completionHandler
{
    [self rewindWithParams:nil
               expectedValues:expectedValues
        expectedValueInterval:expectedValueIntervalMs
            completionHandler:completionHandler];
}
- (void)fastForwardWithParams:(MTRMediaPlaybackClusterFastForwardParams * _Nullable)params
               expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
        expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
            completionHandler:(void (^)(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable data,
                                  NSError * _Nullable error))completionHandler
{
    [self fastForwardWithParams:params
                 expectedValues:expectedDataValueDictionaries
          expectedValueInterval:expectedValueIntervalMs
                     completion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable data, NSError * _Nullable error) {
                         // Cast is safe because subclass does not add any selectors.
                         completionHandler(static_cast<MTRMediaPlaybackClusterPlaybackResponseParams *>(data), error);
                     }];
}
- (void)fastForwardWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                    completionHandler:(void (^)(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable data,
                                          NSError * _Nullable error))completionHandler
{
    [self fastForwardWithParams:nil
                 expectedValues:expectedValues
          expectedValueInterval:expectedValueIntervalMs
              completionHandler:completionHandler];
}
- (void)skipForwardWithParams:(MTRMediaPlaybackClusterSkipForwardParams *)params
               expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
        expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
            completionHandler:(void (^)(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable data,
                                  NSError * _Nullable error))completionHandler
{
    [self skipForwardWithParams:params
                 expectedValues:expectedDataValueDictionaries
          expectedValueInterval:expectedValueIntervalMs
                     completion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable data, NSError * _Nullable error) {
                         // Cast is safe because subclass does not add any selectors.
                         completionHandler(static_cast<MTRMediaPlaybackClusterPlaybackResponseParams *>(data), error);
                     }];
}
- (void)skipBackwardWithParams:(MTRMediaPlaybackClusterSkipBackwardParams *)params
                expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
         expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
             completionHandler:(void (^)(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable data,
                                   NSError * _Nullable error))completionHandler
{
    [self skipBackwardWithParams:params
                  expectedValues:expectedDataValueDictionaries
           expectedValueInterval:expectedValueIntervalMs
                      completion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable data, NSError * _Nullable error) {
                          // Cast is safe because subclass does not add any selectors.
                          completionHandler(static_cast<MTRMediaPlaybackClusterPlaybackResponseParams *>(data), error);
                      }];
}
- (void)seekWithParams:(MTRMediaPlaybackClusterSeekParams *)params
           expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
    expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
        completionHandler:
            (void (^)(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable data, NSError * _Nullable error))completionHandler
{
    [self seekWithParams:params
               expectedValues:expectedDataValueDictionaries
        expectedValueInterval:expectedValueIntervalMs
                   completion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable data, NSError * _Nullable error) {
                       // Cast is safe because subclass does not add any selectors.
                       completionHandler(static_cast<MTRMediaPlaybackClusterPlaybackResponseParams *>(data), error);
                   }];
}
@end

@implementation MTRClusterMediaInput

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (void)selectInputWithParams:(MTRMediaInputClusterSelectInputParams *)params
               expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                   completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeMediaInputID,
                                     (unsigned int) MTRCommandIDTypeClusterMediaInputCommandSelectInputID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                MediaInput::Commands::SelectInput::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.index = params.index.unsignedCharValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)showInputStatusWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                               completion:(MTRStatusCompletion)completion
{
    [self showInputStatusWithParams:nil
                     expectedValues:expectedValues
              expectedValueInterval:expectedValueIntervalMs
                         completion:completion];
}
- (void)showInputStatusWithParams:(MTRMediaInputClusterShowInputStatusParams * _Nullable)params
                   expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
            expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                       completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeMediaInputID,
                                     (unsigned int) MTRCommandIDTypeClusterMediaInputCommandShowInputStatusID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                MediaInput::Commands::ShowInputStatus::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)hideInputStatusWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                               completion:(MTRStatusCompletion)completion
{
    [self hideInputStatusWithParams:nil
                     expectedValues:expectedValues
              expectedValueInterval:expectedValueIntervalMs
                         completion:completion];
}
- (void)hideInputStatusWithParams:(MTRMediaInputClusterHideInputStatusParams * _Nullable)params
                   expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
            expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                       completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeMediaInputID,
                                     (unsigned int) MTRCommandIDTypeClusterMediaInputCommandHideInputStatusID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                MediaInput::Commands::HideInputStatus::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)renameInputWithParams:(MTRMediaInputClusterRenameInputParams *)params
               expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                   completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeMediaInputID,
                                     (unsigned int) MTRCommandIDTypeClusterMediaInputCommandRenameInputID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                MediaInput::Commands::RenameInput::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.index = params.index.unsignedCharValue;
                request.name = [self asCharSpan:params.name];

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (NSDictionary<NSString *, id> *)readAttributeInputListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeMediaInputID)
                                        attributeID:@(MTRAttributeIDTypeClusterMediaInputAttributeInputListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeCurrentInputWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeMediaInputID)
                                        attributeID:@(MTRAttributeIDTypeClusterMediaInputAttributeCurrentInputID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeMediaInputID)
                                        attributeID:@(MTRAttributeIDTypeClusterMediaInputAttributeGeneratedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeMediaInputID)
                                        attributeID:@(MTRAttributeIDTypeClusterMediaInputAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeMediaInputID)
                                        attributeID:@(MTRAttributeIDTypeClusterMediaInputAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeMediaInputID)
                                        attributeID:@(MTRAttributeIDTypeClusterMediaInputAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeMediaInputID)
                                        attributeID:@(MTRAttributeIDTypeClusterMediaInputAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterMediaInput (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

- (void)selectInputWithParams:(MTRMediaInputClusterSelectInputParams *)params
               expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
        expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
            completionHandler:(MTRStatusCompletion)completionHandler
{
    [self selectInputWithParams:params
                 expectedValues:expectedDataValueDictionaries
          expectedValueInterval:expectedValueIntervalMs
                     completion:completionHandler];
}
- (void)showInputStatusWithParams:(MTRMediaInputClusterShowInputStatusParams * _Nullable)params
                   expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
            expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                completionHandler:(MTRStatusCompletion)completionHandler
{
    [self showInputStatusWithParams:params
                     expectedValues:expectedDataValueDictionaries
              expectedValueInterval:expectedValueIntervalMs
                         completion:completionHandler];
}
- (void)showInputStatusWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                        completionHandler:(MTRStatusCompletion)completionHandler
{
    [self showInputStatusWithParams:nil
                     expectedValues:expectedValues
              expectedValueInterval:expectedValueIntervalMs
                  completionHandler:completionHandler];
}
- (void)hideInputStatusWithParams:(MTRMediaInputClusterHideInputStatusParams * _Nullable)params
                   expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
            expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                completionHandler:(MTRStatusCompletion)completionHandler
{
    [self hideInputStatusWithParams:params
                     expectedValues:expectedDataValueDictionaries
              expectedValueInterval:expectedValueIntervalMs
                         completion:completionHandler];
}
- (void)hideInputStatusWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                        completionHandler:(MTRStatusCompletion)completionHandler
{
    [self hideInputStatusWithParams:nil
                     expectedValues:expectedValues
              expectedValueInterval:expectedValueIntervalMs
                  completionHandler:completionHandler];
}
- (void)renameInputWithParams:(MTRMediaInputClusterRenameInputParams *)params
               expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
        expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
            completionHandler:(MTRStatusCompletion)completionHandler
{
    [self renameInputWithParams:params
                 expectedValues:expectedDataValueDictionaries
          expectedValueInterval:expectedValueIntervalMs
                     completion:completionHandler];
}
@end

@implementation MTRClusterLowPower

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (void)sleepWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
          expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                     completion:(MTRStatusCompletion)completion
{
    [self sleepWithParams:nil expectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs completion:completion];
}
- (void)sleepWithParams:(MTRLowPowerClusterSleepParams * _Nullable)params
           expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
               completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix =
        [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex, _endpoint,
                  (unsigned int) MTRClusterIDTypeLowPowerID, (unsigned int) MTRCommandIDTypeClusterLowPowerCommandSleepID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                LowPower::Commands::Sleep::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeLowPowerID)
                                        attributeID:@(MTRAttributeIDTypeClusterLowPowerAttributeGeneratedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeLowPowerID)
                                        attributeID:@(MTRAttributeIDTypeClusterLowPowerAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeLowPowerID)
                                        attributeID:@(MTRAttributeIDTypeClusterLowPowerAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeLowPowerID)
                                        attributeID:@(MTRAttributeIDTypeClusterLowPowerAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeLowPowerID)
                                        attributeID:@(MTRAttributeIDTypeClusterLowPowerAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterLowPower (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

- (void)sleepWithParams:(MTRLowPowerClusterSleepParams * _Nullable)params
           expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
    expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
        completionHandler:(MTRStatusCompletion)completionHandler
{
    [self sleepWithParams:params
               expectedValues:expectedDataValueDictionaries
        expectedValueInterval:expectedValueIntervalMs
                   completion:completionHandler];
}
- (void)sleepWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
          expectedValueInterval:(NSNumber *)expectedValueIntervalMs
              completionHandler:(MTRStatusCompletion)completionHandler
{
    [self sleepWithParams:nil
               expectedValues:expectedValues
        expectedValueInterval:expectedValueIntervalMs
            completionHandler:completionHandler];
}
@end

@implementation MTRClusterKeypadInput

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (void)sendKeyWithParams:(MTRKeypadInputClusterSendKeyParams *)params
           expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
               completion:
                   (void (^)(MTRKeypadInputClusterSendKeyResponseParams * _Nullable data, NSError * _Nullable error))completion
{
    NSString * logPrefix =
        [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex, _endpoint,
                  (unsigned int) MTRClusterIDTypeKeypadInputID, (unsigned int) MTRCommandIDTypeClusterKeypadInputCommandSendKeyID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRKeypadInputClusterSendKeyResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                KeypadInputClusterSendKeyResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRKeypadInputClusterSendKeyResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                KeypadInput::Commands::SendKey::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.keyCode = static_cast<std::remove_reference_t<decltype(request.keyCode)>>(params.keyCode.unsignedCharValue);

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeKeypadInputID)
                                        attributeID:@(MTRAttributeIDTypeClusterKeypadInputAttributeGeneratedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeKeypadInputID)
                                        attributeID:@(MTRAttributeIDTypeClusterKeypadInputAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeKeypadInputID)
                                        attributeID:@(MTRAttributeIDTypeClusterKeypadInputAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeKeypadInputID)
                                        attributeID:@(MTRAttributeIDTypeClusterKeypadInputAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeKeypadInputID)
                                        attributeID:@(MTRAttributeIDTypeClusterKeypadInputAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterKeypadInput (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

- (void)sendKeyWithParams:(MTRKeypadInputClusterSendKeyParams *)params
           expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
    expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
        completionHandler:
            (void (^)(MTRKeypadInputClusterSendKeyResponseParams * _Nullable data, NSError * _Nullable error))completionHandler
{
    [self sendKeyWithParams:params
               expectedValues:expectedDataValueDictionaries
        expectedValueInterval:expectedValueIntervalMs
                   completion:^(MTRKeypadInputClusterSendKeyResponseParams * _Nullable data, NSError * _Nullable error) {
                       // Cast is safe because subclass does not add any selectors.
                       completionHandler(static_cast<MTRKeypadInputClusterSendKeyResponseParams *>(data), error);
                   }];
}
@end

@implementation MTRClusterContentLauncher

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (void)launchContentWithParams:(MTRContentLauncherClusterLaunchContentParams *)params
                 expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
          expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                     completion:(void (^)(MTRContentLauncherClusterLauncherResponseParams * _Nullable data,
                                    NSError * _Nullable error))completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeContentLauncherID,
                                     (unsigned int) MTRCommandIDTypeClusterContentLauncherCommandLaunchContentID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRContentLauncherClusterLauncherResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                ContentLauncherClusterLauncherResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRContentLauncherClusterLauncherResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                ContentLauncher::Commands::LaunchContent::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                {
                    using ListType_1 = std::remove_reference_t<decltype(request.search.parameterList)>;
                    using ListMemberType_1 = ListMemberTypeGetter<ListType_1>::Type;
                    if (params.search.parameterList.count != 0) {
                        auto * listHolder_1 = new ListHolder<ListMemberType_1>(params.search.parameterList.count);
                        if (listHolder_1 == nullptr || listHolder_1->mList == nullptr) {
                            return CHIP_ERROR_INVALID_ARGUMENT;
                        }
                        listFreer.add(listHolder_1);
                        for (size_t i_1 = 0; i_1 < params.search.parameterList.count; ++i_1) {
                            if (![params.search.parameterList[i_1]
                                    isKindOfClass:[MTRContentLauncherClusterParameterStruct class]]) {
                                // Wrong kind of value.
                                return CHIP_ERROR_INVALID_ARGUMENT;
                            }
                            auto element_1 = (MTRContentLauncherClusterParameterStruct *) params.search.parameterList[i_1];
                            listHolder_1->mList[i_1].type
                                = static_cast<std::remove_reference_t<decltype(listHolder_1->mList[i_1].type)>>(
                                    element_1.type.unsignedCharValue);
                            listHolder_1->mList[i_1].value = [self asCharSpan:element_1.value];
                            if (element_1.externalIDList != nil) {
                                auto & definedValue_3 = listHolder_1->mList[i_1].externalIDList.Emplace();
                                {
                                    using ListType_4 = std::remove_reference_t<decltype(definedValue_3)>;
                                    using ListMemberType_4 = ListMemberTypeGetter<ListType_4>::Type;
                                    if (element_1.externalIDList.count != 0) {
                                        auto * listHolder_4 = new ListHolder<ListMemberType_4>(element_1.externalIDList.count);
                                        if (listHolder_4 == nullptr || listHolder_4->mList == nullptr) {
                                            return CHIP_ERROR_INVALID_ARGUMENT;
                                        }
                                        listFreer.add(listHolder_4);
                                        for (size_t i_4 = 0; i_4 < element_1.externalIDList.count; ++i_4) {
                                            if (![element_1.externalIDList[i_4]
                                                    isKindOfClass:[MTRContentLauncherClusterAdditionalInfoStruct class]]) {
                                                // Wrong kind of value.
                                                return CHIP_ERROR_INVALID_ARGUMENT;
                                            }
                                            auto element_4
                                                = (MTRContentLauncherClusterAdditionalInfoStruct *) element_1.externalIDList[i_4];
                                            listHolder_4->mList[i_4].name = [self asCharSpan:element_4.name];
                                            listHolder_4->mList[i_4].value = [self asCharSpan:element_4.value];
                                        }
                                        definedValue_3 = ListType_4(listHolder_4->mList, element_1.externalIDList.count);
                                    } else {
                                        definedValue_3 = ListType_4();
                                    }
                                }
                            }
                        }
                        request.search.parameterList = ListType_1(listHolder_1->mList, params.search.parameterList.count);
                    } else {
                        request.search.parameterList = ListType_1();
                    }
                }
                request.autoPlay = params.autoPlay.boolValue;
                if (params.data != nil) {
                    auto & definedValue_0 = request.data.Emplace();
                    definedValue_0 = [self asCharSpan:params.data];
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)launchURLWithParams:(MTRContentLauncherClusterLaunchURLParams *)params
             expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                 completion:(void (^)(MTRContentLauncherClusterLauncherResponseParams * _Nullable data,
                                NSError * _Nullable error))completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeContentLauncherID,
                                     (unsigned int) MTRCommandIDTypeClusterContentLauncherCommandLaunchURLID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRContentLauncherClusterLauncherResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                ContentLauncherClusterLauncherResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRContentLauncherClusterLauncherResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                ContentLauncher::Commands::LaunchURL::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.contentURL = [self asCharSpan:params.contentURL];
                if (params.displayString != nil) {
                    auto & definedValue_0 = request.displayString.Emplace();
                    definedValue_0 = [self asCharSpan:params.displayString];
                }
                if (params.brandingInformation != nil) {
                    auto & definedValue_0 = request.brandingInformation.Emplace();
                    definedValue_0.providerName = [self asCharSpan:params.brandingInformation.providerName];
                    if (params.brandingInformation.background != nil) {
                        auto & definedValue_2 = definedValue_0.background.Emplace();
                        if (params.brandingInformation.background.imageURL != nil) {
                            auto & definedValue_4 = definedValue_2.imageURL.Emplace();
                            definedValue_4 = [self asCharSpan:params.brandingInformation.background.imageURL];
                        }
                        if (params.brandingInformation.background.color != nil) {
                            auto & definedValue_4 = definedValue_2.color.Emplace();
                            definedValue_4 = [self asCharSpan:params.brandingInformation.background.color];
                        }
                        if (params.brandingInformation.background.size != nil) {
                            auto & definedValue_4 = definedValue_2.size.Emplace();
                            definedValue_4.width = params.brandingInformation.background.size.width.doubleValue;
                            definedValue_4.height = params.brandingInformation.background.size.height.doubleValue;
                            definedValue_4.metric = static_cast<std::remove_reference_t<decltype(definedValue_4.metric)>>(
                                params.brandingInformation.background.size.metric.unsignedCharValue);
                        }
                    }
                    if (params.brandingInformation.logo != nil) {
                        auto & definedValue_2 = definedValue_0.logo.Emplace();
                        if (params.brandingInformation.logo.imageURL != nil) {
                            auto & definedValue_4 = definedValue_2.imageURL.Emplace();
                            definedValue_4 = [self asCharSpan:params.brandingInformation.logo.imageURL];
                        }
                        if (params.brandingInformation.logo.color != nil) {
                            auto & definedValue_4 = definedValue_2.color.Emplace();
                            definedValue_4 = [self asCharSpan:params.brandingInformation.logo.color];
                        }
                        if (params.brandingInformation.logo.size != nil) {
                            auto & definedValue_4 = definedValue_2.size.Emplace();
                            definedValue_4.width = params.brandingInformation.logo.size.width.doubleValue;
                            definedValue_4.height = params.brandingInformation.logo.size.height.doubleValue;
                            definedValue_4.metric = static_cast<std::remove_reference_t<decltype(definedValue_4.metric)>>(
                                params.brandingInformation.logo.size.metric.unsignedCharValue);
                        }
                    }
                    if (params.brandingInformation.progressBar != nil) {
                        auto & definedValue_2 = definedValue_0.progressBar.Emplace();
                        if (params.brandingInformation.progressBar.imageURL != nil) {
                            auto & definedValue_4 = definedValue_2.imageURL.Emplace();
                            definedValue_4 = [self asCharSpan:params.brandingInformation.progressBar.imageURL];
                        }
                        if (params.brandingInformation.progressBar.color != nil) {
                            auto & definedValue_4 = definedValue_2.color.Emplace();
                            definedValue_4 = [self asCharSpan:params.brandingInformation.progressBar.color];
                        }
                        if (params.brandingInformation.progressBar.size != nil) {
                            auto & definedValue_4 = definedValue_2.size.Emplace();
                            definedValue_4.width = params.brandingInformation.progressBar.size.width.doubleValue;
                            definedValue_4.height = params.brandingInformation.progressBar.size.height.doubleValue;
                            definedValue_4.metric = static_cast<std::remove_reference_t<decltype(definedValue_4.metric)>>(
                                params.brandingInformation.progressBar.size.metric.unsignedCharValue);
                        }
                    }
                    if (params.brandingInformation.splash != nil) {
                        auto & definedValue_2 = definedValue_0.splash.Emplace();
                        if (params.brandingInformation.splash.imageURL != nil) {
                            auto & definedValue_4 = definedValue_2.imageURL.Emplace();
                            definedValue_4 = [self asCharSpan:params.brandingInformation.splash.imageURL];
                        }
                        if (params.brandingInformation.splash.color != nil) {
                            auto & definedValue_4 = definedValue_2.color.Emplace();
                            definedValue_4 = [self asCharSpan:params.brandingInformation.splash.color];
                        }
                        if (params.brandingInformation.splash.size != nil) {
                            auto & definedValue_4 = definedValue_2.size.Emplace();
                            definedValue_4.width = params.brandingInformation.splash.size.width.doubleValue;
                            definedValue_4.height = params.brandingInformation.splash.size.height.doubleValue;
                            definedValue_4.metric = static_cast<std::remove_reference_t<decltype(definedValue_4.metric)>>(
                                params.brandingInformation.splash.size.metric.unsignedCharValue);
                        }
                    }
                    if (params.brandingInformation.waterMark != nil) {
                        auto & definedValue_2 = definedValue_0.waterMark.Emplace();
                        if (params.brandingInformation.waterMark.imageURL != nil) {
                            auto & definedValue_4 = definedValue_2.imageURL.Emplace();
                            definedValue_4 = [self asCharSpan:params.brandingInformation.waterMark.imageURL];
                        }
                        if (params.brandingInformation.waterMark.color != nil) {
                            auto & definedValue_4 = definedValue_2.color.Emplace();
                            definedValue_4 = [self asCharSpan:params.brandingInformation.waterMark.color];
                        }
                        if (params.brandingInformation.waterMark.size != nil) {
                            auto & definedValue_4 = definedValue_2.size.Emplace();
                            definedValue_4.width = params.brandingInformation.waterMark.size.width.doubleValue;
                            definedValue_4.height = params.brandingInformation.waterMark.size.height.doubleValue;
                            definedValue_4.metric = static_cast<std::remove_reference_t<decltype(definedValue_4.metric)>>(
                                params.brandingInformation.waterMark.size.metric.unsignedCharValue);
                        }
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptHeaderWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeContentLauncherID)
                                        attributeID:@(MTRAttributeIDTypeClusterContentLauncherAttributeAcceptHeaderID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeSupportedStreamingProtocolsWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeContentLauncherID)
                                     attributeID:@(MTRAttributeIDTypeClusterContentLauncherAttributeSupportedStreamingProtocolsID)
                                          params:params];
}

- (void)writeAttributeSupportedStreamingProtocolsWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                     expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeSupportedStreamingProtocolsWithValue:dataValueDictionary
                                       expectedValueInterval:expectedValueIntervalMs
                                                      params:nil];
}
- (void)writeAttributeSupportedStreamingProtocolsWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                     expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                                    params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeContentLauncherID)
                                  attributeID:@(MTRAttributeIDTypeClusterContentLauncherAttributeSupportedStreamingProtocolsID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeContentLauncherID)
                                        attributeID:@(MTRAttributeIDTypeClusterContentLauncherAttributeGeneratedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeContentLauncherID)
                                        attributeID:@(MTRAttributeIDTypeClusterContentLauncherAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeContentLauncherID)
                                        attributeID:@(MTRAttributeIDTypeClusterContentLauncherAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeContentLauncherID)
                                        attributeID:@(MTRAttributeIDTypeClusterContentLauncherAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeContentLauncherID)
                                        attributeID:@(MTRAttributeIDTypeClusterContentLauncherAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterContentLauncher (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

- (void)launchContentWithParams:(MTRContentLauncherClusterLaunchContentParams *)params
                 expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
          expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
              completionHandler:(void (^)(MTRContentLauncherClusterLaunchResponseParams * _Nullable data,
                                    NSError * _Nullable error))completionHandler
{
    [self launchContentWithParams:params
                   expectedValues:expectedDataValueDictionaries
            expectedValueInterval:expectedValueIntervalMs
                       completion:^(MTRContentLauncherClusterLauncherResponseParams * _Nullable data, NSError * _Nullable error) {
                           // Cast is safe because subclass does not add any selectors.
                           completionHandler(static_cast<MTRContentLauncherClusterLaunchResponseParams *>(data), error);
                       }];
}
- (void)launchURLWithParams:(MTRContentLauncherClusterLaunchURLParams *)params
             expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
      expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
          completionHandler:
              (void (^)(MTRContentLauncherClusterLaunchResponseParams * _Nullable data, NSError * _Nullable error))completionHandler
{
    [self launchURLWithParams:params
               expectedValues:expectedDataValueDictionaries
        expectedValueInterval:expectedValueIntervalMs
                   completion:^(MTRContentLauncherClusterLauncherResponseParams * _Nullable data, NSError * _Nullable error) {
                       // Cast is safe because subclass does not add any selectors.
                       completionHandler(static_cast<MTRContentLauncherClusterLaunchResponseParams *>(data), error);
                   }];
}
@end

@implementation MTRClusterAudioOutput

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (void)selectOutputWithParams:(MTRAudioOutputClusterSelectOutputParams *)params
                expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
         expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                    completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeAudioOutputID,
                                     (unsigned int) MTRCommandIDTypeClusterAudioOutputCommandSelectOutputID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                AudioOutput::Commands::SelectOutput::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.index = params.index.unsignedCharValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)renameOutputWithParams:(MTRAudioOutputClusterRenameOutputParams *)params
                expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
         expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                    completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeAudioOutputID,
                                     (unsigned int) MTRCommandIDTypeClusterAudioOutputCommandRenameOutputID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                AudioOutput::Commands::RenameOutput::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.index = params.index.unsignedCharValue;
                request.name = [self asCharSpan:params.name];

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (NSDictionary<NSString *, id> *)readAttributeOutputListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeAudioOutputID)
                                        attributeID:@(MTRAttributeIDTypeClusterAudioOutputAttributeOutputListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeCurrentOutputWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeAudioOutputID)
                                        attributeID:@(MTRAttributeIDTypeClusterAudioOutputAttributeCurrentOutputID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeAudioOutputID)
                                        attributeID:@(MTRAttributeIDTypeClusterAudioOutputAttributeGeneratedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeAudioOutputID)
                                        attributeID:@(MTRAttributeIDTypeClusterAudioOutputAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeAudioOutputID)
                                        attributeID:@(MTRAttributeIDTypeClusterAudioOutputAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeAudioOutputID)
                                        attributeID:@(MTRAttributeIDTypeClusterAudioOutputAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeAudioOutputID)
                                        attributeID:@(MTRAttributeIDTypeClusterAudioOutputAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterAudioOutput (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

- (void)selectOutputWithParams:(MTRAudioOutputClusterSelectOutputParams *)params
                expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
         expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
             completionHandler:(MTRStatusCompletion)completionHandler
{
    [self selectOutputWithParams:params
                  expectedValues:expectedDataValueDictionaries
           expectedValueInterval:expectedValueIntervalMs
                      completion:completionHandler];
}
- (void)renameOutputWithParams:(MTRAudioOutputClusterRenameOutputParams *)params
                expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
         expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
             completionHandler:(MTRStatusCompletion)completionHandler
{
    [self renameOutputWithParams:params
                  expectedValues:expectedDataValueDictionaries
           expectedValueInterval:expectedValueIntervalMs
                      completion:completionHandler];
}
@end

@implementation MTRClusterApplicationLauncher

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (void)launchAppWithParams:(MTRApplicationLauncherClusterLaunchAppParams * _Nullable)params
             expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                 completion:(void (^)(MTRApplicationLauncherClusterLauncherResponseParams * _Nullable data,
                                NSError * _Nullable error))completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeApplicationLauncherID,
                                     (unsigned int) MTRCommandIDTypeClusterApplicationLauncherCommandLaunchAppID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRApplicationLauncherClusterLauncherResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                ApplicationLauncherClusterLauncherResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRApplicationLauncherClusterLauncherResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                ApplicationLauncher::Commands::LaunchApp::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                if (params != nil) {
                    if (params.application != nil) {
                        auto & definedValue_0 = request.application.Emplace();
                        definedValue_0.catalogVendorID = params.application.catalogVendorID.unsignedShortValue;
                        definedValue_0.applicationID = [self asCharSpan:params.application.applicationID];
                    }
                    if (params.data != nil) {
                        auto & definedValue_0 = request.data.Emplace();
                        definedValue_0 = [self asByteSpan:params.data];
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)stopAppWithParams:(MTRApplicationLauncherClusterStopAppParams * _Nullable)params
           expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
               completion:(void (^)(MTRApplicationLauncherClusterLauncherResponseParams * _Nullable data,
                              NSError * _Nullable error))completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeApplicationLauncherID,
                                     (unsigned int) MTRCommandIDTypeClusterApplicationLauncherCommandStopAppID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRApplicationLauncherClusterLauncherResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                ApplicationLauncherClusterLauncherResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRApplicationLauncherClusterLauncherResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                ApplicationLauncher::Commands::StopApp::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                if (params != nil) {
                    if (params.application != nil) {
                        auto & definedValue_0 = request.application.Emplace();
                        definedValue_0.catalogVendorID = params.application.catalogVendorID.unsignedShortValue;
                        definedValue_0.applicationID = [self asCharSpan:params.application.applicationID];
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)hideAppWithParams:(MTRApplicationLauncherClusterHideAppParams * _Nullable)params
           expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
               completion:(void (^)(MTRApplicationLauncherClusterLauncherResponseParams * _Nullable data,
                              NSError * _Nullable error))completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeApplicationLauncherID,
                                     (unsigned int) MTRCommandIDTypeClusterApplicationLauncherCommandHideAppID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRApplicationLauncherClusterLauncherResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                ApplicationLauncherClusterLauncherResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRApplicationLauncherClusterLauncherResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                ApplicationLauncher::Commands::HideApp::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                if (params != nil) {
                    if (params.application != nil) {
                        auto & definedValue_0 = request.application.Emplace();
                        definedValue_0.catalogVendorID = params.application.catalogVendorID.unsignedShortValue;
                        definedValue_0.applicationID = [self asCharSpan:params.application.applicationID];
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (NSDictionary<NSString *, id> *)readAttributeCatalogListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeApplicationLauncherID)
                                        attributeID:@(MTRAttributeIDTypeClusterApplicationLauncherAttributeCatalogListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeCurrentAppWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeApplicationLauncherID)
                                        attributeID:@(MTRAttributeIDTypeClusterApplicationLauncherAttributeCurrentAppID)
                                             params:params];
}

- (void)writeAttributeCurrentAppWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeCurrentAppWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeCurrentAppWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                   params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeApplicationLauncherID)
                                  attributeID:@(MTRAttributeIDTypeClusterApplicationLauncherAttributeCurrentAppID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeApplicationLauncherID)
                                        attributeID:@(MTRAttributeIDTypeClusterApplicationLauncherAttributeGeneratedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeApplicationLauncherID)
                                        attributeID:@(MTRAttributeIDTypeClusterApplicationLauncherAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeApplicationLauncherID)
                                        attributeID:@(MTRAttributeIDTypeClusterApplicationLauncherAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeApplicationLauncherID)
                                        attributeID:@(MTRAttributeIDTypeClusterApplicationLauncherAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeApplicationLauncherID)
                                        attributeID:@(MTRAttributeIDTypeClusterApplicationLauncherAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterApplicationLauncher (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

- (void)launchAppWithParams:(MTRApplicationLauncherClusterLaunchAppParams * _Nullable)params
             expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
      expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
          completionHandler:(void (^)(MTRApplicationLauncherClusterLauncherResponseParams * _Nullable data,
                                NSError * _Nullable error))completionHandler
{
    [self launchAppWithParams:params
               expectedValues:expectedDataValueDictionaries
        expectedValueInterval:expectedValueIntervalMs
                   completion:^(MTRApplicationLauncherClusterLauncherResponseParams * _Nullable data, NSError * _Nullable error) {
                       // Cast is safe because subclass does not add any selectors.
                       completionHandler(static_cast<MTRApplicationLauncherClusterLauncherResponseParams *>(data), error);
                   }];
}
- (void)stopAppWithParams:(MTRApplicationLauncherClusterStopAppParams * _Nullable)params
           expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
    expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
        completionHandler:(void (^)(MTRApplicationLauncherClusterLauncherResponseParams * _Nullable data,
                              NSError * _Nullable error))completionHandler
{
    [self stopAppWithParams:params
               expectedValues:expectedDataValueDictionaries
        expectedValueInterval:expectedValueIntervalMs
                   completion:^(MTRApplicationLauncherClusterLauncherResponseParams * _Nullable data, NSError * _Nullable error) {
                       // Cast is safe because subclass does not add any selectors.
                       completionHandler(static_cast<MTRApplicationLauncherClusterLauncherResponseParams *>(data), error);
                   }];
}
- (void)hideAppWithParams:(MTRApplicationLauncherClusterHideAppParams * _Nullable)params
           expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
    expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
        completionHandler:(void (^)(MTRApplicationLauncherClusterLauncherResponseParams * _Nullable data,
                              NSError * _Nullable error))completionHandler
{
    [self hideAppWithParams:params
               expectedValues:expectedDataValueDictionaries
        expectedValueInterval:expectedValueIntervalMs
                   completion:^(MTRApplicationLauncherClusterLauncherResponseParams * _Nullable data, NSError * _Nullable error) {
                       // Cast is safe because subclass does not add any selectors.
                       completionHandler(static_cast<MTRApplicationLauncherClusterLauncherResponseParams *>(data), error);
                   }];
}
@end

@implementation MTRClusterApplicationBasic

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (NSDictionary<NSString *, id> *)readAttributeVendorNameWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeApplicationBasicID)
                                        attributeID:@(MTRAttributeIDTypeClusterApplicationBasicAttributeVendorNameID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeVendorIDWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeApplicationBasicID)
                                        attributeID:@(MTRAttributeIDTypeClusterApplicationBasicAttributeVendorIDID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeApplicationNameWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeApplicationBasicID)
                                        attributeID:@(MTRAttributeIDTypeClusterApplicationBasicAttributeApplicationNameID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeProductIDWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeApplicationBasicID)
                                        attributeID:@(MTRAttributeIDTypeClusterApplicationBasicAttributeProductIDID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeApplicationWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeApplicationBasicID)
                                        attributeID:@(MTRAttributeIDTypeClusterApplicationBasicAttributeApplicationID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeStatusWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeApplicationBasicID)
                                        attributeID:@(MTRAttributeIDTypeClusterApplicationBasicAttributeStatusID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeApplicationVersionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeApplicationBasicID)
                                        attributeID:@(MTRAttributeIDTypeClusterApplicationBasicAttributeApplicationVersionID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAllowedVendorListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeApplicationBasicID)
                                        attributeID:@(MTRAttributeIDTypeClusterApplicationBasicAttributeAllowedVendorListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeApplicationBasicID)
                                        attributeID:@(MTRAttributeIDTypeClusterApplicationBasicAttributeGeneratedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeApplicationBasicID)
                                        attributeID:@(MTRAttributeIDTypeClusterApplicationBasicAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeApplicationBasicID)
                                        attributeID:@(MTRAttributeIDTypeClusterApplicationBasicAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeApplicationBasicID)
                                        attributeID:@(MTRAttributeIDTypeClusterApplicationBasicAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeApplicationBasicID)
                                        attributeID:@(MTRAttributeIDTypeClusterApplicationBasicAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterApplicationBasic (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

@end

@implementation MTRClusterAccountLogin

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (void)getSetupPINWithParams:(MTRAccountLoginClusterGetSetupPINParams *)params
               expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                   completion:(void (^)(MTRAccountLoginClusterGetSetupPINResponseParams * _Nullable data,
                                  NSError * _Nullable error))completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeAccountLoginID,
                                     (unsigned int) MTRCommandIDTypeClusterAccountLoginCommandGetSetupPINID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRAccountLoginClusterGetSetupPINResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                AccountLoginClusterGetSetupPINResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRAccountLoginClusterGetSetupPINResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                AccountLogin::Commands::GetSetupPIN::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                if (!timedInvokeTimeoutMs.HasValue()) {
                    timedInvokeTimeoutMs.SetValue(10000);
                }
                request.tempAccountIdentifier = [self asCharSpan:params.tempAccountIdentifier];

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)loginWithParams:(MTRAccountLoginClusterLoginParams *)params
           expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
               completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix =
        [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex, _endpoint,
                  (unsigned int) MTRClusterIDTypeAccountLoginID, (unsigned int) MTRCommandIDTypeClusterAccountLoginCommandLoginID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                AccountLogin::Commands::Login::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                if (!timedInvokeTimeoutMs.HasValue()) {
                    timedInvokeTimeoutMs.SetValue(10000);
                }
                request.tempAccountIdentifier = [self asCharSpan:params.tempAccountIdentifier];
                request.setupPIN = [self asCharSpan:params.setupPIN];

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)logoutWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
           expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                      completion:(MTRStatusCompletion)completion
{
    [self logoutWithParams:nil expectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs completion:completion];
}
- (void)logoutWithParams:(MTRAccountLoginClusterLogoutParams * _Nullable)params
           expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
               completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix =
        [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex, _endpoint,
                  (unsigned int) MTRClusterIDTypeAccountLoginID, (unsigned int) MTRCommandIDTypeClusterAccountLoginCommandLogoutID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                AccountLogin::Commands::Logout::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                if (!timedInvokeTimeoutMs.HasValue()) {
                    timedInvokeTimeoutMs.SetValue(10000);
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeAccountLoginID)
                                        attributeID:@(MTRAttributeIDTypeClusterAccountLoginAttributeGeneratedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeAccountLoginID)
                                        attributeID:@(MTRAttributeIDTypeClusterAccountLoginAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeAccountLoginID)
                                        attributeID:@(MTRAttributeIDTypeClusterAccountLoginAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeAccountLoginID)
                                        attributeID:@(MTRAttributeIDTypeClusterAccountLoginAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeAccountLoginID)
                                        attributeID:@(MTRAttributeIDTypeClusterAccountLoginAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterAccountLogin (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

- (void)getSetupPINWithParams:(MTRAccountLoginClusterGetSetupPINParams *)params
               expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
        expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
            completionHandler:(void (^)(MTRAccountLoginClusterGetSetupPINResponseParams * _Nullable data,
                                  NSError * _Nullable error))completionHandler
{
    [self getSetupPINWithParams:params
                 expectedValues:expectedDataValueDictionaries
          expectedValueInterval:expectedValueIntervalMs
                     completion:^(MTRAccountLoginClusterGetSetupPINResponseParams * _Nullable data, NSError * _Nullable error) {
                         // Cast is safe because subclass does not add any selectors.
                         completionHandler(static_cast<MTRAccountLoginClusterGetSetupPINResponseParams *>(data), error);
                     }];
}
- (void)loginWithParams:(MTRAccountLoginClusterLoginParams *)params
           expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
    expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
        completionHandler:(MTRStatusCompletion)completionHandler
{
    [self loginWithParams:params
               expectedValues:expectedDataValueDictionaries
        expectedValueInterval:expectedValueIntervalMs
                   completion:completionHandler];
}
- (void)logoutWithParams:(MTRAccountLoginClusterLogoutParams * _Nullable)params
           expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
    expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
        completionHandler:(MTRStatusCompletion)completionHandler
{
    [self logoutWithParams:params
               expectedValues:expectedDataValueDictionaries
        expectedValueInterval:expectedValueIntervalMs
                   completion:completionHandler];
}
- (void)logoutWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
           expectedValueInterval:(NSNumber *)expectedValueIntervalMs
               completionHandler:(MTRStatusCompletion)completionHandler
{
    [self logoutWithParams:nil
               expectedValues:expectedValues
        expectedValueInterval:expectedValueIntervalMs
            completionHandler:completionHandler];
}
@end

@implementation MTRClusterElectricalMeasurement

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (void)getProfileInfoCommandWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                          expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                     completion:(MTRStatusCompletion)completion
{
    [self getProfileInfoCommandWithParams:nil
                           expectedValues:expectedValues
                    expectedValueInterval:expectedValueIntervalMs
                               completion:completion];
}
- (void)getProfileInfoCommandWithParams:(MTRElectricalMeasurementClusterGetProfileInfoCommandParams * _Nullable)params
                         expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                  expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                             completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeElectricalMeasurementID,
                                     (unsigned int) MTRCommandIDTypeClusterElectricalMeasurementCommandGetProfileInfoCommandID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                ElectricalMeasurement::Commands::GetProfileInfoCommand::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)getMeasurementProfileCommandWithParams:(MTRElectricalMeasurementClusterGetMeasurementProfileCommandParams *)params
                                expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                         expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                    completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix =
        [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex, _endpoint,
                  (unsigned int) MTRClusterIDTypeElectricalMeasurementID,
                  (unsigned int) MTRCommandIDTypeClusterElectricalMeasurementCommandGetMeasurementProfileCommandID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                ElectricalMeasurement::Commands::GetMeasurementProfileCommand::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.attributeId = params.attributeId.unsignedShortValue;
                request.startTime = params.startTime.unsignedIntValue;
                request.numberOfIntervals = params.numberOfIntervals.unsignedCharValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (NSDictionary<NSString *, id> *)readAttributeMeasurementTypeWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeMeasurementTypeID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeDcVoltageWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeDcVoltageID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeDcVoltageMinWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeDcVoltageMinID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeDcVoltageMaxWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeDcVoltageMaxID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeDcCurrentWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeDcCurrentID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeDcCurrentMinWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeDcCurrentMinID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeDcCurrentMaxWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeDcCurrentMaxID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeDcPowerWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeDcPowerID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeDcPowerMinWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeDcPowerMinID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeDcPowerMaxWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeDcPowerMaxID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeDcVoltageMultiplierWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeDcVoltageMultiplierID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeDcVoltageDivisorWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeDcVoltageDivisorID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeDcCurrentMultiplierWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeDcCurrentMultiplierID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeDcCurrentDivisorWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeDcCurrentDivisorID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeDcPowerMultiplierWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeDcPowerMultiplierID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeDcPowerDivisorWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeDcPowerDivisorID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcFrequencyWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeAcFrequencyID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcFrequencyMinWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeAcFrequencyMinID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcFrequencyMaxWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeAcFrequencyMaxID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeNeutralCurrentWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeNeutralCurrentID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeTotalActivePowerWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeTotalActivePowerID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeTotalReactivePowerWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeTotalReactivePowerID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeTotalApparentPowerWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeTotalApparentPowerID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeMeasured1stHarmonicCurrentWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeMeasured1stHarmonicCurrentID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeMeasured3rdHarmonicCurrentWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeMeasured3rdHarmonicCurrentID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeMeasured5thHarmonicCurrentWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeMeasured5thHarmonicCurrentID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeMeasured7thHarmonicCurrentWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeMeasured7thHarmonicCurrentID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeMeasured9thHarmonicCurrentWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeMeasured9thHarmonicCurrentID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeMeasured11thHarmonicCurrentWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeMeasured11thHarmonicCurrentID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeMeasuredPhase1stHarmonicCurrentWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeMeasuredPhase1stHarmonicCurrentID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeMeasuredPhase3rdHarmonicCurrentWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeMeasuredPhase3rdHarmonicCurrentID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeMeasuredPhase5thHarmonicCurrentWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeMeasuredPhase5thHarmonicCurrentID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeMeasuredPhase7thHarmonicCurrentWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeMeasuredPhase7thHarmonicCurrentID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeMeasuredPhase9thHarmonicCurrentWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeMeasuredPhase9thHarmonicCurrentID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeMeasuredPhase11thHarmonicCurrentWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeMeasuredPhase11thHarmonicCurrentID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcFrequencyMultiplierWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                     attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeAcFrequencyMultiplierID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcFrequencyDivisorWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeAcFrequencyDivisorID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributePowerMultiplierWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributePowerMultiplierID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributePowerDivisorWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributePowerDivisorID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeHarmonicCurrentMultiplierWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeHarmonicCurrentMultiplierID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributePhaseHarmonicCurrentMultiplierWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributePhaseHarmonicCurrentMultiplierID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeInstantaneousVoltageWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeInstantaneousVoltageID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeInstantaneousLineCurrentWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeInstantaneousLineCurrentID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeInstantaneousActiveCurrentWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeInstantaneousActiveCurrentID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeInstantaneousReactiveCurrentWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeInstantaneousReactiveCurrentID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeInstantaneousPowerWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeInstantaneousPowerID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeRmsVoltageWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeRmsVoltageID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeRmsVoltageMinWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeRmsVoltageMinID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeRmsVoltageMaxWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeRmsVoltageMaxID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeRmsCurrentWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeRmsCurrentID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeRmsCurrentMinWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeRmsCurrentMinID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeRmsCurrentMaxWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeRmsCurrentMaxID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeActivePowerWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeActivePowerID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeActivePowerMinWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeActivePowerMinID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeActivePowerMaxWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeActivePowerMaxID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeReactivePowerWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeReactivePowerID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeApparentPowerWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeApparentPowerID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributePowerFactorWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributePowerFactorID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAverageRmsVoltageMeasurementPeriodWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeAverageRmsVoltageMeasurementPeriodID)
                             params:params];
}

- (void)writeAttributeAverageRmsVoltageMeasurementPeriodWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                            expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeAverageRmsVoltageMeasurementPeriodWithValue:dataValueDictionary
                                              expectedValueInterval:expectedValueIntervalMs
                                                             params:nil];
}
- (void)writeAttributeAverageRmsVoltageMeasurementPeriodWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                            expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                                           params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device
        writeAttributeWithEndpointID:@(_endpoint)
                           clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                         attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeAverageRmsVoltageMeasurementPeriodID)
                               value:dataValueDictionary
               expectedValueInterval:expectedValueIntervalMs
                   timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeAverageRmsUnderVoltageCounterWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeAverageRmsUnderVoltageCounterID)
                             params:params];
}

- (void)writeAttributeAverageRmsUnderVoltageCounterWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                       expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeAverageRmsUnderVoltageCounterWithValue:dataValueDictionary
                                         expectedValueInterval:expectedValueIntervalMs
                                                        params:nil];
}
- (void)writeAttributeAverageRmsUnderVoltageCounterWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                       expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                                      params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device
        writeAttributeWithEndpointID:@(_endpoint)
                           clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                         attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeAverageRmsUnderVoltageCounterID)
                               value:dataValueDictionary
               expectedValueInterval:expectedValueIntervalMs
                   timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeRmsExtremeOverVoltagePeriodWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeRmsExtremeOverVoltagePeriodID)
                             params:params];
}

- (void)writeAttributeRmsExtremeOverVoltagePeriodWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                     expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeRmsExtremeOverVoltagePeriodWithValue:dataValueDictionary
                                       expectedValueInterval:expectedValueIntervalMs
                                                      params:nil];
}
- (void)writeAttributeRmsExtremeOverVoltagePeriodWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                     expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                                    params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device
        writeAttributeWithEndpointID:@(_endpoint)
                           clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                         attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeRmsExtremeOverVoltagePeriodID)
                               value:dataValueDictionary
               expectedValueInterval:expectedValueIntervalMs
                   timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeRmsExtremeUnderVoltagePeriodWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeRmsExtremeUnderVoltagePeriodID)
                             params:params];
}

- (void)writeAttributeRmsExtremeUnderVoltagePeriodWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeRmsExtremeUnderVoltagePeriodWithValue:dataValueDictionary
                                        expectedValueInterval:expectedValueIntervalMs
                                                       params:nil];
}
- (void)writeAttributeRmsExtremeUnderVoltagePeriodWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                                     params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device
        writeAttributeWithEndpointID:@(_endpoint)
                           clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                         attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeRmsExtremeUnderVoltagePeriodID)
                               value:dataValueDictionary
               expectedValueInterval:expectedValueIntervalMs
                   timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeRmsVoltageSagPeriodWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeRmsVoltageSagPeriodID)
                                             params:params];
}

- (void)writeAttributeRmsVoltageSagPeriodWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                             expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeRmsVoltageSagPeriodWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeRmsVoltageSagPeriodWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                             expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                            params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                  attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeRmsVoltageSagPeriodID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeRmsVoltageSwellPeriodWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                     attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeRmsVoltageSwellPeriodID)
                                          params:params];
}

- (void)writeAttributeRmsVoltageSwellPeriodWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                               expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeRmsVoltageSwellPeriodWithValue:dataValueDictionary
                                 expectedValueInterval:expectedValueIntervalMs
                                                params:nil];
}
- (void)writeAttributeRmsVoltageSwellPeriodWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                               expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                              params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                  attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeRmsVoltageSwellPeriodID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeAcVoltageMultiplierWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeAcVoltageMultiplierID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcVoltageDivisorWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeAcVoltageDivisorID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcCurrentMultiplierWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeAcCurrentMultiplierID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcCurrentDivisorWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeAcCurrentDivisorID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcPowerMultiplierWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeAcPowerMultiplierID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcPowerDivisorWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeAcPowerDivisorID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeOverloadAlarmsMaskWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeOverloadAlarmsMaskID)
                                             params:params];
}

- (void)writeAttributeOverloadAlarmsMaskWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                            expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeOverloadAlarmsMaskWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeOverloadAlarmsMaskWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                            expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                           params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                  attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeOverloadAlarmsMaskID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeVoltageOverloadWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeVoltageOverloadID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeCurrentOverloadWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeCurrentOverloadID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcOverloadAlarmsMaskWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeAcOverloadAlarmsMaskID)
                                             params:params];
}

- (void)writeAttributeAcOverloadAlarmsMaskWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                              expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeAcOverloadAlarmsMaskWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeAcOverloadAlarmsMaskWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                              expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                             params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                  attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeAcOverloadAlarmsMaskID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeAcVoltageOverloadWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeAcVoltageOverloadID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcCurrentOverloadWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeAcCurrentOverloadID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcActivePowerOverloadWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                     attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeAcActivePowerOverloadID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcReactivePowerOverloadWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                     attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeAcReactivePowerOverloadID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAverageRmsOverVoltageWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                     attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeAverageRmsOverVoltageID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAverageRmsUnderVoltageWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                     attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeAverageRmsUnderVoltageID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeRmsExtremeOverVoltageWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                     attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeRmsExtremeOverVoltageID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeRmsExtremeUnderVoltageWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                     attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeRmsExtremeUnderVoltageID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeRmsVoltageSagWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeRmsVoltageSagID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeRmsVoltageSwellWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeRmsVoltageSwellID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeLineCurrentPhaseBWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeLineCurrentPhaseBID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeActiveCurrentPhaseBWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeActiveCurrentPhaseBID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeReactiveCurrentPhaseBWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                     attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeReactiveCurrentPhaseBID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeRmsVoltagePhaseBWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeRmsVoltagePhaseBID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeRmsVoltageMinPhaseBWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeRmsVoltageMinPhaseBID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeRmsVoltageMaxPhaseBWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeRmsVoltageMaxPhaseBID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeRmsCurrentPhaseBWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeRmsCurrentPhaseBID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeRmsCurrentMinPhaseBWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeRmsCurrentMinPhaseBID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeRmsCurrentMaxPhaseBWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeRmsCurrentMaxPhaseBID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeActivePowerPhaseBWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeActivePowerPhaseBID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeActivePowerMinPhaseBWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeActivePowerMinPhaseBID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeActivePowerMaxPhaseBWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeActivePowerMaxPhaseBID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeReactivePowerPhaseBWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeReactivePowerPhaseBID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeApparentPowerPhaseBWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeApparentPowerPhaseBID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributePowerFactorPhaseBWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributePowerFactorPhaseBID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAverageRmsVoltageMeasurementPeriodPhaseBWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                        attributeID:
                            @(MTRAttributeIDTypeClusterElectricalMeasurementAttributeAverageRmsVoltageMeasurementPeriodPhaseBID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAverageRmsOverVoltageCounterPhaseBWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeAverageRmsOverVoltageCounterPhaseBID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAverageRmsUnderVoltageCounterPhaseBWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeAverageRmsUnderVoltageCounterPhaseBID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeRmsExtremeOverVoltagePeriodPhaseBWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeRmsExtremeOverVoltagePeriodPhaseBID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeRmsExtremeUnderVoltagePeriodPhaseBWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeRmsExtremeUnderVoltagePeriodPhaseBID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeRmsVoltageSagPeriodPhaseBWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeRmsVoltageSagPeriodPhaseBID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeRmsVoltageSwellPeriodPhaseBWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeRmsVoltageSwellPeriodPhaseBID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeLineCurrentPhaseCWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeLineCurrentPhaseCID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeActiveCurrentPhaseCWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeActiveCurrentPhaseCID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeReactiveCurrentPhaseCWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                     attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeReactiveCurrentPhaseCID)
                                          params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeRmsVoltagePhaseCWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeRmsVoltagePhaseCID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeRmsVoltageMinPhaseCWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeRmsVoltageMinPhaseCID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeRmsVoltageMaxPhaseCWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeRmsVoltageMaxPhaseCID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeRmsCurrentPhaseCWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeRmsCurrentPhaseCID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeRmsCurrentMinPhaseCWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeRmsCurrentMinPhaseCID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeRmsCurrentMaxPhaseCWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeRmsCurrentMaxPhaseCID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeActivePowerPhaseCWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeActivePowerPhaseCID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeActivePowerMinPhaseCWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeActivePowerMinPhaseCID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeActivePowerMaxPhaseCWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeActivePowerMaxPhaseCID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeReactivePowerPhaseCWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeReactivePowerPhaseCID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeApparentPowerPhaseCWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeApparentPowerPhaseCID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributePowerFactorPhaseCWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributePowerFactorPhaseCID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAverageRmsVoltageMeasurementPeriodPhaseCWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                        attributeID:
                            @(MTRAttributeIDTypeClusterElectricalMeasurementAttributeAverageRmsVoltageMeasurementPeriodPhaseCID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAverageRmsOverVoltageCounterPhaseCWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeAverageRmsOverVoltageCounterPhaseCID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAverageRmsUnderVoltageCounterPhaseCWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeAverageRmsUnderVoltageCounterPhaseCID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeRmsExtremeOverVoltagePeriodPhaseCWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeRmsExtremeOverVoltagePeriodPhaseCID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeRmsExtremeUnderVoltagePeriodPhaseCWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeRmsExtremeUnderVoltagePeriodPhaseCID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeRmsVoltageSagPeriodPhaseCWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeRmsVoltageSagPeriodPhaseCID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeRmsVoltageSwellPeriodPhaseCWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device
        readAttributeWithEndpointID:@(_endpoint)
                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeRmsVoltageSwellPeriodPhaseCID)
                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeGeneratedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeElectricalMeasurementID)
                                        attributeID:@(MTRAttributeIDTypeClusterElectricalMeasurementAttributeClusterRevisionID)
                                             params:params];
}

@end

@implementation MTRClusterElectricalMeasurement (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

- (void)getProfileInfoCommandWithParams:(MTRElectricalMeasurementClusterGetProfileInfoCommandParams * _Nullable)params
                         expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
                  expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                      completionHandler:(MTRStatusCompletion)completionHandler
{
    [self getProfileInfoCommandWithParams:params
                           expectedValues:expectedDataValueDictionaries
                    expectedValueInterval:expectedValueIntervalMs
                               completion:completionHandler];
}
- (void)getProfileInfoCommandWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                          expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                              completionHandler:(MTRStatusCompletion)completionHandler
{
    [self getProfileInfoCommandWithParams:nil
                           expectedValues:expectedValues
                    expectedValueInterval:expectedValueIntervalMs
                        completionHandler:completionHandler];
}
- (void)getMeasurementProfileCommandWithParams:(MTRElectricalMeasurementClusterGetMeasurementProfileCommandParams *)params
                                expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
                         expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                             completionHandler:(MTRStatusCompletion)completionHandler
{
    [self getMeasurementProfileCommandWithParams:params
                                  expectedValues:expectedDataValueDictionaries
                           expectedValueInterval:expectedValueIntervalMs
                                      completion:completionHandler];
}
@end

@implementation MTRClusterUnitTesting

- (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
{
    if (self = [super initWithQueue:queue]) {
        if (device == nil) {
            return nil;
        }

        _endpoint = [endpointID unsignedShortValue];
        _device = device;
    }
    return self;
}

- (void)testWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
         expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                    completion:(MTRStatusCompletion)completion
{
    [self testWithParams:nil expectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs completion:completion];
}
- (void)testWithParams:(MTRUnitTestingClusterTestParams * _Nullable)params
           expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
               completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix =
        [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex, _endpoint,
                  (unsigned int) MTRClusterIDTypeUnitTestingID, (unsigned int) MTRCommandIDTypeClusterUnitTestingCommandTestID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                UnitTesting::Commands::Test::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)testNotHandledWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                   expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                              completion:(MTRStatusCompletion)completion
{
    [self testNotHandledWithParams:nil
                    expectedValues:expectedValues
             expectedValueInterval:expectedValueIntervalMs
                        completion:completion];
}
- (void)testNotHandledWithParams:(MTRUnitTestingClusterTestNotHandledParams * _Nullable)params
                  expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
           expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                      completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeUnitTestingID,
                                     (unsigned int) MTRCommandIDTypeClusterUnitTestingCommandTestNotHandledID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                UnitTesting::Commands::TestNotHandled::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)testSpecificWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                 expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                            completion:(void (^)(MTRUnitTestingClusterTestSpecificResponseParams * _Nullable data,
                                           NSError * _Nullable error))completion
{
    [self testSpecificWithParams:nil
                  expectedValues:expectedValues
           expectedValueInterval:expectedValueIntervalMs
                      completion:completion];
}
- (void)testSpecificWithParams:(MTRUnitTestingClusterTestSpecificParams * _Nullable)params
                expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
         expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                    completion:(void (^)(MTRUnitTestingClusterTestSpecificResponseParams * _Nullable data,
                                   NSError * _Nullable error))completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeUnitTestingID,
                                     (unsigned int) MTRCommandIDTypeClusterUnitTestingCommandTestSpecificID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRUnitTestingClusterTestSpecificResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                UnitTestingClusterTestSpecificResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRUnitTestingClusterTestSpecificResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                UnitTesting::Commands::TestSpecific::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)testUnknownCommandWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                       expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                  completion:(MTRStatusCompletion)completion
{
    [self testUnknownCommandWithParams:nil
                        expectedValues:expectedValues
                 expectedValueInterval:expectedValueIntervalMs
                            completion:completion];
}
- (void)testUnknownCommandWithParams:(MTRUnitTestingClusterTestUnknownCommandParams * _Nullable)params
                      expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
               expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                          completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeUnitTestingID,
                                     (unsigned int) MTRCommandIDTypeClusterUnitTestingCommandTestUnknownCommandID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                UnitTesting::Commands::TestUnknownCommand::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)testAddArgumentsWithParams:(MTRUnitTestingClusterTestAddArgumentsParams *)params
                    expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
             expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                        completion:(void (^)(MTRUnitTestingClusterTestAddArgumentsResponseParams * _Nullable data,
                                       NSError * _Nullable error))completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeUnitTestingID,
                                     (unsigned int) MTRCommandIDTypeClusterUnitTestingCommandTestAddArgumentsID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRUnitTestingClusterTestAddArgumentsResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                UnitTestingClusterTestAddArgumentsResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRUnitTestingClusterTestAddArgumentsResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                UnitTesting::Commands::TestAddArguments::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.arg1 = params.arg1.unsignedCharValue;
                request.arg2 = params.arg2.unsignedCharValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)testSimpleArgumentRequestWithParams:(MTRUnitTestingClusterTestSimpleArgumentRequestParams *)params
                             expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                 completion:(void (^)(MTRUnitTestingClusterTestSimpleArgumentResponseParams * _Nullable data,
                                                NSError * _Nullable error))completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeUnitTestingID,
                                     (unsigned int) MTRCommandIDTypeClusterUnitTestingCommandTestSimpleArgumentRequestID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRUnitTestingClusterTestSimpleArgumentResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                UnitTestingClusterTestSimpleArgumentResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRUnitTestingClusterTestSimpleArgumentResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                UnitTesting::Commands::TestSimpleArgumentRequest::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.arg1 = params.arg1.boolValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)testStructArrayArgumentRequestWithParams:(MTRUnitTestingClusterTestStructArrayArgumentRequestParams *)params
                                  expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                           expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                      completion:
                                          (void (^)(MTRUnitTestingClusterTestStructArrayArgumentResponseParams * _Nullable data,
                                              NSError * _Nullable error))completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeUnitTestingID,
                                     (unsigned int) MTRCommandIDTypeClusterUnitTestingCommandTestStructArrayArgumentRequestID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRUnitTestingClusterTestStructArrayArgumentResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                UnitTestingClusterTestStructArrayArgumentResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRUnitTestingClusterTestStructArrayArgumentResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                UnitTesting::Commands::TestStructArrayArgumentRequest::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                {
                    using ListType_0 = std::remove_reference_t<decltype(request.arg1)>;
                    using ListMemberType_0 = ListMemberTypeGetter<ListType_0>::Type;
                    if (params.arg1.count != 0) {
                        auto * listHolder_0 = new ListHolder<ListMemberType_0>(params.arg1.count);
                        if (listHolder_0 == nullptr || listHolder_0->mList == nullptr) {
                            return CHIP_ERROR_INVALID_ARGUMENT;
                        }
                        listFreer.add(listHolder_0);
                        for (size_t i_0 = 0; i_0 < params.arg1.count; ++i_0) {
                            if (![params.arg1[i_0] isKindOfClass:[MTRUnitTestingClusterNestedStructList class]]) {
                                // Wrong kind of value.
                                return CHIP_ERROR_INVALID_ARGUMENT;
                            }
                            auto element_0 = (MTRUnitTestingClusterNestedStructList *) params.arg1[i_0];
                            listHolder_0->mList[i_0].a = element_0.a.unsignedCharValue;
                            listHolder_0->mList[i_0].b = element_0.b.boolValue;
                            listHolder_0->mList[i_0].c.a = element_0.c.a.unsignedCharValue;
                            listHolder_0->mList[i_0].c.b = element_0.c.b.boolValue;
                            listHolder_0->mList[i_0].c.c
                                = static_cast<std::remove_reference_t<decltype(listHolder_0->mList[i_0].c.c)>>(
                                    element_0.c.c.unsignedCharValue);
                            listHolder_0->mList[i_0].c.d = [self asByteSpan:element_0.c.d];
                            listHolder_0->mList[i_0].c.e = [self asCharSpan:element_0.c.e];
                            listHolder_0->mList[i_0].c.f
                                = static_cast<std::remove_reference_t<decltype(listHolder_0->mList[i_0].c.f)>>(
                                    element_0.c.f.unsignedCharValue);
                            listHolder_0->mList[i_0].c.g = element_0.c.g.floatValue;
                            listHolder_0->mList[i_0].c.h = element_0.c.h.doubleValue;
                            {
                                using ListType_2 = std::remove_reference_t<decltype(listHolder_0->mList[i_0].d)>;
                                using ListMemberType_2 = ListMemberTypeGetter<ListType_2>::Type;
                                if (element_0.d.count != 0) {
                                    auto * listHolder_2 = new ListHolder<ListMemberType_2>(element_0.d.count);
                                    if (listHolder_2 == nullptr || listHolder_2->mList == nullptr) {
                                        return CHIP_ERROR_INVALID_ARGUMENT;
                                    }
                                    listFreer.add(listHolder_2);
                                    for (size_t i_2 = 0; i_2 < element_0.d.count; ++i_2) {
                                        if (![element_0.d[i_2] isKindOfClass:[MTRUnitTestingClusterSimpleStruct class]]) {
                                            // Wrong kind of value.
                                            return CHIP_ERROR_INVALID_ARGUMENT;
                                        }
                                        auto element_2 = (MTRUnitTestingClusterSimpleStruct *) element_0.d[i_2];
                                        listHolder_2->mList[i_2].a = element_2.a.unsignedCharValue;
                                        listHolder_2->mList[i_2].b = element_2.b.boolValue;
                                        listHolder_2->mList[i_2].c
                                            = static_cast<std::remove_reference_t<decltype(listHolder_2->mList[i_2].c)>>(
                                                element_2.c.unsignedCharValue);
                                        listHolder_2->mList[i_2].d = [self asByteSpan:element_2.d];
                                        listHolder_2->mList[i_2].e = [self asCharSpan:element_2.e];
                                        listHolder_2->mList[i_2].f
                                            = static_cast<std::remove_reference_t<decltype(listHolder_2->mList[i_2].f)>>(
                                                element_2.f.unsignedCharValue);
                                        listHolder_2->mList[i_2].g = element_2.g.floatValue;
                                        listHolder_2->mList[i_2].h = element_2.h.doubleValue;
                                    }
                                    listHolder_0->mList[i_0].d = ListType_2(listHolder_2->mList, element_0.d.count);
                                } else {
                                    listHolder_0->mList[i_0].d = ListType_2();
                                }
                            }
                            {
                                using ListType_2 = std::remove_reference_t<decltype(listHolder_0->mList[i_0].e)>;
                                using ListMemberType_2 = ListMemberTypeGetter<ListType_2>::Type;
                                if (element_0.e.count != 0) {
                                    auto * listHolder_2 = new ListHolder<ListMemberType_2>(element_0.e.count);
                                    if (listHolder_2 == nullptr || listHolder_2->mList == nullptr) {
                                        return CHIP_ERROR_INVALID_ARGUMENT;
                                    }
                                    listFreer.add(listHolder_2);
                                    for (size_t i_2 = 0; i_2 < element_0.e.count; ++i_2) {
                                        if (![element_0.e[i_2] isKindOfClass:[NSNumber class]]) {
                                            // Wrong kind of value.
                                            return CHIP_ERROR_INVALID_ARGUMENT;
                                        }
                                        auto element_2 = (NSNumber *) element_0.e[i_2];
                                        listHolder_2->mList[i_2] = element_2.unsignedIntValue;
                                    }
                                    listHolder_0->mList[i_0].e = ListType_2(listHolder_2->mList, element_0.e.count);
                                } else {
                                    listHolder_0->mList[i_0].e = ListType_2();
                                }
                            }
                            {
                                using ListType_2 = std::remove_reference_t<decltype(listHolder_0->mList[i_0].f)>;
                                using ListMemberType_2 = ListMemberTypeGetter<ListType_2>::Type;
                                if (element_0.f.count != 0) {
                                    auto * listHolder_2 = new ListHolder<ListMemberType_2>(element_0.f.count);
                                    if (listHolder_2 == nullptr || listHolder_2->mList == nullptr) {
                                        return CHIP_ERROR_INVALID_ARGUMENT;
                                    }
                                    listFreer.add(listHolder_2);
                                    for (size_t i_2 = 0; i_2 < element_0.f.count; ++i_2) {
                                        if (![element_0.f[i_2] isKindOfClass:[NSData class]]) {
                                            // Wrong kind of value.
                                            return CHIP_ERROR_INVALID_ARGUMENT;
                                        }
                                        auto element_2 = (NSData *) element_0.f[i_2];
                                        listHolder_2->mList[i_2] = [self asByteSpan:element_2];
                                    }
                                    listHolder_0->mList[i_0].f = ListType_2(listHolder_2->mList, element_0.f.count);
                                } else {
                                    listHolder_0->mList[i_0].f = ListType_2();
                                }
                            }
                            {
                                using ListType_2 = std::remove_reference_t<decltype(listHolder_0->mList[i_0].g)>;
                                using ListMemberType_2 = ListMemberTypeGetter<ListType_2>::Type;
                                if (element_0.g.count != 0) {
                                    auto * listHolder_2 = new ListHolder<ListMemberType_2>(element_0.g.count);
                                    if (listHolder_2 == nullptr || listHolder_2->mList == nullptr) {
                                        return CHIP_ERROR_INVALID_ARGUMENT;
                                    }
                                    listFreer.add(listHolder_2);
                                    for (size_t i_2 = 0; i_2 < element_0.g.count; ++i_2) {
                                        if (![element_0.g[i_2] isKindOfClass:[NSNumber class]]) {
                                            // Wrong kind of value.
                                            return CHIP_ERROR_INVALID_ARGUMENT;
                                        }
                                        auto element_2 = (NSNumber *) element_0.g[i_2];
                                        listHolder_2->mList[i_2] = element_2.unsignedCharValue;
                                    }
                                    listHolder_0->mList[i_0].g = ListType_2(listHolder_2->mList, element_0.g.count);
                                } else {
                                    listHolder_0->mList[i_0].g = ListType_2();
                                }
                            }
                        }
                        request.arg1 = ListType_0(listHolder_0->mList, params.arg1.count);
                    } else {
                        request.arg1 = ListType_0();
                    }
                }
                {
                    using ListType_0 = std::remove_reference_t<decltype(request.arg2)>;
                    using ListMemberType_0 = ListMemberTypeGetter<ListType_0>::Type;
                    if (params.arg2.count != 0) {
                        auto * listHolder_0 = new ListHolder<ListMemberType_0>(params.arg2.count);
                        if (listHolder_0 == nullptr || listHolder_0->mList == nullptr) {
                            return CHIP_ERROR_INVALID_ARGUMENT;
                        }
                        listFreer.add(listHolder_0);
                        for (size_t i_0 = 0; i_0 < params.arg2.count; ++i_0) {
                            if (![params.arg2[i_0] isKindOfClass:[MTRUnitTestingClusterSimpleStruct class]]) {
                                // Wrong kind of value.
                                return CHIP_ERROR_INVALID_ARGUMENT;
                            }
                            auto element_0 = (MTRUnitTestingClusterSimpleStruct *) params.arg2[i_0];
                            listHolder_0->mList[i_0].a = element_0.a.unsignedCharValue;
                            listHolder_0->mList[i_0].b = element_0.b.boolValue;
                            listHolder_0->mList[i_0].c = static_cast<std::remove_reference_t<decltype(listHolder_0->mList[i_0].c)>>(
                                element_0.c.unsignedCharValue);
                            listHolder_0->mList[i_0].d = [self asByteSpan:element_0.d];
                            listHolder_0->mList[i_0].e = [self asCharSpan:element_0.e];
                            listHolder_0->mList[i_0].f = static_cast<std::remove_reference_t<decltype(listHolder_0->mList[i_0].f)>>(
                                element_0.f.unsignedCharValue);
                            listHolder_0->mList[i_0].g = element_0.g.floatValue;
                            listHolder_0->mList[i_0].h = element_0.h.doubleValue;
                        }
                        request.arg2 = ListType_0(listHolder_0->mList, params.arg2.count);
                    } else {
                        request.arg2 = ListType_0();
                    }
                }
                {
                    using ListType_0 = std::remove_reference_t<decltype(request.arg3)>;
                    using ListMemberType_0 = ListMemberTypeGetter<ListType_0>::Type;
                    if (params.arg3.count != 0) {
                        auto * listHolder_0 = new ListHolder<ListMemberType_0>(params.arg3.count);
                        if (listHolder_0 == nullptr || listHolder_0->mList == nullptr) {
                            return CHIP_ERROR_INVALID_ARGUMENT;
                        }
                        listFreer.add(listHolder_0);
                        for (size_t i_0 = 0; i_0 < params.arg3.count; ++i_0) {
                            if (![params.arg3[i_0] isKindOfClass:[NSNumber class]]) {
                                // Wrong kind of value.
                                return CHIP_ERROR_INVALID_ARGUMENT;
                            }
                            auto element_0 = (NSNumber *) params.arg3[i_0];
                            listHolder_0->mList[i_0] = static_cast<std::remove_reference_t<decltype(listHolder_0->mList[i_0])>>(
                                element_0.unsignedCharValue);
                        }
                        request.arg3 = ListType_0(listHolder_0->mList, params.arg3.count);
                    } else {
                        request.arg3 = ListType_0();
                    }
                }
                {
                    using ListType_0 = std::remove_reference_t<decltype(request.arg4)>;
                    using ListMemberType_0 = ListMemberTypeGetter<ListType_0>::Type;
                    if (params.arg4.count != 0) {
                        auto * listHolder_0 = new ListHolder<ListMemberType_0>(params.arg4.count);
                        if (listHolder_0 == nullptr || listHolder_0->mList == nullptr) {
                            return CHIP_ERROR_INVALID_ARGUMENT;
                        }
                        listFreer.add(listHolder_0);
                        for (size_t i_0 = 0; i_0 < params.arg4.count; ++i_0) {
                            if (![params.arg4[i_0] isKindOfClass:[NSNumber class]]) {
                                // Wrong kind of value.
                                return CHIP_ERROR_INVALID_ARGUMENT;
                            }
                            auto element_0 = (NSNumber *) params.arg4[i_0];
                            listHolder_0->mList[i_0] = element_0.boolValue;
                        }
                        request.arg4 = ListType_0(listHolder_0->mList, params.arg4.count);
                    } else {
                        request.arg4 = ListType_0();
                    }
                }
                request.arg5 = static_cast<std::remove_reference_t<decltype(request.arg5)>>(params.arg5.unsignedCharValue);
                request.arg6 = params.arg6.boolValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)testStructArgumentRequestWithParams:(MTRUnitTestingClusterTestStructArgumentRequestParams *)params
                             expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                 completion:(void (^)(MTRUnitTestingClusterBooleanResponseParams * _Nullable data,
                                                NSError * _Nullable error))completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeUnitTestingID,
                                     (unsigned int) MTRCommandIDTypeClusterUnitTestingCommandTestStructArgumentRequestID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRUnitTestingClusterBooleanResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                UnitTestingClusterBooleanResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRUnitTestingClusterBooleanResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                UnitTesting::Commands::TestStructArgumentRequest::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.arg1.a = params.arg1.a.unsignedCharValue;
                request.arg1.b = params.arg1.b.boolValue;
                request.arg1.c = static_cast<std::remove_reference_t<decltype(request.arg1.c)>>(params.arg1.c.unsignedCharValue);
                request.arg1.d = [self asByteSpan:params.arg1.d];
                request.arg1.e = [self asCharSpan:params.arg1.e];
                request.arg1.f = static_cast<std::remove_reference_t<decltype(request.arg1.f)>>(params.arg1.f.unsignedCharValue);
                request.arg1.g = params.arg1.g.floatValue;
                request.arg1.h = params.arg1.h.doubleValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)testNestedStructArgumentRequestWithParams:(MTRUnitTestingClusterTestNestedStructArgumentRequestParams *)params
                                   expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                            expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                       completion:(void (^)(MTRUnitTestingClusterBooleanResponseParams * _Nullable data,
                                                      NSError * _Nullable error))completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeUnitTestingID,
                                     (unsigned int) MTRCommandIDTypeClusterUnitTestingCommandTestNestedStructArgumentRequestID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRUnitTestingClusterBooleanResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                UnitTestingClusterBooleanResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRUnitTestingClusterBooleanResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                UnitTesting::Commands::TestNestedStructArgumentRequest::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.arg1.a = params.arg1.a.unsignedCharValue;
                request.arg1.b = params.arg1.b.boolValue;
                request.arg1.c.a = params.arg1.c.a.unsignedCharValue;
                request.arg1.c.b = params.arg1.c.b.boolValue;
                request.arg1.c.c
                    = static_cast<std::remove_reference_t<decltype(request.arg1.c.c)>>(params.arg1.c.c.unsignedCharValue);
                request.arg1.c.d = [self asByteSpan:params.arg1.c.d];
                request.arg1.c.e = [self asCharSpan:params.arg1.c.e];
                request.arg1.c.f
                    = static_cast<std::remove_reference_t<decltype(request.arg1.c.f)>>(params.arg1.c.f.unsignedCharValue);
                request.arg1.c.g = params.arg1.c.g.floatValue;
                request.arg1.c.h = params.arg1.c.h.doubleValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)testListStructArgumentRequestWithParams:(MTRUnitTestingClusterTestListStructArgumentRequestParams *)params
                                 expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                          expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                     completion:(void (^)(MTRUnitTestingClusterBooleanResponseParams * _Nullable data,
                                                    NSError * _Nullable error))completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeUnitTestingID,
                                     (unsigned int) MTRCommandIDTypeClusterUnitTestingCommandTestListStructArgumentRequestID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRUnitTestingClusterBooleanResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                UnitTestingClusterBooleanResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRUnitTestingClusterBooleanResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                UnitTesting::Commands::TestListStructArgumentRequest::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                {
                    using ListType_0 = std::remove_reference_t<decltype(request.arg1)>;
                    using ListMemberType_0 = ListMemberTypeGetter<ListType_0>::Type;
                    if (params.arg1.count != 0) {
                        auto * listHolder_0 = new ListHolder<ListMemberType_0>(params.arg1.count);
                        if (listHolder_0 == nullptr || listHolder_0->mList == nullptr) {
                            return CHIP_ERROR_INVALID_ARGUMENT;
                        }
                        listFreer.add(listHolder_0);
                        for (size_t i_0 = 0; i_0 < params.arg1.count; ++i_0) {
                            if (![params.arg1[i_0] isKindOfClass:[MTRUnitTestingClusterSimpleStruct class]]) {
                                // Wrong kind of value.
                                return CHIP_ERROR_INVALID_ARGUMENT;
                            }
                            auto element_0 = (MTRUnitTestingClusterSimpleStruct *) params.arg1[i_0];
                            listHolder_0->mList[i_0].a = element_0.a.unsignedCharValue;
                            listHolder_0->mList[i_0].b = element_0.b.boolValue;
                            listHolder_0->mList[i_0].c = static_cast<std::remove_reference_t<decltype(listHolder_0->mList[i_0].c)>>(
                                element_0.c.unsignedCharValue);
                            listHolder_0->mList[i_0].d = [self asByteSpan:element_0.d];
                            listHolder_0->mList[i_0].e = [self asCharSpan:element_0.e];
                            listHolder_0->mList[i_0].f = static_cast<std::remove_reference_t<decltype(listHolder_0->mList[i_0].f)>>(
                                element_0.f.unsignedCharValue);
                            listHolder_0->mList[i_0].g = element_0.g.floatValue;
                            listHolder_0->mList[i_0].h = element_0.h.doubleValue;
                        }
                        request.arg1 = ListType_0(listHolder_0->mList, params.arg1.count);
                    } else {
                        request.arg1 = ListType_0();
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)testListInt8UArgumentRequestWithParams:(MTRUnitTestingClusterTestListInt8UArgumentRequestParams *)params
                                expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                         expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                    completion:(void (^)(MTRUnitTestingClusterBooleanResponseParams * _Nullable data,
                                                   NSError * _Nullable error))completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeUnitTestingID,
                                     (unsigned int) MTRCommandIDTypeClusterUnitTestingCommandTestListInt8UArgumentRequestID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRUnitTestingClusterBooleanResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                UnitTestingClusterBooleanResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRUnitTestingClusterBooleanResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                UnitTesting::Commands::TestListInt8UArgumentRequest::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                {
                    using ListType_0 = std::remove_reference_t<decltype(request.arg1)>;
                    using ListMemberType_0 = ListMemberTypeGetter<ListType_0>::Type;
                    if (params.arg1.count != 0) {
                        auto * listHolder_0 = new ListHolder<ListMemberType_0>(params.arg1.count);
                        if (listHolder_0 == nullptr || listHolder_0->mList == nullptr) {
                            return CHIP_ERROR_INVALID_ARGUMENT;
                        }
                        listFreer.add(listHolder_0);
                        for (size_t i_0 = 0; i_0 < params.arg1.count; ++i_0) {
                            if (![params.arg1[i_0] isKindOfClass:[NSNumber class]]) {
                                // Wrong kind of value.
                                return CHIP_ERROR_INVALID_ARGUMENT;
                            }
                            auto element_0 = (NSNumber *) params.arg1[i_0];
                            listHolder_0->mList[i_0] = element_0.unsignedCharValue;
                        }
                        request.arg1 = ListType_0(listHolder_0->mList, params.arg1.count);
                    } else {
                        request.arg1 = ListType_0();
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)testNestedStructListArgumentRequestWithParams:(MTRUnitTestingClusterTestNestedStructListArgumentRequestParams *)params
                                       expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                           completion:(void (^)(MTRUnitTestingClusterBooleanResponseParams * _Nullable data,
                                                          NSError * _Nullable error))completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeUnitTestingID,
                                     (unsigned int) MTRCommandIDTypeClusterUnitTestingCommandTestNestedStructListArgumentRequestID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRUnitTestingClusterBooleanResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                UnitTestingClusterBooleanResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRUnitTestingClusterBooleanResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                UnitTesting::Commands::TestNestedStructListArgumentRequest::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.arg1.a = params.arg1.a.unsignedCharValue;
                request.arg1.b = params.arg1.b.boolValue;
                request.arg1.c.a = params.arg1.c.a.unsignedCharValue;
                request.arg1.c.b = params.arg1.c.b.boolValue;
                request.arg1.c.c
                    = static_cast<std::remove_reference_t<decltype(request.arg1.c.c)>>(params.arg1.c.c.unsignedCharValue);
                request.arg1.c.d = [self asByteSpan:params.arg1.c.d];
                request.arg1.c.e = [self asCharSpan:params.arg1.c.e];
                request.arg1.c.f
                    = static_cast<std::remove_reference_t<decltype(request.arg1.c.f)>>(params.arg1.c.f.unsignedCharValue);
                request.arg1.c.g = params.arg1.c.g.floatValue;
                request.arg1.c.h = params.arg1.c.h.doubleValue;
                {
                    using ListType_1 = std::remove_reference_t<decltype(request.arg1.d)>;
                    using ListMemberType_1 = ListMemberTypeGetter<ListType_1>::Type;
                    if (params.arg1.d.count != 0) {
                        auto * listHolder_1 = new ListHolder<ListMemberType_1>(params.arg1.d.count);
                        if (listHolder_1 == nullptr || listHolder_1->mList == nullptr) {
                            return CHIP_ERROR_INVALID_ARGUMENT;
                        }
                        listFreer.add(listHolder_1);
                        for (size_t i_1 = 0; i_1 < params.arg1.d.count; ++i_1) {
                            if (![params.arg1.d[i_1] isKindOfClass:[MTRUnitTestingClusterSimpleStruct class]]) {
                                // Wrong kind of value.
                                return CHIP_ERROR_INVALID_ARGUMENT;
                            }
                            auto element_1 = (MTRUnitTestingClusterSimpleStruct *) params.arg1.d[i_1];
                            listHolder_1->mList[i_1].a = element_1.a.unsignedCharValue;
                            listHolder_1->mList[i_1].b = element_1.b.boolValue;
                            listHolder_1->mList[i_1].c = static_cast<std::remove_reference_t<decltype(listHolder_1->mList[i_1].c)>>(
                                element_1.c.unsignedCharValue);
                            listHolder_1->mList[i_1].d = [self asByteSpan:element_1.d];
                            listHolder_1->mList[i_1].e = [self asCharSpan:element_1.e];
                            listHolder_1->mList[i_1].f = static_cast<std::remove_reference_t<decltype(listHolder_1->mList[i_1].f)>>(
                                element_1.f.unsignedCharValue);
                            listHolder_1->mList[i_1].g = element_1.g.floatValue;
                            listHolder_1->mList[i_1].h = element_1.h.doubleValue;
                        }
                        request.arg1.d = ListType_1(listHolder_1->mList, params.arg1.d.count);
                    } else {
                        request.arg1.d = ListType_1();
                    }
                }
                {
                    using ListType_1 = std::remove_reference_t<decltype(request.arg1.e)>;
                    using ListMemberType_1 = ListMemberTypeGetter<ListType_1>::Type;
                    if (params.arg1.e.count != 0) {
                        auto * listHolder_1 = new ListHolder<ListMemberType_1>(params.arg1.e.count);
                        if (listHolder_1 == nullptr || listHolder_1->mList == nullptr) {
                            return CHIP_ERROR_INVALID_ARGUMENT;
                        }
                        listFreer.add(listHolder_1);
                        for (size_t i_1 = 0; i_1 < params.arg1.e.count; ++i_1) {
                            if (![params.arg1.e[i_1] isKindOfClass:[NSNumber class]]) {
                                // Wrong kind of value.
                                return CHIP_ERROR_INVALID_ARGUMENT;
                            }
                            auto element_1 = (NSNumber *) params.arg1.e[i_1];
                            listHolder_1->mList[i_1] = element_1.unsignedIntValue;
                        }
                        request.arg1.e = ListType_1(listHolder_1->mList, params.arg1.e.count);
                    } else {
                        request.arg1.e = ListType_1();
                    }
                }
                {
                    using ListType_1 = std::remove_reference_t<decltype(request.arg1.f)>;
                    using ListMemberType_1 = ListMemberTypeGetter<ListType_1>::Type;
                    if (params.arg1.f.count != 0) {
                        auto * listHolder_1 = new ListHolder<ListMemberType_1>(params.arg1.f.count);
                        if (listHolder_1 == nullptr || listHolder_1->mList == nullptr) {
                            return CHIP_ERROR_INVALID_ARGUMENT;
                        }
                        listFreer.add(listHolder_1);
                        for (size_t i_1 = 0; i_1 < params.arg1.f.count; ++i_1) {
                            if (![params.arg1.f[i_1] isKindOfClass:[NSData class]]) {
                                // Wrong kind of value.
                                return CHIP_ERROR_INVALID_ARGUMENT;
                            }
                            auto element_1 = (NSData *) params.arg1.f[i_1];
                            listHolder_1->mList[i_1] = [self asByteSpan:element_1];
                        }
                        request.arg1.f = ListType_1(listHolder_1->mList, params.arg1.f.count);
                    } else {
                        request.arg1.f = ListType_1();
                    }
                }
                {
                    using ListType_1 = std::remove_reference_t<decltype(request.arg1.g)>;
                    using ListMemberType_1 = ListMemberTypeGetter<ListType_1>::Type;
                    if (params.arg1.g.count != 0) {
                        auto * listHolder_1 = new ListHolder<ListMemberType_1>(params.arg1.g.count);
                        if (listHolder_1 == nullptr || listHolder_1->mList == nullptr) {
                            return CHIP_ERROR_INVALID_ARGUMENT;
                        }
                        listFreer.add(listHolder_1);
                        for (size_t i_1 = 0; i_1 < params.arg1.g.count; ++i_1) {
                            if (![params.arg1.g[i_1] isKindOfClass:[NSNumber class]]) {
                                // Wrong kind of value.
                                return CHIP_ERROR_INVALID_ARGUMENT;
                            }
                            auto element_1 = (NSNumber *) params.arg1.g[i_1];
                            listHolder_1->mList[i_1] = element_1.unsignedCharValue;
                        }
                        request.arg1.g = ListType_1(listHolder_1->mList, params.arg1.g.count);
                    } else {
                        request.arg1.g = ListType_1();
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)testListNestedStructListArgumentRequestWithParams:
            (MTRUnitTestingClusterTestListNestedStructListArgumentRequestParams *)params
                                           expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                                    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                               completion:(void (^)(MTRUnitTestingClusterBooleanResponseParams * _Nullable data,
                                                              NSError * _Nullable error))completion
{
    NSString * logPrefix =
        [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex, _endpoint,
                  (unsigned int) MTRClusterIDTypeUnitTestingID,
                  (unsigned int) MTRCommandIDTypeClusterUnitTestingCommandTestListNestedStructListArgumentRequestID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRUnitTestingClusterBooleanResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                UnitTestingClusterBooleanResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRUnitTestingClusterBooleanResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                UnitTesting::Commands::TestListNestedStructListArgumentRequest::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                {
                    using ListType_0 = std::remove_reference_t<decltype(request.arg1)>;
                    using ListMemberType_0 = ListMemberTypeGetter<ListType_0>::Type;
                    if (params.arg1.count != 0) {
                        auto * listHolder_0 = new ListHolder<ListMemberType_0>(params.arg1.count);
                        if (listHolder_0 == nullptr || listHolder_0->mList == nullptr) {
                            return CHIP_ERROR_INVALID_ARGUMENT;
                        }
                        listFreer.add(listHolder_0);
                        for (size_t i_0 = 0; i_0 < params.arg1.count; ++i_0) {
                            if (![params.arg1[i_0] isKindOfClass:[MTRUnitTestingClusterNestedStructList class]]) {
                                // Wrong kind of value.
                                return CHIP_ERROR_INVALID_ARGUMENT;
                            }
                            auto element_0 = (MTRUnitTestingClusterNestedStructList *) params.arg1[i_0];
                            listHolder_0->mList[i_0].a = element_0.a.unsignedCharValue;
                            listHolder_0->mList[i_0].b = element_0.b.boolValue;
                            listHolder_0->mList[i_0].c.a = element_0.c.a.unsignedCharValue;
                            listHolder_0->mList[i_0].c.b = element_0.c.b.boolValue;
                            listHolder_0->mList[i_0].c.c
                                = static_cast<std::remove_reference_t<decltype(listHolder_0->mList[i_0].c.c)>>(
                                    element_0.c.c.unsignedCharValue);
                            listHolder_0->mList[i_0].c.d = [self asByteSpan:element_0.c.d];
                            listHolder_0->mList[i_0].c.e = [self asCharSpan:element_0.c.e];
                            listHolder_0->mList[i_0].c.f
                                = static_cast<std::remove_reference_t<decltype(listHolder_0->mList[i_0].c.f)>>(
                                    element_0.c.f.unsignedCharValue);
                            listHolder_0->mList[i_0].c.g = element_0.c.g.floatValue;
                            listHolder_0->mList[i_0].c.h = element_0.c.h.doubleValue;
                            {
                                using ListType_2 = std::remove_reference_t<decltype(listHolder_0->mList[i_0].d)>;
                                using ListMemberType_2 = ListMemberTypeGetter<ListType_2>::Type;
                                if (element_0.d.count != 0) {
                                    auto * listHolder_2 = new ListHolder<ListMemberType_2>(element_0.d.count);
                                    if (listHolder_2 == nullptr || listHolder_2->mList == nullptr) {
                                        return CHIP_ERROR_INVALID_ARGUMENT;
                                    }
                                    listFreer.add(listHolder_2);
                                    for (size_t i_2 = 0; i_2 < element_0.d.count; ++i_2) {
                                        if (![element_0.d[i_2] isKindOfClass:[MTRUnitTestingClusterSimpleStruct class]]) {
                                            // Wrong kind of value.
                                            return CHIP_ERROR_INVALID_ARGUMENT;
                                        }
                                        auto element_2 = (MTRUnitTestingClusterSimpleStruct *) element_0.d[i_2];
                                        listHolder_2->mList[i_2].a = element_2.a.unsignedCharValue;
                                        listHolder_2->mList[i_2].b = element_2.b.boolValue;
                                        listHolder_2->mList[i_2].c
                                            = static_cast<std::remove_reference_t<decltype(listHolder_2->mList[i_2].c)>>(
                                                element_2.c.unsignedCharValue);
                                        listHolder_2->mList[i_2].d = [self asByteSpan:element_2.d];
                                        listHolder_2->mList[i_2].e = [self asCharSpan:element_2.e];
                                        listHolder_2->mList[i_2].f
                                            = static_cast<std::remove_reference_t<decltype(listHolder_2->mList[i_2].f)>>(
                                                element_2.f.unsignedCharValue);
                                        listHolder_2->mList[i_2].g = element_2.g.floatValue;
                                        listHolder_2->mList[i_2].h = element_2.h.doubleValue;
                                    }
                                    listHolder_0->mList[i_0].d = ListType_2(listHolder_2->mList, element_0.d.count);
                                } else {
                                    listHolder_0->mList[i_0].d = ListType_2();
                                }
                            }
                            {
                                using ListType_2 = std::remove_reference_t<decltype(listHolder_0->mList[i_0].e)>;
                                using ListMemberType_2 = ListMemberTypeGetter<ListType_2>::Type;
                                if (element_0.e.count != 0) {
                                    auto * listHolder_2 = new ListHolder<ListMemberType_2>(element_0.e.count);
                                    if (listHolder_2 == nullptr || listHolder_2->mList == nullptr) {
                                        return CHIP_ERROR_INVALID_ARGUMENT;
                                    }
                                    listFreer.add(listHolder_2);
                                    for (size_t i_2 = 0; i_2 < element_0.e.count; ++i_2) {
                                        if (![element_0.e[i_2] isKindOfClass:[NSNumber class]]) {
                                            // Wrong kind of value.
                                            return CHIP_ERROR_INVALID_ARGUMENT;
                                        }
                                        auto element_2 = (NSNumber *) element_0.e[i_2];
                                        listHolder_2->mList[i_2] = element_2.unsignedIntValue;
                                    }
                                    listHolder_0->mList[i_0].e = ListType_2(listHolder_2->mList, element_0.e.count);
                                } else {
                                    listHolder_0->mList[i_0].e = ListType_2();
                                }
                            }
                            {
                                using ListType_2 = std::remove_reference_t<decltype(listHolder_0->mList[i_0].f)>;
                                using ListMemberType_2 = ListMemberTypeGetter<ListType_2>::Type;
                                if (element_0.f.count != 0) {
                                    auto * listHolder_2 = new ListHolder<ListMemberType_2>(element_0.f.count);
                                    if (listHolder_2 == nullptr || listHolder_2->mList == nullptr) {
                                        return CHIP_ERROR_INVALID_ARGUMENT;
                                    }
                                    listFreer.add(listHolder_2);
                                    for (size_t i_2 = 0; i_2 < element_0.f.count; ++i_2) {
                                        if (![element_0.f[i_2] isKindOfClass:[NSData class]]) {
                                            // Wrong kind of value.
                                            return CHIP_ERROR_INVALID_ARGUMENT;
                                        }
                                        auto element_2 = (NSData *) element_0.f[i_2];
                                        listHolder_2->mList[i_2] = [self asByteSpan:element_2];
                                    }
                                    listHolder_0->mList[i_0].f = ListType_2(listHolder_2->mList, element_0.f.count);
                                } else {
                                    listHolder_0->mList[i_0].f = ListType_2();
                                }
                            }
                            {
                                using ListType_2 = std::remove_reference_t<decltype(listHolder_0->mList[i_0].g)>;
                                using ListMemberType_2 = ListMemberTypeGetter<ListType_2>::Type;
                                if (element_0.g.count != 0) {
                                    auto * listHolder_2 = new ListHolder<ListMemberType_2>(element_0.g.count);
                                    if (listHolder_2 == nullptr || listHolder_2->mList == nullptr) {
                                        return CHIP_ERROR_INVALID_ARGUMENT;
                                    }
                                    listFreer.add(listHolder_2);
                                    for (size_t i_2 = 0; i_2 < element_0.g.count; ++i_2) {
                                        if (![element_0.g[i_2] isKindOfClass:[NSNumber class]]) {
                                            // Wrong kind of value.
                                            return CHIP_ERROR_INVALID_ARGUMENT;
                                        }
                                        auto element_2 = (NSNumber *) element_0.g[i_2];
                                        listHolder_2->mList[i_2] = element_2.unsignedCharValue;
                                    }
                                    listHolder_0->mList[i_0].g = ListType_2(listHolder_2->mList, element_0.g.count);
                                } else {
                                    listHolder_0->mList[i_0].g = ListType_2();
                                }
                            }
                        }
                        request.arg1 = ListType_0(listHolder_0->mList, params.arg1.count);
                    } else {
                        request.arg1 = ListType_0();
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)testListInt8UReverseRequestWithParams:(MTRUnitTestingClusterTestListInt8UReverseRequestParams *)params
                               expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                   completion:(void (^)(MTRUnitTestingClusterTestListInt8UReverseResponseParams * _Nullable data,
                                                  NSError * _Nullable error))completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeUnitTestingID,
                                     (unsigned int) MTRCommandIDTypeClusterUnitTestingCommandTestListInt8UReverseRequestID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRUnitTestingClusterTestListInt8UReverseResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                UnitTestingClusterTestListInt8UReverseResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRUnitTestingClusterTestListInt8UReverseResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                UnitTesting::Commands::TestListInt8UReverseRequest::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                {
                    using ListType_0 = std::remove_reference_t<decltype(request.arg1)>;
                    using ListMemberType_0 = ListMemberTypeGetter<ListType_0>::Type;
                    if (params.arg1.count != 0) {
                        auto * listHolder_0 = new ListHolder<ListMemberType_0>(params.arg1.count);
                        if (listHolder_0 == nullptr || listHolder_0->mList == nullptr) {
                            return CHIP_ERROR_INVALID_ARGUMENT;
                        }
                        listFreer.add(listHolder_0);
                        for (size_t i_0 = 0; i_0 < params.arg1.count; ++i_0) {
                            if (![params.arg1[i_0] isKindOfClass:[NSNumber class]]) {
                                // Wrong kind of value.
                                return CHIP_ERROR_INVALID_ARGUMENT;
                            }
                            auto element_0 = (NSNumber *) params.arg1[i_0];
                            listHolder_0->mList[i_0] = element_0.unsignedCharValue;
                        }
                        request.arg1 = ListType_0(listHolder_0->mList, params.arg1.count);
                    } else {
                        request.arg1 = ListType_0();
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)testEnumsRequestWithParams:(MTRUnitTestingClusterTestEnumsRequestParams *)params
                    expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
             expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                        completion:(void (^)(MTRUnitTestingClusterTestEnumsResponseParams * _Nullable data,
                                       NSError * _Nullable error))completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeUnitTestingID,
                                     (unsigned int) MTRCommandIDTypeClusterUnitTestingCommandTestEnumsRequestID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRUnitTestingClusterTestEnumsResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                UnitTestingClusterTestEnumsResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRUnitTestingClusterTestEnumsResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                UnitTesting::Commands::TestEnumsRequest::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.arg1 = static_cast<std::remove_reference_t<decltype(request.arg1)>>(params.arg1.unsignedShortValue);
                request.arg2 = static_cast<std::remove_reference_t<decltype(request.arg2)>>(params.arg2.unsignedCharValue);

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)testNullableOptionalRequestWithParams:(MTRUnitTestingClusterTestNullableOptionalRequestParams * _Nullable)params
                               expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                   completion:(void (^)(MTRUnitTestingClusterTestNullableOptionalResponseParams * _Nullable data,
                                                  NSError * _Nullable error))completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeUnitTestingID,
                                     (unsigned int) MTRCommandIDTypeClusterUnitTestingCommandTestNullableOptionalRequestID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRUnitTestingClusterTestNullableOptionalResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                UnitTestingClusterTestNullableOptionalResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRUnitTestingClusterTestNullableOptionalResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                UnitTesting::Commands::TestNullableOptionalRequest::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                if (params != nil) {
                    if (params.arg1 != nil) {
                        auto & definedValue_0 = request.arg1.Emplace();
                        if (params.arg1 == nil) {
                            definedValue_0.SetNull();
                        } else {
                            auto & nonNullValue_1 = definedValue_0.SetNonNull();
                            nonNullValue_1 = params.arg1.unsignedCharValue;
                        }
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)testComplexNullableOptionalRequestWithParams:(MTRUnitTestingClusterTestComplexNullableOptionalRequestParams *)params
                                      expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                               expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                          completion:
                                              (void (^)(
                                                  MTRUnitTestingClusterTestComplexNullableOptionalResponseParams * _Nullable data,
                                                  NSError * _Nullable error))completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeUnitTestingID,
                                     (unsigned int) MTRCommandIDTypeClusterUnitTestingCommandTestComplexNullableOptionalRequestID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRUnitTestingClusterTestComplexNullableOptionalResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                UnitTestingClusterTestComplexNullableOptionalResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRUnitTestingClusterTestComplexNullableOptionalResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                UnitTesting::Commands::TestComplexNullableOptionalRequest::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                if (params.nullableInt == nil) {
                    request.nullableInt.SetNull();
                } else {
                    auto & nonNullValue_0 = request.nullableInt.SetNonNull();
                    nonNullValue_0 = params.nullableInt.unsignedShortValue;
                }
                if (params.optionalInt != nil) {
                    auto & definedValue_0 = request.optionalInt.Emplace();
                    definedValue_0 = params.optionalInt.unsignedShortValue;
                }
                if (params.nullableOptionalInt != nil) {
                    auto & definedValue_0 = request.nullableOptionalInt.Emplace();
                    if (params.nullableOptionalInt == nil) {
                        definedValue_0.SetNull();
                    } else {
                        auto & nonNullValue_1 = definedValue_0.SetNonNull();
                        nonNullValue_1 = params.nullableOptionalInt.unsignedShortValue;
                    }
                }
                if (params.nullableString == nil) {
                    request.nullableString.SetNull();
                } else {
                    auto & nonNullValue_0 = request.nullableString.SetNonNull();
                    nonNullValue_0 = [self asCharSpan:params.nullableString];
                }
                if (params.optionalString != nil) {
                    auto & definedValue_0 = request.optionalString.Emplace();
                    definedValue_0 = [self asCharSpan:params.optionalString];
                }
                if (params.nullableOptionalString != nil) {
                    auto & definedValue_0 = request.nullableOptionalString.Emplace();
                    if (params.nullableOptionalString == nil) {
                        definedValue_0.SetNull();
                    } else {
                        auto & nonNullValue_1 = definedValue_0.SetNonNull();
                        nonNullValue_1 = [self asCharSpan:params.nullableOptionalString];
                    }
                }
                if (params.nullableStruct == nil) {
                    request.nullableStruct.SetNull();
                } else {
                    auto & nonNullValue_0 = request.nullableStruct.SetNonNull();
                    nonNullValue_0.a = params.nullableStruct.a.unsignedCharValue;
                    nonNullValue_0.b = params.nullableStruct.b.boolValue;
                    nonNullValue_0.c = static_cast<std::remove_reference_t<decltype(nonNullValue_0.c)>>(
                        params.nullableStruct.c.unsignedCharValue);
                    nonNullValue_0.d = [self asByteSpan:params.nullableStruct.d];
                    nonNullValue_0.e = [self asCharSpan:params.nullableStruct.e];
                    nonNullValue_0.f = static_cast<std::remove_reference_t<decltype(nonNullValue_0.f)>>(
                        params.nullableStruct.f.unsignedCharValue);
                    nonNullValue_0.g = params.nullableStruct.g.floatValue;
                    nonNullValue_0.h = params.nullableStruct.h.doubleValue;
                }
                if (params.optionalStruct != nil) {
                    auto & definedValue_0 = request.optionalStruct.Emplace();
                    definedValue_0.a = params.optionalStruct.a.unsignedCharValue;
                    definedValue_0.b = params.optionalStruct.b.boolValue;
                    definedValue_0.c = static_cast<std::remove_reference_t<decltype(definedValue_0.c)>>(
                        params.optionalStruct.c.unsignedCharValue);
                    definedValue_0.d = [self asByteSpan:params.optionalStruct.d];
                    definedValue_0.e = [self asCharSpan:params.optionalStruct.e];
                    definedValue_0.f = static_cast<std::remove_reference_t<decltype(definedValue_0.f)>>(
                        params.optionalStruct.f.unsignedCharValue);
                    definedValue_0.g = params.optionalStruct.g.floatValue;
                    definedValue_0.h = params.optionalStruct.h.doubleValue;
                }
                if (params.nullableOptionalStruct != nil) {
                    auto & definedValue_0 = request.nullableOptionalStruct.Emplace();
                    if (params.nullableOptionalStruct == nil) {
                        definedValue_0.SetNull();
                    } else {
                        auto & nonNullValue_1 = definedValue_0.SetNonNull();
                        nonNullValue_1.a = params.nullableOptionalStruct.a.unsignedCharValue;
                        nonNullValue_1.b = params.nullableOptionalStruct.b.boolValue;
                        nonNullValue_1.c = static_cast<std::remove_reference_t<decltype(nonNullValue_1.c)>>(
                            params.nullableOptionalStruct.c.unsignedCharValue);
                        nonNullValue_1.d = [self asByteSpan:params.nullableOptionalStruct.d];
                        nonNullValue_1.e = [self asCharSpan:params.nullableOptionalStruct.e];
                        nonNullValue_1.f = static_cast<std::remove_reference_t<decltype(nonNullValue_1.f)>>(
                            params.nullableOptionalStruct.f.unsignedCharValue);
                        nonNullValue_1.g = params.nullableOptionalStruct.g.floatValue;
                        nonNullValue_1.h = params.nullableOptionalStruct.h.doubleValue;
                    }
                }
                if (params.nullableList == nil) {
                    request.nullableList.SetNull();
                } else {
                    auto & nonNullValue_0 = request.nullableList.SetNonNull();
                    {
                        using ListType_1 = std::remove_reference_t<decltype(nonNullValue_0)>;
                        using ListMemberType_1 = ListMemberTypeGetter<ListType_1>::Type;
                        if (params.nullableList.count != 0) {
                            auto * listHolder_1 = new ListHolder<ListMemberType_1>(params.nullableList.count);
                            if (listHolder_1 == nullptr || listHolder_1->mList == nullptr) {
                                return CHIP_ERROR_INVALID_ARGUMENT;
                            }
                            listFreer.add(listHolder_1);
                            for (size_t i_1 = 0; i_1 < params.nullableList.count; ++i_1) {
                                if (![params.nullableList[i_1] isKindOfClass:[NSNumber class]]) {
                                    // Wrong kind of value.
                                    return CHIP_ERROR_INVALID_ARGUMENT;
                                }
                                auto element_1 = (NSNumber *) params.nullableList[i_1];
                                listHolder_1->mList[i_1] = static_cast<std::remove_reference_t<decltype(listHolder_1->mList[i_1])>>(
                                    element_1.unsignedCharValue);
                            }
                            nonNullValue_0 = ListType_1(listHolder_1->mList, params.nullableList.count);
                        } else {
                            nonNullValue_0 = ListType_1();
                        }
                    }
                }
                if (params.optionalList != nil) {
                    auto & definedValue_0 = request.optionalList.Emplace();
                    {
                        using ListType_1 = std::remove_reference_t<decltype(definedValue_0)>;
                        using ListMemberType_1 = ListMemberTypeGetter<ListType_1>::Type;
                        if (params.optionalList.count != 0) {
                            auto * listHolder_1 = new ListHolder<ListMemberType_1>(params.optionalList.count);
                            if (listHolder_1 == nullptr || listHolder_1->mList == nullptr) {
                                return CHIP_ERROR_INVALID_ARGUMENT;
                            }
                            listFreer.add(listHolder_1);
                            for (size_t i_1 = 0; i_1 < params.optionalList.count; ++i_1) {
                                if (![params.optionalList[i_1] isKindOfClass:[NSNumber class]]) {
                                    // Wrong kind of value.
                                    return CHIP_ERROR_INVALID_ARGUMENT;
                                }
                                auto element_1 = (NSNumber *) params.optionalList[i_1];
                                listHolder_1->mList[i_1] = static_cast<std::remove_reference_t<decltype(listHolder_1->mList[i_1])>>(
                                    element_1.unsignedCharValue);
                            }
                            definedValue_0 = ListType_1(listHolder_1->mList, params.optionalList.count);
                        } else {
                            definedValue_0 = ListType_1();
                        }
                    }
                }
                if (params.nullableOptionalList != nil) {
                    auto & definedValue_0 = request.nullableOptionalList.Emplace();
                    if (params.nullableOptionalList == nil) {
                        definedValue_0.SetNull();
                    } else {
                        auto & nonNullValue_1 = definedValue_0.SetNonNull();
                        {
                            using ListType_2 = std::remove_reference_t<decltype(nonNullValue_1)>;
                            using ListMemberType_2 = ListMemberTypeGetter<ListType_2>::Type;
                            if (params.nullableOptionalList.count != 0) {
                                auto * listHolder_2 = new ListHolder<ListMemberType_2>(params.nullableOptionalList.count);
                                if (listHolder_2 == nullptr || listHolder_2->mList == nullptr) {
                                    return CHIP_ERROR_INVALID_ARGUMENT;
                                }
                                listFreer.add(listHolder_2);
                                for (size_t i_2 = 0; i_2 < params.nullableOptionalList.count; ++i_2) {
                                    if (![params.nullableOptionalList[i_2] isKindOfClass:[NSNumber class]]) {
                                        // Wrong kind of value.
                                        return CHIP_ERROR_INVALID_ARGUMENT;
                                    }
                                    auto element_2 = (NSNumber *) params.nullableOptionalList[i_2];
                                    listHolder_2->mList[i_2]
                                        = static_cast<std::remove_reference_t<decltype(listHolder_2->mList[i_2])>>(
                                            element_2.unsignedCharValue);
                                }
                                nonNullValue_1 = ListType_2(listHolder_2->mList, params.nullableOptionalList.count);
                            } else {
                                nonNullValue_1 = ListType_2();
                            }
                        }
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)simpleStructEchoRequestWithParams:(MTRUnitTestingClusterSimpleStructEchoRequestParams *)params
                           expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                               completion:(void (^)(MTRUnitTestingClusterSimpleStructResponseParams * _Nullable data,
                                              NSError * _Nullable error))completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeUnitTestingID,
                                     (unsigned int) MTRCommandIDTypeClusterUnitTestingCommandSimpleStructEchoRequestID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRUnitTestingClusterSimpleStructResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                UnitTestingClusterSimpleStructResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRUnitTestingClusterSimpleStructResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                UnitTesting::Commands::SimpleStructEchoRequest::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.arg1.a = params.arg1.a.unsignedCharValue;
                request.arg1.b = params.arg1.b.boolValue;
                request.arg1.c = static_cast<std::remove_reference_t<decltype(request.arg1.c)>>(params.arg1.c.unsignedCharValue);
                request.arg1.d = [self asByteSpan:params.arg1.d];
                request.arg1.e = [self asCharSpan:params.arg1.e];
                request.arg1.f = static_cast<std::remove_reference_t<decltype(request.arg1.f)>>(params.arg1.f.unsignedCharValue);
                request.arg1.g = params.arg1.g.floatValue;
                request.arg1.h = params.arg1.h.doubleValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)timedInvokeRequestWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                       expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                  completion:(MTRStatusCompletion)completion
{
    [self timedInvokeRequestWithParams:nil
                        expectedValues:expectedValues
                 expectedValueInterval:expectedValueIntervalMs
                            completion:completion];
}
- (void)timedInvokeRequestWithParams:(MTRUnitTestingClusterTimedInvokeRequestParams * _Nullable)params
                      expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
               expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                          completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeUnitTestingID,
                                     (unsigned int) MTRCommandIDTypeClusterUnitTestingCommandTimedInvokeRequestID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                UnitTesting::Commands::TimedInvokeRequest::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                if (!timedInvokeTimeoutMs.HasValue()) {
                    timedInvokeTimeoutMs.SetValue(10000);
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)testSimpleOptionalArgumentRequestWithParams:(MTRUnitTestingClusterTestSimpleOptionalArgumentRequestParams * _Nullable)params
                                     expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                              expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                         completion:(MTRStatusCompletion)completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeUnitTestingID,
                                     (unsigned int) MTRCommandIDTypeClusterUnitTestingCommandTestSimpleOptionalArgumentRequestID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRCommandSuccessCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb,
                MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRCommandSuccessCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                UnitTesting::Commands::TestSimpleOptionalArgumentRequest::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                if (params != nil) {
                    if (params.arg1 != nil) {
                        auto & definedValue_0 = request.arg1.Emplace();
                        definedValue_0 = params.arg1.boolValue;
                    }
                }

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)testEmitTestEventRequestWithParams:(MTRUnitTestingClusterTestEmitTestEventRequestParams *)params
                            expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                     expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                completion:(void (^)(MTRUnitTestingClusterTestEmitTestEventResponseParams * _Nullable data,
                                               NSError * _Nullable error))completion
{
    NSString * logPrefix = [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex,
                                     _endpoint, (unsigned int) MTRClusterIDTypeUnitTestingID,
                                     (unsigned int) MTRCommandIDTypeClusterUnitTestingCommandTestEmitTestEventRequestID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRUnitTestingClusterTestEmitTestEventResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                UnitTestingClusterTestEmitTestEventResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge = static_cast<MTRUnitTestingClusterTestEmitTestEventResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                UnitTesting::Commands::TestEmitTestEventRequest::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.arg1 = params.arg1.unsignedCharValue;
                request.arg2 = static_cast<std::remove_reference_t<decltype(request.arg2)>>(params.arg2.unsignedCharValue);
                request.arg3 = params.arg3.boolValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (void)
    testEmitTestFabricScopedEventRequestWithParams:(MTRUnitTestingClusterTestEmitTestFabricScopedEventRequestParams *)params
                                    expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                             expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                        completion:
                                            (void (^)(
                                                MTRUnitTestingClusterTestEmitTestFabricScopedEventResponseParams * _Nullable data,
                                                NSError * _Nullable error))completion
{
    NSString * logPrefix =
        [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex, _endpoint,
                  (unsigned int) MTRClusterIDTypeUnitTestingID,
                  (unsigned int) MTRCommandIDTypeClusterUnitTestingCommandTestEmitTestFabricScopedEventRequestID];
    // Make a copy of params before we go async.
    params = [params copy];
    NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs;
    if (timedInvokeTimeoutMsParam) {
        timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX));
    }
    MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue];
    MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) {
        MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue);
        MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                controller:self.device.deviceController];
        auto * bridge = new MTRUnitTestingClusterTestEmitTestFabricScopedEventResponseCallbackBridge(
            self.device.queue,
            ^(id _Nullable value, NSError * _Nullable error) {
                MTRClustersLogCompletion(logPrefix, value, error);
                dispatch_async(self.callbackQueue, ^{
                    completion(value, error);
                });
                [workItem endWork];
            },
            ^(ExchangeManager & exchangeManager, const SessionHandle & session,
                UnitTestingClusterTestEmitTestFabricScopedEventResponseCallbackType successCb, MTRErrorCallback failureCb,
                MTRCallbackBridgeBase * bridge) {
                auto * typedBridge
                    = static_cast<MTRUnitTestingClusterTestEmitTestFabricScopedEventResponseCallbackBridge *>(bridge);
                Optional<uint16_t> timedInvokeTimeoutMs;
                Optional<Timeout> invokeTimeout;
                ListFreer listFreer;
                UnitTesting::Commands::TestEmitTestFabricScopedEventRequest::Type request;
                if (timedInvokeTimeoutMsParam != nil) {
                    timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue);
                }
                if (params != nil) {
                    if (params.serverSideProcessingTimeout != nil) {
                        // Clamp to a number of seconds that will not overflow 32-bit
                        // int when converted to ms.
                        auto * serverSideProcessingTimeout
                            = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX));
                        invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue));
                    }
                }
                request.arg1 = params.arg1.unsignedCharValue;

                return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb,
                    self->_endpoint, timedInvokeTimeoutMs, invokeTimeout);
            });
        std::move(*bridge).DispatchAction(baseDevice);
    };
    workItem.readyHandler = readyHandler;
    MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue);
    [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem];

    if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) {
        expectedValues = nil;
    } else {
        expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX));
    }
    if (expectedValues) {
        [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs];
    }
}

- (NSDictionary<NSString *, id> *)readAttributeBooleanWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeBooleanID)
                                             params:params];
}

- (void)writeAttributeBooleanWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                 expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeBooleanWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeBooleanWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                 expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeBooleanID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeBitmap8WithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeBitmap8ID)
                                             params:params];
}

- (void)writeAttributeBitmap8WithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                 expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeBitmap8WithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeBitmap8WithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                 expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeBitmap8ID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeBitmap16WithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeBitmap16ID)
                                             params:params];
}

- (void)writeAttributeBitmap16WithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                  expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeBitmap16WithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeBitmap16WithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                  expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                 params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeBitmap16ID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeBitmap32WithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeBitmap32ID)
                                             params:params];
}

- (void)writeAttributeBitmap32WithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                  expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeBitmap32WithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeBitmap32WithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                  expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                 params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeBitmap32ID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeBitmap64WithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeBitmap64ID)
                                             params:params];
}

- (void)writeAttributeBitmap64WithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                  expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeBitmap64WithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeBitmap64WithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                  expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                 params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeBitmap64ID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeInt8uWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeInt8uID)
                                             params:params];
}

- (void)writeAttributeInt8uWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
               expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeInt8uWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeInt8uWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
               expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                              params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeInt8uID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeInt16uWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeInt16uID)
                                             params:params];
}

- (void)writeAttributeInt16uWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeInt16uWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeInt16uWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                               params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeInt16uID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeInt24uWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeInt24uID)
                                             params:params];
}

- (void)writeAttributeInt24uWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeInt24uWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeInt24uWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                               params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeInt24uID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeInt32uWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeInt32uID)
                                             params:params];
}

- (void)writeAttributeInt32uWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeInt32uWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeInt32uWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                               params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeInt32uID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeInt40uWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeInt40uID)
                                             params:params];
}

- (void)writeAttributeInt40uWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeInt40uWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeInt40uWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                               params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeInt40uID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeInt48uWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeInt48uID)
                                             params:params];
}

- (void)writeAttributeInt48uWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeInt48uWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeInt48uWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                               params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeInt48uID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeInt56uWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeInt56uID)
                                             params:params];
}

- (void)writeAttributeInt56uWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeInt56uWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeInt56uWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                               params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeInt56uID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeInt64uWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeInt64uID)
                                             params:params];
}

- (void)writeAttributeInt64uWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeInt64uWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeInt64uWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                               params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeInt64uID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeInt8sWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeInt8sID)
                                             params:params];
}

- (void)writeAttributeInt8sWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
               expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeInt8sWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeInt8sWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
               expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                              params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeInt8sID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeInt16sWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeInt16sID)
                                             params:params];
}

- (void)writeAttributeInt16sWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeInt16sWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeInt16sWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                               params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeInt16sID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeInt24sWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeInt24sID)
                                             params:params];
}

- (void)writeAttributeInt24sWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeInt24sWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeInt24sWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                               params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeInt24sID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeInt32sWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeInt32sID)
                                             params:params];
}

- (void)writeAttributeInt32sWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeInt32sWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeInt32sWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                               params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeInt32sID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeInt40sWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeInt40sID)
                                             params:params];
}

- (void)writeAttributeInt40sWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeInt40sWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeInt40sWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                               params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeInt40sID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeInt48sWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeInt48sID)
                                             params:params];
}

- (void)writeAttributeInt48sWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeInt48sWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeInt48sWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                               params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeInt48sID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeInt56sWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeInt56sID)
                                             params:params];
}

- (void)writeAttributeInt56sWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeInt56sWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeInt56sWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                               params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeInt56sID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeInt64sWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeInt64sID)
                                             params:params];
}

- (void)writeAttributeInt64sWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeInt64sWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeInt64sWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                               params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeInt64sID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeEnum8WithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeEnum8ID)
                                             params:params];
}

- (void)writeAttributeEnum8WithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
               expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeEnum8WithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeEnum8WithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
               expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                              params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeEnum8ID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeEnum16WithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeEnum16ID)
                                             params:params];
}

- (void)writeAttributeEnum16WithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeEnum16WithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeEnum16WithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                               params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeEnum16ID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeFloatSingleWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeFloatSingleID)
                                             params:params];
}

- (void)writeAttributeFloatSingleWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                     expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeFloatSingleWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeFloatSingleWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                     expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                    params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeFloatSingleID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeFloatDoubleWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeFloatDoubleID)
                                             params:params];
}

- (void)writeAttributeFloatDoubleWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                     expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeFloatDoubleWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeFloatDoubleWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                     expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                    params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeFloatDoubleID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeOctetStringWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeOctetStringID)
                                             params:params];
}

- (void)writeAttributeOctetStringWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                     expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeOctetStringWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeOctetStringWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                     expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                    params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeOctetStringID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeListInt8uWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeListInt8uID)
                                             params:params];
}

- (void)writeAttributeListInt8uWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                   expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeListInt8uWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeListInt8uWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                   expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                  params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeListInt8uID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeListOctetStringWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeListOctetStringID)
                                             params:params];
}

- (void)writeAttributeListOctetStringWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                         expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeListOctetStringWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeListOctetStringWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                         expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                        params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeListOctetStringID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeListStructOctetStringWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeListStructOctetStringID)
                                             params:params];
}

- (void)writeAttributeListStructOctetStringWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                               expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeListStructOctetStringWithValue:dataValueDictionary
                                 expectedValueInterval:expectedValueIntervalMs
                                                params:nil];
}
- (void)writeAttributeListStructOctetStringWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                               expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                              params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeListStructOctetStringID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeLongOctetStringWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeLongOctetStringID)
                                             params:params];
}

- (void)writeAttributeLongOctetStringWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                         expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeLongOctetStringWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeLongOctetStringWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                         expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                        params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeLongOctetStringID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeCharStringWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeCharStringID)
                                             params:params];
}

- (void)writeAttributeCharStringWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeCharStringWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeCharStringWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                   params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeCharStringID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeLongCharStringWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeLongCharStringID)
                                             params:params];
}

- (void)writeAttributeLongCharStringWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeLongCharStringWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeLongCharStringWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                       params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeLongCharStringID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeEpochUsWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeEpochUsID)
                                             params:params];
}

- (void)writeAttributeEpochUsWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                 expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeEpochUsWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeEpochUsWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                 expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeEpochUsID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeEpochSWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeEpochSID)
                                             params:params];
}

- (void)writeAttributeEpochSWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeEpochSWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeEpochSWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                               params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeEpochSID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeVendorIdWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeVendorIdID)
                                             params:params];
}

- (void)writeAttributeVendorIdWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                  expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeVendorIdWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeVendorIdWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                  expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                 params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeVendorIdID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeListNullablesAndOptionalsStructWithParams:(MTRReadParams * _Nullable)params
{
    return
        [self.device readAttributeWithEndpointID:@(_endpoint)
                                       clusterID:@(MTRClusterIDTypeUnitTestingID)
                                     attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeListNullablesAndOptionalsStructID)
                                          params:params];
}

- (void)writeAttributeListNullablesAndOptionalsStructWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                         expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeListNullablesAndOptionalsStructWithValue:dataValueDictionary
                                           expectedValueInterval:expectedValueIntervalMs
                                                          params:nil];
}
- (void)writeAttributeListNullablesAndOptionalsStructWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                         expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                                        params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeListNullablesAndOptionalsStructID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeEnumAttrWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeEnumAttrID)
                                             params:params];
}

- (void)writeAttributeEnumAttrWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                  expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeEnumAttrWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeEnumAttrWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                  expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                 params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeEnumAttrID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeStructAttrWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeStructAttrID)
                                             params:params];
}

- (void)writeAttributeStructAttrWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeStructAttrWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeStructAttrWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                    expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                   params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeStructAttrID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeRangeRestrictedInt8uWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeRangeRestrictedInt8uID)
                                             params:params];
}

- (void)writeAttributeRangeRestrictedInt8uWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                              expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeRangeRestrictedInt8uWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeRangeRestrictedInt8uWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                              expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                             params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeRangeRestrictedInt8uID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeRangeRestrictedInt8sWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeRangeRestrictedInt8sID)
                                             params:params];
}

- (void)writeAttributeRangeRestrictedInt8sWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                              expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeRangeRestrictedInt8sWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeRangeRestrictedInt8sWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                              expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                             params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeRangeRestrictedInt8sID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeRangeRestrictedInt16uWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeRangeRestrictedInt16uID)
                                             params:params];
}

- (void)writeAttributeRangeRestrictedInt16uWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                               expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeRangeRestrictedInt16uWithValue:dataValueDictionary
                                 expectedValueInterval:expectedValueIntervalMs
                                                params:nil];
}
- (void)writeAttributeRangeRestrictedInt16uWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                               expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                              params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeRangeRestrictedInt16uID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeRangeRestrictedInt16sWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeRangeRestrictedInt16sID)
                                             params:params];
}

- (void)writeAttributeRangeRestrictedInt16sWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                               expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeRangeRestrictedInt16sWithValue:dataValueDictionary
                                 expectedValueInterval:expectedValueIntervalMs
                                                params:nil];
}
- (void)writeAttributeRangeRestrictedInt16sWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                               expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                              params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeRangeRestrictedInt16sID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeListLongOctetStringWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeListLongOctetStringID)
                                             params:params];
}

- (void)writeAttributeListLongOctetStringWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                             expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeListLongOctetStringWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeListLongOctetStringWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                             expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                            params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeListLongOctetStringID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeListFabricScopedWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeListFabricScopedID)
                                             params:params];
}

- (void)writeAttributeListFabricScopedWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                          expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeListFabricScopedWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeListFabricScopedWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                          expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                         params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeListFabricScopedID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeTimedWriteBooleanWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeTimedWriteBooleanID)
                                             params:params];
}

- (void)writeAttributeTimedWriteBooleanWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                           expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeTimedWriteBooleanWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeTimedWriteBooleanWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                           expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                          params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeTimedWriteBooleanID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneralErrorBooleanWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeGeneralErrorBooleanID)
                                             params:params];
}

- (void)writeAttributeGeneralErrorBooleanWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                             expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeGeneralErrorBooleanWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeGeneralErrorBooleanWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                             expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                            params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeGeneralErrorBooleanID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterErrorBooleanWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeClusterErrorBooleanID)
                                             params:params];
}

- (void)writeAttributeClusterErrorBooleanWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                             expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeClusterErrorBooleanWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeClusterErrorBooleanWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                             expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                            params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeClusterErrorBooleanID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeUnsupportedWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeUnsupportedID)
                                             params:params];
}

- (void)writeAttributeUnsupportedWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                     expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeUnsupportedWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeUnsupportedWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                     expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                    params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeUnsupportedID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeNullableBooleanWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableBooleanID)
                                             params:params];
}

- (void)writeAttributeNullableBooleanWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                         expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeNullableBooleanWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeNullableBooleanWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                         expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                        params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableBooleanID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeNullableBitmap8WithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableBitmap8ID)
                                             params:params];
}

- (void)writeAttributeNullableBitmap8WithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                         expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeNullableBitmap8WithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeNullableBitmap8WithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                         expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                        params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableBitmap8ID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeNullableBitmap16WithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableBitmap16ID)
                                             params:params];
}

- (void)writeAttributeNullableBitmap16WithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                          expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeNullableBitmap16WithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeNullableBitmap16WithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                          expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                         params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableBitmap16ID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeNullableBitmap32WithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableBitmap32ID)
                                             params:params];
}

- (void)writeAttributeNullableBitmap32WithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                          expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeNullableBitmap32WithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeNullableBitmap32WithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                          expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                         params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableBitmap32ID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeNullableBitmap64WithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableBitmap64ID)
                                             params:params];
}

- (void)writeAttributeNullableBitmap64WithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                          expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeNullableBitmap64WithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeNullableBitmap64WithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                          expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                         params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableBitmap64ID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeNullableInt8uWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableInt8uID)
                                             params:params];
}

- (void)writeAttributeNullableInt8uWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                       expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeNullableInt8uWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeNullableInt8uWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                       expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                      params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableInt8uID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeNullableInt16uWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableInt16uID)
                                             params:params];
}

- (void)writeAttributeNullableInt16uWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeNullableInt16uWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeNullableInt16uWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                       params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableInt16uID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeNullableInt24uWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableInt24uID)
                                             params:params];
}

- (void)writeAttributeNullableInt24uWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeNullableInt24uWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeNullableInt24uWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                       params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableInt24uID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeNullableInt32uWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableInt32uID)
                                             params:params];
}

- (void)writeAttributeNullableInt32uWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeNullableInt32uWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeNullableInt32uWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                       params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableInt32uID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeNullableInt40uWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableInt40uID)
                                             params:params];
}

- (void)writeAttributeNullableInt40uWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeNullableInt40uWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeNullableInt40uWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                       params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableInt40uID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeNullableInt48uWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableInt48uID)
                                             params:params];
}

- (void)writeAttributeNullableInt48uWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeNullableInt48uWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeNullableInt48uWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                       params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableInt48uID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeNullableInt56uWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableInt56uID)
                                             params:params];
}

- (void)writeAttributeNullableInt56uWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeNullableInt56uWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeNullableInt56uWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                       params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableInt56uID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeNullableInt64uWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableInt64uID)
                                             params:params];
}

- (void)writeAttributeNullableInt64uWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeNullableInt64uWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeNullableInt64uWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                       params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableInt64uID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeNullableInt8sWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableInt8sID)
                                             params:params];
}

- (void)writeAttributeNullableInt8sWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                       expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeNullableInt8sWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeNullableInt8sWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                       expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                      params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableInt8sID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeNullableInt16sWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableInt16sID)
                                             params:params];
}

- (void)writeAttributeNullableInt16sWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeNullableInt16sWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeNullableInt16sWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                       params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableInt16sID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeNullableInt24sWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableInt24sID)
                                             params:params];
}

- (void)writeAttributeNullableInt24sWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeNullableInt24sWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeNullableInt24sWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                       params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableInt24sID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeNullableInt32sWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableInt32sID)
                                             params:params];
}

- (void)writeAttributeNullableInt32sWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeNullableInt32sWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeNullableInt32sWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                       params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableInt32sID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeNullableInt40sWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableInt40sID)
                                             params:params];
}

- (void)writeAttributeNullableInt40sWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeNullableInt40sWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeNullableInt40sWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                       params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableInt40sID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeNullableInt48sWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableInt48sID)
                                             params:params];
}

- (void)writeAttributeNullableInt48sWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeNullableInt48sWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeNullableInt48sWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                       params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableInt48sID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeNullableInt56sWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableInt56sID)
                                             params:params];
}

- (void)writeAttributeNullableInt56sWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeNullableInt56sWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeNullableInt56sWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                       params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableInt56sID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeNullableInt64sWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableInt64sID)
                                             params:params];
}

- (void)writeAttributeNullableInt64sWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeNullableInt64sWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeNullableInt64sWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                       params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableInt64sID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeNullableEnum8WithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableEnum8ID)
                                             params:params];
}

- (void)writeAttributeNullableEnum8WithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                       expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeNullableEnum8WithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeNullableEnum8WithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                       expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                      params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableEnum8ID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeNullableEnum16WithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableEnum16ID)
                                             params:params];
}

- (void)writeAttributeNullableEnum16WithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeNullableEnum16WithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeNullableEnum16WithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                       params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableEnum16ID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeNullableFloatSingleWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableFloatSingleID)
                                             params:params];
}

- (void)writeAttributeNullableFloatSingleWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                             expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeNullableFloatSingleWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeNullableFloatSingleWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                             expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                            params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableFloatSingleID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeNullableFloatDoubleWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableFloatDoubleID)
                                             params:params];
}

- (void)writeAttributeNullableFloatDoubleWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                             expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeNullableFloatDoubleWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeNullableFloatDoubleWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                             expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                            params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableFloatDoubleID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeNullableOctetStringWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableOctetStringID)
                                             params:params];
}

- (void)writeAttributeNullableOctetStringWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                             expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeNullableOctetStringWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeNullableOctetStringWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                             expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                            params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableOctetStringID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeNullableCharStringWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableCharStringID)
                                             params:params];
}

- (void)writeAttributeNullableCharStringWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                            expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeNullableCharStringWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeNullableCharStringWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                            expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                           params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableCharStringID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeNullableEnumAttrWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableEnumAttrID)
                                             params:params];
}

- (void)writeAttributeNullableEnumAttrWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                          expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeNullableEnumAttrWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeNullableEnumAttrWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                          expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                         params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableEnumAttrID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeNullableStructWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableStructID)
                                             params:params];
}

- (void)writeAttributeNullableStructWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeNullableStructWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeNullableStructWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                       params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableStructID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeNullableRangeRestrictedInt8uWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableRangeRestrictedInt8uID)
                                             params:params];
}

- (void)writeAttributeNullableRangeRestrictedInt8uWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeNullableRangeRestrictedInt8uWithValue:dataValueDictionary
                                        expectedValueInterval:expectedValueIntervalMs
                                                       params:nil];
}
- (void)writeAttributeNullableRangeRestrictedInt8uWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                                     params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableRangeRestrictedInt8uID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeNullableRangeRestrictedInt8sWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableRangeRestrictedInt8sID)
                                             params:params];
}

- (void)writeAttributeNullableRangeRestrictedInt8sWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeNullableRangeRestrictedInt8sWithValue:dataValueDictionary
                                        expectedValueInterval:expectedValueIntervalMs
                                                       params:nil];
}
- (void)writeAttributeNullableRangeRestrictedInt8sWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                                     params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableRangeRestrictedInt8sID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeNullableRangeRestrictedInt16uWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableRangeRestrictedInt16uID)
                                             params:params];
}

- (void)writeAttributeNullableRangeRestrictedInt16uWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                       expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeNullableRangeRestrictedInt16uWithValue:dataValueDictionary
                                         expectedValueInterval:expectedValueIntervalMs
                                                        params:nil];
}
- (void)writeAttributeNullableRangeRestrictedInt16uWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                       expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                                      params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableRangeRestrictedInt16uID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeNullableRangeRestrictedInt16sWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableRangeRestrictedInt16sID)
                                             params:params];
}

- (void)writeAttributeNullableRangeRestrictedInt16sWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                       expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeNullableRangeRestrictedInt16sWithValue:dataValueDictionary
                                         expectedValueInterval:expectedValueIntervalMs
                                                        params:nil];
}
- (void)writeAttributeNullableRangeRestrictedInt16sWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                       expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                                      params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeNullableRangeRestrictedInt16sID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeWriteOnlyInt8uWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeWriteOnlyInt8uID)
                                             params:params];
}

- (void)writeAttributeWriteOnlyInt8uWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
{
    [self writeAttributeWriteOnlyInt8uWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
}
- (void)writeAttributeWriteOnlyInt8uWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                       params:(MTRWriteParams * _Nullable)params
{
    NSNumber * timedWriteTimeout = params.timedWriteTimeout;

    [self.device writeAttributeWithEndpointID:@(_endpoint)
                                    clusterID:@(MTRClusterIDTypeUnitTestingID)
                                  attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeWriteOnlyInt8uID)
                                        value:dataValueDictionary
                        expectedValueInterval:expectedValueIntervalMs
                            timedWriteTimeout:timedWriteTimeout];
}

- (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeGeneratedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeAcceptedCommandListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeAttributeListID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeFeatureMapID)
                                             params:params];
}

- (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
{
    return [self.device readAttributeWithEndpointID:@(_endpoint)
                                          clusterID:@(MTRClusterIDTypeUnitTestingID)
                                        attributeID:@(MTRAttributeIDTypeClusterUnitTestingAttributeClusterRevisionID)
                                             params:params];
}

@end
@implementation MTRClusterTestCluster
@end

@implementation MTRClusterTestCluster (Deprecated)

- (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
{
    return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
}

- (void)testWithParams:(MTRTestClusterClusterTestParams * _Nullable)params
           expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
    expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
        completionHandler:(MTRStatusCompletion)completionHandler
{
    [self testWithParams:params
               expectedValues:expectedDataValueDictionaries
        expectedValueInterval:expectedValueIntervalMs
                   completion:completionHandler];
}
- (void)testWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
         expectedValueInterval:(NSNumber *)expectedValueIntervalMs
             completionHandler:(MTRStatusCompletion)completionHandler
{
    [self testWithParams:nil
               expectedValues:expectedValues
        expectedValueInterval:expectedValueIntervalMs
            completionHandler:completionHandler];
}
- (void)testNotHandledWithParams:(MTRTestClusterClusterTestNotHandledParams * _Nullable)params
                  expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
           expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
               completionHandler:(MTRStatusCompletion)completionHandler
{
    [self testNotHandledWithParams:params
                    expectedValues:expectedDataValueDictionaries
             expectedValueInterval:expectedValueIntervalMs
                        completion:completionHandler];
}
- (void)testNotHandledWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                   expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                       completionHandler:(MTRStatusCompletion)completionHandler
{
    [self testNotHandledWithParams:nil
                    expectedValues:expectedValues
             expectedValueInterval:expectedValueIntervalMs
                 completionHandler:completionHandler];
}
- (void)testSpecificWithParams:(MTRTestClusterClusterTestSpecificParams * _Nullable)params
                expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
         expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
             completionHandler:(void (^)(MTRTestClusterClusterTestSpecificResponseParams * _Nullable data,
                                   NSError * _Nullable error))completionHandler
{
    [self testSpecificWithParams:params
                  expectedValues:expectedDataValueDictionaries
           expectedValueInterval:expectedValueIntervalMs
                      completion:^(MTRUnitTestingClusterTestSpecificResponseParams * _Nullable data, NSError * _Nullable error) {
                          // Cast is safe because subclass does not add any selectors.
                          completionHandler(static_cast<MTRTestClusterClusterTestSpecificResponseParams *>(data), error);
                      }];
}
- (void)testSpecificWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                 expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                     completionHandler:(void (^)(MTRTestClusterClusterTestSpecificResponseParams * _Nullable data,
                                           NSError * _Nullable error))completionHandler
{
    [self testSpecificWithParams:nil
                  expectedValues:expectedValues
           expectedValueInterval:expectedValueIntervalMs
               completionHandler:completionHandler];
}
- (void)testUnknownCommandWithParams:(MTRTestClusterClusterTestUnknownCommandParams * _Nullable)params
                      expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
               expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                   completionHandler:(MTRStatusCompletion)completionHandler
{
    [self testUnknownCommandWithParams:params
                        expectedValues:expectedDataValueDictionaries
                 expectedValueInterval:expectedValueIntervalMs
                            completion:completionHandler];
}
- (void)testUnknownCommandWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                       expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                           completionHandler:(MTRStatusCompletion)completionHandler
{
    [self testUnknownCommandWithParams:nil
                        expectedValues:expectedValues
                 expectedValueInterval:expectedValueIntervalMs
                     completionHandler:completionHandler];
}
- (void)testAddArgumentsWithParams:(MTRTestClusterClusterTestAddArgumentsParams *)params
                    expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
             expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                 completionHandler:(void (^)(MTRTestClusterClusterTestAddArgumentsResponseParams * _Nullable data,
                                       NSError * _Nullable error))completionHandler
{
    [self testAddArgumentsWithParams:params
                      expectedValues:expectedDataValueDictionaries
               expectedValueInterval:expectedValueIntervalMs
                          completion:^(
                              MTRUnitTestingClusterTestAddArgumentsResponseParams * _Nullable data, NSError * _Nullable error) {
                              // Cast is safe because subclass does not add any selectors.
                              completionHandler(static_cast<MTRTestClusterClusterTestAddArgumentsResponseParams *>(data), error);
                          }];
}
- (void)testSimpleArgumentRequestWithParams:(MTRTestClusterClusterTestSimpleArgumentRequestParams *)params
                             expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
                      expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                          completionHandler:(void (^)(MTRTestClusterClusterTestSimpleArgumentResponseParams * _Nullable data,
                                                NSError * _Nullable error))completionHandler
{
    [self testSimpleArgumentRequestWithParams:params
                               expectedValues:expectedDataValueDictionaries
                        expectedValueInterval:expectedValueIntervalMs
                                   completion:^(MTRUnitTestingClusterTestSimpleArgumentResponseParams * _Nullable data,
                                       NSError * _Nullable error) {
                                       // Cast is safe because subclass does not add any selectors.
                                       completionHandler(
                                           static_cast<MTRTestClusterClusterTestSimpleArgumentResponseParams *>(data), error);
                                   }];
}
- (void)testStructArrayArgumentRequestWithParams:(MTRTestClusterClusterTestStructArrayArgumentRequestParams *)params
                                  expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
                           expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                               completionHandler:
                                   (void (^)(MTRTestClusterClusterTestStructArrayArgumentResponseParams * _Nullable data,
                                       NSError * _Nullable error))completionHandler
{
    [self testStructArrayArgumentRequestWithParams:params
                                    expectedValues:expectedDataValueDictionaries
                             expectedValueInterval:expectedValueIntervalMs
                                        completion:^(MTRUnitTestingClusterTestStructArrayArgumentResponseParams * _Nullable data,
                                            NSError * _Nullable error) {
                                            // Cast is safe because subclass does not add any selectors.
                                            completionHandler(
                                                static_cast<MTRTestClusterClusterTestStructArrayArgumentResponseParams *>(data),
                                                error);
                                        }];
}
- (void)testStructArgumentRequestWithParams:(MTRTestClusterClusterTestStructArgumentRequestParams *)params
                             expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
                      expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                          completionHandler:(void (^)(MTRTestClusterClusterBooleanResponseParams * _Nullable data,
                                                NSError * _Nullable error))completionHandler
{
    [self testStructArgumentRequestWithParams:params
                               expectedValues:expectedDataValueDictionaries
                        expectedValueInterval:expectedValueIntervalMs
                                   completion:^(
                                       MTRUnitTestingClusterBooleanResponseParams * _Nullable data, NSError * _Nullable error) {
                                       // Cast is safe because subclass does not add any selectors.
                                       completionHandler(static_cast<MTRTestClusterClusterBooleanResponseParams *>(data), error);
                                   }];
}
- (void)testNestedStructArgumentRequestWithParams:(MTRTestClusterClusterTestNestedStructArgumentRequestParams *)params
                                   expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
                            expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                                completionHandler:(void (^)(MTRTestClusterClusterBooleanResponseParams * _Nullable data,
                                                      NSError * _Nullable error))completionHandler
{
    [self testNestedStructArgumentRequestWithParams:params
                                     expectedValues:expectedDataValueDictionaries
                              expectedValueInterval:expectedValueIntervalMs
                                         completion:^(MTRUnitTestingClusterBooleanResponseParams * _Nullable data,
                                             NSError * _Nullable error) {
                                             // Cast is safe because subclass does not add any selectors.
                                             completionHandler(
                                                 static_cast<MTRTestClusterClusterBooleanResponseParams *>(data), error);
                                         }];
}
- (void)testListStructArgumentRequestWithParams:(MTRTestClusterClusterTestListStructArgumentRequestParams *)params
                                 expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
                          expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                              completionHandler:(void (^)(MTRTestClusterClusterBooleanResponseParams * _Nullable data,
                                                    NSError * _Nullable error))completionHandler
{
    [self
        testListStructArgumentRequestWithParams:params
                                 expectedValues:expectedDataValueDictionaries
                          expectedValueInterval:expectedValueIntervalMs
                                     completion:^(
                                         MTRUnitTestingClusterBooleanResponseParams * _Nullable data, NSError * _Nullable error) {
                                         // Cast is safe because subclass does not add any selectors.
                                         completionHandler(static_cast<MTRTestClusterClusterBooleanResponseParams *>(data), error);
                                     }];
}
- (void)testListInt8UArgumentRequestWithParams:(MTRTestClusterClusterTestListInt8UArgumentRequestParams *)params
                                expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
                         expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                             completionHandler:(void (^)(MTRTestClusterClusterBooleanResponseParams * _Nullable data,
                                                   NSError * _Nullable error))completionHandler
{
    [self testListInt8UArgumentRequestWithParams:params
                                  expectedValues:expectedDataValueDictionaries
                           expectedValueInterval:expectedValueIntervalMs
                                      completion:^(
                                          MTRUnitTestingClusterBooleanResponseParams * _Nullable data, NSError * _Nullable error) {
                                          // Cast is safe because subclass does not add any selectors.
                                          completionHandler(static_cast<MTRTestClusterClusterBooleanResponseParams *>(data), error);
                                      }];
}
- (void)testNestedStructListArgumentRequestWithParams:(MTRTestClusterClusterTestNestedStructListArgumentRequestParams *)params
                                       expectedValues:
                                           (NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
                                expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                                    completionHandler:(void (^)(MTRTestClusterClusterBooleanResponseParams * _Nullable data,
                                                          NSError * _Nullable error))completionHandler
{
    [self testNestedStructListArgumentRequestWithParams:params
                                         expectedValues:expectedDataValueDictionaries
                                  expectedValueInterval:expectedValueIntervalMs
                                             completion:^(MTRUnitTestingClusterBooleanResponseParams * _Nullable data,
                                                 NSError * _Nullable error) {
                                                 // Cast is safe because subclass does not add any selectors.
                                                 completionHandler(
                                                     static_cast<MTRTestClusterClusterBooleanResponseParams *>(data), error);
                                             }];
}
- (void)testListNestedStructListArgumentRequestWithParams:
            (MTRTestClusterClusterTestListNestedStructListArgumentRequestParams *)params
                                           expectedValues:
                                               (NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
                                    expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                                        completionHandler:(void (^)(MTRTestClusterClusterBooleanResponseParams * _Nullable data,
                                                              NSError * _Nullable error))completionHandler
{
    [self testListNestedStructListArgumentRequestWithParams:params
                                             expectedValues:expectedDataValueDictionaries
                                      expectedValueInterval:expectedValueIntervalMs
                                                 completion:^(MTRUnitTestingClusterBooleanResponseParams * _Nullable data,
                                                     NSError * _Nullable error) {
                                                     // Cast is safe because subclass does not add any selectors.
                                                     completionHandler(
                                                         static_cast<MTRTestClusterClusterBooleanResponseParams *>(data), error);
                                                 }];
}
- (void)testListInt8UReverseRequestWithParams:(MTRTestClusterClusterTestListInt8UReverseRequestParams *)params
                               expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
                        expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                            completionHandler:(void (^)(MTRTestClusterClusterTestListInt8UReverseResponseParams * _Nullable data,
                                                  NSError * _Nullable error))completionHandler
{
    [self testListInt8UReverseRequestWithParams:params
                                 expectedValues:expectedDataValueDictionaries
                          expectedValueInterval:expectedValueIntervalMs
                                     completion:^(MTRUnitTestingClusterTestListInt8UReverseResponseParams * _Nullable data,
                                         NSError * _Nullable error) {
                                         // Cast is safe because subclass does not add any selectors.
                                         completionHandler(
                                             static_cast<MTRTestClusterClusterTestListInt8UReverseResponseParams *>(data), error);
                                     }];
}
- (void)testEnumsRequestWithParams:(MTRTestClusterClusterTestEnumsRequestParams *)params
                    expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
             expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                 completionHandler:(void (^)(MTRTestClusterClusterTestEnumsResponseParams * _Nullable data,
                                       NSError * _Nullable error))completionHandler
{
    [self testEnumsRequestWithParams:params
                      expectedValues:expectedDataValueDictionaries
               expectedValueInterval:expectedValueIntervalMs
                          completion:^(MTRUnitTestingClusterTestEnumsResponseParams * _Nullable data, NSError * _Nullable error) {
                              // Cast is safe because subclass does not add any selectors.
                              completionHandler(static_cast<MTRTestClusterClusterTestEnumsResponseParams *>(data), error);
                          }];
}
- (void)testNullableOptionalRequestWithParams:(MTRTestClusterClusterTestNullableOptionalRequestParams * _Nullable)params
                               expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
                        expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                            completionHandler:(void (^)(MTRTestClusterClusterTestNullableOptionalResponseParams * _Nullable data,
                                                  NSError * _Nullable error))completionHandler
{
    [self testNullableOptionalRequestWithParams:params
                                 expectedValues:expectedDataValueDictionaries
                          expectedValueInterval:expectedValueIntervalMs
                                     completion:^(MTRUnitTestingClusterTestNullableOptionalResponseParams * _Nullable data,
                                         NSError * _Nullable error) {
                                         // Cast is safe because subclass does not add any selectors.
                                         completionHandler(
                                             static_cast<MTRTestClusterClusterTestNullableOptionalResponseParams *>(data), error);
                                     }];
}
- (void)testComplexNullableOptionalRequestWithParams:(MTRTestClusterClusterTestComplexNullableOptionalRequestParams *)params
                                      expectedValues:
                                          (NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
                               expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                                   completionHandler:
                                       (void (^)(MTRTestClusterClusterTestComplexNullableOptionalResponseParams * _Nullable data,
                                           NSError * _Nullable error))completionHandler
{
    [self testComplexNullableOptionalRequestWithParams:params
                                        expectedValues:expectedDataValueDictionaries
                                 expectedValueInterval:expectedValueIntervalMs
                                            completion:^(
                                                MTRUnitTestingClusterTestComplexNullableOptionalResponseParams * _Nullable data,
                                                NSError * _Nullable error) {
                                                // Cast is safe because subclass does not add any selectors.
                                                completionHandler(
                                                    static_cast<MTRTestClusterClusterTestComplexNullableOptionalResponseParams *>(
                                                        data),
                                                    error);
                                            }];
}
- (void)simpleStructEchoRequestWithParams:(MTRTestClusterClusterSimpleStructEchoRequestParams *)params
                           expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
                    expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                        completionHandler:(void (^)(MTRTestClusterClusterSimpleStructResponseParams * _Nullable data,
                                              NSError * _Nullable error))completionHandler
{
    [self simpleStructEchoRequestWithParams:params
                             expectedValues:expectedDataValueDictionaries
                      expectedValueInterval:expectedValueIntervalMs
                                 completion:^(
                                     MTRUnitTestingClusterSimpleStructResponseParams * _Nullable data, NSError * _Nullable error) {
                                     // Cast is safe because subclass does not add any selectors.
                                     completionHandler(static_cast<MTRTestClusterClusterSimpleStructResponseParams *>(data), error);
                                 }];
}
- (void)timedInvokeRequestWithParams:(MTRTestClusterClusterTimedInvokeRequestParams * _Nullable)params
                      expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
               expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                   completionHandler:(MTRStatusCompletion)completionHandler
{
    [self timedInvokeRequestWithParams:params
                        expectedValues:expectedDataValueDictionaries
                 expectedValueInterval:expectedValueIntervalMs
                            completion:completionHandler];
}
- (void)timedInvokeRequestWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                       expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                           completionHandler:(MTRStatusCompletion)completionHandler
{
    [self timedInvokeRequestWithParams:nil
                        expectedValues:expectedValues
                 expectedValueInterval:expectedValueIntervalMs
                     completionHandler:completionHandler];
}
- (void)testSimpleOptionalArgumentRequestWithParams:(MTRTestClusterClusterTestSimpleOptionalArgumentRequestParams * _Nullable)params
                                     expectedValues:
                                         (NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
                              expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                                  completionHandler:(MTRStatusCompletion)completionHandler
{
    [self testSimpleOptionalArgumentRequestWithParams:params
                                       expectedValues:expectedDataValueDictionaries
                                expectedValueInterval:expectedValueIntervalMs
                                           completion:completionHandler];
}
- (void)testEmitTestEventRequestWithParams:(MTRTestClusterClusterTestEmitTestEventRequestParams *)params
                            expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
                     expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                         completionHandler:(void (^)(MTRTestClusterClusterTestEmitTestEventResponseParams * _Nullable data,
                                               NSError * _Nullable error))completionHandler
{
    [self testEmitTestEventRequestWithParams:params
                              expectedValues:expectedDataValueDictionaries
                       expectedValueInterval:expectedValueIntervalMs
                                  completion:^(MTRUnitTestingClusterTestEmitTestEventResponseParams * _Nullable data,
                                      NSError * _Nullable error) {
                                      // Cast is safe because subclass does not add any selectors.
                                      completionHandler(
                                          static_cast<MTRTestClusterClusterTestEmitTestEventResponseParams *>(data), error);
                                  }];
}
- (void)testEmitTestFabricScopedEventRequestWithParams:(MTRTestClusterClusterTestEmitTestFabricScopedEventRequestParams *)params
                                        expectedValues:
                                            (NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
                                 expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                                     completionHandler:
                                         (void (^)(
                                             MTRTestClusterClusterTestEmitTestFabricScopedEventResponseParams * _Nullable data,
                                             NSError * _Nullable error))completionHandler
{
    [self
        testEmitTestFabricScopedEventRequestWithParams:params
                                        expectedValues:expectedDataValueDictionaries
                                 expectedValueInterval:expectedValueIntervalMs
                                            completion:^(
                                                MTRUnitTestingClusterTestEmitTestFabricScopedEventResponseParams * _Nullable data,
                                                NSError * _Nullable error) {
                                                // Cast is safe because subclass does not add any selectors.
                                                completionHandler(
                                                    static_cast<MTRTestClusterClusterTestEmitTestFabricScopedEventResponseParams *>(
                                                        data),
                                                    error);
                                            }];
}
@end

// NOLINTEND(clang-analyzer-cplusplus.NewDeleteLeaks)
