From d715f8246b96e5db8b440f352bc169511e5049d9 Mon Sep 17 00:00:00 2001 From: Vivien Nicolas Date: Thu, 27 Jan 2022 19:18:20 +0100 Subject: [PATCH] [chip-tool] Add write-by-id, command-by-id and a custom payload builder (#14398) * [chip-tool] Add write-by-id, command-by-id and a custom payload builder * Update generated content --- .../commands/clusters/ClusterCommand.h | 25 ++ .../commands/clusters/CustomArgument.h | 232 ++++++++++++++++++ .../commands/clusters/WriteAttributeCommand.h | 25 ++ .../chip-tool/commands/common/Command.cpp | 16 ++ examples/chip-tool/commands/common/Command.h | 5 +- examples/chip-tool/templates/commands.zapt | 4 + .../zap-generated/cluster/Commands.h | 134 +++++++++- 7 files changed, 437 insertions(+), 4 deletions(-) create mode 100644 examples/chip-tool/commands/clusters/CustomArgument.h diff --git a/examples/chip-tool/commands/clusters/ClusterCommand.h b/examples/chip-tool/commands/clusters/ClusterCommand.h index 2b9dd68553bbee..ea0a2a41ad3fb2 100644 --- a/examples/chip-tool/commands/clusters/ClusterCommand.h +++ b/examples/chip-tool/commands/clusters/ClusterCommand.h @@ -26,6 +26,23 @@ class ClusterCommand : public ModelCommand, public chip::app::CommandSender::Callback { public: + ClusterCommand() : ModelCommand("command-by-id") + { + AddArgument("cluster-id", 0, UINT32_MAX, &mClusterId); + AddArgument("command-id", 0, UINT32_MAX, &mCommandId); + AddArgument("payload", &mPayload); + AddArgument("timedInteractionTimeoutMs", 0, UINT16_MAX, &mTimedInteractionTimeoutMs); + ModelCommand::AddArguments(); + } + + ClusterCommand(chip::ClusterId clusterId) : ModelCommand("command-by-id"), mClusterId(clusterId) + { + AddArgument("command-id", 0, UINT32_MAX, &mCommandId); + AddArgument("payload", &mPayload); + AddArgument("timedInteractionTimeoutMs", 0, UINT16_MAX, &mTimedInteractionTimeoutMs); + ModelCommand::AddArguments(); + } + ClusterCommand(const char * commandName) : ModelCommand(commandName) { AddArgument("timedInteractionTimeoutMs", 0, UINT16_MAX, &mTimedInteractionTimeoutMs); @@ -33,6 +50,11 @@ class ClusterCommand : public ModelCommand, public chip::app::CommandSender::Cal ~ClusterCommand() {} + CHIP_ERROR SendCommand(ChipDevice * device, chip::EndpointId endpointId) override + { + return ClusterCommand::SendCommand(device, endpointId, mClusterId, mCommandId, mPayload); + } + /////////// CommandSender Callback Interface ///////// virtual void OnResponse(chip::app::CommandSender * client, const chip::app::ConcreteCommandPath & path, const chip::app::StatusIB & status, chip::TLV::TLVReader * data) override @@ -84,7 +106,10 @@ class ClusterCommand : public ModelCommand, public chip::app::CommandSender::Cal } private: + chip::ClusterId mClusterId; + chip::CommandId mCommandId; chip::Optional mTimedInteractionTimeoutMs; + CustomArgument mPayload; std::unique_ptr mCommandSender; }; diff --git a/examples/chip-tool/commands/clusters/CustomArgument.h b/examples/chip-tool/commands/clusters/CustomArgument.h new file mode 100644 index 00000000000000..1176c70e2db4cf --- /dev/null +++ b/examples/chip-tool/commands/clusters/CustomArgument.h @@ -0,0 +1,232 @@ +/* + * Copyright (c) 2022 Project CHIP Authors + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#pragma once + +#include +#include + +namespace { +static constexpr char kPayloadHexPrefix[] = "hex:"; +static constexpr char kPayloadSignedPrefix[] = "s:"; +static constexpr char kPayloadUnkPayloadSignedPrefix[] = "u:"; +static constexpr size_t kPayloadHexPrefixLen = ArraySize(kPayloadHexPrefix) - 1; // ignore null character +static constexpr size_t kPayloadSignedPrefixLen = ArraySize(kPayloadSignedPrefix) - 1; // ignore null character +static constexpr size_t kPayloadUnkPayloadSignedPrefixLen = ArraySize(kPayloadUnkPayloadSignedPrefix) - 1; // ignore null character +} // namespace + +class CustomArgumentParser +{ +public: + static CHIP_ERROR Put(chip::TLV::TLVWriter * writer, chip::TLV::Tag tag, Json::Value & value) + { + if (value.isObject()) + { + return CustomArgumentParser::PutObject(writer, tag, value); + } + + if (value.isArray()) + { + return CustomArgumentParser::PutArray(writer, tag, value); + } + + if (value.isString()) + { + if (IsOctetString(value)) + { + return CustomArgumentParser::PutOctetString(writer, tag, value); + } + else if (IsUnsignedNumberPrefix(value)) + { + return CustomArgumentParser::PutUnsignedFromString(writer, tag, value); + } + else if (IsSignedNumberPrefix(value)) + { + return CustomArgumentParser::PutSignedFromString(writer, tag, value); + } + + return CustomArgumentParser::PutCharString(writer, tag, value); + } + + if (value.isNull()) + { + return chip::app::DataModel::Encode(*writer, tag, chip::app::DataModel::Nullable()); + } + + if (value.isBool()) + { + return chip::app::DataModel::Encode(*writer, tag, value.asBool()); + } + + if (value.isUInt()) + { + return chip::app::DataModel::Encode(*writer, tag, value.asLargestUInt()); + } + + if (value.isInt()) + { + return chip::app::DataModel::Encode(*writer, tag, value.asLargestInt()); + } + + if (value.isNumeric()) + { + return chip::app::DataModel::Encode(*writer, tag, value.asDouble()); + } + + return CHIP_ERROR_NOT_IMPLEMENTED; + } + +private: + static CHIP_ERROR PutArray(chip::TLV::TLVWriter * writer, chip::TLV::Tag tag, Json::Value & value) + { + chip::TLV::TLVType outer; + ReturnErrorOnFailure(writer->StartContainer(tag, chip::TLV::kTLVType_Array, outer)); + + Json::ArrayIndex size = value.size(); + + for (Json::ArrayIndex i = 0; i < size; i++) + { + ReturnErrorOnFailure(CustomArgumentParser::Put(writer, chip::TLV::AnonymousTag(), value[i])); + } + + return writer->EndContainer(outer); + } + + static CHIP_ERROR PutObject(chip::TLV::TLVWriter * writer, chip::TLV::Tag tag, Json::Value & value) + { + chip::TLV::TLVType outer; + ReturnErrorOnFailure(writer->StartContainer(tag, chip::TLV::kTLVType_Structure, outer)); + + for (auto const & id : value.getMemberNames()) + { + auto index = std::stoul(id, nullptr, 0); + VerifyOrReturnError(chip::CanCastTo(index), CHIP_ERROR_INVALID_ARGUMENT); + ReturnErrorOnFailure(CustomArgumentParser::Put(writer, chip::TLV::ContextTag(static_cast(index)), value[id])); + } + + return writer->EndContainer(outer); + } + + static CHIP_ERROR PutOctetString(chip::TLV::TLVWriter * writer, chip::TLV::Tag tag, Json::Value & value) + { + size_t size = strlen(value.asCString()); + VerifyOrReturnError(size % 2 == 0, CHIP_ERROR_INVALID_STRING_LENGTH); + + chip::Platform::ScopedMemoryBuffer buffer; + VerifyOrReturnError(buffer.Calloc(size / 2), CHIP_ERROR_NO_MEMORY); + size_t octetCount = chip::Encoding::HexToBytes(value.asCString() + kPayloadHexPrefixLen, size - kPayloadHexPrefixLen, + buffer.Get(), (size - kPayloadHexPrefixLen) / 2); + VerifyOrReturnError(octetCount != 0, CHIP_ERROR_NO_MEMORY); + + return chip::app::DataModel::Encode(*writer, tag, chip::ByteSpan(buffer.Get(), octetCount)); + } + + static CHIP_ERROR PutCharString(chip::TLV::TLVWriter * writer, chip::TLV::Tag tag, Json::Value & value) + { + size_t size = strlen(value.asCString()); + + chip::Platform::ScopedMemoryBuffer buffer; + VerifyOrReturnError(buffer.Calloc(size), CHIP_ERROR_NO_MEMORY); + strncpy(buffer.Get(), value.asCString(), size); + + return chip::app::DataModel::Encode(*writer, tag, chip::CharSpan(buffer.Get(), size)); + } + + static CHIP_ERROR PutUnsignedFromString(chip::TLV::TLVWriter * writer, chip::TLV::Tag tag, Json::Value & value) + { + size_t size = strlen(value.asCString()); + char numberAsString[21]; + + chip::Platform::ScopedMemoryBuffer buffer; + strncpy(numberAsString, value.asCString() + kPayloadUnkPayloadSignedPrefixLen, size - kPayloadUnkPayloadSignedPrefixLen); + + auto numberAsUint = std::stoull(numberAsString, nullptr, 0); + return chip::app::DataModel::Encode(*writer, tag, static_cast(numberAsUint)); + } + + static CHIP_ERROR PutSignedFromString(chip::TLV::TLVWriter * writer, chip::TLV::Tag tag, Json::Value & value) + { + size_t size = strlen(value.asCString()); + char numberAsString[21]; + + chip::Platform::ScopedMemoryBuffer buffer; + strncpy(numberAsString, value.asCString() + kPayloadSignedPrefixLen, size - kPayloadSignedPrefixLen); + + auto numberAsInt = std::stoll(numberAsString, nullptr, 0); + return chip::app::DataModel::Encode(*writer, tag, static_cast(numberAsInt)); + } + + static bool IsOctetString(Json::Value & value) + { + return (strncmp(value.asCString(), kPayloadHexPrefix, kPayloadHexPrefixLen) == 0); + } + + static bool IsUnsignedNumberPrefix(Json::Value & value) + { + return (strncmp(value.asCString(), kPayloadUnkPayloadSignedPrefix, kPayloadUnkPayloadSignedPrefixLen) == 0); + } + + static bool IsSignedNumberPrefix(Json::Value & value) + { + return (strncmp(value.asCString(), kPayloadSignedPrefix, kPayloadSignedPrefixLen) == 0); + } +}; + +class CustomArgument +{ +public: + ~CustomArgument() + { + if (mData != nullptr) + { + chip::Platform::MemoryFree(mData); + } + } + + CHIP_ERROR Parse(const char * label, const char * json) + { + Json::Reader reader; + Json::Value value; + reader.parse(json, value); + + mData = static_cast(chip::Platform::MemoryCalloc(sizeof(uint8_t), mDataMaxLen)); + VerifyOrReturnError(mData != nullptr, CHIP_ERROR_NO_MEMORY); + + chip::TLV::TLVWriter writer; + writer.Init(mData, mDataMaxLen); + + ReturnErrorOnFailure(CustomArgumentParser::Put(&writer, chip::TLV::AnonymousTag(), value)); + + mDataLen = writer.GetLengthWritten(); + return writer.Finalize(); + } + + CHIP_ERROR Encode(chip::TLV::TLVWriter & writer, chip::TLV::Tag tag) const + { + chip::TLV::TLVReader reader; + reader.Init(mData, mDataLen); + reader.Next(); + + return writer.CopyElement(tag, reader); + } + +private: + uint8_t * mData = nullptr; + uint32_t mDataLen = 0; + static constexpr uint32_t mDataMaxLen = 4096; +}; diff --git a/examples/chip-tool/commands/clusters/WriteAttributeCommand.h b/examples/chip-tool/commands/clusters/WriteAttributeCommand.h index eb0174d565c3ac..2accb3d40061a6 100644 --- a/examples/chip-tool/commands/clusters/WriteAttributeCommand.h +++ b/examples/chip-tool/commands/clusters/WriteAttributeCommand.h @@ -26,6 +26,23 @@ class WriteAttribute : public ModelCommand, public chip::app::WriteClient::Callback { public: + WriteAttribute() : ModelCommand("write-by-id") + { + AddArgument("cluster-id", 0, UINT32_MAX, &mClusterId); + AddArgument("attribute-id", 0, UINT32_MAX, &mAttributeId); + AddArgument("attribute-value", &mAttributeValue); + AddArgument("timedInteractionTimeoutMs", 0, UINT16_MAX, &mTimedInteractionTimeoutMs); + ModelCommand::AddArguments(); + } + + WriteAttribute(chip::ClusterId clusterId) : ModelCommand("write-by-id"), mClusterId(clusterId) + { + AddArgument("attribute-id", 0, UINT32_MAX, &mAttributeId); + AddArgument("attribute-value", &mAttributeValue); + AddArgument("timedInteractionTimeoutMs", 0, UINT16_MAX, &mTimedInteractionTimeoutMs); + ModelCommand::AddArguments(); + } + WriteAttribute(const char * attributeName) : ModelCommand("write") { AddArgument("timedInteractionTimeoutMs", 0, UINT16_MAX, &mTimedInteractionTimeoutMs); @@ -33,6 +50,11 @@ class WriteAttribute : public ModelCommand, public chip::app::WriteClient::Callb ~WriteAttribute() {} + CHIP_ERROR SendCommand(ChipDevice * device, chip::EndpointId endpointId) override + { + return WriteAttribute::SendCommand(device, endpointId, mClusterId, mAttributeId, mAttributeValue); + } + /////////// WriteClient Callback Interface ///////// void OnResponse(const chip::app::WriteClient * client, const chip::app::ConcreteAttributePath & path, chip::app::StatusIB status) override @@ -79,7 +101,10 @@ class WriteAttribute : public ModelCommand, public chip::app::WriteClient::Callb } private: + chip::ClusterId mClusterId; + chip::AttributeId mAttributeId; chip::Optional mTimedInteractionTimeoutMs; + CustomArgument mAttributeValue; std::unique_ptr mWriteClient; }; diff --git a/examples/chip-tool/commands/common/Command.cpp b/examples/chip-tool/commands/common/Command.cpp index 4f91b7301911f9..af595d4aaf20f6 100644 --- a/examples/chip-tool/commands/common/Command.cpp +++ b/examples/chip-tool/commands/common/Command.cpp @@ -188,6 +188,11 @@ bool Command::InitArgument(size_t argIndex, char * argValue) return CHIP_NO_ERROR == complexArgument->Parse(arg.name, argValue); } + case ArgumentType::Custom: { + auto customArgument = static_cast(arg.value); + return CHIP_NO_ERROR == customArgument->Parse(arg.name, argValue); + } + case ArgumentType::Attribute: { if (arg.isOptional() || arg.isNullable()) { @@ -495,6 +500,17 @@ size_t Command::AddArgument(const char * name, ComplexArgument * value) return AddArgumentToList(std::move(arg)); } +size_t Command::AddArgument(const char * name, CustomArgument * value) +{ + Argument arg; + arg.type = ArgumentType::Custom; + arg.name = name; + arg.value = const_cast(reinterpret_cast(value)); + arg.flags = 0; + + return AddArgumentToList(std::move(arg)); +} + size_t Command::AddArgument(const char * name, float min, float max, float * out, uint8_t flags) { Argument arg; diff --git a/examples/chip-tool/commands/common/Command.h b/examples/chip-tool/commands/common/Command.h index 9fc024e2952ed0..1d0965957cd730 100644 --- a/examples/chip-tool/commands/common/Command.h +++ b/examples/chip-tool/commands/common/Command.h @@ -20,6 +20,7 @@ #include #include +#include #include #include #include @@ -67,7 +68,8 @@ enum ArgumentType OctetString, Attribute, Address, - Complex + Complex, + Custom }; struct Argument @@ -127,6 +129,7 @@ class Command size_t AddArgument(const char * name, chip::Span * value, uint8_t flags = 0); size_t AddArgument(const char * name, AddressWithInterface * out, uint8_t flags = 0); size_t AddArgument(const char * name, ComplexArgument * value); + size_t AddArgument(const char * name, CustomArgument * value); size_t AddArgument(const char * name, int64_t min, uint64_t max, bool * out, uint8_t flags = 0) { return AddArgument(name, min, max, reinterpret_cast(out), Boolean, flags); diff --git a/examples/chip-tool/templates/commands.zapt b/examples/chip-tool/templates/commands.zapt index 7f0e521f77e6ee..f3f2cb04e16907 100644 --- a/examples/chip-tool/templates/commands.zapt +++ b/examples/chip-tool/templates/commands.zapt @@ -118,6 +118,7 @@ void registerCluster{{asUpperCamelCase name}}(Commands & commands) // // Commands // + make_unique(Id), // {{#chip_cluster_commands}} make_unique<{{asUpperCamelCase clusterName}}{{asUpperCamelCase name}}>(), // {{/chip_cluster_commands}} @@ -128,6 +129,7 @@ void registerCluster{{asUpperCamelCase name}}(Commands & commands) {{#chip_server_cluster_attributes}} make_unique(Id, "{{asDelimitedCommand (asUpperCamelCase name)}}", Attributes::{{asUpperCamelCase name}}::Id), // {{/chip_server_cluster_attributes}} + make_unique(Id), // {{#chip_server_cluster_attributes}} {{! TODO: Various types (floats, structs) not supported here. }} {{#unless (isStrEqual chipCallback.name "Unsupported")}} @@ -164,7 +166,9 @@ void registerClusterAny(Commands & commands) const char * clusterName = "Any"; commands_list clusterCommands = { + make_unique(), // make_unique(), // + make_unique(), // make_unique(), // make_unique(), // make_unique(), // diff --git a/zzz_generated/chip-tool/zap-generated/cluster/Commands.h b/zzz_generated/chip-tool/zap-generated/cluster/Commands.h index 2c36446ad0fd69..991dc46773ba26 100644 --- a/zzz_generated/chip-tool/zap-generated/cluster/Commands.h +++ b/zzz_generated/chip-tool/zap-generated/cluster/Commands.h @@ -8613,6 +8613,7 @@ void registerClusterAccessControl(Commands & commands) // // Commands // + make_unique(Id), // // // Attributes // @@ -8621,6 +8622,7 @@ void registerClusterAccessControl(Commands & commands) make_unique(Id, "extension", Attributes::Extension::Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(), // make_unique(), // make_unique(Id), // @@ -8651,6 +8653,7 @@ void registerClusterAccountLogin(Commands & commands) // // Commands // + make_unique(Id), // make_unique(), // make_unique(), // make_unique(), // @@ -8660,6 +8663,7 @@ void registerClusterAccountLogin(Commands & commands) make_unique(Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // @@ -8682,6 +8686,7 @@ void registerClusterAdministratorCommissioning(Commands & commands) // // Commands // + make_unique(Id), // make_unique(), // make_unique(), // make_unique(), // @@ -8694,6 +8699,7 @@ void registerClusterAdministratorCommissioning(Commands & commands) make_unique(Id, "admin-vendor-id", Attributes::AdminVendorId::Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(Id), // make_unique(Id, "window-status", Attributes::WindowStatus::Id), // make_unique(Id, "admin-fabric-index", Attributes::AdminFabricIndex::Id), // @@ -8719,6 +8725,7 @@ void registerClusterApplicationBasic(Commands & commands) // // Commands // + make_unique(Id), // // // Attributes // @@ -8733,6 +8740,7 @@ void registerClusterApplicationBasic(Commands & commands) make_unique(Id, "allowed-vendor-list", Attributes::AllowedVendorList::Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(Id), // make_unique(Id, "vendor-name", Attributes::VendorName::Id), // make_unique(Id, "vendor-id", Attributes::VendorId::Id), // @@ -8763,6 +8771,7 @@ void registerClusterApplicationLauncher(Commands & commands) // // Commands // + make_unique(Id), // make_unique(), // make_unique(), // make_unique(), // @@ -8773,6 +8782,7 @@ void registerClusterApplicationLauncher(Commands & commands) make_unique(Id, "application-launcher-list", Attributes::ApplicationLauncherList::Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(Id), // make_unique(Id, "application-launcher-list", Attributes::ApplicationLauncherList::Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // @@ -8796,6 +8806,7 @@ void registerClusterAudioOutput(Commands & commands) // // Commands // + make_unique(Id), // make_unique(), // make_unique(), // // @@ -8806,6 +8817,7 @@ void registerClusterAudioOutput(Commands & commands) make_unique(Id, "current-audio-output", Attributes::CurrentAudioOutput::Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(Id), // make_unique(Id, "audio-output-list", Attributes::AudioOutputList::Id), // make_unique(Id, "current-audio-output", Attributes::CurrentAudioOutput::Id), // @@ -8830,6 +8842,7 @@ void registerClusterBarrierControl(Commands & commands) // // Commands // + make_unique(Id), // make_unique(), // make_unique(), // // @@ -8842,6 +8855,7 @@ void registerClusterBarrierControl(Commands & commands) make_unique(Id, "barrier-position", Attributes::BarrierPosition::Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(Id), // make_unique(Id, "barrier-moving-state", Attributes::BarrierMovingState::Id), // make_unique(Id, "barrier-safety-status", Attributes::BarrierSafetyStatus::Id), // @@ -8868,6 +8882,7 @@ void registerClusterBasic(Commands & commands) // // Commands // + make_unique(Id), // // // Attributes // @@ -8893,6 +8908,7 @@ void registerClusterBasic(Commands & commands) make_unique(Id, "unique-id", Attributes::UniqueID::Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(), // make_unique(), // make_unique(), // @@ -8945,6 +8961,7 @@ void registerClusterBinaryInputBasic(Commands & commands) // // Commands // + make_unique(Id), // // // Attributes // @@ -8954,6 +8971,7 @@ void registerClusterBinaryInputBasic(Commands & commands) make_unique(Id, "status-flags", Attributes::StatusFlags::Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(), // make_unique(), // make_unique(Id), // @@ -8981,14 +8999,16 @@ void registerClusterBinding(Commands & commands) // // Commands // - make_unique(), // - make_unique(), // + make_unique(Id), // + make_unique(), // + make_unique(), // // // Attributes // make_unique(Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // @@ -9011,6 +9031,7 @@ void registerClusterBooleanState(Commands & commands) // // Commands // + make_unique(Id), // // // Attributes // @@ -9018,6 +9039,7 @@ void registerClusterBooleanState(Commands & commands) make_unique(Id, "state-value", Attributes::StateValue::Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(Id), // make_unique(Id, "state-value", Attributes::StateValue::Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // @@ -9043,6 +9065,7 @@ void registerClusterBridgedActions(Commands & commands) // // Commands // + make_unique(Id), // make_unique(), // make_unique(), // make_unique(), // @@ -9064,6 +9087,7 @@ void registerClusterBridgedActions(Commands & commands) make_unique(Id, "setup-url", Attributes::SetupUrl::Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(Id), // make_unique(Id, "action-list", Attributes::ActionList::Id), // make_unique(Id, "endpoint-list", Attributes::EndpointList::Id), // @@ -9093,12 +9117,14 @@ void registerClusterBridgedDeviceBasic(Commands & commands) // // Commands // + make_unique(Id), // // // Attributes // make_unique(Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // @@ -9121,6 +9147,7 @@ void registerClusterChannel(Commands & commands) // // Commands // + make_unique(Id), // make_unique(), // make_unique(), // make_unique(), // @@ -9131,6 +9158,7 @@ void registerClusterChannel(Commands & commands) make_unique(Id, "channel-list", Attributes::ChannelList::Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(Id), // make_unique(Id, "channel-list", Attributes::ChannelList::Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // @@ -9154,6 +9182,7 @@ void registerClusterColorControl(Commands & commands) // // Commands // + make_unique(Id), // make_unique(), // make_unique(), // make_unique(), // @@ -9231,6 +9260,7 @@ void registerClusterColorControl(Commands & commands) make_unique(Id, "start-up-color-temperature-mireds", Attributes::StartUpColorTemperatureMireds::Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(), // make_unique(), // make_unique(), // @@ -9319,6 +9349,7 @@ void registerClusterContentLauncher(Commands & commands) // // Commands // + make_unique(Id), // make_unique(), // make_unique(), // // @@ -9329,6 +9360,7 @@ void registerClusterContentLauncher(Commands & commands) make_unique(Id, "supported-streaming-protocols", Attributes::SupportedStreamingProtocols::Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(), // make_unique(Id), // make_unique(Id, "accept-header-list", Attributes::AcceptHeaderList::Id), // @@ -9354,6 +9386,7 @@ void registerClusterDescriptor(Commands & commands) // // Commands // + make_unique(Id), // // // Attributes // @@ -9364,6 +9397,7 @@ void registerClusterDescriptor(Commands & commands) make_unique(Id, "parts-list", Attributes::PartsList::Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(Id), // make_unique(Id, "device-list", Attributes::DeviceList::Id), // make_unique(Id, "server-list", Attributes::ServerList::Id), // @@ -9390,12 +9424,14 @@ void registerClusterDiagnosticLogs(Commands & commands) // // Commands // + make_unique(Id), // make_unique(), // // // Attributes // make_unique(Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // + make_unique(Id), // make_unique(Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // // @@ -9417,6 +9453,7 @@ void registerClusterDoorLock(Commands & commands) // // Commands // + make_unique(Id), // make_unique(), // make_unique(), // make_unique(), // @@ -9450,6 +9487,7 @@ void registerClusterDoorLock(Commands & commands) make_unique(Id, "wrong-code-entry-limit", Attributes::WrongCodeEntryLimit::Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(), // make_unique(), // make_unique(), // @@ -9508,6 +9546,7 @@ void registerClusterElectricalMeasurement(Commands & commands) // // Commands // + make_unique(Id), // // // Attributes // @@ -9525,6 +9564,7 @@ void registerClusterElectricalMeasurement(Commands & commands) make_unique(Id, "active-power-max", Attributes::ActivePowerMax::Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(Id), // make_unique(Id, "measurement-type", Attributes::MeasurementType::Id), // make_unique(Id, "total-active-power", Attributes::TotalActivePower::Id), // @@ -9558,6 +9598,7 @@ void registerClusterEthernetNetworkDiagnostics(Commands & commands) // // Commands // + make_unique(Id), // make_unique(), // // // Attributes @@ -9575,6 +9616,7 @@ void registerClusterEthernetNetworkDiagnostics(Commands & commands) make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "feature-map", Attributes::FeatureMap::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(Id), // make_unique(Id, "phyrate", Attributes::PHYRate::Id), // make_unique(Id, "full-duplex", Attributes::FullDuplex::Id), // @@ -9607,6 +9649,7 @@ void registerClusterFixedLabel(Commands & commands) // // Commands // + make_unique(Id), // // // Attributes // @@ -9614,6 +9657,7 @@ void registerClusterFixedLabel(Commands & commands) make_unique(Id, "label-list", Attributes::LabelList::Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(Id), // make_unique(Id, "label-list", Attributes::LabelList::Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // @@ -9637,6 +9681,7 @@ void registerClusterFlowMeasurement(Commands & commands) // // Commands // + make_unique(Id), // // // Attributes // @@ -9647,6 +9692,7 @@ void registerClusterFlowMeasurement(Commands & commands) make_unique(Id, "tolerance", Attributes::Tolerance::Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(Id), // make_unique(Id, "measured-value", Attributes::MeasuredValue::Id), // make_unique(Id, "min-measured-value", Attributes::MinMeasuredValue::Id), // @@ -9673,6 +9719,7 @@ void registerClusterGeneralCommissioning(Commands & commands) // // Commands // + make_unique(Id), // make_unique(), // make_unique(), // make_unique(), // @@ -9686,6 +9733,7 @@ void registerClusterGeneralCommissioning(Commands & commands) make_unique(Id, "location-capability", Attributes::LocationCapability::Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(), // make_unique(Id), // make_unique(Id, "breadcrumb", Attributes::Breadcrumb::Id), // @@ -9713,6 +9761,7 @@ void registerClusterGeneralDiagnostics(Commands & commands) // // Commands // + make_unique(Id), // // // Attributes // @@ -9727,6 +9776,7 @@ void registerClusterGeneralDiagnostics(Commands & commands) make_unique(Id, "active-network-faults", Attributes::ActiveNetworkFaults::Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(Id), // make_unique(Id, "network-interfaces", Attributes::NetworkInterfaces::Id), // make_unique(Id, "reboot-count", Attributes::RebootCount::Id), // @@ -9765,6 +9815,7 @@ void registerClusterGroupKeyManagement(Commands & commands) // // Commands // + make_unique(Id), // make_unique(), // make_unique(), // make_unique(), // @@ -9779,6 +9830,7 @@ void registerClusterGroupKeyManagement(Commands & commands) make_unique(Id, "max-group-keys-per-fabric", Attributes::MaxGroupKeysPerFabric::Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(Id), // make_unique(Id, "group-key-map", Attributes::GroupKeyMap::Id), // make_unique(Id, "group-table", Attributes::GroupTable::Id), // @@ -9805,6 +9857,7 @@ void registerClusterGroups(Commands & commands) // // Commands // + make_unique(Id), // make_unique(), // make_unique(), // make_unique(), // @@ -9818,6 +9871,7 @@ void registerClusterGroups(Commands & commands) make_unique(Id, "name-support", Attributes::NameSupport::Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(Id), // make_unique(Id, "name-support", Attributes::NameSupport::Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // @@ -9841,6 +9895,7 @@ void registerClusterIdentify(Commands & commands) // // Commands // + make_unique(Id), // make_unique(), // make_unique(), // make_unique(), // @@ -9852,6 +9907,7 @@ void registerClusterIdentify(Commands & commands) make_unique(Id, "identify-type", Attributes::IdentifyType::Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(), // make_unique(Id), // make_unique(Id, "identify-time", Attributes::IdentifyTime::Id), // @@ -9877,6 +9933,7 @@ void registerClusterIlluminanceMeasurement(Commands & commands) // // Commands // + make_unique(Id), // // // Attributes // @@ -9888,6 +9945,7 @@ void registerClusterIlluminanceMeasurement(Commands & commands) make_unique(Id, "light-sensor-type", Attributes::LightSensorType::Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(Id), // make_unique(Id, "measured-value", Attributes::MeasuredValue::Id), // make_unique(Id, "min-measured-value", Attributes::MinMeasuredValue::Id), // @@ -9915,6 +9973,7 @@ void registerClusterKeypadInput(Commands & commands) // // Commands // + make_unique(Id), // make_unique(), // // // Attributes @@ -9922,6 +9981,7 @@ void registerClusterKeypadInput(Commands & commands) make_unique(Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // @@ -9944,6 +10004,7 @@ void registerClusterLevelControl(Commands & commands) // // Commands // + make_unique(Id), // make_unique(), // make_unique(), // make_unique(), // @@ -9973,6 +10034,7 @@ void registerClusterLevelControl(Commands & commands) make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "feature-map", Attributes::FeatureMap::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(), // make_unique(), // make_unique(), // @@ -10017,6 +10079,7 @@ void registerClusterLocalizationConfiguration(Commands & commands) // // Commands // + make_unique(Id), // // // Attributes // @@ -10024,6 +10087,7 @@ void registerClusterLocalizationConfiguration(Commands & commands) make_unique(Id, "active-locale", Attributes::ActiveLocale::Id), // make_unique(Id, "supported-locales", Attributes::SupportedLocales::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(), // make_unique(Id), // make_unique(Id, "active-locale", Attributes::ActiveLocale::Id), // @@ -10048,13 +10112,15 @@ void registerClusterLowPower(Commands & commands) // // Commands // - make_unique(), // + make_unique(Id), // + make_unique(), // // // Attributes // make_unique(Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // @@ -10077,6 +10143,7 @@ void registerClusterMediaInput(Commands & commands) // // Commands // + make_unique(Id), // make_unique(), // make_unique(), // make_unique(), // @@ -10089,6 +10156,7 @@ void registerClusterMediaInput(Commands & commands) make_unique(Id, "current-media-input", Attributes::CurrentMediaInput::Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(Id), // make_unique(Id, "media-input-list", Attributes::MediaInputList::Id), // make_unique(Id, "current-media-input", Attributes::CurrentMediaInput::Id), // @@ -10113,6 +10181,7 @@ void registerClusterMediaPlayback(Commands & commands) // // Commands // + make_unique(Id), // make_unique(), // make_unique(), // make_unique(), // @@ -10136,6 +10205,7 @@ void registerClusterMediaPlayback(Commands & commands) make_unique(Id, "seek-range-start", Attributes::SeekRangeStart::Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(Id), // make_unique(Id, "playback-state", Attributes::PlaybackState::Id), // make_unique(Id, "start-time", Attributes::StartTime::Id), // @@ -10164,6 +10234,7 @@ void registerClusterModeSelect(Commands & commands) // // Commands // + make_unique(Id), // make_unique(), // // // Attributes @@ -10176,6 +10247,7 @@ void registerClusterModeSelect(Commands & commands) make_unique(Id, "description", Attributes::Description::Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(), // make_unique(Id), // make_unique(Id, "current-mode", Attributes::CurrentMode::Id), // @@ -10204,6 +10276,7 @@ void registerClusterNetworkCommissioning(Commands & commands) // // Commands // + make_unique(Id), // make_unique(), // make_unique(), // make_unique(), // @@ -10224,6 +10297,7 @@ void registerClusterNetworkCommissioning(Commands & commands) make_unique(Id, "last-connect-error-value", Attributes::LastConnectErrorValue::Id), // make_unique(Id, "feature-map", Attributes::FeatureMap::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(), // make_unique(Id), // make_unique(Id, "max-networks", Attributes::MaxNetworks::Id), // @@ -10255,6 +10329,7 @@ void registerClusterOtaSoftwareUpdateProvider(Commands & commands) // // Commands // + make_unique(Id), // make_unique(), // make_unique(), // make_unique(), // @@ -10264,6 +10339,7 @@ void registerClusterOtaSoftwareUpdateProvider(Commands & commands) make_unique(Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // @@ -10286,6 +10362,7 @@ void registerClusterOtaSoftwareUpdateRequestor(Commands & commands) // // Commands // + make_unique(Id), // make_unique(), // // // Attributes @@ -10297,6 +10374,7 @@ void registerClusterOtaSoftwareUpdateRequestor(Commands & commands) make_unique(Id, "update-state-progress", Attributes::UpdateStateProgress::Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(), // make_unique(Id), // make_unique(Id, "default-ota-providers", Attributes::DefaultOtaProviders::Id), // @@ -10330,6 +10408,7 @@ void registerClusterOccupancySensing(Commands & commands) // // Commands // + make_unique(Id), // // // Attributes // @@ -10339,6 +10418,7 @@ void registerClusterOccupancySensing(Commands & commands) make_unique(Id, "occupancy-sensor-type-bitmap", Attributes::OccupancySensorTypeBitmap::Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(Id), // make_unique(Id, "occupancy", Attributes::Occupancy::Id), // make_unique(Id, "occupancy-sensor-type", Attributes::OccupancySensorType::Id), // @@ -10364,6 +10444,7 @@ void registerClusterOnOff(Commands & commands) // // Commands // + make_unique(Id), // make_unique(), // make_unique(), // make_unique(), // @@ -10382,6 +10463,7 @@ void registerClusterOnOff(Commands & commands) make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "feature-map", Attributes::FeatureMap::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(), // make_unique(), // make_unique(), // @@ -10413,6 +10495,7 @@ void registerClusterOnOffSwitchConfiguration(Commands & commands) // // Commands // + make_unique(Id), // // // Attributes // @@ -10421,6 +10504,7 @@ void registerClusterOnOffSwitchConfiguration(Commands & commands) make_unique(Id, "switch-actions", Attributes::SwitchActions::Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(), // make_unique(Id), // make_unique(Id, "switch-type", Attributes::SwitchType::Id), // @@ -10446,6 +10530,7 @@ void registerClusterOperationalCredentials(Commands & commands) // // Commands // + make_unique(Id), // make_unique(), // make_unique(), // make_unique(), // @@ -10467,6 +10552,7 @@ void registerClusterOperationalCredentials(Commands & commands) make_unique(Id, "current-fabric-index", Attributes::CurrentFabricIndex::Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(Id), // make_unique(Id, "nocs", Attributes::NOCs::Id), // make_unique(Id, "fabrics-list", Attributes::FabricsList::Id), // @@ -10495,6 +10581,7 @@ void registerClusterPowerSource(Commands & commands) // // Commands // + make_unique(Id), // // // Attributes // @@ -10511,6 +10598,7 @@ void registerClusterPowerSource(Commands & commands) make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "feature-map", Attributes::FeatureMap::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(Id), // make_unique(Id, "status", Attributes::Status::Id), // make_unique(Id, "order", Attributes::Order::Id), // @@ -10543,6 +10631,7 @@ void registerClusterPowerSourceConfiguration(Commands & commands) // // Commands // + make_unique(Id), // // // Attributes // @@ -10550,6 +10639,7 @@ void registerClusterPowerSourceConfiguration(Commands & commands) make_unique(Id, "sources", Attributes::Sources::Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(Id), // make_unique(Id, "sources", Attributes::Sources::Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // @@ -10573,6 +10663,7 @@ void registerClusterPressureMeasurement(Commands & commands) // // Commands // + make_unique(Id), // // // Attributes // @@ -10582,6 +10673,7 @@ void registerClusterPressureMeasurement(Commands & commands) make_unique(Id, "max-measured-value", Attributes::MaxMeasuredValue::Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(Id), // make_unique(Id, "measured-value", Attributes::MeasuredValue::Id), // make_unique(Id, "min-measured-value", Attributes::MinMeasuredValue::Id), // @@ -10607,6 +10699,7 @@ void registerClusterPumpConfigurationAndControl(Commands & commands) // // Commands // + make_unique(Id), // // // Attributes // @@ -10638,6 +10731,7 @@ void registerClusterPumpConfigurationAndControl(Commands & commands) make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "feature-map", Attributes::FeatureMap::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(), // make_unique(), // make_unique(), // @@ -10723,6 +10817,7 @@ void registerClusterRelativeHumidityMeasurement(Commands & commands) // // Commands // + make_unique(Id), // // // Attributes // @@ -10733,6 +10828,7 @@ void registerClusterRelativeHumidityMeasurement(Commands & commands) make_unique(Id, "tolerance", Attributes::Tolerance::Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(Id), // make_unique(Id, "measured-value", Attributes::MeasuredValue::Id), // make_unique(Id, "min-measured-value", Attributes::MinMeasuredValue::Id), // @@ -10759,6 +10855,7 @@ void registerClusterScenes(Commands & commands) // // Commands // + make_unique(Id), // make_unique(), // make_unique(), // make_unique(), // @@ -10777,6 +10874,7 @@ void registerClusterScenes(Commands & commands) make_unique(Id, "name-support", Attributes::NameSupport::Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(Id), // make_unique(Id, "scene-count", Attributes::SceneCount::Id), // make_unique(Id, "current-scene", Attributes::CurrentScene::Id), // @@ -10804,6 +10902,7 @@ void registerClusterSoftwareDiagnostics(Commands & commands) // // Commands // + make_unique(Id), // make_unique(), // // // Attributes @@ -10816,6 +10915,7 @@ void registerClusterSoftwareDiagnostics(Commands & commands) make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "feature-map", Attributes::FeatureMap::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(Id), // make_unique(Id, "thread-metrics", Attributes::ThreadMetrics::Id), // make_unique(Id, "current-heap-free", Attributes::CurrentHeapFree::Id), // @@ -10845,6 +10945,7 @@ void registerClusterSwitch(Commands & commands) // // Commands // + make_unique(Id), // // // Attributes // @@ -10855,6 +10956,7 @@ void registerClusterSwitch(Commands & commands) make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "feature-map", Attributes::FeatureMap::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(Id), // make_unique(Id, "number-of-positions", Attributes::NumberOfPositions::Id), // make_unique(Id, "current-position", Attributes::CurrentPosition::Id), // @@ -10895,6 +10997,7 @@ void registerClusterTargetNavigator(Commands & commands) // // Commands // + make_unique(Id), // make_unique(), // // // Attributes @@ -10904,6 +11007,7 @@ void registerClusterTargetNavigator(Commands & commands) make_unique(Id, "current-navigator-target", Attributes::CurrentNavigatorTarget::Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(Id), // make_unique(Id, "target-navigator-list", Attributes::TargetNavigatorList::Id), // make_unique(Id, "current-navigator-target", Attributes::CurrentNavigatorTarget::Id), // @@ -10928,6 +11032,7 @@ void registerClusterTemperatureMeasurement(Commands & commands) // // Commands // + make_unique(Id), // // // Attributes // @@ -10938,6 +11043,7 @@ void registerClusterTemperatureMeasurement(Commands & commands) make_unique(Id, "tolerance", Attributes::Tolerance::Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(Id), // make_unique(Id, "measured-value", Attributes::MeasuredValue::Id), // make_unique(Id, "min-measured-value", Attributes::MinMeasuredValue::Id), // @@ -10964,6 +11070,7 @@ void registerClusterTestCluster(Commands & commands) // // Commands // + make_unique(Id), // make_unique(), // make_unique(), // make_unique(), // @@ -11068,6 +11175,7 @@ void registerClusterTestCluster(Commands & commands) make_unique(Id, "nullable-range-restricted-int16s", Attributes::NullableRangeRestrictedInt16s::Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(), // make_unique(), // make_unique(), // @@ -11252,6 +11360,7 @@ void registerClusterThermostat(Commands & commands) // // Commands // + make_unique(Id), // make_unique(), // make_unique(), // make_unique(), // @@ -11281,6 +11390,7 @@ void registerClusterThermostat(Commands & commands) make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "feature-map", Attributes::FeatureMap::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(), // make_unique(), // make_unique(), // @@ -11330,6 +11440,7 @@ void registerClusterThermostatUserInterfaceConfiguration(Commands & commands) // // Commands // + make_unique(Id), // // // Attributes // @@ -11339,6 +11450,7 @@ void registerClusterThermostatUserInterfaceConfiguration(Commands & commands) make_unique(Id, "schedule-programming-visibility", Attributes::ScheduleProgrammingVisibility::Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(), // make_unique(), // make_unique(), // @@ -11367,6 +11479,7 @@ void registerClusterThreadNetworkDiagnostics(Commands & commands) // // Commands // + make_unique(Id), // make_unique(), // // // Attributes @@ -11439,6 +11552,7 @@ void registerClusterThreadNetworkDiagnostics(Commands & commands) make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "feature-map", Attributes::FeatureMap::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(Id), // make_unique(Id, "channel", Attributes::Channel::Id), // make_unique(Id, "routing-role", Attributes::RoutingRole::Id), // @@ -11528,6 +11642,7 @@ void registerClusterTimeFormatLocalization(Commands & commands) // // Commands // + make_unique(Id), // // // Attributes // @@ -11536,6 +11651,7 @@ void registerClusterTimeFormatLocalization(Commands & commands) make_unique(Id, "active-calendar-type", Attributes::ActiveCalendarType::Id), // make_unique(Id, "supported-calendar-types", Attributes::SupportedCalendarTypes::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(), // make_unique(), // make_unique(Id), // @@ -11562,6 +11678,7 @@ void registerClusterUnitLocalization(Commands & commands) // // Commands // + make_unique(Id), // // // Attributes // @@ -11569,6 +11686,7 @@ void registerClusterUnitLocalization(Commands & commands) make_unique(Id, "temperature-unit", Attributes::TemperatureUnit::Id), // make_unique(Id, "feature-map", Attributes::FeatureMap::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(), // make_unique(Id), // make_unique(Id, "temperature-unit", Attributes::TemperatureUnit::Id), // @@ -11593,12 +11711,14 @@ void registerClusterUserLabel(Commands & commands) // // Commands // + make_unique(Id), // // // Attributes // make_unique(Id), // make_unique(Id, "label-list", Attributes::LabelList::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(), // make_unique(Id), // make_unique(Id, "label-list", Attributes::LabelList::Id), // @@ -11622,6 +11742,7 @@ void registerClusterWakeOnLan(Commands & commands) // // Commands // + make_unique(Id), // // // Attributes // @@ -11629,6 +11750,7 @@ void registerClusterWakeOnLan(Commands & commands) make_unique(Id, "wake-on-lan-mac-address", Attributes::WakeOnLanMacAddress::Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(Id), // make_unique(Id, "wake-on-lan-mac-address", Attributes::WakeOnLanMacAddress::Id), // make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // @@ -11652,6 +11774,7 @@ void registerClusterWiFiNetworkDiagnostics(Commands & commands) // // Commands // + make_unique(Id), // make_unique(), // // // Attributes @@ -11673,6 +11796,7 @@ void registerClusterWiFiNetworkDiagnostics(Commands & commands) make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "feature-map", Attributes::FeatureMap::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(Id), // make_unique(Id, "bssid", Attributes::Bssid::Id), // make_unique(Id, "security-type", Attributes::SecurityType::Id), // @@ -11715,6 +11839,7 @@ void registerClusterWindowCovering(Commands & commands) // // Commands // + make_unique(Id), // make_unique(), // make_unique(), // make_unique(), // @@ -11747,6 +11872,7 @@ void registerClusterWindowCovering(Commands & commands) make_unique(Id, "attribute-list", Attributes::AttributeList::Id), // make_unique(Id, "feature-map", Attributes::FeatureMap::Id), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id), // + make_unique(Id), // make_unique(), // make_unique(Id), // make_unique(Id, "type", Attributes::Type::Id), // @@ -11789,7 +11915,9 @@ void registerClusterAny(Commands & commands) const char * clusterName = "Any"; commands_list clusterCommands = { + make_unique(), // make_unique(), // + make_unique(), // make_unique(), // make_unique(), // make_unique(), //