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

// THIS FILE IS GENERATED BY ZAP

#include <commands/clusters/DataModelLogger.h>

using namespace chip::app::Clusters;

CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const chip::app::Clusters::Scenes::Structs::AttributeValuePair::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("AttributeID", indent + 1, value.attributeID);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'AttributeID'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("AttributeValue", indent + 1, value.attributeValue);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'AttributeValue'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const chip::app::Clusters::Scenes::Structs::ExtensionFieldSet::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("ClusterID", indent + 1, value.clusterID);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'ClusterID'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("AttributeValueList", indent + 1, value.attributeValueList);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'AttributeValueList'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const chip::app::Clusters::Descriptor::Structs::DeviceTypeStruct::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("DeviceType", indent + 1, value.deviceType);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'DeviceType'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Revision", indent + 1, value.revision);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Revision'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const chip::app::Clusters::Binding::Structs::TargetStruct::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("Node", indent + 1, value.node);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Node'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Group", indent + 1, value.group);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Group'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Endpoint", indent + 1, value.endpoint);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Endpoint'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Cluster", indent + 1, value.cluster);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Cluster'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("FabricIndex", indent + 1, value.fabricIndex);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'FabricIndex'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR
DataModelLogger::LogValue(const char * label, size_t indent,
                          const chip::app::Clusters::AccessControl::Structs::AccessControlTargetStruct::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("Cluster", indent + 1, value.cluster);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Cluster'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Endpoint", indent + 1, value.endpoint);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Endpoint'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("DeviceType", indent + 1, value.deviceType);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'DeviceType'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR
DataModelLogger::LogValue(const char * label, size_t indent,
                          const chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("Privilege", indent + 1, value.privilege);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Privilege'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("AuthMode", indent + 1, value.authMode);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'AuthMode'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Subjects", indent + 1, value.subjects);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Subjects'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Targets", indent + 1, value.targets);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Targets'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("FabricIndex", indent + 1, value.fabricIndex);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'FabricIndex'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR
DataModelLogger::LogValue(const char * label, size_t indent,
                          const chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("Data", indent + 1, value.data);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Data'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("FabricIndex", indent + 1, value.fabricIndex);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'FabricIndex'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const chip::app::Clusters::Actions::Structs::ActionStruct::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("ActionID", indent + 1, value.actionID);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'ActionID'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Name", indent + 1, value.name);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Name'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Type", indent + 1, value.type);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Type'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("EndpointListID", indent + 1, value.endpointListID);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'EndpointListID'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("SupportedCommands", indent + 1, value.supportedCommands);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'SupportedCommands'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("State", indent + 1, value.state);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'State'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const chip::app::Clusters::Actions::Structs::EndpointListStruct::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("EndpointListID", indent + 1, value.endpointListID);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'EndpointListID'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Name", indent + 1, value.name);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Name'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Type", indent + 1, value.type);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Type'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Endpoints", indent + 1, value.endpoints);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Endpoints'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR
DataModelLogger::LogValue(const char * label, size_t indent,
                          const chip::app::Clusters::BasicInformation::Structs::CapabilityMinimaStruct::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("CaseSessionsPerFabric", indent + 1, value.caseSessionsPerFabric);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'CaseSessionsPerFabric'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("SubscriptionsPerFabric", indent + 1, value.subscriptionsPerFabric);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'SubscriptionsPerFabric'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR
DataModelLogger::LogValue(const char * label, size_t indent,
                          const chip::app::Clusters::BasicInformation::Structs::ProductAppearanceStruct::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("Finish", indent + 1, value.finish);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Finish'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("PrimaryColor", indent + 1, value.primaryColor);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'PrimaryColor'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR
DataModelLogger::LogValue(const char * label, size_t indent,
                          const chip::app::Clusters::OtaSoftwareUpdateRequestor::Structs::ProviderLocation::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("ProviderNodeID", indent + 1, value.providerNodeID);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'ProviderNodeID'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Endpoint", indent + 1, value.endpoint);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Endpoint'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("FabricIndex", indent + 1, value.fabricIndex);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'FabricIndex'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR
DataModelLogger::LogValue(const char * label, size_t indent,
                          const chip::app::Clusters::PowerSource::Structs::BatChargeFaultChangeType::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("Current", indent + 1, value.current);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Current'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Previous", indent + 1, value.previous);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Previous'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const chip::app::Clusters::PowerSource::Structs::BatFaultChangeType::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("Current", indent + 1, value.current);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Current'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Previous", indent + 1, value.previous);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Previous'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const chip::app::Clusters::PowerSource::Structs::WiredFaultChangeType::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("Current", indent + 1, value.current);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Current'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Previous", indent + 1, value.previous);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Previous'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR
DataModelLogger::LogValue(const char * label, size_t indent,
                          const chip::app::Clusters::GeneralCommissioning::Structs::BasicCommissioningInfo::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("FailSafeExpiryLengthSeconds", indent + 1, value.failSafeExpiryLengthSeconds);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'FailSafeExpiryLengthSeconds'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("MaxCumulativeFailsafeSeconds", indent + 1, value.maxCumulativeFailsafeSeconds);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'MaxCumulativeFailsafeSeconds'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const chip::app::Clusters::NetworkCommissioning::Structs::NetworkInfo::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("NetworkID", indent + 1, value.networkID);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'NetworkID'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Connected", indent + 1, value.connected);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Connected'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR DataModelLogger::LogValue(
    const char * label, size_t indent,
    const chip::app::Clusters::NetworkCommissioning::Structs::ThreadInterfaceScanResult::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("PanId", indent + 1, value.panId);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'PanId'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("ExtendedPanId", indent + 1, value.extendedPanId);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'ExtendedPanId'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("NetworkName", indent + 1, value.networkName);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'NetworkName'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Channel", indent + 1, value.channel);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Channel'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Version", indent + 1, value.version);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Version'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("ExtendedAddress", indent + 1, value.extendedAddress);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'ExtendedAddress'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Rssi", indent + 1, value.rssi);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Rssi'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Lqi", indent + 1, value.lqi);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Lqi'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR
DataModelLogger::LogValue(const char * label, size_t indent,
                          const chip::app::Clusters::NetworkCommissioning::Structs::WiFiInterfaceScanResult::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("Security", indent + 1, value.security);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Security'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Ssid", indent + 1, value.ssid);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Ssid'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Bssid", indent + 1, value.bssid);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Bssid'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Channel", indent + 1, value.channel);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Channel'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("WiFiBand", indent + 1, value.wiFiBand);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'WiFiBand'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Rssi", indent + 1, value.rssi);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Rssi'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR
DataModelLogger::LogValue(const char * label, size_t indent,
                          const chip::app::Clusters::GeneralDiagnostics::Structs::NetworkInterface::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("Name", indent + 1, value.name);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Name'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("IsOperational", indent + 1, value.isOperational);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'IsOperational'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("OffPremiseServicesReachableIPv4", indent + 1, value.offPremiseServicesReachableIPv4);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'OffPremiseServicesReachableIPv4'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("OffPremiseServicesReachableIPv6", indent + 1, value.offPremiseServicesReachableIPv6);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'OffPremiseServicesReachableIPv6'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("HardwareAddress", indent + 1, value.hardwareAddress);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'HardwareAddress'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("IPv4Addresses", indent + 1, value.IPv4Addresses);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'IPv4Addresses'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("IPv6Addresses", indent + 1, value.IPv6Addresses);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'IPv6Addresses'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Type", indent + 1, value.type);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Type'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR
DataModelLogger::LogValue(const char * label, size_t indent,
                          const chip::app::Clusters::SoftwareDiagnostics::Structs::ThreadMetricsStruct::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("Id", indent + 1, value.id);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Id'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Name", indent + 1, value.name);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Name'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("StackFreeCurrent", indent + 1, value.stackFreeCurrent);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'StackFreeCurrent'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("StackFreeMinimum", indent + 1, value.stackFreeMinimum);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'StackFreeMinimum'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("StackSize", indent + 1, value.stackSize);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'StackSize'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR
DataModelLogger::LogValue(const char * label, size_t indent,
                          const chip::app::Clusters::ThreadNetworkDiagnostics::Structs::NeighborTableStruct::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("ExtAddress", indent + 1, value.extAddress);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'ExtAddress'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Age", indent + 1, value.age);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Age'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Rloc16", indent + 1, value.rloc16);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Rloc16'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("LinkFrameCounter", indent + 1, value.linkFrameCounter);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'LinkFrameCounter'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("MleFrameCounter", indent + 1, value.mleFrameCounter);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'MleFrameCounter'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Lqi", indent + 1, value.lqi);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Lqi'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("AverageRssi", indent + 1, value.averageRssi);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'AverageRssi'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("LastRssi", indent + 1, value.lastRssi);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'LastRssi'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("FrameErrorRate", indent + 1, value.frameErrorRate);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'FrameErrorRate'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("MessageErrorRate", indent + 1, value.messageErrorRate);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'MessageErrorRate'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("RxOnWhenIdle", indent + 1, value.rxOnWhenIdle);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'RxOnWhenIdle'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("FullThreadDevice", indent + 1, value.fullThreadDevice);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'FullThreadDevice'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("FullNetworkData", indent + 1, value.fullNetworkData);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'FullNetworkData'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("IsChild", indent + 1, value.isChild);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'IsChild'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR DataModelLogger::LogValue(
    const char * label, size_t indent,
    const chip::app::Clusters::ThreadNetworkDiagnostics::Structs::OperationalDatasetComponents::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("ActiveTimestampPresent", indent + 1, value.activeTimestampPresent);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'ActiveTimestampPresent'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("PendingTimestampPresent", indent + 1, value.pendingTimestampPresent);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'PendingTimestampPresent'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("MasterKeyPresent", indent + 1, value.masterKeyPresent);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'MasterKeyPresent'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("NetworkNamePresent", indent + 1, value.networkNamePresent);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'NetworkNamePresent'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("ExtendedPanIdPresent", indent + 1, value.extendedPanIdPresent);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'ExtendedPanIdPresent'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("MeshLocalPrefixPresent", indent + 1, value.meshLocalPrefixPresent);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'MeshLocalPrefixPresent'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("DelayPresent", indent + 1, value.delayPresent);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'DelayPresent'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("PanIdPresent", indent + 1, value.panIdPresent);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'PanIdPresent'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("ChannelPresent", indent + 1, value.channelPresent);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'ChannelPresent'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("PskcPresent", indent + 1, value.pskcPresent);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'PskcPresent'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("SecurityPolicyPresent", indent + 1, value.securityPolicyPresent);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'SecurityPolicyPresent'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("ChannelMaskPresent", indent + 1, value.channelMaskPresent);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'ChannelMaskPresent'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR
DataModelLogger::LogValue(const char * label, size_t indent,
                          const chip::app::Clusters::ThreadNetworkDiagnostics::Structs::RouteTableStruct::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("ExtAddress", indent + 1, value.extAddress);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'ExtAddress'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Rloc16", indent + 1, value.rloc16);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Rloc16'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("RouterId", indent + 1, value.routerId);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'RouterId'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("NextHop", indent + 1, value.nextHop);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'NextHop'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("PathCost", indent + 1, value.pathCost);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'PathCost'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("LQIIn", indent + 1, value.LQIIn);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'LQIIn'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("LQIOut", indent + 1, value.LQIOut);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'LQIOut'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Age", indent + 1, value.age);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Age'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Allocated", indent + 1, value.allocated);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Allocated'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("LinkEstablished", indent + 1, value.linkEstablished);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'LinkEstablished'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR
DataModelLogger::LogValue(const char * label, size_t indent,
                          const chip::app::Clusters::ThreadNetworkDiagnostics::Structs::SecurityPolicy::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("RotationTime", indent + 1, value.rotationTime);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'RotationTime'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Flags", indent + 1, value.flags);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Flags'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR
DataModelLogger::LogValue(const char * label, size_t indent,
                          const chip::app::Clusters::TimeSynchronization::Structs::DSTOffsetStruct::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("Offset", indent + 1, value.offset);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Offset'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("ValidStarting", indent + 1, value.validStarting);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'ValidStarting'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("ValidUntil", indent + 1, value.validUntil);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'ValidUntil'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR DataModelLogger::LogValue(
    const char * label, size_t indent,
    const chip::app::Clusters::TimeSynchronization::Structs::FabricScopedTrustedTimeSourceStruct::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("NodeID", indent + 1, value.nodeID);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'NodeID'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Endpoint", indent + 1, value.endpoint);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Endpoint'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const chip::app::Clusters::TimeSynchronization::Structs::TimeZoneStruct::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("Offset", indent + 1, value.offset);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Offset'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("ValidAt", indent + 1, value.validAt);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'ValidAt'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Name", indent + 1, value.name);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Name'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR
DataModelLogger::LogValue(const char * label, size_t indent,
                          const chip::app::Clusters::TimeSynchronization::Structs::TrustedTimeSourceStruct::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("FabricIndex", indent + 1, value.fabricIndex);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'FabricIndex'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("NodeID", indent + 1, value.nodeID);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'NodeID'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Endpoint", indent + 1, value.endpoint);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Endpoint'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR DataModelLogger::LogValue(
    const char * label, size_t indent,
    const chip::app::Clusters::BridgedDeviceBasicInformation::Structs::ProductAppearanceStruct::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("Finish", indent + 1, value.finish);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Finish'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("PrimaryColor", indent + 1, value.primaryColor);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'PrimaryColor'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR
DataModelLogger::LogValue(const char * label, size_t indent,
                          const chip::app::Clusters::OperationalCredentials::Structs::FabricDescriptorStruct::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("RootPublicKey", indent + 1, value.rootPublicKey);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'RootPublicKey'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("VendorID", indent + 1, value.vendorID);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'VendorID'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("FabricID", indent + 1, value.fabricID);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'FabricID'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("NodeID", indent + 1, value.nodeID);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'NodeID'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Label", indent + 1, value.label);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Label'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("FabricIndex", indent + 1, value.fabricIndex);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'FabricIndex'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const chip::app::Clusters::OperationalCredentials::Structs::NOCStruct::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("Noc", indent + 1, value.noc);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Noc'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Icac", indent + 1, value.icac);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Icac'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("FabricIndex", indent + 1, value.fabricIndex);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'FabricIndex'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR
DataModelLogger::LogValue(const char * label, size_t indent,
                          const chip::app::Clusters::GroupKeyManagement::Structs::GroupInfoMapStruct::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("GroupId", indent + 1, value.groupId);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'GroupId'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Endpoints", indent + 1, value.endpoints);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Endpoints'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("GroupName", indent + 1, value.groupName);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'GroupName'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("FabricIndex", indent + 1, value.fabricIndex);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'FabricIndex'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR
DataModelLogger::LogValue(const char * label, size_t indent,
                          const chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("GroupId", indent + 1, value.groupId);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'GroupId'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("GroupKeySetID", indent + 1, value.groupKeySetID);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'GroupKeySetID'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("FabricIndex", indent + 1, value.fabricIndex);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'FabricIndex'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR
DataModelLogger::LogValue(const char * label, size_t indent,
                          const chip::app::Clusters::GroupKeyManagement::Structs::GroupKeySetStruct::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("GroupKeySetID", indent + 1, value.groupKeySetID);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'GroupKeySetID'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("GroupKeySecurityPolicy", indent + 1, value.groupKeySecurityPolicy);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'GroupKeySecurityPolicy'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("EpochKey0", indent + 1, value.epochKey0);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'EpochKey0'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("EpochStartTime0", indent + 1, value.epochStartTime0);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'EpochStartTime0'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("EpochKey1", indent + 1, value.epochKey1);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'EpochKey1'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("EpochStartTime1", indent + 1, value.epochStartTime1);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'EpochStartTime1'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("EpochKey2", indent + 1, value.epochKey2);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'EpochKey2'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("EpochStartTime2", indent + 1, value.epochStartTime2);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'EpochStartTime2'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const chip::app::Clusters::FixedLabel::Structs::LabelStruct::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("Label", indent + 1, value.label);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Label'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Value", indent + 1, value.value);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Value'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const chip::app::Clusters::UserLabel::Structs::LabelStruct::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("Label", indent + 1, value.label);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Label'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Value", indent + 1, value.value);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Value'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR
DataModelLogger::LogValue(const char * label, size_t indent,
                          const chip::app::Clusters::IcdManagement::Structs::MonitoringRegistrationStruct::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("CheckInNodeID", indent + 1, value.checkInNodeID);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'CheckInNodeID'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("MonitoredSubject", indent + 1, value.monitoredSubject);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'MonitoredSubject'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Key", indent + 1, value.key);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Key'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("FabricIndex", indent + 1, value.fabricIndex);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'FabricIndex'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const chip::app::Clusters::ModeSelect::Structs::SemanticTagStruct::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("MfgCode", indent + 1, value.mfgCode);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'MfgCode'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Value", indent + 1, value.value);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Value'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const chip::app::Clusters::ModeSelect::Structs::ModeOptionStruct::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("Label", indent + 1, value.label);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Label'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Mode", indent + 1, value.mode);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Mode'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("SemanticTags", indent + 1, value.semanticTags);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'SemanticTags'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR
DataModelLogger::LogValue(const char * label, size_t indent,
                          const chip::app::Clusters::TemperatureControl::Structs::TemperatureLevelStruct::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("Label", indent + 1, value.label);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Label'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("TemperatureLevel", indent + 1, value.temperatureLevel);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'TemperatureLevel'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const chip::app::Clusters::OperationalState::Structs::ErrorStateStruct::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("ErrorStateID", indent + 1, value.errorStateID);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'ErrorStateID'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("ErrorStateLabel", indent + 1, value.errorStateLabel);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'ErrorStateLabel'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("ErrorStateDetails", indent + 1, value.errorStateDetails);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'ErrorStateDetails'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR
DataModelLogger::LogValue(const char * label, size_t indent,
                          const chip::app::Clusters::OperationalState::Structs::OperationalStateStruct::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("OperationalStateID", indent + 1, value.operationalStateID);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'OperationalStateID'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("OperationalStateLabel", indent + 1, value.operationalStateLabel);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'OperationalStateLabel'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const chip::app::Clusters::DoorLock::Structs::CredentialStruct::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("CredentialType", indent + 1, value.credentialType);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'CredentialType'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("CredentialIndex", indent + 1, value.credentialIndex);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'CredentialIndex'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR
DataModelLogger::LogValue(const char * label, size_t indent,
                          const chip::app::Clusters::Thermostat::Structs::ThermostatScheduleTransition::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("TransitionTime", indent + 1, value.transitionTime);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'TransitionTime'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("HeatSetpoint", indent + 1, value.heatSetpoint);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'HeatSetpoint'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("CoolSetpoint", indent + 1, value.coolSetpoint);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'CoolSetpoint'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const chip::app::Clusters::Channel::Structs::ChannelInfoStruct::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("MajorNumber", indent + 1, value.majorNumber);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'MajorNumber'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("MinorNumber", indent + 1, value.minorNumber);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'MinorNumber'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Name", indent + 1, value.name);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Name'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("CallSign", indent + 1, value.callSign);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'CallSign'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("AffiliateCallSign", indent + 1, value.affiliateCallSign);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'AffiliateCallSign'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const chip::app::Clusters::Channel::Structs::LineupInfoStruct::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("OperatorName", indent + 1, value.operatorName);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'OperatorName'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("LineupName", indent + 1, value.lineupName);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'LineupName'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("PostalCode", indent + 1, value.postalCode);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'PostalCode'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("LineupInfoType", indent + 1, value.lineupInfoType);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'LineupInfoType'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const chip::app::Clusters::TargetNavigator::Structs::TargetInfoStruct::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("Identifier", indent + 1, value.identifier);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Identifier'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Name", indent + 1, value.name);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Name'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR
DataModelLogger::LogValue(const char * label, size_t indent,
                          const chip::app::Clusters::MediaPlayback::Structs::PlaybackPositionStruct::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("UpdatedAt", indent + 1, value.updatedAt);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'UpdatedAt'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Position", indent + 1, value.position);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Position'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const chip::app::Clusters::MediaInput::Structs::InputInfoStruct::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("Index", indent + 1, value.index);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Index'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("InputType", indent + 1, value.inputType);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'InputType'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Name", indent + 1, value.name);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Name'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Description", indent + 1, value.description);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Description'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const chip::app::Clusters::ContentLauncher::Structs::DimensionStruct::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("Width", indent + 1, value.width);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Width'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Height", indent + 1, value.height);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Height'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Metric", indent + 1, value.metric);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Metric'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR
DataModelLogger::LogValue(const char * label, size_t indent,
                          const chip::app::Clusters::ContentLauncher::Structs::AdditionalInfoStruct::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("Name", indent + 1, value.name);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Name'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Value", indent + 1, value.value);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Value'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const chip::app::Clusters::ContentLauncher::Structs::ParameterStruct::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("Type", indent + 1, value.type);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Type'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Value", indent + 1, value.value);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Value'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("ExternalIDList", indent + 1, value.externalIDList);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'ExternalIDList'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR
DataModelLogger::LogValue(const char * label, size_t indent,
                          const chip::app::Clusters::ContentLauncher::Structs::ContentSearchStruct::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("ParameterList", indent + 1, value.parameterList);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'ParameterList'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR
DataModelLogger::LogValue(const char * label, size_t indent,
                          const chip::app::Clusters::ContentLauncher::Structs::StyleInformationStruct::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("ImageURL", indent + 1, value.imageURL);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'ImageURL'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Color", indent + 1, value.color);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Color'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Size", indent + 1, value.size);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Size'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR
DataModelLogger::LogValue(const char * label, size_t indent,
                          const chip::app::Clusters::ContentLauncher::Structs::BrandingInformationStruct::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("ProviderName", indent + 1, value.providerName);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'ProviderName'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Background", indent + 1, value.background);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Background'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Logo", indent + 1, value.logo);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Logo'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("ProgressBar", indent + 1, value.progressBar);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'ProgressBar'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Splash", indent + 1, value.splash);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Splash'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("WaterMark", indent + 1, value.waterMark);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'WaterMark'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const chip::app::Clusters::AudioOutput::Structs::OutputInfoStruct::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("Index", indent + 1, value.index);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Index'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("OutputType", indent + 1, value.outputType);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'OutputType'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Name", indent + 1, value.name);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Name'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR
DataModelLogger::LogValue(const char * label, size_t indent,
                          const chip::app::Clusters::ApplicationLauncher::Structs::ApplicationStruct::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("CatalogVendorID", indent + 1, value.catalogVendorID);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'CatalogVendorID'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("ApplicationID", indent + 1, value.applicationID);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'ApplicationID'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR
DataModelLogger::LogValue(const char * label, size_t indent,
                          const chip::app::Clusters::ApplicationLauncher::Structs::ApplicationEPStruct::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("Application", indent + 1, value.application);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Application'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Endpoint", indent + 1, value.endpoint);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Endpoint'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const chip::app::Clusters::ApplicationBasic::Structs::ApplicationStruct::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("CatalogVendorID", indent + 1, value.catalogVendorID);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'CatalogVendorID'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("ApplicationID", indent + 1, value.applicationID);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'ApplicationID'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const chip::app::Clusters::UnitTesting::Structs::SimpleStruct::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("A", indent + 1, value.a);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'A'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("B", indent + 1, value.b);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'B'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("C", indent + 1, value.c);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'C'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("D", indent + 1, value.d);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'D'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("E", indent + 1, value.e);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'E'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("F", indent + 1, value.f);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'F'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("G", indent + 1, value.g);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'G'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("H", indent + 1, value.h);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'H'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const chip::app::Clusters::UnitTesting::Structs::TestFabricScoped::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("FabricSensitiveInt8u", indent + 1, value.fabricSensitiveInt8u);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'FabricSensitiveInt8u'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("OptionalFabricSensitiveInt8u", indent + 1, value.optionalFabricSensitiveInt8u);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'OptionalFabricSensitiveInt8u'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("NullableFabricSensitiveInt8u", indent + 1, value.nullableFabricSensitiveInt8u);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'NullableFabricSensitiveInt8u'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("NullableOptionalFabricSensitiveInt8u", indent + 1, value.nullableOptionalFabricSensitiveInt8u);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1,
                                       "Struct truncated due to invalid value for 'NullableOptionalFabricSensitiveInt8u'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("FabricSensitiveCharString", indent + 1, value.fabricSensitiveCharString);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'FabricSensitiveCharString'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("FabricSensitiveStruct", indent + 1, value.fabricSensitiveStruct);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'FabricSensitiveStruct'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("FabricSensitiveInt8uList", indent + 1, value.fabricSensitiveInt8uList);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'FabricSensitiveInt8uList'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("FabricIndex", indent + 1, value.fabricIndex);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'FabricIndex'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR
DataModelLogger::LogValue(const char * label, size_t indent,
                          const chip::app::Clusters::UnitTesting::Structs::NullablesAndOptionalsStruct::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("NullableInt", indent + 1, value.nullableInt);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'NullableInt'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("OptionalInt", indent + 1, value.optionalInt);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'OptionalInt'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("NullableOptionalInt", indent + 1, value.nullableOptionalInt);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'NullableOptionalInt'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("NullableString", indent + 1, value.nullableString);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'NullableString'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("OptionalString", indent + 1, value.optionalString);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'OptionalString'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("NullableOptionalString", indent + 1, value.nullableOptionalString);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'NullableOptionalString'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("NullableStruct", indent + 1, value.nullableStruct);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'NullableStruct'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("OptionalStruct", indent + 1, value.optionalStruct);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'OptionalStruct'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("NullableOptionalStruct", indent + 1, value.nullableOptionalStruct);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'NullableOptionalStruct'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("NullableList", indent + 1, value.nullableList);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'NullableList'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("OptionalList", indent + 1, value.optionalList);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'OptionalList'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("NullableOptionalList", indent + 1, value.nullableOptionalList);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'NullableOptionalList'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const chip::app::Clusters::UnitTesting::Structs::NestedStruct::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("A", indent + 1, value.a);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'A'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("B", indent + 1, value.b);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'B'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("C", indent + 1, value.c);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'C'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const chip::app::Clusters::UnitTesting::Structs::NestedStructList::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("A", indent + 1, value.a);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'A'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("B", indent + 1, value.b);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'B'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("C", indent + 1, value.c);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'C'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("D", indent + 1, value.d);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'D'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("E", indent + 1, value.e);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'E'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("F", indent + 1, value.f);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'F'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("G", indent + 1, value.g);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'G'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const chip::app::Clusters::UnitTesting::Structs::DoubleNestedStructList::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("A", indent + 1, value.a);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'A'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const chip::app::Clusters::UnitTesting::Structs::TestListStructOctet::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = LogValue("Member1", indent + 1, value.member1);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Member1'");
            return err;
        }
    }
    {
        CHIP_ERROR err = LogValue("Member2", indent + 1, value.member2);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Struct truncated due to invalid value for 'Member2'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const AccessControl::Events::AccessControlEntryChanged::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = DataModelLogger::LogValue("AdminNodeID", indent + 1, value.adminNodeID);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'AdminNodeID'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("AdminPasscodeID", indent + 1, value.adminPasscodeID);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'AdminPasscodeID'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("ChangeType", indent + 1, value.changeType);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'ChangeType'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("LatestValue", indent + 1, value.latestValue);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'LatestValue'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("FabricIndex", indent + 1, value.fabricIndex);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'FabricIndex'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const AccessControl::Events::AccessControlExtensionChanged::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = DataModelLogger::LogValue("AdminNodeID", indent + 1, value.adminNodeID);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'AdminNodeID'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("AdminPasscodeID", indent + 1, value.adminPasscodeID);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'AdminPasscodeID'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("ChangeType", indent + 1, value.changeType);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'ChangeType'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("LatestValue", indent + 1, value.latestValue);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'LatestValue'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("FabricIndex", indent + 1, value.fabricIndex);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'FabricIndex'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent, const Actions::Events::StateChanged::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = DataModelLogger::LogValue("ActionID", indent + 1, value.actionID);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'ActionID'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("InvokeID", indent + 1, value.invokeID);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'InvokeID'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("NewState", indent + 1, value.newState);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'NewState'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent, const Actions::Events::ActionFailed::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = DataModelLogger::LogValue("ActionID", indent + 1, value.actionID);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'ActionID'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("InvokeID", indent + 1, value.invokeID);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'InvokeID'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("NewState", indent + 1, value.newState);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'NewState'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("Error", indent + 1, value.error);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'Error'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const BasicInformation::Events::StartUp::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = DataModelLogger::LogValue("SoftwareVersion", indent + 1, value.softwareVersion);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'SoftwareVersion'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const BasicInformation::Events::ShutDown::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const BasicInformation::Events::Leave::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = DataModelLogger::LogValue("FabricIndex", indent + 1, value.fabricIndex);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'FabricIndex'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const BasicInformation::Events::ReachableChanged::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = DataModelLogger::LogValue("ReachableNewValue", indent + 1, value.reachableNewValue);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'ReachableNewValue'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const OtaSoftwareUpdateRequestor::Events::StateTransition::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = DataModelLogger::LogValue("PreviousState", indent + 1, value.previousState);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'PreviousState'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("NewState", indent + 1, value.newState);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'NewState'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("Reason", indent + 1, value.reason);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'Reason'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("TargetSoftwareVersion", indent + 1, value.targetSoftwareVersion);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'TargetSoftwareVersion'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const OtaSoftwareUpdateRequestor::Events::VersionApplied::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = DataModelLogger::LogValue("SoftwareVersion", indent + 1, value.softwareVersion);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'SoftwareVersion'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("ProductID", indent + 1, value.productID);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'ProductID'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const OtaSoftwareUpdateRequestor::Events::DownloadError::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = DataModelLogger::LogValue("SoftwareVersion", indent + 1, value.softwareVersion);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'SoftwareVersion'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("BytesDownloaded", indent + 1, value.bytesDownloaded);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'BytesDownloaded'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("ProgressPercent", indent + 1, value.progressPercent);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'ProgressPercent'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("PlatformCode", indent + 1, value.platformCode);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'PlatformCode'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const PowerSource::Events::WiredFaultChange::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = DataModelLogger::LogValue("Current", indent + 1, value.current);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'Current'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("Previous", indent + 1, value.previous);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'Previous'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const PowerSource::Events::BatFaultChange::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = DataModelLogger::LogValue("Current", indent + 1, value.current);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'Current'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("Previous", indent + 1, value.previous);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'Previous'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const PowerSource::Events::BatChargeFaultChange::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = DataModelLogger::LogValue("Current", indent + 1, value.current);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'Current'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("Previous", indent + 1, value.previous);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'Previous'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const GeneralDiagnostics::Events::HardwareFaultChange::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = DataModelLogger::LogValue("Current", indent + 1, value.current);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'Current'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("Previous", indent + 1, value.previous);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'Previous'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const GeneralDiagnostics::Events::RadioFaultChange::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = DataModelLogger::LogValue("Current", indent + 1, value.current);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'Current'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("Previous", indent + 1, value.previous);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'Previous'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const GeneralDiagnostics::Events::NetworkFaultChange::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = DataModelLogger::LogValue("Current", indent + 1, value.current);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'Current'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("Previous", indent + 1, value.previous);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'Previous'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const GeneralDiagnostics::Events::BootReason::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = DataModelLogger::LogValue("BootReason", indent + 1, value.bootReason);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'BootReason'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const SoftwareDiagnostics::Events::SoftwareFault::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = DataModelLogger::LogValue("Id", indent + 1, value.id);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'Id'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("Name", indent + 1, value.name);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'Name'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("FaultRecording", indent + 1, value.faultRecording);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'FaultRecording'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const ThreadNetworkDiagnostics::Events::ConnectionStatus::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = DataModelLogger::LogValue("ConnectionStatus", indent + 1, value.connectionStatus);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'ConnectionStatus'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const ThreadNetworkDiagnostics::Events::NetworkFaultChange::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = DataModelLogger::LogValue("Current", indent + 1, value.current);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'Current'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("Previous", indent + 1, value.previous);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'Previous'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const WiFiNetworkDiagnostics::Events::Disconnection::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = DataModelLogger::LogValue("ReasonCode", indent + 1, value.reasonCode);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'ReasonCode'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const WiFiNetworkDiagnostics::Events::AssociationFailure::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = DataModelLogger::LogValue("AssociationFailure", indent + 1, value.associationFailure);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'AssociationFailure'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("Status", indent + 1, value.status);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'Status'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const WiFiNetworkDiagnostics::Events::ConnectionStatus::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = DataModelLogger::LogValue("ConnectionStatus", indent + 1, value.connectionStatus);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'ConnectionStatus'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const TimeSynchronization::Events::DSTTableEmpty::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const TimeSynchronization::Events::DSTStatus::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = DataModelLogger::LogValue("DSTOffsetActive", indent + 1, value.DSTOffsetActive);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'DSTOffsetActive'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const TimeSynchronization::Events::TimeZoneStatus::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = DataModelLogger::LogValue("Offset", indent + 1, value.offset);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'Offset'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("Name", indent + 1, value.name);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'Name'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const TimeSynchronization::Events::TimeFailure::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const TimeSynchronization::Events::MissingTrustedTimeSource::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const BridgedDeviceBasicInformation::Events::StartUp::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = DataModelLogger::LogValue("SoftwareVersion", indent + 1, value.softwareVersion);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'SoftwareVersion'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const BridgedDeviceBasicInformation::Events::ShutDown::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const BridgedDeviceBasicInformation::Events::Leave::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const BridgedDeviceBasicInformation::Events::ReachableChanged::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = DataModelLogger::LogValue("ReachableNewValue", indent + 1, value.reachableNewValue);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'ReachableNewValue'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent, const Switch::Events::SwitchLatched::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = DataModelLogger::LogValue("NewPosition", indent + 1, value.newPosition);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'NewPosition'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent, const Switch::Events::InitialPress::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = DataModelLogger::LogValue("NewPosition", indent + 1, value.newPosition);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'NewPosition'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent, const Switch::Events::LongPress::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = DataModelLogger::LogValue("NewPosition", indent + 1, value.newPosition);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'NewPosition'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent, const Switch::Events::ShortRelease::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = DataModelLogger::LogValue("PreviousPosition", indent + 1, value.previousPosition);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'PreviousPosition'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent, const Switch::Events::LongRelease::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = DataModelLogger::LogValue("PreviousPosition", indent + 1, value.previousPosition);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'PreviousPosition'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const Switch::Events::MultiPressOngoing::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = DataModelLogger::LogValue("NewPosition", indent + 1, value.newPosition);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'NewPosition'");
            return err;
        }
    }
    {
        CHIP_ERROR err =
            DataModelLogger::LogValue("CurrentNumberOfPressesCounted", indent + 1, value.currentNumberOfPressesCounted);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'CurrentNumberOfPressesCounted'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const Switch::Events::MultiPressComplete::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = DataModelLogger::LogValue("PreviousPosition", indent + 1, value.previousPosition);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'PreviousPosition'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("TotalNumberOfPressesCounted", indent + 1, value.totalNumberOfPressesCounted);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'TotalNumberOfPressesCounted'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const BooleanState::Events::StateChange::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = DataModelLogger::LogValue("StateValue", indent + 1, value.stateValue);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'StateValue'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const RefrigeratorAlarm::Events::Notify::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = DataModelLogger::LogValue("Active", indent + 1, value.active);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'Active'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("Inactive", indent + 1, value.inactive);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'Inactive'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("State", indent + 1, value.state);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'State'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("Mask", indent + 1, value.mask);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'Mask'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const SmokeCoAlarm::Events::SmokeAlarm::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent, const SmokeCoAlarm::Events::COAlarm::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const SmokeCoAlarm::Events::LowBattery::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const SmokeCoAlarm::Events::HardwareFault::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const SmokeCoAlarm::Events::EndOfService::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const SmokeCoAlarm::Events::SelfTestComplete::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const SmokeCoAlarm::Events::AlarmMuted::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const SmokeCoAlarm::Events::MuteEnded::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const SmokeCoAlarm::Events::InterconnectSmokeAlarm::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const SmokeCoAlarm::Events::InterconnectCOAlarm::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent, const SmokeCoAlarm::Events::AllClear::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const OperationalState::Events::OperationalError::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = DataModelLogger::LogValue("ErrorState", indent + 1, value.errorState);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'ErrorState'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const OperationalState::Events::OperationCompletion::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = DataModelLogger::LogValue("CompletionErrorCode", indent + 1, value.completionErrorCode);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'CompletionErrorCode'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("TotalOperationalTime", indent + 1, value.totalOperationalTime);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'TotalOperationalTime'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("PausedTime", indent + 1, value.pausedTime);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'PausedTime'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const DoorLock::Events::DoorLockAlarm::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = DataModelLogger::LogValue("AlarmCode", indent + 1, value.alarmCode);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'AlarmCode'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const DoorLock::Events::DoorStateChange::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = DataModelLogger::LogValue("DoorState", indent + 1, value.doorState);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'DoorState'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const DoorLock::Events::LockOperation::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = DataModelLogger::LogValue("LockOperationType", indent + 1, value.lockOperationType);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'LockOperationType'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("OperationSource", indent + 1, value.operationSource);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'OperationSource'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("UserIndex", indent + 1, value.userIndex);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'UserIndex'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("FabricIndex", indent + 1, value.fabricIndex);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'FabricIndex'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("SourceNode", indent + 1, value.sourceNode);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'SourceNode'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("Credentials", indent + 1, value.credentials);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'Credentials'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const DoorLock::Events::LockOperationError::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = DataModelLogger::LogValue("LockOperationType", indent + 1, value.lockOperationType);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'LockOperationType'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("OperationSource", indent + 1, value.operationSource);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'OperationSource'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("OperationError", indent + 1, value.operationError);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'OperationError'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("UserIndex", indent + 1, value.userIndex);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'UserIndex'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("FabricIndex", indent + 1, value.fabricIndex);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'FabricIndex'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("SourceNode", indent + 1, value.sourceNode);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'SourceNode'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("Credentials", indent + 1, value.credentials);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'Credentials'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const DoorLock::Events::LockUserChange::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = DataModelLogger::LogValue("LockDataType", indent + 1, value.lockDataType);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'LockDataType'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("DataOperationType", indent + 1, value.dataOperationType);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'DataOperationType'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("OperationSource", indent + 1, value.operationSource);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'OperationSource'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("UserIndex", indent + 1, value.userIndex);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'UserIndex'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("FabricIndex", indent + 1, value.fabricIndex);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'FabricIndex'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("SourceNode", indent + 1, value.sourceNode);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'SourceNode'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("DataIndex", indent + 1, value.dataIndex);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'DataIndex'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const PumpConfigurationAndControl::Events::SupplyVoltageLow::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const PumpConfigurationAndControl::Events::SupplyVoltageHigh::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const PumpConfigurationAndControl::Events::PowerMissingPhase::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const PumpConfigurationAndControl::Events::SystemPressureLow::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const PumpConfigurationAndControl::Events::SystemPressureHigh::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const PumpConfigurationAndControl::Events::DryRunning::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const PumpConfigurationAndControl::Events::MotorTemperatureHigh::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const PumpConfigurationAndControl::Events::PumpMotorFatalFailure::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const PumpConfigurationAndControl::Events::ElectronicTemperatureHigh::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const PumpConfigurationAndControl::Events::PumpBlocked::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const PumpConfigurationAndControl::Events::SensorFailure::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const PumpConfigurationAndControl::Events::ElectronicNonFatalFailure::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const PumpConfigurationAndControl::Events::ElectronicFatalFailure::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const PumpConfigurationAndControl::Events::GeneralFault::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const PumpConfigurationAndControl::Events::Leakage::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const PumpConfigurationAndControl::Events::AirDetection::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const PumpConfigurationAndControl::Events::TurbineOperation::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent, const UnitTesting::Events::TestEvent::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = DataModelLogger::LogValue("Arg1", indent + 1, value.arg1);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'Arg1'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("Arg2", indent + 1, value.arg2);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'Arg2'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("Arg3", indent + 1, value.arg3);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'Arg3'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("Arg4", indent + 1, value.arg4);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'Arg4'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("Arg5", indent + 1, value.arg5);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'Arg5'");
            return err;
        }
    }
    {
        CHIP_ERROR err = DataModelLogger::LogValue("Arg6", indent + 1, value.arg6);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'Arg6'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const UnitTesting::Events::TestFabricScopedEvent::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    {
        CHIP_ERROR err = DataModelLogger::LogValue("FabricIndex", indent + 1, value.fabricIndex);
        if (err != CHIP_NO_ERROR)
        {
            DataModelLogger::LogString(indent + 1, "Event truncated due to invalid value for 'FabricIndex'");
            return err;
        }
    }
    DataModelLogger::LogString(indent, "}");

    return CHIP_NO_ERROR;
}

CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const Groups::Commands::AddGroupResponse::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("status", indent + 1, value.status));
    ReturnErrorOnFailure(DataModelLogger::LogValue("groupID", indent + 1, value.groupID));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const Groups::Commands::ViewGroupResponse::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("status", indent + 1, value.status));
    ReturnErrorOnFailure(DataModelLogger::LogValue("groupID", indent + 1, value.groupID));
    ReturnErrorOnFailure(DataModelLogger::LogValue("groupName", indent + 1, value.groupName));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const Groups::Commands::GetGroupMembershipResponse::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("capacity", indent + 1, value.capacity));
    ReturnErrorOnFailure(DataModelLogger::LogValue("groupList", indent + 1, value.groupList));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const Groups::Commands::RemoveGroupResponse::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("status", indent + 1, value.status));
    ReturnErrorOnFailure(DataModelLogger::LogValue("groupID", indent + 1, value.groupID));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const Scenes::Commands::AddSceneResponse::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("status", indent + 1, value.status));
    ReturnErrorOnFailure(DataModelLogger::LogValue("groupID", indent + 1, value.groupID));
    ReturnErrorOnFailure(DataModelLogger::LogValue("sceneID", indent + 1, value.sceneID));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const Scenes::Commands::ViewSceneResponse::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("status", indent + 1, value.status));
    ReturnErrorOnFailure(DataModelLogger::LogValue("groupID", indent + 1, value.groupID));
    ReturnErrorOnFailure(DataModelLogger::LogValue("sceneID", indent + 1, value.sceneID));
    ReturnErrorOnFailure(DataModelLogger::LogValue("transitionTime", indent + 1, value.transitionTime));
    ReturnErrorOnFailure(DataModelLogger::LogValue("sceneName", indent + 1, value.sceneName));
    ReturnErrorOnFailure(DataModelLogger::LogValue("extensionFieldSets", indent + 1, value.extensionFieldSets));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const Scenes::Commands::RemoveSceneResponse::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("status", indent + 1, value.status));
    ReturnErrorOnFailure(DataModelLogger::LogValue("groupID", indent + 1, value.groupID));
    ReturnErrorOnFailure(DataModelLogger::LogValue("sceneID", indent + 1, value.sceneID));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const Scenes::Commands::RemoveAllScenesResponse::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("status", indent + 1, value.status));
    ReturnErrorOnFailure(DataModelLogger::LogValue("groupID", indent + 1, value.groupID));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const Scenes::Commands::StoreSceneResponse::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("status", indent + 1, value.status));
    ReturnErrorOnFailure(DataModelLogger::LogValue("groupID", indent + 1, value.groupID));
    ReturnErrorOnFailure(DataModelLogger::LogValue("sceneID", indent + 1, value.sceneID));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const Scenes::Commands::GetSceneMembershipResponse::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("status", indent + 1, value.status));
    ReturnErrorOnFailure(DataModelLogger::LogValue("capacity", indent + 1, value.capacity));
    ReturnErrorOnFailure(DataModelLogger::LogValue("groupID", indent + 1, value.groupID));
    ReturnErrorOnFailure(DataModelLogger::LogValue("sceneList", indent + 1, value.sceneList));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const Scenes::Commands::EnhancedAddSceneResponse::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("status", indent + 1, value.status));
    ReturnErrorOnFailure(DataModelLogger::LogValue("groupID", indent + 1, value.groupID));
    ReturnErrorOnFailure(DataModelLogger::LogValue("sceneID", indent + 1, value.sceneID));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const Scenes::Commands::EnhancedViewSceneResponse::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("status", indent + 1, value.status));
    ReturnErrorOnFailure(DataModelLogger::LogValue("groupID", indent + 1, value.groupID));
    ReturnErrorOnFailure(DataModelLogger::LogValue("sceneID", indent + 1, value.sceneID));
    ReturnErrorOnFailure(DataModelLogger::LogValue("transitionTime", indent + 1, value.transitionTime));
    ReturnErrorOnFailure(DataModelLogger::LogValue("sceneName", indent + 1, value.sceneName));
    ReturnErrorOnFailure(DataModelLogger::LogValue("extensionFieldSets", indent + 1, value.extensionFieldSets));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const Scenes::Commands::CopySceneResponse::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("status", indent + 1, value.status));
    ReturnErrorOnFailure(DataModelLogger::LogValue("groupIdentifierFrom", indent + 1, value.groupIdentifierFrom));
    ReturnErrorOnFailure(DataModelLogger::LogValue("sceneIdentifierFrom", indent + 1, value.sceneIdentifierFrom));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const OtaSoftwareUpdateProvider::Commands::QueryImageResponse::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("status", indent + 1, value.status));
    ReturnErrorOnFailure(DataModelLogger::LogValue("delayedActionTime", indent + 1, value.delayedActionTime));
    ReturnErrorOnFailure(DataModelLogger::LogValue("imageURI", indent + 1, value.imageURI));
    ReturnErrorOnFailure(DataModelLogger::LogValue("softwareVersion", indent + 1, value.softwareVersion));
    ReturnErrorOnFailure(DataModelLogger::LogValue("softwareVersionString", indent + 1, value.softwareVersionString));
    ReturnErrorOnFailure(DataModelLogger::LogValue("updateToken", indent + 1, value.updateToken));
    ReturnErrorOnFailure(DataModelLogger::LogValue("userConsentNeeded", indent + 1, value.userConsentNeeded));
    ReturnErrorOnFailure(DataModelLogger::LogValue("metadataForRequestor", indent + 1, value.metadataForRequestor));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const OtaSoftwareUpdateProvider::Commands::ApplyUpdateResponse::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("action", indent + 1, value.action));
    ReturnErrorOnFailure(DataModelLogger::LogValue("delayedActionTime", indent + 1, value.delayedActionTime));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const GeneralCommissioning::Commands::ArmFailSafeResponse::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("errorCode", indent + 1, value.errorCode));
    ReturnErrorOnFailure(DataModelLogger::LogValue("debugText", indent + 1, value.debugText));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const GeneralCommissioning::Commands::SetRegulatoryConfigResponse::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("errorCode", indent + 1, value.errorCode));
    ReturnErrorOnFailure(DataModelLogger::LogValue("debugText", indent + 1, value.debugText));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const GeneralCommissioning::Commands::CommissioningCompleteResponse::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("errorCode", indent + 1, value.errorCode));
    ReturnErrorOnFailure(DataModelLogger::LogValue("debugText", indent + 1, value.debugText));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const NetworkCommissioning::Commands::ScanNetworksResponse::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("networkingStatus", indent + 1, value.networkingStatus));
    ReturnErrorOnFailure(DataModelLogger::LogValue("debugText", indent + 1, value.debugText));
    ReturnErrorOnFailure(DataModelLogger::LogValue("wiFiScanResults", indent + 1, value.wiFiScanResults));
    ReturnErrorOnFailure(DataModelLogger::LogValue("threadScanResults", indent + 1, value.threadScanResults));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const NetworkCommissioning::Commands::NetworkConfigResponse::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("networkingStatus", indent + 1, value.networkingStatus));
    ReturnErrorOnFailure(DataModelLogger::LogValue("debugText", indent + 1, value.debugText));
    ReturnErrorOnFailure(DataModelLogger::LogValue("networkIndex", indent + 1, value.networkIndex));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const NetworkCommissioning::Commands::ConnectNetworkResponse::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("networkingStatus", indent + 1, value.networkingStatus));
    ReturnErrorOnFailure(DataModelLogger::LogValue("debugText", indent + 1, value.debugText));
    ReturnErrorOnFailure(DataModelLogger::LogValue("errorValue", indent + 1, value.errorValue));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const DiagnosticLogs::Commands::RetrieveLogsResponse::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("status", indent + 1, value.status));
    ReturnErrorOnFailure(DataModelLogger::LogValue("logContent", indent + 1, value.logContent));
    ReturnErrorOnFailure(DataModelLogger::LogValue("UTCTimeStamp", indent + 1, value.UTCTimeStamp));
    ReturnErrorOnFailure(DataModelLogger::LogValue("timeSinceBoot", indent + 1, value.timeSinceBoot));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const TimeSynchronization::Commands::SetTimeZoneResponse::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("DSTOffsetRequired", indent + 1, value.DSTOffsetRequired));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const OperationalCredentials::Commands::AttestationResponse::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("attestationElements", indent + 1, value.attestationElements));
    ReturnErrorOnFailure(DataModelLogger::LogValue("attestationSignature", indent + 1, value.attestationSignature));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const OperationalCredentials::Commands::CertificateChainResponse::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("certificate", indent + 1, value.certificate));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const OperationalCredentials::Commands::CSRResponse::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("NOCSRElements", indent + 1, value.NOCSRElements));
    ReturnErrorOnFailure(DataModelLogger::LogValue("attestationSignature", indent + 1, value.attestationSignature));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const OperationalCredentials::Commands::NOCResponse::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("statusCode", indent + 1, value.statusCode));
    ReturnErrorOnFailure(DataModelLogger::LogValue("fabricIndex", indent + 1, value.fabricIndex));
    ReturnErrorOnFailure(DataModelLogger::LogValue("debugText", indent + 1, value.debugText));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const GroupKeyManagement::Commands::KeySetReadResponse::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("groupKeySet", indent + 1, value.groupKeySet));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const GroupKeyManagement::Commands::KeySetReadAllIndicesResponse::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("groupKeySetIDs", indent + 1, value.groupKeySetIDs));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const IcdManagement::Commands::RegisterClientResponse::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("ICDCounter", indent + 1, value.ICDCounter));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const OperationalState::Commands::OperationalCommandResponse::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("commandResponseState", indent + 1, value.commandResponseState));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const DoorLock::Commands::GetWeekDayScheduleResponse::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("weekDayIndex", indent + 1, value.weekDayIndex));
    ReturnErrorOnFailure(DataModelLogger::LogValue("userIndex", indent + 1, value.userIndex));
    ReturnErrorOnFailure(DataModelLogger::LogValue("status", indent + 1, value.status));
    ReturnErrorOnFailure(DataModelLogger::LogValue("daysMask", indent + 1, value.daysMask));
    ReturnErrorOnFailure(DataModelLogger::LogValue("startHour", indent + 1, value.startHour));
    ReturnErrorOnFailure(DataModelLogger::LogValue("startMinute", indent + 1, value.startMinute));
    ReturnErrorOnFailure(DataModelLogger::LogValue("endHour", indent + 1, value.endHour));
    ReturnErrorOnFailure(DataModelLogger::LogValue("endMinute", indent + 1, value.endMinute));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const DoorLock::Commands::GetYearDayScheduleResponse::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("yearDayIndex", indent + 1, value.yearDayIndex));
    ReturnErrorOnFailure(DataModelLogger::LogValue("userIndex", indent + 1, value.userIndex));
    ReturnErrorOnFailure(DataModelLogger::LogValue("status", indent + 1, value.status));
    ReturnErrorOnFailure(DataModelLogger::LogValue("localStartTime", indent + 1, value.localStartTime));
    ReturnErrorOnFailure(DataModelLogger::LogValue("localEndTime", indent + 1, value.localEndTime));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const DoorLock::Commands::GetHolidayScheduleResponse::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("holidayIndex", indent + 1, value.holidayIndex));
    ReturnErrorOnFailure(DataModelLogger::LogValue("status", indent + 1, value.status));
    ReturnErrorOnFailure(DataModelLogger::LogValue("localStartTime", indent + 1, value.localStartTime));
    ReturnErrorOnFailure(DataModelLogger::LogValue("localEndTime", indent + 1, value.localEndTime));
    ReturnErrorOnFailure(DataModelLogger::LogValue("operatingMode", indent + 1, value.operatingMode));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const DoorLock::Commands::GetUserResponse::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("userIndex", indent + 1, value.userIndex));
    ReturnErrorOnFailure(DataModelLogger::LogValue("userName", indent + 1, value.userName));
    ReturnErrorOnFailure(DataModelLogger::LogValue("userUniqueID", indent + 1, value.userUniqueID));
    ReturnErrorOnFailure(DataModelLogger::LogValue("userStatus", indent + 1, value.userStatus));
    ReturnErrorOnFailure(DataModelLogger::LogValue("userType", indent + 1, value.userType));
    ReturnErrorOnFailure(DataModelLogger::LogValue("credentialRule", indent + 1, value.credentialRule));
    ReturnErrorOnFailure(DataModelLogger::LogValue("credentials", indent + 1, value.credentials));
    ReturnErrorOnFailure(DataModelLogger::LogValue("creatorFabricIndex", indent + 1, value.creatorFabricIndex));
    ReturnErrorOnFailure(DataModelLogger::LogValue("lastModifiedFabricIndex", indent + 1, value.lastModifiedFabricIndex));
    ReturnErrorOnFailure(DataModelLogger::LogValue("nextUserIndex", indent + 1, value.nextUserIndex));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const DoorLock::Commands::SetCredentialResponse::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("status", indent + 1, value.status));
    ReturnErrorOnFailure(DataModelLogger::LogValue("userIndex", indent + 1, value.userIndex));
    ReturnErrorOnFailure(DataModelLogger::LogValue("nextCredentialIndex", indent + 1, value.nextCredentialIndex));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const DoorLock::Commands::GetCredentialStatusResponse::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("credentialExists", indent + 1, value.credentialExists));
    ReturnErrorOnFailure(DataModelLogger::LogValue("userIndex", indent + 1, value.userIndex));
    ReturnErrorOnFailure(DataModelLogger::LogValue("creatorFabricIndex", indent + 1, value.creatorFabricIndex));
    ReturnErrorOnFailure(DataModelLogger::LogValue("lastModifiedFabricIndex", indent + 1, value.lastModifiedFabricIndex));
    ReturnErrorOnFailure(DataModelLogger::LogValue("nextCredentialIndex", indent + 1, value.nextCredentialIndex));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const Thermostat::Commands::GetWeeklyScheduleResponse::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(
        DataModelLogger::LogValue("numberOfTransitionsForSequence", indent + 1, value.numberOfTransitionsForSequence));
    ReturnErrorOnFailure(DataModelLogger::LogValue("dayOfWeekForSequence", indent + 1, value.dayOfWeekForSequence));
    ReturnErrorOnFailure(DataModelLogger::LogValue("modeForSequence", indent + 1, value.modeForSequence));
    ReturnErrorOnFailure(DataModelLogger::LogValue("transitions", indent + 1, value.transitions));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const Channel::Commands::ChangeChannelResponse::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("status", indent + 1, value.status));
    ReturnErrorOnFailure(DataModelLogger::LogValue("data", indent + 1, value.data));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const TargetNavigator::Commands::NavigateTargetResponse::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("status", indent + 1, value.status));
    ReturnErrorOnFailure(DataModelLogger::LogValue("data", indent + 1, value.data));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const MediaPlayback::Commands::PlaybackResponse::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("status", indent + 1, value.status));
    ReturnErrorOnFailure(DataModelLogger::LogValue("data", indent + 1, value.data));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const KeypadInput::Commands::SendKeyResponse::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("status", indent + 1, value.status));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const ContentLauncher::Commands::LauncherResponse::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("status", indent + 1, value.status));
    ReturnErrorOnFailure(DataModelLogger::LogValue("data", indent + 1, value.data));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const ApplicationLauncher::Commands::LauncherResponse::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("status", indent + 1, value.status));
    ReturnErrorOnFailure(DataModelLogger::LogValue("data", indent + 1, value.data));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const AccountLogin::Commands::GetSetupPINResponse::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("setupPIN", indent + 1, value.setupPIN));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const ElectricalMeasurement::Commands::GetProfileInfoResponseCommand::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("profileCount", indent + 1, value.profileCount));
    ReturnErrorOnFailure(DataModelLogger::LogValue("profileIntervalPeriod", indent + 1, value.profileIntervalPeriod));
    ReturnErrorOnFailure(DataModelLogger::LogValue("maxNumberOfIntervals", indent + 1, value.maxNumberOfIntervals));
    ReturnErrorOnFailure(DataModelLogger::LogValue("listOfAttributes", indent + 1, value.listOfAttributes));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR
DataModelLogger::LogValue(const char * label, size_t indent,
                          const ElectricalMeasurement::Commands::GetMeasurementProfileResponseCommand::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("startTime", indent + 1, value.startTime));
    ReturnErrorOnFailure(DataModelLogger::LogValue("status", indent + 1, value.status));
    ReturnErrorOnFailure(DataModelLogger::LogValue("profileIntervalPeriod", indent + 1, value.profileIntervalPeriod));
    ReturnErrorOnFailure(DataModelLogger::LogValue("numberOfIntervalsDelivered", indent + 1, value.numberOfIntervalsDelivered));
    ReturnErrorOnFailure(DataModelLogger::LogValue("attributeId", indent + 1, value.attributeId));
    ReturnErrorOnFailure(DataModelLogger::LogValue("intervals", indent + 1, value.intervals));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const UnitTesting::Commands::TestSpecificResponse::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("returnValue", indent + 1, value.returnValue));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const UnitTesting::Commands::TestAddArgumentsResponse::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("returnValue", indent + 1, value.returnValue));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const UnitTesting::Commands::TestSimpleArgumentResponse::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("returnValue", indent + 1, value.returnValue));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const UnitTesting::Commands::TestStructArrayArgumentResponse::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("arg1", indent + 1, value.arg1));
    ReturnErrorOnFailure(DataModelLogger::LogValue("arg2", indent + 1, value.arg2));
    ReturnErrorOnFailure(DataModelLogger::LogValue("arg3", indent + 1, value.arg3));
    ReturnErrorOnFailure(DataModelLogger::LogValue("arg4", indent + 1, value.arg4));
    ReturnErrorOnFailure(DataModelLogger::LogValue("arg5", indent + 1, value.arg5));
    ReturnErrorOnFailure(DataModelLogger::LogValue("arg6", indent + 1, value.arg6));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const UnitTesting::Commands::TestListInt8UReverseResponse::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("arg1", indent + 1, value.arg1));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const UnitTesting::Commands::TestEnumsResponse::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("arg1", indent + 1, value.arg1));
    ReturnErrorOnFailure(DataModelLogger::LogValue("arg2", indent + 1, value.arg2));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const UnitTesting::Commands::TestNullableOptionalResponse::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("wasPresent", indent + 1, value.wasPresent));
    ReturnErrorOnFailure(DataModelLogger::LogValue("wasNull", indent + 1, value.wasNull));
    ReturnErrorOnFailure(DataModelLogger::LogValue("value", indent + 1, value.value));
    ReturnErrorOnFailure(DataModelLogger::LogValue("originalValue", indent + 1, value.originalValue));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const UnitTesting::Commands::TestComplexNullableOptionalResponse::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("nullableIntWasNull", indent + 1, value.nullableIntWasNull));
    ReturnErrorOnFailure(DataModelLogger::LogValue("nullableIntValue", indent + 1, value.nullableIntValue));
    ReturnErrorOnFailure(DataModelLogger::LogValue("optionalIntWasPresent", indent + 1, value.optionalIntWasPresent));
    ReturnErrorOnFailure(DataModelLogger::LogValue("optionalIntValue", indent + 1, value.optionalIntValue));
    ReturnErrorOnFailure(
        DataModelLogger::LogValue("nullableOptionalIntWasPresent", indent + 1, value.nullableOptionalIntWasPresent));
    ReturnErrorOnFailure(DataModelLogger::LogValue("nullableOptionalIntWasNull", indent + 1, value.nullableOptionalIntWasNull));
    ReturnErrorOnFailure(DataModelLogger::LogValue("nullableOptionalIntValue", indent + 1, value.nullableOptionalIntValue));
    ReturnErrorOnFailure(DataModelLogger::LogValue("nullableStringWasNull", indent + 1, value.nullableStringWasNull));
    ReturnErrorOnFailure(DataModelLogger::LogValue("nullableStringValue", indent + 1, value.nullableStringValue));
    ReturnErrorOnFailure(DataModelLogger::LogValue("optionalStringWasPresent", indent + 1, value.optionalStringWasPresent));
    ReturnErrorOnFailure(DataModelLogger::LogValue("optionalStringValue", indent + 1, value.optionalStringValue));
    ReturnErrorOnFailure(
        DataModelLogger::LogValue("nullableOptionalStringWasPresent", indent + 1, value.nullableOptionalStringWasPresent));
    ReturnErrorOnFailure(
        DataModelLogger::LogValue("nullableOptionalStringWasNull", indent + 1, value.nullableOptionalStringWasNull));
    ReturnErrorOnFailure(DataModelLogger::LogValue("nullableOptionalStringValue", indent + 1, value.nullableOptionalStringValue));
    ReturnErrorOnFailure(DataModelLogger::LogValue("nullableStructWasNull", indent + 1, value.nullableStructWasNull));
    ReturnErrorOnFailure(DataModelLogger::LogValue("nullableStructValue", indent + 1, value.nullableStructValue));
    ReturnErrorOnFailure(DataModelLogger::LogValue("optionalStructWasPresent", indent + 1, value.optionalStructWasPresent));
    ReturnErrorOnFailure(DataModelLogger::LogValue("optionalStructValue", indent + 1, value.optionalStructValue));
    ReturnErrorOnFailure(
        DataModelLogger::LogValue("nullableOptionalStructWasPresent", indent + 1, value.nullableOptionalStructWasPresent));
    ReturnErrorOnFailure(
        DataModelLogger::LogValue("nullableOptionalStructWasNull", indent + 1, value.nullableOptionalStructWasNull));
    ReturnErrorOnFailure(DataModelLogger::LogValue("nullableOptionalStructValue", indent + 1, value.nullableOptionalStructValue));
    ReturnErrorOnFailure(DataModelLogger::LogValue("nullableListWasNull", indent + 1, value.nullableListWasNull));
    ReturnErrorOnFailure(DataModelLogger::LogValue("nullableListValue", indent + 1, value.nullableListValue));
    ReturnErrorOnFailure(DataModelLogger::LogValue("optionalListWasPresent", indent + 1, value.optionalListWasPresent));
    ReturnErrorOnFailure(DataModelLogger::LogValue("optionalListValue", indent + 1, value.optionalListValue));
    ReturnErrorOnFailure(
        DataModelLogger::LogValue("nullableOptionalListWasPresent", indent + 1, value.nullableOptionalListWasPresent));
    ReturnErrorOnFailure(DataModelLogger::LogValue("nullableOptionalListWasNull", indent + 1, value.nullableOptionalListWasNull));
    ReturnErrorOnFailure(DataModelLogger::LogValue("nullableOptionalListValue", indent + 1, value.nullableOptionalListValue));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const UnitTesting::Commands::BooleanResponse::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("value", indent + 1, value.value));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const UnitTesting::Commands::SimpleStructResponse::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("arg1", indent + 1, value.arg1));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const UnitTesting::Commands::TestEmitTestEventResponse::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("value", indent + 1, value.value));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}
CHIP_ERROR DataModelLogger::LogValue(const char * label, size_t indent,
                                     const UnitTesting::Commands::TestEmitTestFabricScopedEventResponse::DecodableType & value)
{
    DataModelLogger::LogString(label, indent, "{");
    ReturnErrorOnFailure(DataModelLogger::LogValue("value", indent + 1, value.value));
    DataModelLogger::LogString(indent, "}");
    return CHIP_NO_ERROR;
}

CHIP_ERROR DataModelLogger::LogAttribute(const chip::app::ConcreteDataAttributePath & path, chip::TLV::TLVReader * data)
{
    ChipLogProgress(chipTool, "Endpoint: %u Cluster: " ChipLogFormatMEI " Attribute " ChipLogFormatMEI " DataVersion: %" PRIu32,
                    path.mEndpointId, ChipLogValueMEI(path.mClusterId), ChipLogValueMEI(path.mAttributeId),
                    path.mDataVersion.ValueOr(0));

    switch (path.mClusterId)
    {
    case Identify::Id: {
        switch (path.mAttributeId)
        {
        case Identify::Attributes::IdentifyTime::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("IdentifyTime", 1, value);
        }
        case Identify::Attributes::IdentifyType::Id: {
            chip::app::Clusters::Identify::IdentifyTypeEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("IdentifyType", 1, value);
        }
        case Identify::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case Identify::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case Identify::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case Identify::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case Identify::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case Identify::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case Groups::Id: {
        switch (path.mAttributeId)
        {
        case Groups::Attributes::NameSupport::Id: {
            chip::BitMask<chip::app::Clusters::Groups::NameSupportBitmap> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("NameSupport", 1, value);
        }
        case Groups::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case Groups::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case Groups::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case Groups::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case Groups::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case Groups::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case Scenes::Id: {
        switch (path.mAttributeId)
        {
        case Scenes::Attributes::SceneCount::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("SceneCount", 1, value);
        }
        case Scenes::Attributes::CurrentScene::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("CurrentScene", 1, value);
        }
        case Scenes::Attributes::CurrentGroup::Id: {
            chip::GroupId value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("CurrentGroup", 1, value);
        }
        case Scenes::Attributes::SceneValid::Id: {
            bool value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("SceneValid", 1, value);
        }
        case Scenes::Attributes::NameSupport::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("NameSupport", 1, value);
        }
        case Scenes::Attributes::LastConfiguredBy::Id: {
            chip::app::DataModel::Nullable<chip::NodeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LastConfiguredBy", 1, value);
        }
        case Scenes::Attributes::SceneTableSize::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("SceneTableSize", 1, value);
        }
        case Scenes::Attributes::RemainingCapacity::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("RemainingCapacity", 1, value);
        }
        case Scenes::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case Scenes::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case Scenes::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case Scenes::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case Scenes::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case Scenes::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case OnOff::Id: {
        switch (path.mAttributeId)
        {
        case OnOff::Attributes::OnOff::Id: {
            bool value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("OnOff", 1, value);
        }
        case OnOff::Attributes::GlobalSceneControl::Id: {
            bool value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GlobalSceneControl", 1, value);
        }
        case OnOff::Attributes::OnTime::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("OnTime", 1, value);
        }
        case OnOff::Attributes::OffWaitTime::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("OffWaitTime", 1, value);
        }
        case OnOff::Attributes::StartUpOnOff::Id: {
            chip::app::DataModel::Nullable<chip::app::Clusters::OnOff::OnOffStartUpOnOff> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("StartUpOnOff", 1, value);
        }
        case OnOff::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case OnOff::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case OnOff::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case OnOff::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case OnOff::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case OnOff::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case OnOffSwitchConfiguration::Id: {
        switch (path.mAttributeId)
        {
        case OnOffSwitchConfiguration::Attributes::SwitchType::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("switch type", 1, value);
        }
        case OnOffSwitchConfiguration::Attributes::SwitchActions::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("switch actions", 1, value);
        }
        case OnOffSwitchConfiguration::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case OnOffSwitchConfiguration::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case OnOffSwitchConfiguration::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case OnOffSwitchConfiguration::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case OnOffSwitchConfiguration::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case OnOffSwitchConfiguration::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case LevelControl::Id: {
        switch (path.mAttributeId)
        {
        case LevelControl::Attributes::CurrentLevel::Id: {
            chip::app::DataModel::Nullable<uint8_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("CurrentLevel", 1, value);
        }
        case LevelControl::Attributes::RemainingTime::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("RemainingTime", 1, value);
        }
        case LevelControl::Attributes::MinLevel::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MinLevel", 1, value);
        }
        case LevelControl::Attributes::MaxLevel::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxLevel", 1, value);
        }
        case LevelControl::Attributes::CurrentFrequency::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("CurrentFrequency", 1, value);
        }
        case LevelControl::Attributes::MinFrequency::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MinFrequency", 1, value);
        }
        case LevelControl::Attributes::MaxFrequency::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxFrequency", 1, value);
        }
        case LevelControl::Attributes::Options::Id: {
            chip::BitMask<chip::app::Clusters::LevelControl::LevelControlOptions> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Options", 1, value);
        }
        case LevelControl::Attributes::OnOffTransitionTime::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("OnOffTransitionTime", 1, value);
        }
        case LevelControl::Attributes::OnLevel::Id: {
            chip::app::DataModel::Nullable<uint8_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("OnLevel", 1, value);
        }
        case LevelControl::Attributes::OnTransitionTime::Id: {
            chip::app::DataModel::Nullable<uint16_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("OnTransitionTime", 1, value);
        }
        case LevelControl::Attributes::OffTransitionTime::Id: {
            chip::app::DataModel::Nullable<uint16_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("OffTransitionTime", 1, value);
        }
        case LevelControl::Attributes::DefaultMoveRate::Id: {
            chip::app::DataModel::Nullable<uint8_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("DefaultMoveRate", 1, value);
        }
        case LevelControl::Attributes::StartUpCurrentLevel::Id: {
            chip::app::DataModel::Nullable<uint8_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("StartUpCurrentLevel", 1, value);
        }
        case LevelControl::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case LevelControl::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case LevelControl::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case LevelControl::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case LevelControl::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case LevelControl::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case BinaryInputBasic::Id: {
        switch (path.mAttributeId)
        {
        case BinaryInputBasic::Attributes::ActiveText::Id: {
            chip::CharSpan value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("active text", 1, value);
        }
        case BinaryInputBasic::Attributes::Description::Id: {
            chip::CharSpan value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("description", 1, value);
        }
        case BinaryInputBasic::Attributes::InactiveText::Id: {
            chip::CharSpan value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("inactive text", 1, value);
        }
        case BinaryInputBasic::Attributes::OutOfService::Id: {
            bool value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("out of service", 1, value);
        }
        case BinaryInputBasic::Attributes::Polarity::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("polarity", 1, value);
        }
        case BinaryInputBasic::Attributes::PresentValue::Id: {
            bool value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("present value", 1, value);
        }
        case BinaryInputBasic::Attributes::Reliability::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("reliability", 1, value);
        }
        case BinaryInputBasic::Attributes::StatusFlags::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("status flags", 1, value);
        }
        case BinaryInputBasic::Attributes::ApplicationType::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("application type", 1, value);
        }
        case BinaryInputBasic::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case BinaryInputBasic::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case BinaryInputBasic::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case BinaryInputBasic::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case BinaryInputBasic::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case BinaryInputBasic::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case PulseWidthModulation::Id: {
        switch (path.mAttributeId)
        {
        case PulseWidthModulation::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case PulseWidthModulation::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case PulseWidthModulation::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case PulseWidthModulation::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case PulseWidthModulation::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case PulseWidthModulation::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case Descriptor::Id: {
        switch (path.mAttributeId)
        {
        case Descriptor::Attributes::DeviceTypeList::Id: {
            chip::app::DataModel::DecodableList<chip::app::Clusters::Descriptor::Structs::DeviceTypeStruct::DecodableType> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("DeviceTypeList", 1, value);
        }
        case Descriptor::Attributes::ServerList::Id: {
            chip::app::DataModel::DecodableList<chip::ClusterId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ServerList", 1, value);
        }
        case Descriptor::Attributes::ClientList::Id: {
            chip::app::DataModel::DecodableList<chip::ClusterId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClientList", 1, value);
        }
        case Descriptor::Attributes::PartsList::Id: {
            chip::app::DataModel::DecodableList<chip::EndpointId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PartsList", 1, value);
        }
        case Descriptor::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case Descriptor::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case Descriptor::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case Descriptor::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case Descriptor::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case Descriptor::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case Binding::Id: {
        switch (path.mAttributeId)
        {
        case Binding::Attributes::Binding::Id: {
            chip::app::DataModel::DecodableList<chip::app::Clusters::Binding::Structs::TargetStruct::DecodableType> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Binding", 1, value);
        }
        case Binding::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case Binding::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case Binding::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case Binding::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case Binding::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case Binding::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case AccessControl::Id: {
        switch (path.mAttributeId)
        {
        case AccessControl::Attributes::Acl::Id: {
            chip::app::DataModel::DecodableList<
                chip::app::Clusters::AccessControl::Structs::AccessControlEntryStruct::DecodableType>
                value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ACL", 1, value);
        }
        case AccessControl::Attributes::Extension::Id: {
            chip::app::DataModel::DecodableList<
                chip::app::Clusters::AccessControl::Structs::AccessControlExtensionStruct::DecodableType>
                value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Extension", 1, value);
        }
        case AccessControl::Attributes::SubjectsPerAccessControlEntry::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("SubjectsPerAccessControlEntry", 1, value);
        }
        case AccessControl::Attributes::TargetsPerAccessControlEntry::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("TargetsPerAccessControlEntry", 1, value);
        }
        case AccessControl::Attributes::AccessControlEntriesPerFabric::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AccessControlEntriesPerFabric", 1, value);
        }
        case AccessControl::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case AccessControl::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case AccessControl::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case AccessControl::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case AccessControl::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case AccessControl::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case Actions::Id: {
        switch (path.mAttributeId)
        {
        case Actions::Attributes::ActionList::Id: {
            chip::app::DataModel::DecodableList<chip::app::Clusters::Actions::Structs::ActionStruct::DecodableType> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ActionList", 1, value);
        }
        case Actions::Attributes::EndpointLists::Id: {
            chip::app::DataModel::DecodableList<chip::app::Clusters::Actions::Structs::EndpointListStruct::DecodableType> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EndpointLists", 1, value);
        }
        case Actions::Attributes::SetupURL::Id: {
            chip::CharSpan value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("SetupURL", 1, value);
        }
        case Actions::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case Actions::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case Actions::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case Actions::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case Actions::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case Actions::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case BasicInformation::Id: {
        switch (path.mAttributeId)
        {
        case BasicInformation::Attributes::DataModelRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("DataModelRevision", 1, value);
        }
        case BasicInformation::Attributes::VendorName::Id: {
            chip::CharSpan value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("VendorName", 1, value);
        }
        case BasicInformation::Attributes::VendorID::Id: {
            chip::VendorId value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("VendorID", 1, value);
        }
        case BasicInformation::Attributes::ProductName::Id: {
            chip::CharSpan value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ProductName", 1, value);
        }
        case BasicInformation::Attributes::ProductID::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ProductID", 1, value);
        }
        case BasicInformation::Attributes::NodeLabel::Id: {
            chip::CharSpan value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("NodeLabel", 1, value);
        }
        case BasicInformation::Attributes::Location::Id: {
            chip::CharSpan value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Location", 1, value);
        }
        case BasicInformation::Attributes::HardwareVersion::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("HardwareVersion", 1, value);
        }
        case BasicInformation::Attributes::HardwareVersionString::Id: {
            chip::CharSpan value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("HardwareVersionString", 1, value);
        }
        case BasicInformation::Attributes::SoftwareVersion::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("SoftwareVersion", 1, value);
        }
        case BasicInformation::Attributes::SoftwareVersionString::Id: {
            chip::CharSpan value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("SoftwareVersionString", 1, value);
        }
        case BasicInformation::Attributes::ManufacturingDate::Id: {
            chip::CharSpan value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ManufacturingDate", 1, value);
        }
        case BasicInformation::Attributes::PartNumber::Id: {
            chip::CharSpan value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PartNumber", 1, value);
        }
        case BasicInformation::Attributes::ProductURL::Id: {
            chip::CharSpan value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ProductURL", 1, value);
        }
        case BasicInformation::Attributes::ProductLabel::Id: {
            chip::CharSpan value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ProductLabel", 1, value);
        }
        case BasicInformation::Attributes::SerialNumber::Id: {
            chip::CharSpan value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("SerialNumber", 1, value);
        }
        case BasicInformation::Attributes::LocalConfigDisabled::Id: {
            bool value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LocalConfigDisabled", 1, value);
        }
        case BasicInformation::Attributes::Reachable::Id: {
            bool value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Reachable", 1, value);
        }
        case BasicInformation::Attributes::UniqueID::Id: {
            chip::CharSpan value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("UniqueID", 1, value);
        }
        case BasicInformation::Attributes::CapabilityMinima::Id: {
            chip::app::Clusters::BasicInformation::Structs::CapabilityMinimaStruct::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("CapabilityMinima", 1, value);
        }
        case BasicInformation::Attributes::ProductAppearance::Id: {
            chip::app::Clusters::BasicInformation::Structs::ProductAppearanceStruct::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ProductAppearance", 1, value);
        }
        case BasicInformation::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case BasicInformation::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case BasicInformation::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case BasicInformation::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case BasicInformation::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case BasicInformation::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case OtaSoftwareUpdateProvider::Id: {
        switch (path.mAttributeId)
        {
        case OtaSoftwareUpdateProvider::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case OtaSoftwareUpdateProvider::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case OtaSoftwareUpdateProvider::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case OtaSoftwareUpdateProvider::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case OtaSoftwareUpdateProvider::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case OtaSoftwareUpdateProvider::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case OtaSoftwareUpdateRequestor::Id: {
        switch (path.mAttributeId)
        {
        case OtaSoftwareUpdateRequestor::Attributes::DefaultOTAProviders::Id: {
            chip::app::DataModel::DecodableList<
                chip::app::Clusters::OtaSoftwareUpdateRequestor::Structs::ProviderLocation::DecodableType>
                value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("DefaultOTAProviders", 1, value);
        }
        case OtaSoftwareUpdateRequestor::Attributes::UpdatePossible::Id: {
            bool value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("UpdatePossible", 1, value);
        }
        case OtaSoftwareUpdateRequestor::Attributes::UpdateState::Id: {
            chip::app::Clusters::OtaSoftwareUpdateRequestor::OTAUpdateStateEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("UpdateState", 1, value);
        }
        case OtaSoftwareUpdateRequestor::Attributes::UpdateStateProgress::Id: {
            chip::app::DataModel::Nullable<uint8_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("UpdateStateProgress", 1, value);
        }
        case OtaSoftwareUpdateRequestor::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case OtaSoftwareUpdateRequestor::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case OtaSoftwareUpdateRequestor::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case OtaSoftwareUpdateRequestor::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case OtaSoftwareUpdateRequestor::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case OtaSoftwareUpdateRequestor::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case LocalizationConfiguration::Id: {
        switch (path.mAttributeId)
        {
        case LocalizationConfiguration::Attributes::ActiveLocale::Id: {
            chip::CharSpan value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ActiveLocale", 1, value);
        }
        case LocalizationConfiguration::Attributes::SupportedLocales::Id: {
            chip::app::DataModel::DecodableList<chip::CharSpan> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("SupportedLocales", 1, value);
        }
        case LocalizationConfiguration::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case LocalizationConfiguration::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case LocalizationConfiguration::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case LocalizationConfiguration::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case LocalizationConfiguration::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case LocalizationConfiguration::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case TimeFormatLocalization::Id: {
        switch (path.mAttributeId)
        {
        case TimeFormatLocalization::Attributes::HourFormat::Id: {
            chip::app::Clusters::TimeFormatLocalization::HourFormatEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("HourFormat", 1, value);
        }
        case TimeFormatLocalization::Attributes::ActiveCalendarType::Id: {
            chip::app::Clusters::TimeFormatLocalization::CalendarTypeEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ActiveCalendarType", 1, value);
        }
        case TimeFormatLocalization::Attributes::SupportedCalendarTypes::Id: {
            chip::app::DataModel::DecodableList<chip::app::Clusters::TimeFormatLocalization::CalendarTypeEnum> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("SupportedCalendarTypes", 1, value);
        }
        case TimeFormatLocalization::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case TimeFormatLocalization::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case TimeFormatLocalization::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case TimeFormatLocalization::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case TimeFormatLocalization::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case TimeFormatLocalization::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case UnitLocalization::Id: {
        switch (path.mAttributeId)
        {
        case UnitLocalization::Attributes::TemperatureUnit::Id: {
            chip::app::Clusters::UnitLocalization::TempUnitEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("TemperatureUnit", 1, value);
        }
        case UnitLocalization::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case UnitLocalization::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case UnitLocalization::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case UnitLocalization::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case UnitLocalization::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case UnitLocalization::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case PowerSourceConfiguration::Id: {
        switch (path.mAttributeId)
        {
        case PowerSourceConfiguration::Attributes::Sources::Id: {
            chip::app::DataModel::DecodableList<uint8_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Sources", 1, value);
        }
        case PowerSourceConfiguration::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case PowerSourceConfiguration::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case PowerSourceConfiguration::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case PowerSourceConfiguration::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case PowerSourceConfiguration::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case PowerSourceConfiguration::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case PowerSource::Id: {
        switch (path.mAttributeId)
        {
        case PowerSource::Attributes::Status::Id: {
            chip::app::Clusters::PowerSource::PowerSourceStatusEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Status", 1, value);
        }
        case PowerSource::Attributes::Order::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Order", 1, value);
        }
        case PowerSource::Attributes::Description::Id: {
            chip::CharSpan value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Description", 1, value);
        }
        case PowerSource::Attributes::WiredAssessedInputVoltage::Id: {
            chip::app::DataModel::Nullable<uint32_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("WiredAssessedInputVoltage", 1, value);
        }
        case PowerSource::Attributes::WiredAssessedInputFrequency::Id: {
            chip::app::DataModel::Nullable<uint16_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("WiredAssessedInputFrequency", 1, value);
        }
        case PowerSource::Attributes::WiredCurrentType::Id: {
            chip::app::Clusters::PowerSource::WiredCurrentTypeEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("WiredCurrentType", 1, value);
        }
        case PowerSource::Attributes::WiredAssessedCurrent::Id: {
            chip::app::DataModel::Nullable<uint32_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("WiredAssessedCurrent", 1, value);
        }
        case PowerSource::Attributes::WiredNominalVoltage::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("WiredNominalVoltage", 1, value);
        }
        case PowerSource::Attributes::WiredMaximumCurrent::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("WiredMaximumCurrent", 1, value);
        }
        case PowerSource::Attributes::WiredPresent::Id: {
            bool value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("WiredPresent", 1, value);
        }
        case PowerSource::Attributes::ActiveWiredFaults::Id: {
            chip::app::DataModel::DecodableList<chip::app::Clusters::PowerSource::WiredFaultEnum> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ActiveWiredFaults", 1, value);
        }
        case PowerSource::Attributes::BatVoltage::Id: {
            chip::app::DataModel::Nullable<uint32_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("BatVoltage", 1, value);
        }
        case PowerSource::Attributes::BatPercentRemaining::Id: {
            chip::app::DataModel::Nullable<uint8_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("BatPercentRemaining", 1, value);
        }
        case PowerSource::Attributes::BatTimeRemaining::Id: {
            chip::app::DataModel::Nullable<uint32_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("BatTimeRemaining", 1, value);
        }
        case PowerSource::Attributes::BatChargeLevel::Id: {
            chip::app::Clusters::PowerSource::BatChargeLevelEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("BatChargeLevel", 1, value);
        }
        case PowerSource::Attributes::BatReplacementNeeded::Id: {
            bool value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("BatReplacementNeeded", 1, value);
        }
        case PowerSource::Attributes::BatReplaceability::Id: {
            chip::app::Clusters::PowerSource::BatReplaceabilityEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("BatReplaceability", 1, value);
        }
        case PowerSource::Attributes::BatPresent::Id: {
            bool value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("BatPresent", 1, value);
        }
        case PowerSource::Attributes::ActiveBatFaults::Id: {
            chip::app::DataModel::DecodableList<chip::app::Clusters::PowerSource::BatFaultEnum> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ActiveBatFaults", 1, value);
        }
        case PowerSource::Attributes::BatReplacementDescription::Id: {
            chip::CharSpan value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("BatReplacementDescription", 1, value);
        }
        case PowerSource::Attributes::BatCommonDesignation::Id: {
            chip::app::Clusters::PowerSource::BatCommonDesignationEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("BatCommonDesignation", 1, value);
        }
        case PowerSource::Attributes::BatANSIDesignation::Id: {
            chip::CharSpan value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("BatANSIDesignation", 1, value);
        }
        case PowerSource::Attributes::BatIECDesignation::Id: {
            chip::CharSpan value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("BatIECDesignation", 1, value);
        }
        case PowerSource::Attributes::BatApprovedChemistry::Id: {
            chip::app::Clusters::PowerSource::BatApprovedChemistryEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("BatApprovedChemistry", 1, value);
        }
        case PowerSource::Attributes::BatCapacity::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("BatCapacity", 1, value);
        }
        case PowerSource::Attributes::BatQuantity::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("BatQuantity", 1, value);
        }
        case PowerSource::Attributes::BatChargeState::Id: {
            chip::app::Clusters::PowerSource::BatChargeStateEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("BatChargeState", 1, value);
        }
        case PowerSource::Attributes::BatTimeToFullCharge::Id: {
            chip::app::DataModel::Nullable<uint32_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("BatTimeToFullCharge", 1, value);
        }
        case PowerSource::Attributes::BatFunctionalWhileCharging::Id: {
            bool value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("BatFunctionalWhileCharging", 1, value);
        }
        case PowerSource::Attributes::BatChargingCurrent::Id: {
            chip::app::DataModel::Nullable<uint32_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("BatChargingCurrent", 1, value);
        }
        case PowerSource::Attributes::ActiveBatChargeFaults::Id: {
            chip::app::DataModel::DecodableList<chip::app::Clusters::PowerSource::BatChargeFaultEnum> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ActiveBatChargeFaults", 1, value);
        }
        case PowerSource::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case PowerSource::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case PowerSource::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case PowerSource::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case PowerSource::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case PowerSource::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case GeneralCommissioning::Id: {
        switch (path.mAttributeId)
        {
        case GeneralCommissioning::Attributes::Breadcrumb::Id: {
            uint64_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Breadcrumb", 1, value);
        }
        case GeneralCommissioning::Attributes::BasicCommissioningInfo::Id: {
            chip::app::Clusters::GeneralCommissioning::Structs::BasicCommissioningInfo::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("BasicCommissioningInfo", 1, value);
        }
        case GeneralCommissioning::Attributes::RegulatoryConfig::Id: {
            chip::app::Clusters::GeneralCommissioning::RegulatoryLocationTypeEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("RegulatoryConfig", 1, value);
        }
        case GeneralCommissioning::Attributes::LocationCapability::Id: {
            chip::app::Clusters::GeneralCommissioning::RegulatoryLocationTypeEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LocationCapability", 1, value);
        }
        case GeneralCommissioning::Attributes::SupportsConcurrentConnection::Id: {
            bool value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("SupportsConcurrentConnection", 1, value);
        }
        case GeneralCommissioning::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case GeneralCommissioning::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case GeneralCommissioning::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case GeneralCommissioning::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case GeneralCommissioning::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case GeneralCommissioning::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case NetworkCommissioning::Id: {
        switch (path.mAttributeId)
        {
        case NetworkCommissioning::Attributes::MaxNetworks::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxNetworks", 1, value);
        }
        case NetworkCommissioning::Attributes::Networks::Id: {
            chip::app::DataModel::DecodableList<chip::app::Clusters::NetworkCommissioning::Structs::NetworkInfo::DecodableType>
                value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Networks", 1, value);
        }
        case NetworkCommissioning::Attributes::ScanMaxTimeSeconds::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ScanMaxTimeSeconds", 1, value);
        }
        case NetworkCommissioning::Attributes::ConnectMaxTimeSeconds::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ConnectMaxTimeSeconds", 1, value);
        }
        case NetworkCommissioning::Attributes::InterfaceEnabled::Id: {
            bool value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("InterfaceEnabled", 1, value);
        }
        case NetworkCommissioning::Attributes::LastNetworkingStatus::Id: {
            chip::app::DataModel::Nullable<chip::app::Clusters::NetworkCommissioning::NetworkCommissioningStatus> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LastNetworkingStatus", 1, value);
        }
        case NetworkCommissioning::Attributes::LastNetworkID::Id: {
            chip::app::DataModel::Nullable<chip::ByteSpan> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LastNetworkID", 1, value);
        }
        case NetworkCommissioning::Attributes::LastConnectErrorValue::Id: {
            chip::app::DataModel::Nullable<int32_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LastConnectErrorValue", 1, value);
        }
        case NetworkCommissioning::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case NetworkCommissioning::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case NetworkCommissioning::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case NetworkCommissioning::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case NetworkCommissioning::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case NetworkCommissioning::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case DiagnosticLogs::Id: {
        switch (path.mAttributeId)
        {
        case DiagnosticLogs::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case DiagnosticLogs::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case DiagnosticLogs::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case DiagnosticLogs::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case DiagnosticLogs::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case DiagnosticLogs::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case GeneralDiagnostics::Id: {
        switch (path.mAttributeId)
        {
        case GeneralDiagnostics::Attributes::NetworkInterfaces::Id: {
            chip::app::DataModel::DecodableList<chip::app::Clusters::GeneralDiagnostics::Structs::NetworkInterface::DecodableType>
                value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("NetworkInterfaces", 1, value);
        }
        case GeneralDiagnostics::Attributes::RebootCount::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("RebootCount", 1, value);
        }
        case GeneralDiagnostics::Attributes::UpTime::Id: {
            uint64_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("UpTime", 1, value);
        }
        case GeneralDiagnostics::Attributes::TotalOperationalHours::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("TotalOperationalHours", 1, value);
        }
        case GeneralDiagnostics::Attributes::BootReason::Id: {
            chip::app::Clusters::GeneralDiagnostics::BootReasonEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("BootReason", 1, value);
        }
        case GeneralDiagnostics::Attributes::ActiveHardwareFaults::Id: {
            chip::app::DataModel::DecodableList<chip::app::Clusters::GeneralDiagnostics::HardwareFaultEnum> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ActiveHardwareFaults", 1, value);
        }
        case GeneralDiagnostics::Attributes::ActiveRadioFaults::Id: {
            chip::app::DataModel::DecodableList<chip::app::Clusters::GeneralDiagnostics::RadioFaultEnum> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ActiveRadioFaults", 1, value);
        }
        case GeneralDiagnostics::Attributes::ActiveNetworkFaults::Id: {
            chip::app::DataModel::DecodableList<chip::app::Clusters::GeneralDiagnostics::NetworkFaultEnum> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ActiveNetworkFaults", 1, value);
        }
        case GeneralDiagnostics::Attributes::TestEventTriggersEnabled::Id: {
            bool value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("TestEventTriggersEnabled", 1, value);
        }
        case GeneralDiagnostics::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case GeneralDiagnostics::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case GeneralDiagnostics::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case GeneralDiagnostics::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case GeneralDiagnostics::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case GeneralDiagnostics::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case SoftwareDiagnostics::Id: {
        switch (path.mAttributeId)
        {
        case SoftwareDiagnostics::Attributes::ThreadMetrics::Id: {
            chip::app::DataModel::DecodableList<
                chip::app::Clusters::SoftwareDiagnostics::Structs::ThreadMetricsStruct::DecodableType>
                value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ThreadMetrics", 1, value);
        }
        case SoftwareDiagnostics::Attributes::CurrentHeapFree::Id: {
            uint64_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("CurrentHeapFree", 1, value);
        }
        case SoftwareDiagnostics::Attributes::CurrentHeapUsed::Id: {
            uint64_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("CurrentHeapUsed", 1, value);
        }
        case SoftwareDiagnostics::Attributes::CurrentHeapHighWatermark::Id: {
            uint64_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("CurrentHeapHighWatermark", 1, value);
        }
        case SoftwareDiagnostics::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case SoftwareDiagnostics::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case SoftwareDiagnostics::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case SoftwareDiagnostics::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case SoftwareDiagnostics::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case SoftwareDiagnostics::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case ThreadNetworkDiagnostics::Id: {
        switch (path.mAttributeId)
        {
        case ThreadNetworkDiagnostics::Attributes::Channel::Id: {
            chip::app::DataModel::Nullable<uint16_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Channel", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::RoutingRole::Id: {
            chip::app::DataModel::Nullable<chip::app::Clusters::ThreadNetworkDiagnostics::RoutingRoleEnum> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("RoutingRole", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::NetworkName::Id: {
            chip::app::DataModel::Nullable<chip::CharSpan> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("NetworkName", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::PanId::Id: {
            chip::app::DataModel::Nullable<uint16_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PanId", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::ExtendedPanId::Id: {
            chip::app::DataModel::Nullable<uint64_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ExtendedPanId", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::MeshLocalPrefix::Id: {
            chip::app::DataModel::Nullable<chip::ByteSpan> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeshLocalPrefix", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::OverrunCount::Id: {
            uint64_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("OverrunCount", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::NeighborTable::Id: {
            chip::app::DataModel::DecodableList<
                chip::app::Clusters::ThreadNetworkDiagnostics::Structs::NeighborTableStruct::DecodableType>
                value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("NeighborTable", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::RouteTable::Id: {
            chip::app::DataModel::DecodableList<
                chip::app::Clusters::ThreadNetworkDiagnostics::Structs::RouteTableStruct::DecodableType>
                value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("RouteTable", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::PartitionId::Id: {
            chip::app::DataModel::Nullable<uint32_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PartitionId", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::Weighting::Id: {
            chip::app::DataModel::Nullable<uint8_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Weighting", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::DataVersion::Id: {
            chip::app::DataModel::Nullable<uint8_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("DataVersion", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::StableDataVersion::Id: {
            chip::app::DataModel::Nullable<uint8_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("StableDataVersion", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::LeaderRouterId::Id: {
            chip::app::DataModel::Nullable<uint8_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LeaderRouterId", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::DetachedRoleCount::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("DetachedRoleCount", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::ChildRoleCount::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ChildRoleCount", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::RouterRoleCount::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("RouterRoleCount", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::LeaderRoleCount::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LeaderRoleCount", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::AttachAttemptCount::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttachAttemptCount", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::PartitionIdChangeCount::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PartitionIdChangeCount", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::BetterPartitionAttachAttemptCount::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("BetterPartitionAttachAttemptCount", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::ParentChangeCount::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ParentChangeCount", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::TxTotalCount::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("TxTotalCount", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::TxUnicastCount::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("TxUnicastCount", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::TxBroadcastCount::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("TxBroadcastCount", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::TxAckRequestedCount::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("TxAckRequestedCount", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::TxAckedCount::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("TxAckedCount", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::TxNoAckRequestedCount::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("TxNoAckRequestedCount", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::TxDataCount::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("TxDataCount", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::TxDataPollCount::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("TxDataPollCount", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::TxBeaconCount::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("TxBeaconCount", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::TxBeaconRequestCount::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("TxBeaconRequestCount", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::TxOtherCount::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("TxOtherCount", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::TxRetryCount::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("TxRetryCount", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::TxDirectMaxRetryExpiryCount::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("TxDirectMaxRetryExpiryCount", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::TxIndirectMaxRetryExpiryCount::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("TxIndirectMaxRetryExpiryCount", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::TxErrCcaCount::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("TxErrCcaCount", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::TxErrAbortCount::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("TxErrAbortCount", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::TxErrBusyChannelCount::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("TxErrBusyChannelCount", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::RxTotalCount::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("RxTotalCount", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::RxUnicastCount::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("RxUnicastCount", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::RxBroadcastCount::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("RxBroadcastCount", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::RxDataCount::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("RxDataCount", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::RxDataPollCount::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("RxDataPollCount", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::RxBeaconCount::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("RxBeaconCount", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::RxBeaconRequestCount::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("RxBeaconRequestCount", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::RxOtherCount::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("RxOtherCount", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::RxAddressFilteredCount::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("RxAddressFilteredCount", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::RxDestAddrFilteredCount::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("RxDestAddrFilteredCount", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::RxDuplicatedCount::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("RxDuplicatedCount", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::RxErrNoFrameCount::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("RxErrNoFrameCount", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::RxErrUnknownNeighborCount::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("RxErrUnknownNeighborCount", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::RxErrInvalidSrcAddrCount::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("RxErrInvalidSrcAddrCount", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::RxErrSecCount::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("RxErrSecCount", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::RxErrFcsCount::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("RxErrFcsCount", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::RxErrOtherCount::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("RxErrOtherCount", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::ActiveTimestamp::Id: {
            chip::app::DataModel::Nullable<uint64_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ActiveTimestamp", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::PendingTimestamp::Id: {
            chip::app::DataModel::Nullable<uint64_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PendingTimestamp", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::Delay::Id: {
            chip::app::DataModel::Nullable<uint32_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Delay", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::SecurityPolicy::Id: {
            chip::app::DataModel::Nullable<chip::app::Clusters::ThreadNetworkDiagnostics::Structs::SecurityPolicy::DecodableType>
                value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("SecurityPolicy", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::ChannelPage0Mask::Id: {
            chip::app::DataModel::Nullable<chip::ByteSpan> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ChannelPage0Mask", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::OperationalDatasetComponents::Id: {
            chip::app::DataModel::Nullable<
                chip::app::Clusters::ThreadNetworkDiagnostics::Structs::OperationalDatasetComponents::DecodableType>
                value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("OperationalDatasetComponents", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::ActiveNetworkFaultsList::Id: {
            chip::app::DataModel::DecodableList<chip::app::Clusters::ThreadNetworkDiagnostics::NetworkFaultEnum> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ActiveNetworkFaultsList", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case ThreadNetworkDiagnostics::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case WiFiNetworkDiagnostics::Id: {
        switch (path.mAttributeId)
        {
        case WiFiNetworkDiagnostics::Attributes::Bssid::Id: {
            chip::app::DataModel::Nullable<chip::ByteSpan> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("BSSID", 1, value);
        }
        case WiFiNetworkDiagnostics::Attributes::SecurityType::Id: {
            chip::app::DataModel::Nullable<chip::app::Clusters::WiFiNetworkDiagnostics::SecurityTypeEnum> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("SecurityType", 1, value);
        }
        case WiFiNetworkDiagnostics::Attributes::WiFiVersion::Id: {
            chip::app::DataModel::Nullable<chip::app::Clusters::WiFiNetworkDiagnostics::WiFiVersionEnum> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("WiFiVersion", 1, value);
        }
        case WiFiNetworkDiagnostics::Attributes::ChannelNumber::Id: {
            chip::app::DataModel::Nullable<uint16_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ChannelNumber", 1, value);
        }
        case WiFiNetworkDiagnostics::Attributes::Rssi::Id: {
            chip::app::DataModel::Nullable<int8_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("RSSI", 1, value);
        }
        case WiFiNetworkDiagnostics::Attributes::BeaconLostCount::Id: {
            chip::app::DataModel::Nullable<uint32_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("BeaconLostCount", 1, value);
        }
        case WiFiNetworkDiagnostics::Attributes::BeaconRxCount::Id: {
            chip::app::DataModel::Nullable<uint32_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("BeaconRxCount", 1, value);
        }
        case WiFiNetworkDiagnostics::Attributes::PacketMulticastRxCount::Id: {
            chip::app::DataModel::Nullable<uint32_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PacketMulticastRxCount", 1, value);
        }
        case WiFiNetworkDiagnostics::Attributes::PacketMulticastTxCount::Id: {
            chip::app::DataModel::Nullable<uint32_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PacketMulticastTxCount", 1, value);
        }
        case WiFiNetworkDiagnostics::Attributes::PacketUnicastRxCount::Id: {
            chip::app::DataModel::Nullable<uint32_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PacketUnicastRxCount", 1, value);
        }
        case WiFiNetworkDiagnostics::Attributes::PacketUnicastTxCount::Id: {
            chip::app::DataModel::Nullable<uint32_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PacketUnicastTxCount", 1, value);
        }
        case WiFiNetworkDiagnostics::Attributes::CurrentMaxRate::Id: {
            chip::app::DataModel::Nullable<uint64_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("CurrentMaxRate", 1, value);
        }
        case WiFiNetworkDiagnostics::Attributes::OverrunCount::Id: {
            chip::app::DataModel::Nullable<uint64_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("OverrunCount", 1, value);
        }
        case WiFiNetworkDiagnostics::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case WiFiNetworkDiagnostics::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case WiFiNetworkDiagnostics::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case WiFiNetworkDiagnostics::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case WiFiNetworkDiagnostics::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case WiFiNetworkDiagnostics::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case EthernetNetworkDiagnostics::Id: {
        switch (path.mAttributeId)
        {
        case EthernetNetworkDiagnostics::Attributes::PHYRate::Id: {
            chip::app::DataModel::Nullable<chip::app::Clusters::EthernetNetworkDiagnostics::PHYRateEnum> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PHYRate", 1, value);
        }
        case EthernetNetworkDiagnostics::Attributes::FullDuplex::Id: {
            chip::app::DataModel::Nullable<bool> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FullDuplex", 1, value);
        }
        case EthernetNetworkDiagnostics::Attributes::PacketRxCount::Id: {
            uint64_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PacketRxCount", 1, value);
        }
        case EthernetNetworkDiagnostics::Attributes::PacketTxCount::Id: {
            uint64_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PacketTxCount", 1, value);
        }
        case EthernetNetworkDiagnostics::Attributes::TxErrCount::Id: {
            uint64_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("TxErrCount", 1, value);
        }
        case EthernetNetworkDiagnostics::Attributes::CollisionCount::Id: {
            uint64_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("CollisionCount", 1, value);
        }
        case EthernetNetworkDiagnostics::Attributes::OverrunCount::Id: {
            uint64_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("OverrunCount", 1, value);
        }
        case EthernetNetworkDiagnostics::Attributes::CarrierDetect::Id: {
            chip::app::DataModel::Nullable<bool> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("CarrierDetect", 1, value);
        }
        case EthernetNetworkDiagnostics::Attributes::TimeSinceReset::Id: {
            uint64_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("TimeSinceReset", 1, value);
        }
        case EthernetNetworkDiagnostics::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case EthernetNetworkDiagnostics::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case EthernetNetworkDiagnostics::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case EthernetNetworkDiagnostics::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case EthernetNetworkDiagnostics::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case EthernetNetworkDiagnostics::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case TimeSynchronization::Id: {
        switch (path.mAttributeId)
        {
        case TimeSynchronization::Attributes::UTCTime::Id: {
            chip::app::DataModel::Nullable<uint64_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("UTCTime", 1, value);
        }
        case TimeSynchronization::Attributes::Granularity::Id: {
            chip::app::Clusters::TimeSynchronization::GranularityEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Granularity", 1, value);
        }
        case TimeSynchronization::Attributes::TimeSource::Id: {
            chip::app::Clusters::TimeSynchronization::TimeSourceEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("TimeSource", 1, value);
        }
        case TimeSynchronization::Attributes::TrustedTimeSource::Id: {
            chip::app::DataModel::Nullable<
                chip::app::Clusters::TimeSynchronization::Structs::TrustedTimeSourceStruct::DecodableType>
                value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("TrustedTimeSource", 1, value);
        }
        case TimeSynchronization::Attributes::DefaultNTP::Id: {
            chip::app::DataModel::Nullable<chip::CharSpan> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("DefaultNTP", 1, value);
        }
        case TimeSynchronization::Attributes::TimeZone::Id: {
            chip::app::DataModel::DecodableList<chip::app::Clusters::TimeSynchronization::Structs::TimeZoneStruct::DecodableType>
                value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("TimeZone", 1, value);
        }
        case TimeSynchronization::Attributes::DSTOffset::Id: {
            chip::app::DataModel::DecodableList<chip::app::Clusters::TimeSynchronization::Structs::DSTOffsetStruct::DecodableType>
                value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("DSTOffset", 1, value);
        }
        case TimeSynchronization::Attributes::LocalTime::Id: {
            chip::app::DataModel::Nullable<uint64_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LocalTime", 1, value);
        }
        case TimeSynchronization::Attributes::TimeZoneDatabase::Id: {
            chip::app::Clusters::TimeSynchronization::TimeZoneDatabaseEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("TimeZoneDatabase", 1, value);
        }
        case TimeSynchronization::Attributes::NTPServerAvailable::Id: {
            bool value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("NTPServerAvailable", 1, value);
        }
        case TimeSynchronization::Attributes::TimeZoneListMaxSize::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("TimeZoneListMaxSize", 1, value);
        }
        case TimeSynchronization::Attributes::DSTOffsetListMaxSize::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("DSTOffsetListMaxSize", 1, value);
        }
        case TimeSynchronization::Attributes::SupportsDNSResolve::Id: {
            bool value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("SupportsDNSResolve", 1, value);
        }
        case TimeSynchronization::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case TimeSynchronization::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case TimeSynchronization::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case TimeSynchronization::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case TimeSynchronization::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case TimeSynchronization::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case BridgedDeviceBasicInformation::Id: {
        switch (path.mAttributeId)
        {
        case BridgedDeviceBasicInformation::Attributes::VendorName::Id: {
            chip::CharSpan value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("VendorName", 1, value);
        }
        case BridgedDeviceBasicInformation::Attributes::VendorID::Id: {
            chip::VendorId value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("VendorID", 1, value);
        }
        case BridgedDeviceBasicInformation::Attributes::ProductName::Id: {
            chip::CharSpan value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ProductName", 1, value);
        }
        case BridgedDeviceBasicInformation::Attributes::NodeLabel::Id: {
            chip::CharSpan value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("NodeLabel", 1, value);
        }
        case BridgedDeviceBasicInformation::Attributes::HardwareVersion::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("HardwareVersion", 1, value);
        }
        case BridgedDeviceBasicInformation::Attributes::HardwareVersionString::Id: {
            chip::CharSpan value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("HardwareVersionString", 1, value);
        }
        case BridgedDeviceBasicInformation::Attributes::SoftwareVersion::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("SoftwareVersion", 1, value);
        }
        case BridgedDeviceBasicInformation::Attributes::SoftwareVersionString::Id: {
            chip::CharSpan value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("SoftwareVersionString", 1, value);
        }
        case BridgedDeviceBasicInformation::Attributes::ManufacturingDate::Id: {
            chip::CharSpan value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ManufacturingDate", 1, value);
        }
        case BridgedDeviceBasicInformation::Attributes::PartNumber::Id: {
            chip::CharSpan value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PartNumber", 1, value);
        }
        case BridgedDeviceBasicInformation::Attributes::ProductURL::Id: {
            chip::CharSpan value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ProductURL", 1, value);
        }
        case BridgedDeviceBasicInformation::Attributes::ProductLabel::Id: {
            chip::CharSpan value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ProductLabel", 1, value);
        }
        case BridgedDeviceBasicInformation::Attributes::SerialNumber::Id: {
            chip::CharSpan value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("SerialNumber", 1, value);
        }
        case BridgedDeviceBasicInformation::Attributes::Reachable::Id: {
            bool value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Reachable", 1, value);
        }
        case BridgedDeviceBasicInformation::Attributes::UniqueID::Id: {
            chip::CharSpan value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("UniqueID", 1, value);
        }
        case BridgedDeviceBasicInformation::Attributes::ProductAppearance::Id: {
            chip::app::Clusters::BridgedDeviceBasicInformation::Structs::ProductAppearanceStruct::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ProductAppearance", 1, value);
        }
        case BridgedDeviceBasicInformation::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case BridgedDeviceBasicInformation::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case BridgedDeviceBasicInformation::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case BridgedDeviceBasicInformation::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case BridgedDeviceBasicInformation::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case BridgedDeviceBasicInformation::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case Switch::Id: {
        switch (path.mAttributeId)
        {
        case Switch::Attributes::NumberOfPositions::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("NumberOfPositions", 1, value);
        }
        case Switch::Attributes::CurrentPosition::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("CurrentPosition", 1, value);
        }
        case Switch::Attributes::MultiPressMax::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MultiPressMax", 1, value);
        }
        case Switch::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case Switch::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case Switch::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case Switch::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case Switch::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case Switch::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case AdministratorCommissioning::Id: {
        switch (path.mAttributeId)
        {
        case AdministratorCommissioning::Attributes::WindowStatus::Id: {
            chip::app::Clusters::AdministratorCommissioning::CommissioningWindowStatusEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("WindowStatus", 1, value);
        }
        case AdministratorCommissioning::Attributes::AdminFabricIndex::Id: {
            chip::app::DataModel::Nullable<chip::FabricIndex> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AdminFabricIndex", 1, value);
        }
        case AdministratorCommissioning::Attributes::AdminVendorId::Id: {
            chip::app::DataModel::Nullable<uint16_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AdminVendorId", 1, value);
        }
        case AdministratorCommissioning::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case AdministratorCommissioning::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case AdministratorCommissioning::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case AdministratorCommissioning::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case AdministratorCommissioning::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case AdministratorCommissioning::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case OperationalCredentials::Id: {
        switch (path.mAttributeId)
        {
        case OperationalCredentials::Attributes::NOCs::Id: {
            chip::app::DataModel::DecodableList<chip::app::Clusters::OperationalCredentials::Structs::NOCStruct::DecodableType>
                value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("NOCs", 1, value);
        }
        case OperationalCredentials::Attributes::Fabrics::Id: {
            chip::app::DataModel::DecodableList<
                chip::app::Clusters::OperationalCredentials::Structs::FabricDescriptorStruct::DecodableType>
                value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Fabrics", 1, value);
        }
        case OperationalCredentials::Attributes::SupportedFabrics::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("SupportedFabrics", 1, value);
        }
        case OperationalCredentials::Attributes::CommissionedFabrics::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("CommissionedFabrics", 1, value);
        }
        case OperationalCredentials::Attributes::TrustedRootCertificates::Id: {
            chip::app::DataModel::DecodableList<chip::ByteSpan> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("TrustedRootCertificates", 1, value);
        }
        case OperationalCredentials::Attributes::CurrentFabricIndex::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("CurrentFabricIndex", 1, value);
        }
        case OperationalCredentials::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case OperationalCredentials::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case OperationalCredentials::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case OperationalCredentials::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case OperationalCredentials::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case OperationalCredentials::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case GroupKeyManagement::Id: {
        switch (path.mAttributeId)
        {
        case GroupKeyManagement::Attributes::GroupKeyMap::Id: {
            chip::app::DataModel::DecodableList<chip::app::Clusters::GroupKeyManagement::Structs::GroupKeyMapStruct::DecodableType>
                value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GroupKeyMap", 1, value);
        }
        case GroupKeyManagement::Attributes::GroupTable::Id: {
            chip::app::DataModel::DecodableList<chip::app::Clusters::GroupKeyManagement::Structs::GroupInfoMapStruct::DecodableType>
                value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GroupTable", 1, value);
        }
        case GroupKeyManagement::Attributes::MaxGroupsPerFabric::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxGroupsPerFabric", 1, value);
        }
        case GroupKeyManagement::Attributes::MaxGroupKeysPerFabric::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxGroupKeysPerFabric", 1, value);
        }
        case GroupKeyManagement::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case GroupKeyManagement::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case GroupKeyManagement::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case GroupKeyManagement::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case GroupKeyManagement::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case GroupKeyManagement::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case FixedLabel::Id: {
        switch (path.mAttributeId)
        {
        case FixedLabel::Attributes::LabelList::Id: {
            chip::app::DataModel::DecodableList<chip::app::Clusters::FixedLabel::Structs::LabelStruct::DecodableType> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LabelList", 1, value);
        }
        case FixedLabel::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case FixedLabel::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case FixedLabel::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case FixedLabel::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case FixedLabel::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case FixedLabel::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case UserLabel::Id: {
        switch (path.mAttributeId)
        {
        case UserLabel::Attributes::LabelList::Id: {
            chip::app::DataModel::DecodableList<chip::app::Clusters::UserLabel::Structs::LabelStruct::DecodableType> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LabelList", 1, value);
        }
        case UserLabel::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case UserLabel::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case UserLabel::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case UserLabel::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case UserLabel::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case UserLabel::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case ProxyConfiguration::Id: {
        switch (path.mAttributeId)
        {
        case ProxyConfiguration::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case ProxyConfiguration::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case ProxyConfiguration::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case ProxyConfiguration::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case ProxyConfiguration::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case ProxyConfiguration::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case ProxyDiscovery::Id: {
        switch (path.mAttributeId)
        {
        case ProxyDiscovery::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case ProxyDiscovery::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case ProxyDiscovery::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case ProxyDiscovery::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case ProxyDiscovery::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case ProxyDiscovery::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case ProxyValid::Id: {
        switch (path.mAttributeId)
        {
        case ProxyValid::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case ProxyValid::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case ProxyValid::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case ProxyValid::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case ProxyValid::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case ProxyValid::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case BooleanState::Id: {
        switch (path.mAttributeId)
        {
        case BooleanState::Attributes::StateValue::Id: {
            bool value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("StateValue", 1, value);
        }
        case BooleanState::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case BooleanState::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case BooleanState::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case BooleanState::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case BooleanState::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case BooleanState::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case IcdManagement::Id: {
        switch (path.mAttributeId)
        {
        case IcdManagement::Attributes::IdleModeInterval::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("IdleModeInterval", 1, value);
        }
        case IcdManagement::Attributes::ActiveModeInterval::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ActiveModeInterval", 1, value);
        }
        case IcdManagement::Attributes::ActiveModeThreshold::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ActiveModeThreshold", 1, value);
        }
        case IcdManagement::Attributes::RegisteredClients::Id: {
            chip::app::DataModel::DecodableList<
                chip::app::Clusters::IcdManagement::Structs::MonitoringRegistrationStruct::DecodableType>
                value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("RegisteredClients", 1, value);
        }
        case IcdManagement::Attributes::ICDCounter::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ICDCounter", 1, value);
        }
        case IcdManagement::Attributes::ClientsSupportedPerFabric::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClientsSupportedPerFabric", 1, value);
        }
        case IcdManagement::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case IcdManagement::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case IcdManagement::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case IcdManagement::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case IcdManagement::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case IcdManagement::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case ModeSelect::Id: {
        switch (path.mAttributeId)
        {
        case ModeSelect::Attributes::Description::Id: {
            chip::CharSpan value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Description", 1, value);
        }
        case ModeSelect::Attributes::StandardNamespace::Id: {
            chip::app::DataModel::Nullable<uint16_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("StandardNamespace", 1, value);
        }
        case ModeSelect::Attributes::SupportedModes::Id: {
            chip::app::DataModel::DecodableList<chip::app::Clusters::ModeSelect::Structs::ModeOptionStruct::DecodableType> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("SupportedModes", 1, value);
        }
        case ModeSelect::Attributes::CurrentMode::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("CurrentMode", 1, value);
        }
        case ModeSelect::Attributes::StartUpMode::Id: {
            chip::app::DataModel::Nullable<uint8_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("StartUpMode", 1, value);
        }
        case ModeSelect::Attributes::OnMode::Id: {
            chip::app::DataModel::Nullable<uint8_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("OnMode", 1, value);
        }
        case ModeSelect::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case ModeSelect::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case ModeSelect::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case ModeSelect::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case ModeSelect::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case ModeSelect::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case TemperatureControl::Id: {
        switch (path.mAttributeId)
        {
        case TemperatureControl::Attributes::TemperatureSetpoint::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("TemperatureSetpoint", 1, value);
        }
        case TemperatureControl::Attributes::MinTemperature::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MinTemperature", 1, value);
        }
        case TemperatureControl::Attributes::MaxTemperature::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxTemperature", 1, value);
        }
        case TemperatureControl::Attributes::Step::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Step", 1, value);
        }
        case TemperatureControl::Attributes::CurrentTemperatureLevelIndex::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("CurrentTemperatureLevelIndex", 1, value);
        }
        case TemperatureControl::Attributes::SupportedTemperatureLevels::Id: {
            chip::app::DataModel::DecodableList<
                chip::app::Clusters::TemperatureControl::Structs::TemperatureLevelStruct::DecodableType>
                value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("SupportedTemperatureLevels", 1, value);
        }
        case TemperatureControl::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case TemperatureControl::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case TemperatureControl::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case TemperatureControl::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case TemperatureControl::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case TemperatureControl::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case RefrigeratorAlarm::Id: {
        switch (path.mAttributeId)
        {
        case RefrigeratorAlarm::Attributes::Mask::Id: {
            chip::BitMask<chip::app::Clusters::RefrigeratorAlarm::AlarmMap> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Mask", 1, value);
        }
        case RefrigeratorAlarm::Attributes::Latch::Id: {
            chip::BitMask<chip::app::Clusters::RefrigeratorAlarm::AlarmMap> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Latch", 1, value);
        }
        case RefrigeratorAlarm::Attributes::State::Id: {
            chip::BitMask<chip::app::Clusters::RefrigeratorAlarm::AlarmMap> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("State", 1, value);
        }
        case RefrigeratorAlarm::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case RefrigeratorAlarm::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case RefrigeratorAlarm::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case RefrigeratorAlarm::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case RefrigeratorAlarm::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case RefrigeratorAlarm::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case AirQuality::Id: {
        switch (path.mAttributeId)
        {
        case AirQuality::Attributes::AirQuality::Id: {
            chip::app::Clusters::AirQuality::AirQualityEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AirQuality", 1, value);
        }
        case AirQuality::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case AirQuality::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case AirQuality::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case AirQuality::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case AirQuality::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case AirQuality::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case SmokeCoAlarm::Id: {
        switch (path.mAttributeId)
        {
        case SmokeCoAlarm::Attributes::ExpressedState::Id: {
            chip::app::Clusters::SmokeCoAlarm::ExpressedStateEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ExpressedState", 1, value);
        }
        case SmokeCoAlarm::Attributes::SmokeState::Id: {
            chip::app::Clusters::SmokeCoAlarm::AlarmStateEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("SmokeState", 1, value);
        }
        case SmokeCoAlarm::Attributes::COState::Id: {
            chip::app::Clusters::SmokeCoAlarm::AlarmStateEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("COState", 1, value);
        }
        case SmokeCoAlarm::Attributes::BatteryAlert::Id: {
            chip::app::Clusters::SmokeCoAlarm::AlarmStateEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("BatteryAlert", 1, value);
        }
        case SmokeCoAlarm::Attributes::DeviceMuted::Id: {
            chip::app::Clusters::SmokeCoAlarm::MuteStateEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("DeviceMuted", 1, value);
        }
        case SmokeCoAlarm::Attributes::TestInProgress::Id: {
            bool value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("TestInProgress", 1, value);
        }
        case SmokeCoAlarm::Attributes::HardwareFaultAlert::Id: {
            bool value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("HardwareFaultAlert", 1, value);
        }
        case SmokeCoAlarm::Attributes::EndOfServiceAlert::Id: {
            chip::app::Clusters::SmokeCoAlarm::EndOfServiceEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EndOfServiceAlert", 1, value);
        }
        case SmokeCoAlarm::Attributes::InterconnectSmokeAlarm::Id: {
            chip::app::Clusters::SmokeCoAlarm::AlarmStateEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("InterconnectSmokeAlarm", 1, value);
        }
        case SmokeCoAlarm::Attributes::InterconnectCOAlarm::Id: {
            chip::app::Clusters::SmokeCoAlarm::AlarmStateEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("InterconnectCOAlarm", 1, value);
        }
        case SmokeCoAlarm::Attributes::ContaminationState::Id: {
            chip::app::Clusters::SmokeCoAlarm::ContaminationStateEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ContaminationState", 1, value);
        }
        case SmokeCoAlarm::Attributes::SensitivityLevel::Id: {
            chip::app::Clusters::SmokeCoAlarm::SensitivityEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("SensitivityLevel", 1, value);
        }
        case SmokeCoAlarm::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case SmokeCoAlarm::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case SmokeCoAlarm::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case SmokeCoAlarm::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case SmokeCoAlarm::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case SmokeCoAlarm::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case OperationalState::Id: {
        switch (path.mAttributeId)
        {
        case OperationalState::Attributes::PhaseList::Id: {
            chip::app::DataModel::Nullable<chip::app::DataModel::DecodableList<chip::CharSpan>> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PhaseList", 1, value);
        }
        case OperationalState::Attributes::CurrentPhase::Id: {
            chip::app::DataModel::Nullable<uint8_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("CurrentPhase", 1, value);
        }
        case OperationalState::Attributes::CountdownTime::Id: {
            chip::app::DataModel::Nullable<uint32_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("CountdownTime", 1, value);
        }
        case OperationalState::Attributes::OperationalStateList::Id: {
            chip::app::DataModel::DecodableList<
                chip::app::Clusters::OperationalState::Structs::OperationalStateStruct::DecodableType>
                value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("OperationalStateList", 1, value);
        }
        case OperationalState::Attributes::OperationalState::Id: {
            chip::app::Clusters::OperationalState::Structs::OperationalStateStruct::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("OperationalState", 1, value);
        }
        case OperationalState::Attributes::OperationalError::Id: {
            chip::app::Clusters::OperationalState::Structs::ErrorStateStruct::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("OperationalError", 1, value);
        }
        case OperationalState::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case OperationalState::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case OperationalState::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case OperationalState::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case OperationalState::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case OperationalState::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case HepaFilterMonitoring::Id: {
        switch (path.mAttributeId)
        {
        case HepaFilterMonitoring::Attributes::Condition::Id: {
            chip::Percent value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Condition", 1, value);
        }
        case HepaFilterMonitoring::Attributes::DegradationDirection::Id: {
            chip::app::Clusters::HepaFilterMonitoring::DegradationDirectionEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("DegradationDirection", 1, value);
        }
        case HepaFilterMonitoring::Attributes::ChangeIndication::Id: {
            chip::app::Clusters::HepaFilterMonitoring::ChangeIndicationEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ChangeIndication", 1, value);
        }
        case HepaFilterMonitoring::Attributes::InPlaceIndicator::Id: {
            bool value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("InPlaceIndicator", 1, value);
        }
        case HepaFilterMonitoring::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case HepaFilterMonitoring::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case HepaFilterMonitoring::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case HepaFilterMonitoring::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case HepaFilterMonitoring::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case HepaFilterMonitoring::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case ActivatedCarbonFilterMonitoring::Id: {
        switch (path.mAttributeId)
        {
        case ActivatedCarbonFilterMonitoring::Attributes::Condition::Id: {
            chip::Percent value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Condition", 1, value);
        }
        case ActivatedCarbonFilterMonitoring::Attributes::DegradationDirection::Id: {
            chip::app::Clusters::ActivatedCarbonFilterMonitoring::DegradationDirectionEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("DegradationDirection", 1, value);
        }
        case ActivatedCarbonFilterMonitoring::Attributes::ChangeIndication::Id: {
            chip::app::Clusters::ActivatedCarbonFilterMonitoring::ChangeIndicationEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ChangeIndication", 1, value);
        }
        case ActivatedCarbonFilterMonitoring::Attributes::InPlaceIndicator::Id: {
            bool value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("InPlaceIndicator", 1, value);
        }
        case ActivatedCarbonFilterMonitoring::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case ActivatedCarbonFilterMonitoring::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case ActivatedCarbonFilterMonitoring::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case ActivatedCarbonFilterMonitoring::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case ActivatedCarbonFilterMonitoring::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case ActivatedCarbonFilterMonitoring::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case CeramicFilterMonitoring::Id: {
        switch (path.mAttributeId)
        {
        case CeramicFilterMonitoring::Attributes::Condition::Id: {
            chip::Percent value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Condition", 1, value);
        }
        case CeramicFilterMonitoring::Attributes::DegradationDirection::Id: {
            chip::app::Clusters::CeramicFilterMonitoring::DegradationDirectionEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("DegradationDirection", 1, value);
        }
        case CeramicFilterMonitoring::Attributes::ChangeIndication::Id: {
            chip::app::Clusters::CeramicFilterMonitoring::ChangeIndicationEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ChangeIndication", 1, value);
        }
        case CeramicFilterMonitoring::Attributes::InPlaceIndicator::Id: {
            bool value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("InPlaceIndicator", 1, value);
        }
        case CeramicFilterMonitoring::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case CeramicFilterMonitoring::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case CeramicFilterMonitoring::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case CeramicFilterMonitoring::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case CeramicFilterMonitoring::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case CeramicFilterMonitoring::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case ElectrostaticFilterMonitoring::Id: {
        switch (path.mAttributeId)
        {
        case ElectrostaticFilterMonitoring::Attributes::Condition::Id: {
            chip::Percent value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Condition", 1, value);
        }
        case ElectrostaticFilterMonitoring::Attributes::DegradationDirection::Id: {
            chip::app::Clusters::ElectrostaticFilterMonitoring::DegradationDirectionEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("DegradationDirection", 1, value);
        }
        case ElectrostaticFilterMonitoring::Attributes::ChangeIndication::Id: {
            chip::app::Clusters::ElectrostaticFilterMonitoring::ChangeIndicationEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ChangeIndication", 1, value);
        }
        case ElectrostaticFilterMonitoring::Attributes::InPlaceIndicator::Id: {
            bool value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("InPlaceIndicator", 1, value);
        }
        case ElectrostaticFilterMonitoring::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case ElectrostaticFilterMonitoring::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case ElectrostaticFilterMonitoring::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case ElectrostaticFilterMonitoring::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case ElectrostaticFilterMonitoring::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case ElectrostaticFilterMonitoring::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case UvFilterMonitoring::Id: {
        switch (path.mAttributeId)
        {
        case UvFilterMonitoring::Attributes::Condition::Id: {
            chip::Percent value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Condition", 1, value);
        }
        case UvFilterMonitoring::Attributes::DegradationDirection::Id: {
            chip::app::Clusters::UvFilterMonitoring::DegradationDirectionEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("DegradationDirection", 1, value);
        }
        case UvFilterMonitoring::Attributes::ChangeIndication::Id: {
            chip::app::Clusters::UvFilterMonitoring::ChangeIndicationEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ChangeIndication", 1, value);
        }
        case UvFilterMonitoring::Attributes::InPlaceIndicator::Id: {
            bool value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("InPlaceIndicator", 1, value);
        }
        case UvFilterMonitoring::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case UvFilterMonitoring::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case UvFilterMonitoring::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case UvFilterMonitoring::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case UvFilterMonitoring::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case UvFilterMonitoring::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case IonizingFilterMonitoring::Id: {
        switch (path.mAttributeId)
        {
        case IonizingFilterMonitoring::Attributes::Condition::Id: {
            chip::Percent value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Condition", 1, value);
        }
        case IonizingFilterMonitoring::Attributes::DegradationDirection::Id: {
            chip::app::Clusters::IonizingFilterMonitoring::DegradationDirectionEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("DegradationDirection", 1, value);
        }
        case IonizingFilterMonitoring::Attributes::ChangeIndication::Id: {
            chip::app::Clusters::IonizingFilterMonitoring::ChangeIndicationEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ChangeIndication", 1, value);
        }
        case IonizingFilterMonitoring::Attributes::InPlaceIndicator::Id: {
            bool value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("InPlaceIndicator", 1, value);
        }
        case IonizingFilterMonitoring::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case IonizingFilterMonitoring::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case IonizingFilterMonitoring::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case IonizingFilterMonitoring::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case IonizingFilterMonitoring::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case IonizingFilterMonitoring::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case ZeoliteFilterMonitoring::Id: {
        switch (path.mAttributeId)
        {
        case ZeoliteFilterMonitoring::Attributes::Condition::Id: {
            chip::Percent value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Condition", 1, value);
        }
        case ZeoliteFilterMonitoring::Attributes::DegradationDirection::Id: {
            chip::app::Clusters::ZeoliteFilterMonitoring::DegradationDirectionEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("DegradationDirection", 1, value);
        }
        case ZeoliteFilterMonitoring::Attributes::ChangeIndication::Id: {
            chip::app::Clusters::ZeoliteFilterMonitoring::ChangeIndicationEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ChangeIndication", 1, value);
        }
        case ZeoliteFilterMonitoring::Attributes::InPlaceIndicator::Id: {
            bool value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("InPlaceIndicator", 1, value);
        }
        case ZeoliteFilterMonitoring::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case ZeoliteFilterMonitoring::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case ZeoliteFilterMonitoring::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case ZeoliteFilterMonitoring::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case ZeoliteFilterMonitoring::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case ZeoliteFilterMonitoring::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case OzoneFilterMonitoring::Id: {
        switch (path.mAttributeId)
        {
        case OzoneFilterMonitoring::Attributes::Condition::Id: {
            chip::Percent value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Condition", 1, value);
        }
        case OzoneFilterMonitoring::Attributes::DegradationDirection::Id: {
            chip::app::Clusters::OzoneFilterMonitoring::DegradationDirectionEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("DegradationDirection", 1, value);
        }
        case OzoneFilterMonitoring::Attributes::ChangeIndication::Id: {
            chip::app::Clusters::OzoneFilterMonitoring::ChangeIndicationEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ChangeIndication", 1, value);
        }
        case OzoneFilterMonitoring::Attributes::InPlaceIndicator::Id: {
            bool value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("InPlaceIndicator", 1, value);
        }
        case OzoneFilterMonitoring::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case OzoneFilterMonitoring::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case OzoneFilterMonitoring::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case OzoneFilterMonitoring::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case OzoneFilterMonitoring::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case OzoneFilterMonitoring::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case WaterTankMonitoring::Id: {
        switch (path.mAttributeId)
        {
        case WaterTankMonitoring::Attributes::Condition::Id: {
            chip::Percent value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Condition", 1, value);
        }
        case WaterTankMonitoring::Attributes::DegradationDirection::Id: {
            chip::app::Clusters::WaterTankMonitoring::DegradationDirectionEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("DegradationDirection", 1, value);
        }
        case WaterTankMonitoring::Attributes::ChangeIndication::Id: {
            chip::app::Clusters::WaterTankMonitoring::ChangeIndicationEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ChangeIndication", 1, value);
        }
        case WaterTankMonitoring::Attributes::InPlaceIndicator::Id: {
            bool value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("InPlaceIndicator", 1, value);
        }
        case WaterTankMonitoring::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case WaterTankMonitoring::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case WaterTankMonitoring::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case WaterTankMonitoring::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case WaterTankMonitoring::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case WaterTankMonitoring::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case FuelTankMonitoring::Id: {
        switch (path.mAttributeId)
        {
        case FuelTankMonitoring::Attributes::Condition::Id: {
            chip::Percent value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Condition", 1, value);
        }
        case FuelTankMonitoring::Attributes::DegradationDirection::Id: {
            chip::app::Clusters::FuelTankMonitoring::DegradationDirectionEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("DegradationDirection", 1, value);
        }
        case FuelTankMonitoring::Attributes::ChangeIndication::Id: {
            chip::app::Clusters::FuelTankMonitoring::ChangeIndicationEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ChangeIndication", 1, value);
        }
        case FuelTankMonitoring::Attributes::InPlaceIndicator::Id: {
            bool value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("InPlaceIndicator", 1, value);
        }
        case FuelTankMonitoring::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case FuelTankMonitoring::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case FuelTankMonitoring::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case FuelTankMonitoring::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case FuelTankMonitoring::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case FuelTankMonitoring::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case InkCartridgeMonitoring::Id: {
        switch (path.mAttributeId)
        {
        case InkCartridgeMonitoring::Attributes::Condition::Id: {
            chip::Percent value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Condition", 1, value);
        }
        case InkCartridgeMonitoring::Attributes::DegradationDirection::Id: {
            chip::app::Clusters::InkCartridgeMonitoring::DegradationDirectionEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("DegradationDirection", 1, value);
        }
        case InkCartridgeMonitoring::Attributes::ChangeIndication::Id: {
            chip::app::Clusters::InkCartridgeMonitoring::ChangeIndicationEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ChangeIndication", 1, value);
        }
        case InkCartridgeMonitoring::Attributes::InPlaceIndicator::Id: {
            bool value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("InPlaceIndicator", 1, value);
        }
        case InkCartridgeMonitoring::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case InkCartridgeMonitoring::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case InkCartridgeMonitoring::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case InkCartridgeMonitoring::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case InkCartridgeMonitoring::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case InkCartridgeMonitoring::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case TonerCartridgeMonitoring::Id: {
        switch (path.mAttributeId)
        {
        case TonerCartridgeMonitoring::Attributes::Condition::Id: {
            chip::Percent value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Condition", 1, value);
        }
        case TonerCartridgeMonitoring::Attributes::DegradationDirection::Id: {
            chip::app::Clusters::TonerCartridgeMonitoring::DegradationDirectionEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("DegradationDirection", 1, value);
        }
        case TonerCartridgeMonitoring::Attributes::ChangeIndication::Id: {
            chip::app::Clusters::TonerCartridgeMonitoring::ChangeIndicationEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ChangeIndication", 1, value);
        }
        case TonerCartridgeMonitoring::Attributes::InPlaceIndicator::Id: {
            bool value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("InPlaceIndicator", 1, value);
        }
        case TonerCartridgeMonitoring::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case TonerCartridgeMonitoring::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case TonerCartridgeMonitoring::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case TonerCartridgeMonitoring::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case TonerCartridgeMonitoring::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case TonerCartridgeMonitoring::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case DoorLock::Id: {
        switch (path.mAttributeId)
        {
        case DoorLock::Attributes::LockState::Id: {
            chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DlLockState> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LockState", 1, value);
        }
        case DoorLock::Attributes::LockType::Id: {
            chip::app::Clusters::DoorLock::DlLockType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LockType", 1, value);
        }
        case DoorLock::Attributes::ActuatorEnabled::Id: {
            bool value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ActuatorEnabled", 1, value);
        }
        case DoorLock::Attributes::DoorState::Id: {
            chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DoorStateEnum> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("DoorState", 1, value);
        }
        case DoorLock::Attributes::DoorOpenEvents::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("DoorOpenEvents", 1, value);
        }
        case DoorLock::Attributes::DoorClosedEvents::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("DoorClosedEvents", 1, value);
        }
        case DoorLock::Attributes::OpenPeriod::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("OpenPeriod", 1, value);
        }
        case DoorLock::Attributes::NumberOfTotalUsersSupported::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("NumberOfTotalUsersSupported", 1, value);
        }
        case DoorLock::Attributes::NumberOfPINUsersSupported::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("NumberOfPINUsersSupported", 1, value);
        }
        case DoorLock::Attributes::NumberOfRFIDUsersSupported::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("NumberOfRFIDUsersSupported", 1, value);
        }
        case DoorLock::Attributes::NumberOfWeekDaySchedulesSupportedPerUser::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("NumberOfWeekDaySchedulesSupportedPerUser", 1, value);
        }
        case DoorLock::Attributes::NumberOfYearDaySchedulesSupportedPerUser::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("NumberOfYearDaySchedulesSupportedPerUser", 1, value);
        }
        case DoorLock::Attributes::NumberOfHolidaySchedulesSupported::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("NumberOfHolidaySchedulesSupported", 1, value);
        }
        case DoorLock::Attributes::MaxPINCodeLength::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxPINCodeLength", 1, value);
        }
        case DoorLock::Attributes::MinPINCodeLength::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MinPINCodeLength", 1, value);
        }
        case DoorLock::Attributes::MaxRFIDCodeLength::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxRFIDCodeLength", 1, value);
        }
        case DoorLock::Attributes::MinRFIDCodeLength::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MinRFIDCodeLength", 1, value);
        }
        case DoorLock::Attributes::CredentialRulesSupport::Id: {
            chip::BitMask<chip::app::Clusters::DoorLock::DlCredentialRuleMask> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("CredentialRulesSupport", 1, value);
        }
        case DoorLock::Attributes::NumberOfCredentialsSupportedPerUser::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("NumberOfCredentialsSupportedPerUser", 1, value);
        }
        case DoorLock::Attributes::Language::Id: {
            chip::CharSpan value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Language", 1, value);
        }
        case DoorLock::Attributes::LEDSettings::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LEDSettings", 1, value);
        }
        case DoorLock::Attributes::AutoRelockTime::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AutoRelockTime", 1, value);
        }
        case DoorLock::Attributes::SoundVolume::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("SoundVolume", 1, value);
        }
        case DoorLock::Attributes::OperatingMode::Id: {
            chip::app::Clusters::DoorLock::OperatingModeEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("OperatingMode", 1, value);
        }
        case DoorLock::Attributes::SupportedOperatingModes::Id: {
            chip::BitMask<chip::app::Clusters::DoorLock::DlSupportedOperatingModes> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("SupportedOperatingModes", 1, value);
        }
        case DoorLock::Attributes::DefaultConfigurationRegister::Id: {
            chip::BitMask<chip::app::Clusters::DoorLock::DlDefaultConfigurationRegister> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("DefaultConfigurationRegister", 1, value);
        }
        case DoorLock::Attributes::EnableLocalProgramming::Id: {
            bool value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EnableLocalProgramming", 1, value);
        }
        case DoorLock::Attributes::EnableOneTouchLocking::Id: {
            bool value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EnableOneTouchLocking", 1, value);
        }
        case DoorLock::Attributes::EnableInsideStatusLED::Id: {
            bool value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EnableInsideStatusLED", 1, value);
        }
        case DoorLock::Attributes::EnablePrivacyModeButton::Id: {
            bool value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EnablePrivacyModeButton", 1, value);
        }
        case DoorLock::Attributes::LocalProgrammingFeatures::Id: {
            chip::BitMask<chip::app::Clusters::DoorLock::DlLocalProgrammingFeatures> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LocalProgrammingFeatures", 1, value);
        }
        case DoorLock::Attributes::WrongCodeEntryLimit::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("WrongCodeEntryLimit", 1, value);
        }
        case DoorLock::Attributes::UserCodeTemporaryDisableTime::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("UserCodeTemporaryDisableTime", 1, value);
        }
        case DoorLock::Attributes::SendPINOverTheAir::Id: {
            bool value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("SendPINOverTheAir", 1, value);
        }
        case DoorLock::Attributes::RequirePINforRemoteOperation::Id: {
            bool value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("RequirePINforRemoteOperation", 1, value);
        }
        case DoorLock::Attributes::ExpiringUserTimeout::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ExpiringUserTimeout", 1, value);
        }
        case DoorLock::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case DoorLock::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case DoorLock::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case DoorLock::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case DoorLock::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case DoorLock::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case WindowCovering::Id: {
        switch (path.mAttributeId)
        {
        case WindowCovering::Attributes::Type::Id: {
            chip::app::Clusters::WindowCovering::Type value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Type", 1, value);
        }
        case WindowCovering::Attributes::PhysicalClosedLimitLift::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PhysicalClosedLimitLift", 1, value);
        }
        case WindowCovering::Attributes::PhysicalClosedLimitTilt::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PhysicalClosedLimitTilt", 1, value);
        }
        case WindowCovering::Attributes::CurrentPositionLift::Id: {
            chip::app::DataModel::Nullable<uint16_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("CurrentPositionLift", 1, value);
        }
        case WindowCovering::Attributes::CurrentPositionTilt::Id: {
            chip::app::DataModel::Nullable<uint16_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("CurrentPositionTilt", 1, value);
        }
        case WindowCovering::Attributes::NumberOfActuationsLift::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("NumberOfActuationsLift", 1, value);
        }
        case WindowCovering::Attributes::NumberOfActuationsTilt::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("NumberOfActuationsTilt", 1, value);
        }
        case WindowCovering::Attributes::ConfigStatus::Id: {
            chip::BitMask<chip::app::Clusters::WindowCovering::ConfigStatus> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ConfigStatus", 1, value);
        }
        case WindowCovering::Attributes::CurrentPositionLiftPercentage::Id: {
            chip::app::DataModel::Nullable<chip::Percent> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("CurrentPositionLiftPercentage", 1, value);
        }
        case WindowCovering::Attributes::CurrentPositionTiltPercentage::Id: {
            chip::app::DataModel::Nullable<chip::Percent> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("CurrentPositionTiltPercentage", 1, value);
        }
        case WindowCovering::Attributes::OperationalStatus::Id: {
            chip::BitMask<chip::app::Clusters::WindowCovering::OperationalStatus> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("OperationalStatus", 1, value);
        }
        case WindowCovering::Attributes::TargetPositionLiftPercent100ths::Id: {
            chip::app::DataModel::Nullable<chip::Percent100ths> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("TargetPositionLiftPercent100ths", 1, value);
        }
        case WindowCovering::Attributes::TargetPositionTiltPercent100ths::Id: {
            chip::app::DataModel::Nullable<chip::Percent100ths> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("TargetPositionTiltPercent100ths", 1, value);
        }
        case WindowCovering::Attributes::EndProductType::Id: {
            chip::app::Clusters::WindowCovering::EndProductType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EndProductType", 1, value);
        }
        case WindowCovering::Attributes::CurrentPositionLiftPercent100ths::Id: {
            chip::app::DataModel::Nullable<chip::Percent100ths> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("CurrentPositionLiftPercent100ths", 1, value);
        }
        case WindowCovering::Attributes::CurrentPositionTiltPercent100ths::Id: {
            chip::app::DataModel::Nullable<chip::Percent100ths> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("CurrentPositionTiltPercent100ths", 1, value);
        }
        case WindowCovering::Attributes::InstalledOpenLimitLift::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("InstalledOpenLimitLift", 1, value);
        }
        case WindowCovering::Attributes::InstalledClosedLimitLift::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("InstalledClosedLimitLift", 1, value);
        }
        case WindowCovering::Attributes::InstalledOpenLimitTilt::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("InstalledOpenLimitTilt", 1, value);
        }
        case WindowCovering::Attributes::InstalledClosedLimitTilt::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("InstalledClosedLimitTilt", 1, value);
        }
        case WindowCovering::Attributes::Mode::Id: {
            chip::BitMask<chip::app::Clusters::WindowCovering::Mode> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Mode", 1, value);
        }
        case WindowCovering::Attributes::SafetyStatus::Id: {
            chip::BitMask<chip::app::Clusters::WindowCovering::SafetyStatus> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("SafetyStatus", 1, value);
        }
        case WindowCovering::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case WindowCovering::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case WindowCovering::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case WindowCovering::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case WindowCovering::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case WindowCovering::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case BarrierControl::Id: {
        switch (path.mAttributeId)
        {
        case BarrierControl::Attributes::BarrierMovingState::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("barrier moving state", 1, value);
        }
        case BarrierControl::Attributes::BarrierSafetyStatus::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("barrier safety status", 1, value);
        }
        case BarrierControl::Attributes::BarrierCapabilities::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("barrier capabilities", 1, value);
        }
        case BarrierControl::Attributes::BarrierOpenEvents::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("barrier open events", 1, value);
        }
        case BarrierControl::Attributes::BarrierCloseEvents::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("barrier close events", 1, value);
        }
        case BarrierControl::Attributes::BarrierCommandOpenEvents::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("barrier command open events", 1, value);
        }
        case BarrierControl::Attributes::BarrierCommandCloseEvents::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("barrier command close events", 1, value);
        }
        case BarrierControl::Attributes::BarrierOpenPeriod::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("barrier open period", 1, value);
        }
        case BarrierControl::Attributes::BarrierClosePeriod::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("barrier close period", 1, value);
        }
        case BarrierControl::Attributes::BarrierPosition::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("barrier position", 1, value);
        }
        case BarrierControl::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case BarrierControl::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case BarrierControl::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case BarrierControl::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case BarrierControl::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case BarrierControl::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case PumpConfigurationAndControl::Id: {
        switch (path.mAttributeId)
        {
        case PumpConfigurationAndControl::Attributes::MaxPressure::Id: {
            chip::app::DataModel::Nullable<int16_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxPressure", 1, value);
        }
        case PumpConfigurationAndControl::Attributes::MaxSpeed::Id: {
            chip::app::DataModel::Nullable<uint16_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxSpeed", 1, value);
        }
        case PumpConfigurationAndControl::Attributes::MaxFlow::Id: {
            chip::app::DataModel::Nullable<uint16_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxFlow", 1, value);
        }
        case PumpConfigurationAndControl::Attributes::MinConstPressure::Id: {
            chip::app::DataModel::Nullable<int16_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MinConstPressure", 1, value);
        }
        case PumpConfigurationAndControl::Attributes::MaxConstPressure::Id: {
            chip::app::DataModel::Nullable<int16_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxConstPressure", 1, value);
        }
        case PumpConfigurationAndControl::Attributes::MinCompPressure::Id: {
            chip::app::DataModel::Nullable<int16_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MinCompPressure", 1, value);
        }
        case PumpConfigurationAndControl::Attributes::MaxCompPressure::Id: {
            chip::app::DataModel::Nullable<int16_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxCompPressure", 1, value);
        }
        case PumpConfigurationAndControl::Attributes::MinConstSpeed::Id: {
            chip::app::DataModel::Nullable<uint16_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MinConstSpeed", 1, value);
        }
        case PumpConfigurationAndControl::Attributes::MaxConstSpeed::Id: {
            chip::app::DataModel::Nullable<uint16_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxConstSpeed", 1, value);
        }
        case PumpConfigurationAndControl::Attributes::MinConstFlow::Id: {
            chip::app::DataModel::Nullable<uint16_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MinConstFlow", 1, value);
        }
        case PumpConfigurationAndControl::Attributes::MaxConstFlow::Id: {
            chip::app::DataModel::Nullable<uint16_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxConstFlow", 1, value);
        }
        case PumpConfigurationAndControl::Attributes::MinConstTemp::Id: {
            chip::app::DataModel::Nullable<int16_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MinConstTemp", 1, value);
        }
        case PumpConfigurationAndControl::Attributes::MaxConstTemp::Id: {
            chip::app::DataModel::Nullable<int16_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxConstTemp", 1, value);
        }
        case PumpConfigurationAndControl::Attributes::PumpStatus::Id: {
            chip::BitMask<chip::app::Clusters::PumpConfigurationAndControl::PumpStatusBitmap> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PumpStatus", 1, value);
        }
        case PumpConfigurationAndControl::Attributes::EffectiveOperationMode::Id: {
            chip::app::Clusters::PumpConfigurationAndControl::OperationModeEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EffectiveOperationMode", 1, value);
        }
        case PumpConfigurationAndControl::Attributes::EffectiveControlMode::Id: {
            chip::app::Clusters::PumpConfigurationAndControl::ControlModeEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EffectiveControlMode", 1, value);
        }
        case PumpConfigurationAndControl::Attributes::Capacity::Id: {
            chip::app::DataModel::Nullable<int16_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Capacity", 1, value);
        }
        case PumpConfigurationAndControl::Attributes::Speed::Id: {
            chip::app::DataModel::Nullable<uint16_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Speed", 1, value);
        }
        case PumpConfigurationAndControl::Attributes::LifetimeRunningHours::Id: {
            chip::app::DataModel::Nullable<uint32_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LifetimeRunningHours", 1, value);
        }
        case PumpConfigurationAndControl::Attributes::Power::Id: {
            chip::app::DataModel::Nullable<uint32_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Power", 1, value);
        }
        case PumpConfigurationAndControl::Attributes::LifetimeEnergyConsumed::Id: {
            chip::app::DataModel::Nullable<uint32_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LifetimeEnergyConsumed", 1, value);
        }
        case PumpConfigurationAndControl::Attributes::OperationMode::Id: {
            chip::app::Clusters::PumpConfigurationAndControl::OperationModeEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("OperationMode", 1, value);
        }
        case PumpConfigurationAndControl::Attributes::ControlMode::Id: {
            chip::app::Clusters::PumpConfigurationAndControl::ControlModeEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ControlMode", 1, value);
        }
        case PumpConfigurationAndControl::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case PumpConfigurationAndControl::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case PumpConfigurationAndControl::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case PumpConfigurationAndControl::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case PumpConfigurationAndControl::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case PumpConfigurationAndControl::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case Thermostat::Id: {
        switch (path.mAttributeId)
        {
        case Thermostat::Attributes::LocalTemperature::Id: {
            chip::app::DataModel::Nullable<int16_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LocalTemperature", 1, value);
        }
        case Thermostat::Attributes::OutdoorTemperature::Id: {
            chip::app::DataModel::Nullable<int16_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("OutdoorTemperature", 1, value);
        }
        case Thermostat::Attributes::Occupancy::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Occupancy", 1, value);
        }
        case Thermostat::Attributes::AbsMinHeatSetpointLimit::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AbsMinHeatSetpointLimit", 1, value);
        }
        case Thermostat::Attributes::AbsMaxHeatSetpointLimit::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AbsMaxHeatSetpointLimit", 1, value);
        }
        case Thermostat::Attributes::AbsMinCoolSetpointLimit::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AbsMinCoolSetpointLimit", 1, value);
        }
        case Thermostat::Attributes::AbsMaxCoolSetpointLimit::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AbsMaxCoolSetpointLimit", 1, value);
        }
        case Thermostat::Attributes::PICoolingDemand::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PICoolingDemand", 1, value);
        }
        case Thermostat::Attributes::PIHeatingDemand::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PIHeatingDemand", 1, value);
        }
        case Thermostat::Attributes::HVACSystemTypeConfiguration::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("HVACSystemTypeConfiguration", 1, value);
        }
        case Thermostat::Attributes::LocalTemperatureCalibration::Id: {
            int8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LocalTemperatureCalibration", 1, value);
        }
        case Thermostat::Attributes::OccupiedCoolingSetpoint::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("OccupiedCoolingSetpoint", 1, value);
        }
        case Thermostat::Attributes::OccupiedHeatingSetpoint::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("OccupiedHeatingSetpoint", 1, value);
        }
        case Thermostat::Attributes::UnoccupiedCoolingSetpoint::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("UnoccupiedCoolingSetpoint", 1, value);
        }
        case Thermostat::Attributes::UnoccupiedHeatingSetpoint::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("UnoccupiedHeatingSetpoint", 1, value);
        }
        case Thermostat::Attributes::MinHeatSetpointLimit::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MinHeatSetpointLimit", 1, value);
        }
        case Thermostat::Attributes::MaxHeatSetpointLimit::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxHeatSetpointLimit", 1, value);
        }
        case Thermostat::Attributes::MinCoolSetpointLimit::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MinCoolSetpointLimit", 1, value);
        }
        case Thermostat::Attributes::MaxCoolSetpointLimit::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxCoolSetpointLimit", 1, value);
        }
        case Thermostat::Attributes::MinSetpointDeadBand::Id: {
            int8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MinSetpointDeadBand", 1, value);
        }
        case Thermostat::Attributes::RemoteSensing::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("RemoteSensing", 1, value);
        }
        case Thermostat::Attributes::ControlSequenceOfOperation::Id: {
            chip::app::Clusters::Thermostat::ThermostatControlSequence value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ControlSequenceOfOperation", 1, value);
        }
        case Thermostat::Attributes::SystemMode::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("SystemMode", 1, value);
        }
        case Thermostat::Attributes::ThermostatRunningMode::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ThermostatRunningMode", 1, value);
        }
        case Thermostat::Attributes::StartOfWeek::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("StartOfWeek", 1, value);
        }
        case Thermostat::Attributes::NumberOfWeeklyTransitions::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("NumberOfWeeklyTransitions", 1, value);
        }
        case Thermostat::Attributes::NumberOfDailyTransitions::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("NumberOfDailyTransitions", 1, value);
        }
        case Thermostat::Attributes::TemperatureSetpointHold::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("TemperatureSetpointHold", 1, value);
        }
        case Thermostat::Attributes::TemperatureSetpointHoldDuration::Id: {
            chip::app::DataModel::Nullable<uint16_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("TemperatureSetpointHoldDuration", 1, value);
        }
        case Thermostat::Attributes::ThermostatProgrammingOperationMode::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ThermostatProgrammingOperationMode", 1, value);
        }
        case Thermostat::Attributes::ThermostatRunningState::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ThermostatRunningState", 1, value);
        }
        case Thermostat::Attributes::SetpointChangeSource::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("SetpointChangeSource", 1, value);
        }
        case Thermostat::Attributes::SetpointChangeAmount::Id: {
            chip::app::DataModel::Nullable<int16_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("SetpointChangeAmount", 1, value);
        }
        case Thermostat::Attributes::SetpointChangeSourceTimestamp::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("SetpointChangeSourceTimestamp", 1, value);
        }
        case Thermostat::Attributes::OccupiedSetback::Id: {
            chip::app::DataModel::Nullable<uint8_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("OccupiedSetback", 1, value);
        }
        case Thermostat::Attributes::OccupiedSetbackMin::Id: {
            chip::app::DataModel::Nullable<uint8_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("OccupiedSetbackMin", 1, value);
        }
        case Thermostat::Attributes::OccupiedSetbackMax::Id: {
            chip::app::DataModel::Nullable<uint8_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("OccupiedSetbackMax", 1, value);
        }
        case Thermostat::Attributes::UnoccupiedSetback::Id: {
            chip::app::DataModel::Nullable<uint8_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("UnoccupiedSetback", 1, value);
        }
        case Thermostat::Attributes::UnoccupiedSetbackMin::Id: {
            chip::app::DataModel::Nullable<uint8_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("UnoccupiedSetbackMin", 1, value);
        }
        case Thermostat::Attributes::UnoccupiedSetbackMax::Id: {
            chip::app::DataModel::Nullable<uint8_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("UnoccupiedSetbackMax", 1, value);
        }
        case Thermostat::Attributes::EmergencyHeatDelta::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EmergencyHeatDelta", 1, value);
        }
        case Thermostat::Attributes::ACType::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ACType", 1, value);
        }
        case Thermostat::Attributes::ACCapacity::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ACCapacity", 1, value);
        }
        case Thermostat::Attributes::ACRefrigerantType::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ACRefrigerantType", 1, value);
        }
        case Thermostat::Attributes::ACCompressorType::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ACCompressorType", 1, value);
        }
        case Thermostat::Attributes::ACErrorCode::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ACErrorCode", 1, value);
        }
        case Thermostat::Attributes::ACLouverPosition::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ACLouverPosition", 1, value);
        }
        case Thermostat::Attributes::ACCoilTemperature::Id: {
            chip::app::DataModel::Nullable<int16_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ACCoilTemperature", 1, value);
        }
        case Thermostat::Attributes::ACCapacityformat::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ACCapacityformat", 1, value);
        }
        case Thermostat::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case Thermostat::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case Thermostat::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case Thermostat::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case Thermostat::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case Thermostat::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case FanControl::Id: {
        switch (path.mAttributeId)
        {
        case FanControl::Attributes::FanMode::Id: {
            chip::app::Clusters::FanControl::FanModeType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FanMode", 1, value);
        }
        case FanControl::Attributes::FanModeSequence::Id: {
            chip::app::Clusters::FanControl::FanModeSequenceType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FanModeSequence", 1, value);
        }
        case FanControl::Attributes::PercentSetting::Id: {
            chip::app::DataModel::Nullable<uint8_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PercentSetting", 1, value);
        }
        case FanControl::Attributes::PercentCurrent::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PercentCurrent", 1, value);
        }
        case FanControl::Attributes::SpeedMax::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("SpeedMax", 1, value);
        }
        case FanControl::Attributes::SpeedSetting::Id: {
            chip::app::DataModel::Nullable<uint8_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("SpeedSetting", 1, value);
        }
        case FanControl::Attributes::SpeedCurrent::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("SpeedCurrent", 1, value);
        }
        case FanControl::Attributes::RockSupport::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("RockSupport", 1, value);
        }
        case FanControl::Attributes::RockSetting::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("RockSetting", 1, value);
        }
        case FanControl::Attributes::WindSupport::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("WindSupport", 1, value);
        }
        case FanControl::Attributes::WindSetting::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("WindSetting", 1, value);
        }
        case FanControl::Attributes::AirflowDirection::Id: {
            chip::app::Clusters::FanControl::AirflowDirectionEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AirflowDirection", 1, value);
        }
        case FanControl::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case FanControl::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case FanControl::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case FanControl::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case FanControl::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case FanControl::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case ThermostatUserInterfaceConfiguration::Id: {
        switch (path.mAttributeId)
        {
        case ThermostatUserInterfaceConfiguration::Attributes::TemperatureDisplayMode::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("TemperatureDisplayMode", 1, value);
        }
        case ThermostatUserInterfaceConfiguration::Attributes::KeypadLockout::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("KeypadLockout", 1, value);
        }
        case ThermostatUserInterfaceConfiguration::Attributes::ScheduleProgrammingVisibility::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ScheduleProgrammingVisibility", 1, value);
        }
        case ThermostatUserInterfaceConfiguration::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case ThermostatUserInterfaceConfiguration::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case ThermostatUserInterfaceConfiguration::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case ThermostatUserInterfaceConfiguration::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case ThermostatUserInterfaceConfiguration::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case ThermostatUserInterfaceConfiguration::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case ColorControl::Id: {
        switch (path.mAttributeId)
        {
        case ColorControl::Attributes::CurrentHue::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("CurrentHue", 1, value);
        }
        case ColorControl::Attributes::CurrentSaturation::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("CurrentSaturation", 1, value);
        }
        case ColorControl::Attributes::RemainingTime::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("RemainingTime", 1, value);
        }
        case ColorControl::Attributes::CurrentX::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("CurrentX", 1, value);
        }
        case ColorControl::Attributes::CurrentY::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("CurrentY", 1, value);
        }
        case ColorControl::Attributes::DriftCompensation::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("DriftCompensation", 1, value);
        }
        case ColorControl::Attributes::CompensationText::Id: {
            chip::CharSpan value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("CompensationText", 1, value);
        }
        case ColorControl::Attributes::ColorTemperatureMireds::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ColorTemperatureMireds", 1, value);
        }
        case ColorControl::Attributes::ColorMode::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ColorMode", 1, value);
        }
        case ColorControl::Attributes::Options::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Options", 1, value);
        }
        case ColorControl::Attributes::NumberOfPrimaries::Id: {
            chip::app::DataModel::Nullable<uint8_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("NumberOfPrimaries", 1, value);
        }
        case ColorControl::Attributes::Primary1X::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Primary1X", 1, value);
        }
        case ColorControl::Attributes::Primary1Y::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Primary1Y", 1, value);
        }
        case ColorControl::Attributes::Primary1Intensity::Id: {
            chip::app::DataModel::Nullable<uint8_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Primary1Intensity", 1, value);
        }
        case ColorControl::Attributes::Primary2X::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Primary2X", 1, value);
        }
        case ColorControl::Attributes::Primary2Y::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Primary2Y", 1, value);
        }
        case ColorControl::Attributes::Primary2Intensity::Id: {
            chip::app::DataModel::Nullable<uint8_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Primary2Intensity", 1, value);
        }
        case ColorControl::Attributes::Primary3X::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Primary3X", 1, value);
        }
        case ColorControl::Attributes::Primary3Y::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Primary3Y", 1, value);
        }
        case ColorControl::Attributes::Primary3Intensity::Id: {
            chip::app::DataModel::Nullable<uint8_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Primary3Intensity", 1, value);
        }
        case ColorControl::Attributes::Primary4X::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Primary4X", 1, value);
        }
        case ColorControl::Attributes::Primary4Y::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Primary4Y", 1, value);
        }
        case ColorControl::Attributes::Primary4Intensity::Id: {
            chip::app::DataModel::Nullable<uint8_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Primary4Intensity", 1, value);
        }
        case ColorControl::Attributes::Primary5X::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Primary5X", 1, value);
        }
        case ColorControl::Attributes::Primary5Y::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Primary5Y", 1, value);
        }
        case ColorControl::Attributes::Primary5Intensity::Id: {
            chip::app::DataModel::Nullable<uint8_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Primary5Intensity", 1, value);
        }
        case ColorControl::Attributes::Primary6X::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Primary6X", 1, value);
        }
        case ColorControl::Attributes::Primary6Y::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Primary6Y", 1, value);
        }
        case ColorControl::Attributes::Primary6Intensity::Id: {
            chip::app::DataModel::Nullable<uint8_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Primary6Intensity", 1, value);
        }
        case ColorControl::Attributes::WhitePointX::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("WhitePointX", 1, value);
        }
        case ColorControl::Attributes::WhitePointY::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("WhitePointY", 1, value);
        }
        case ColorControl::Attributes::ColorPointRX::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ColorPointRX", 1, value);
        }
        case ColorControl::Attributes::ColorPointRY::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ColorPointRY", 1, value);
        }
        case ColorControl::Attributes::ColorPointRIntensity::Id: {
            chip::app::DataModel::Nullable<uint8_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ColorPointRIntensity", 1, value);
        }
        case ColorControl::Attributes::ColorPointGX::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ColorPointGX", 1, value);
        }
        case ColorControl::Attributes::ColorPointGY::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ColorPointGY", 1, value);
        }
        case ColorControl::Attributes::ColorPointGIntensity::Id: {
            chip::app::DataModel::Nullable<uint8_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ColorPointGIntensity", 1, value);
        }
        case ColorControl::Attributes::ColorPointBX::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ColorPointBX", 1, value);
        }
        case ColorControl::Attributes::ColorPointBY::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ColorPointBY", 1, value);
        }
        case ColorControl::Attributes::ColorPointBIntensity::Id: {
            chip::app::DataModel::Nullable<uint8_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ColorPointBIntensity", 1, value);
        }
        case ColorControl::Attributes::EnhancedCurrentHue::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EnhancedCurrentHue", 1, value);
        }
        case ColorControl::Attributes::EnhancedColorMode::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EnhancedColorMode", 1, value);
        }
        case ColorControl::Attributes::ColorLoopActive::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ColorLoopActive", 1, value);
        }
        case ColorControl::Attributes::ColorLoopDirection::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ColorLoopDirection", 1, value);
        }
        case ColorControl::Attributes::ColorLoopTime::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ColorLoopTime", 1, value);
        }
        case ColorControl::Attributes::ColorLoopStartEnhancedHue::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ColorLoopStartEnhancedHue", 1, value);
        }
        case ColorControl::Attributes::ColorLoopStoredEnhancedHue::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ColorLoopStoredEnhancedHue", 1, value);
        }
        case ColorControl::Attributes::ColorCapabilities::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ColorCapabilities", 1, value);
        }
        case ColorControl::Attributes::ColorTempPhysicalMinMireds::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ColorTempPhysicalMinMireds", 1, value);
        }
        case ColorControl::Attributes::ColorTempPhysicalMaxMireds::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ColorTempPhysicalMaxMireds", 1, value);
        }
        case ColorControl::Attributes::CoupleColorTempToLevelMinMireds::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("CoupleColorTempToLevelMinMireds", 1, value);
        }
        case ColorControl::Attributes::StartUpColorTemperatureMireds::Id: {
            chip::app::DataModel::Nullable<uint16_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("StartUpColorTemperatureMireds", 1, value);
        }
        case ColorControl::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case ColorControl::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case ColorControl::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case ColorControl::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case ColorControl::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case ColorControl::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case BallastConfiguration::Id: {
        switch (path.mAttributeId)
        {
        case BallastConfiguration::Attributes::PhysicalMinLevel::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PhysicalMinLevel", 1, value);
        }
        case BallastConfiguration::Attributes::PhysicalMaxLevel::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PhysicalMaxLevel", 1, value);
        }
        case BallastConfiguration::Attributes::BallastStatus::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("BallastStatus", 1, value);
        }
        case BallastConfiguration::Attributes::MinLevel::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MinLevel", 1, value);
        }
        case BallastConfiguration::Attributes::MaxLevel::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxLevel", 1, value);
        }
        case BallastConfiguration::Attributes::IntrinsicBallastFactor::Id: {
            chip::app::DataModel::Nullable<uint8_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("IntrinsicBallastFactor", 1, value);
        }
        case BallastConfiguration::Attributes::BallastFactorAdjustment::Id: {
            chip::app::DataModel::Nullable<uint8_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("BallastFactorAdjustment", 1, value);
        }
        case BallastConfiguration::Attributes::LampQuantity::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LampQuantity", 1, value);
        }
        case BallastConfiguration::Attributes::LampType::Id: {
            chip::CharSpan value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LampType", 1, value);
        }
        case BallastConfiguration::Attributes::LampManufacturer::Id: {
            chip::CharSpan value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LampManufacturer", 1, value);
        }
        case BallastConfiguration::Attributes::LampRatedHours::Id: {
            chip::app::DataModel::Nullable<uint32_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LampRatedHours", 1, value);
        }
        case BallastConfiguration::Attributes::LampBurnHours::Id: {
            chip::app::DataModel::Nullable<uint32_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LampBurnHours", 1, value);
        }
        case BallastConfiguration::Attributes::LampAlarmMode::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LampAlarmMode", 1, value);
        }
        case BallastConfiguration::Attributes::LampBurnHoursTripPoint::Id: {
            chip::app::DataModel::Nullable<uint32_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LampBurnHoursTripPoint", 1, value);
        }
        case BallastConfiguration::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case BallastConfiguration::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case BallastConfiguration::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case BallastConfiguration::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case BallastConfiguration::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case BallastConfiguration::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case IlluminanceMeasurement::Id: {
        switch (path.mAttributeId)
        {
        case IlluminanceMeasurement::Attributes::MeasuredValue::Id: {
            chip::app::DataModel::Nullable<uint16_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasuredValue", 1, value);
        }
        case IlluminanceMeasurement::Attributes::MinMeasuredValue::Id: {
            chip::app::DataModel::Nullable<uint16_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MinMeasuredValue", 1, value);
        }
        case IlluminanceMeasurement::Attributes::MaxMeasuredValue::Id: {
            chip::app::DataModel::Nullable<uint16_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxMeasuredValue", 1, value);
        }
        case IlluminanceMeasurement::Attributes::Tolerance::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Tolerance", 1, value);
        }
        case IlluminanceMeasurement::Attributes::LightSensorType::Id: {
            chip::app::DataModel::Nullable<uint8_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LightSensorType", 1, value);
        }
        case IlluminanceMeasurement::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case IlluminanceMeasurement::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case IlluminanceMeasurement::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case IlluminanceMeasurement::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case IlluminanceMeasurement::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case IlluminanceMeasurement::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case TemperatureMeasurement::Id: {
        switch (path.mAttributeId)
        {
        case TemperatureMeasurement::Attributes::MeasuredValue::Id: {
            chip::app::DataModel::Nullable<int16_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasuredValue", 1, value);
        }
        case TemperatureMeasurement::Attributes::MinMeasuredValue::Id: {
            chip::app::DataModel::Nullable<int16_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MinMeasuredValue", 1, value);
        }
        case TemperatureMeasurement::Attributes::MaxMeasuredValue::Id: {
            chip::app::DataModel::Nullable<int16_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxMeasuredValue", 1, value);
        }
        case TemperatureMeasurement::Attributes::Tolerance::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Tolerance", 1, value);
        }
        case TemperatureMeasurement::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case TemperatureMeasurement::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case TemperatureMeasurement::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case TemperatureMeasurement::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case TemperatureMeasurement::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case TemperatureMeasurement::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case PressureMeasurement::Id: {
        switch (path.mAttributeId)
        {
        case PressureMeasurement::Attributes::MeasuredValue::Id: {
            chip::app::DataModel::Nullable<int16_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasuredValue", 1, value);
        }
        case PressureMeasurement::Attributes::MinMeasuredValue::Id: {
            chip::app::DataModel::Nullable<int16_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MinMeasuredValue", 1, value);
        }
        case PressureMeasurement::Attributes::MaxMeasuredValue::Id: {
            chip::app::DataModel::Nullable<int16_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxMeasuredValue", 1, value);
        }
        case PressureMeasurement::Attributes::Tolerance::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Tolerance", 1, value);
        }
        case PressureMeasurement::Attributes::ScaledValue::Id: {
            chip::app::DataModel::Nullable<int16_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ScaledValue", 1, value);
        }
        case PressureMeasurement::Attributes::MinScaledValue::Id: {
            chip::app::DataModel::Nullable<int16_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MinScaledValue", 1, value);
        }
        case PressureMeasurement::Attributes::MaxScaledValue::Id: {
            chip::app::DataModel::Nullable<int16_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxScaledValue", 1, value);
        }
        case PressureMeasurement::Attributes::ScaledTolerance::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ScaledTolerance", 1, value);
        }
        case PressureMeasurement::Attributes::Scale::Id: {
            int8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Scale", 1, value);
        }
        case PressureMeasurement::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case PressureMeasurement::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case PressureMeasurement::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case PressureMeasurement::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case PressureMeasurement::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case PressureMeasurement::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case FlowMeasurement::Id: {
        switch (path.mAttributeId)
        {
        case FlowMeasurement::Attributes::MeasuredValue::Id: {
            chip::app::DataModel::Nullable<uint16_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasuredValue", 1, value);
        }
        case FlowMeasurement::Attributes::MinMeasuredValue::Id: {
            chip::app::DataModel::Nullable<uint16_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MinMeasuredValue", 1, value);
        }
        case FlowMeasurement::Attributes::MaxMeasuredValue::Id: {
            chip::app::DataModel::Nullable<uint16_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxMeasuredValue", 1, value);
        }
        case FlowMeasurement::Attributes::Tolerance::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Tolerance", 1, value);
        }
        case FlowMeasurement::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case FlowMeasurement::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case FlowMeasurement::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case FlowMeasurement::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case FlowMeasurement::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case FlowMeasurement::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case RelativeHumidityMeasurement::Id: {
        switch (path.mAttributeId)
        {
        case RelativeHumidityMeasurement::Attributes::MeasuredValue::Id: {
            chip::app::DataModel::Nullable<uint16_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasuredValue", 1, value);
        }
        case RelativeHumidityMeasurement::Attributes::MinMeasuredValue::Id: {
            chip::app::DataModel::Nullable<uint16_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MinMeasuredValue", 1, value);
        }
        case RelativeHumidityMeasurement::Attributes::MaxMeasuredValue::Id: {
            chip::app::DataModel::Nullable<uint16_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxMeasuredValue", 1, value);
        }
        case RelativeHumidityMeasurement::Attributes::Tolerance::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Tolerance", 1, value);
        }
        case RelativeHumidityMeasurement::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case RelativeHumidityMeasurement::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case RelativeHumidityMeasurement::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case RelativeHumidityMeasurement::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case RelativeHumidityMeasurement::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case RelativeHumidityMeasurement::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case OccupancySensing::Id: {
        switch (path.mAttributeId)
        {
        case OccupancySensing::Attributes::Occupancy::Id: {
            chip::BitMask<chip::app::Clusters::OccupancySensing::OccupancyBitmap> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Occupancy", 1, value);
        }
        case OccupancySensing::Attributes::OccupancySensorType::Id: {
            chip::app::Clusters::OccupancySensing::OccupancySensorTypeEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("OccupancySensorType", 1, value);
        }
        case OccupancySensing::Attributes::OccupancySensorTypeBitmap::Id: {
            chip::BitMask<chip::app::Clusters::OccupancySensing::OccupancySensorTypeBitmap> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("OccupancySensorTypeBitmap", 1, value);
        }
        case OccupancySensing::Attributes::PIROccupiedToUnoccupiedDelay::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PIROccupiedToUnoccupiedDelay", 1, value);
        }
        case OccupancySensing::Attributes::PIRUnoccupiedToOccupiedDelay::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PIRUnoccupiedToOccupiedDelay", 1, value);
        }
        case OccupancySensing::Attributes::PIRUnoccupiedToOccupiedThreshold::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PIRUnoccupiedToOccupiedThreshold", 1, value);
        }
        case OccupancySensing::Attributes::UltrasonicOccupiedToUnoccupiedDelay::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("UltrasonicOccupiedToUnoccupiedDelay", 1, value);
        }
        case OccupancySensing::Attributes::UltrasonicUnoccupiedToOccupiedDelay::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("UltrasonicUnoccupiedToOccupiedDelay", 1, value);
        }
        case OccupancySensing::Attributes::UltrasonicUnoccupiedToOccupiedThreshold::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("UltrasonicUnoccupiedToOccupiedThreshold", 1, value);
        }
        case OccupancySensing::Attributes::PhysicalContactOccupiedToUnoccupiedDelay::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PhysicalContactOccupiedToUnoccupiedDelay", 1, value);
        }
        case OccupancySensing::Attributes::PhysicalContactUnoccupiedToOccupiedDelay::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PhysicalContactUnoccupiedToOccupiedDelay", 1, value);
        }
        case OccupancySensing::Attributes::PhysicalContactUnoccupiedToOccupiedThreshold::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PhysicalContactUnoccupiedToOccupiedThreshold", 1, value);
        }
        case OccupancySensing::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case OccupancySensing::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case OccupancySensing::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case OccupancySensing::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case OccupancySensing::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case OccupancySensing::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case CarbonMonoxideConcentrationMeasurement::Id: {
        switch (path.mAttributeId)
        {
        case CarbonMonoxideConcentrationMeasurement::Attributes::MeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasuredValue", 1, value);
        }
        case CarbonMonoxideConcentrationMeasurement::Attributes::MinMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MinMeasuredValue", 1, value);
        }
        case CarbonMonoxideConcentrationMeasurement::Attributes::MaxMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxMeasuredValue", 1, value);
        }
        case CarbonMonoxideConcentrationMeasurement::Attributes::PeakMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValue", 1, value);
        }
        case CarbonMonoxideConcentrationMeasurement::Attributes::PeakMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValueWindow", 1, value);
        }
        case CarbonMonoxideConcentrationMeasurement::Attributes::AverageMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValue", 1, value);
        }
        case CarbonMonoxideConcentrationMeasurement::Attributes::AverageMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValueWindow", 1, value);
        }
        case CarbonMonoxideConcentrationMeasurement::Attributes::Uncertainty::Id: {
            float value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Uncertainty", 1, value);
        }
        case CarbonMonoxideConcentrationMeasurement::Attributes::MeasurementUnit::Id: {
            chip::app::Clusters::CarbonMonoxideConcentrationMeasurement::MeasurementUnitEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementUnit", 1, value);
        }
        case CarbonMonoxideConcentrationMeasurement::Attributes::MeasurementMedium::Id: {
            chip::app::Clusters::CarbonMonoxideConcentrationMeasurement::MeasurementMediumEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementMedium", 1, value);
        }
        case CarbonMonoxideConcentrationMeasurement::Attributes::LevelValue::Id: {
            chip::app::Clusters::CarbonMonoxideConcentrationMeasurement::LevelValueEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LevelValue", 1, value);
        }
        case CarbonMonoxideConcentrationMeasurement::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case CarbonMonoxideConcentrationMeasurement::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case CarbonMonoxideConcentrationMeasurement::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case CarbonMonoxideConcentrationMeasurement::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case CarbonMonoxideConcentrationMeasurement::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case CarbonMonoxideConcentrationMeasurement::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case CarbonDioxideConcentrationMeasurement::Id: {
        switch (path.mAttributeId)
        {
        case CarbonDioxideConcentrationMeasurement::Attributes::MeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasuredValue", 1, value);
        }
        case CarbonDioxideConcentrationMeasurement::Attributes::MinMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MinMeasuredValue", 1, value);
        }
        case CarbonDioxideConcentrationMeasurement::Attributes::MaxMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxMeasuredValue", 1, value);
        }
        case CarbonDioxideConcentrationMeasurement::Attributes::PeakMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValue", 1, value);
        }
        case CarbonDioxideConcentrationMeasurement::Attributes::PeakMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValueWindow", 1, value);
        }
        case CarbonDioxideConcentrationMeasurement::Attributes::AverageMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValue", 1, value);
        }
        case CarbonDioxideConcentrationMeasurement::Attributes::AverageMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValueWindow", 1, value);
        }
        case CarbonDioxideConcentrationMeasurement::Attributes::Uncertainty::Id: {
            float value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Uncertainty", 1, value);
        }
        case CarbonDioxideConcentrationMeasurement::Attributes::MeasurementUnit::Id: {
            chip::app::Clusters::CarbonDioxideConcentrationMeasurement::MeasurementUnitEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementUnit", 1, value);
        }
        case CarbonDioxideConcentrationMeasurement::Attributes::MeasurementMedium::Id: {
            chip::app::Clusters::CarbonDioxideConcentrationMeasurement::MeasurementMediumEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementMedium", 1, value);
        }
        case CarbonDioxideConcentrationMeasurement::Attributes::LevelValue::Id: {
            chip::app::Clusters::CarbonDioxideConcentrationMeasurement::LevelValueEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LevelValue", 1, value);
        }
        case CarbonDioxideConcentrationMeasurement::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case CarbonDioxideConcentrationMeasurement::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case CarbonDioxideConcentrationMeasurement::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case CarbonDioxideConcentrationMeasurement::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case CarbonDioxideConcentrationMeasurement::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case CarbonDioxideConcentrationMeasurement::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case EthyleneConcentrationMeasurement::Id: {
        switch (path.mAttributeId)
        {
        case EthyleneConcentrationMeasurement::Attributes::MeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasuredValue", 1, value);
        }
        case EthyleneConcentrationMeasurement::Attributes::MinMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MinMeasuredValue", 1, value);
        }
        case EthyleneConcentrationMeasurement::Attributes::MaxMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxMeasuredValue", 1, value);
        }
        case EthyleneConcentrationMeasurement::Attributes::PeakMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValue", 1, value);
        }
        case EthyleneConcentrationMeasurement::Attributes::PeakMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValueWindow", 1, value);
        }
        case EthyleneConcentrationMeasurement::Attributes::AverageMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValue", 1, value);
        }
        case EthyleneConcentrationMeasurement::Attributes::AverageMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValueWindow", 1, value);
        }
        case EthyleneConcentrationMeasurement::Attributes::Uncertainty::Id: {
            float value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Uncertainty", 1, value);
        }
        case EthyleneConcentrationMeasurement::Attributes::MeasurementUnit::Id: {
            chip::app::Clusters::EthyleneConcentrationMeasurement::MeasurementUnitEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementUnit", 1, value);
        }
        case EthyleneConcentrationMeasurement::Attributes::MeasurementMedium::Id: {
            chip::app::Clusters::EthyleneConcentrationMeasurement::MeasurementMediumEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementMedium", 1, value);
        }
        case EthyleneConcentrationMeasurement::Attributes::LevelValue::Id: {
            chip::app::Clusters::EthyleneConcentrationMeasurement::LevelValueEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LevelValue", 1, value);
        }
        case EthyleneConcentrationMeasurement::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case EthyleneConcentrationMeasurement::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case EthyleneConcentrationMeasurement::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case EthyleneConcentrationMeasurement::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case EthyleneConcentrationMeasurement::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case EthyleneConcentrationMeasurement::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case EthyleneOxideConcentrationMeasurement::Id: {
        switch (path.mAttributeId)
        {
        case EthyleneOxideConcentrationMeasurement::Attributes::MeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasuredValue", 1, value);
        }
        case EthyleneOxideConcentrationMeasurement::Attributes::MinMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MinMeasuredValue", 1, value);
        }
        case EthyleneOxideConcentrationMeasurement::Attributes::MaxMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxMeasuredValue", 1, value);
        }
        case EthyleneOxideConcentrationMeasurement::Attributes::PeakMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValue", 1, value);
        }
        case EthyleneOxideConcentrationMeasurement::Attributes::PeakMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValueWindow", 1, value);
        }
        case EthyleneOxideConcentrationMeasurement::Attributes::AverageMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValue", 1, value);
        }
        case EthyleneOxideConcentrationMeasurement::Attributes::AverageMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValueWindow", 1, value);
        }
        case EthyleneOxideConcentrationMeasurement::Attributes::Uncertainty::Id: {
            float value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Uncertainty", 1, value);
        }
        case EthyleneOxideConcentrationMeasurement::Attributes::MeasurementUnit::Id: {
            chip::app::Clusters::EthyleneOxideConcentrationMeasurement::MeasurementUnitEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementUnit", 1, value);
        }
        case EthyleneOxideConcentrationMeasurement::Attributes::MeasurementMedium::Id: {
            chip::app::Clusters::EthyleneOxideConcentrationMeasurement::MeasurementMediumEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementMedium", 1, value);
        }
        case EthyleneOxideConcentrationMeasurement::Attributes::LevelValue::Id: {
            chip::app::Clusters::EthyleneOxideConcentrationMeasurement::LevelValueEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LevelValue", 1, value);
        }
        case EthyleneOxideConcentrationMeasurement::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case EthyleneOxideConcentrationMeasurement::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case EthyleneOxideConcentrationMeasurement::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case EthyleneOxideConcentrationMeasurement::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case EthyleneOxideConcentrationMeasurement::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case EthyleneOxideConcentrationMeasurement::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case HydrogenConcentrationMeasurement::Id: {
        switch (path.mAttributeId)
        {
        case HydrogenConcentrationMeasurement::Attributes::MeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasuredValue", 1, value);
        }
        case HydrogenConcentrationMeasurement::Attributes::MinMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MinMeasuredValue", 1, value);
        }
        case HydrogenConcentrationMeasurement::Attributes::MaxMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxMeasuredValue", 1, value);
        }
        case HydrogenConcentrationMeasurement::Attributes::PeakMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValue", 1, value);
        }
        case HydrogenConcentrationMeasurement::Attributes::PeakMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValueWindow", 1, value);
        }
        case HydrogenConcentrationMeasurement::Attributes::AverageMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValue", 1, value);
        }
        case HydrogenConcentrationMeasurement::Attributes::AverageMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValueWindow", 1, value);
        }
        case HydrogenConcentrationMeasurement::Attributes::Uncertainty::Id: {
            float value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Uncertainty", 1, value);
        }
        case HydrogenConcentrationMeasurement::Attributes::MeasurementUnit::Id: {
            chip::app::Clusters::HydrogenConcentrationMeasurement::MeasurementUnitEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementUnit", 1, value);
        }
        case HydrogenConcentrationMeasurement::Attributes::MeasurementMedium::Id: {
            chip::app::Clusters::HydrogenConcentrationMeasurement::MeasurementMediumEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementMedium", 1, value);
        }
        case HydrogenConcentrationMeasurement::Attributes::LevelValue::Id: {
            chip::app::Clusters::HydrogenConcentrationMeasurement::LevelValueEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LevelValue", 1, value);
        }
        case HydrogenConcentrationMeasurement::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case HydrogenConcentrationMeasurement::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case HydrogenConcentrationMeasurement::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case HydrogenConcentrationMeasurement::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case HydrogenConcentrationMeasurement::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case HydrogenConcentrationMeasurement::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case HydrogenSulfideConcentrationMeasurement::Id: {
        switch (path.mAttributeId)
        {
        case HydrogenSulfideConcentrationMeasurement::Attributes::MeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasuredValue", 1, value);
        }
        case HydrogenSulfideConcentrationMeasurement::Attributes::MinMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MinMeasuredValue", 1, value);
        }
        case HydrogenSulfideConcentrationMeasurement::Attributes::MaxMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxMeasuredValue", 1, value);
        }
        case HydrogenSulfideConcentrationMeasurement::Attributes::PeakMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValue", 1, value);
        }
        case HydrogenSulfideConcentrationMeasurement::Attributes::PeakMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValueWindow", 1, value);
        }
        case HydrogenSulfideConcentrationMeasurement::Attributes::AverageMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValue", 1, value);
        }
        case HydrogenSulfideConcentrationMeasurement::Attributes::AverageMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValueWindow", 1, value);
        }
        case HydrogenSulfideConcentrationMeasurement::Attributes::Uncertainty::Id: {
            float value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Uncertainty", 1, value);
        }
        case HydrogenSulfideConcentrationMeasurement::Attributes::MeasurementUnit::Id: {
            chip::app::Clusters::HydrogenSulfideConcentrationMeasurement::MeasurementUnitEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementUnit", 1, value);
        }
        case HydrogenSulfideConcentrationMeasurement::Attributes::MeasurementMedium::Id: {
            chip::app::Clusters::HydrogenSulfideConcentrationMeasurement::MeasurementMediumEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementMedium", 1, value);
        }
        case HydrogenSulfideConcentrationMeasurement::Attributes::LevelValue::Id: {
            chip::app::Clusters::HydrogenSulfideConcentrationMeasurement::LevelValueEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LevelValue", 1, value);
        }
        case HydrogenSulfideConcentrationMeasurement::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case HydrogenSulfideConcentrationMeasurement::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case HydrogenSulfideConcentrationMeasurement::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case HydrogenSulfideConcentrationMeasurement::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case HydrogenSulfideConcentrationMeasurement::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case HydrogenSulfideConcentrationMeasurement::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case NitricOxideConcentrationMeasurement::Id: {
        switch (path.mAttributeId)
        {
        case NitricOxideConcentrationMeasurement::Attributes::MeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasuredValue", 1, value);
        }
        case NitricOxideConcentrationMeasurement::Attributes::MinMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MinMeasuredValue", 1, value);
        }
        case NitricOxideConcentrationMeasurement::Attributes::MaxMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxMeasuredValue", 1, value);
        }
        case NitricOxideConcentrationMeasurement::Attributes::PeakMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValue", 1, value);
        }
        case NitricOxideConcentrationMeasurement::Attributes::PeakMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValueWindow", 1, value);
        }
        case NitricOxideConcentrationMeasurement::Attributes::AverageMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValue", 1, value);
        }
        case NitricOxideConcentrationMeasurement::Attributes::AverageMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValueWindow", 1, value);
        }
        case NitricOxideConcentrationMeasurement::Attributes::Uncertainty::Id: {
            float value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Uncertainty", 1, value);
        }
        case NitricOxideConcentrationMeasurement::Attributes::MeasurementUnit::Id: {
            chip::app::Clusters::NitricOxideConcentrationMeasurement::MeasurementUnitEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementUnit", 1, value);
        }
        case NitricOxideConcentrationMeasurement::Attributes::MeasurementMedium::Id: {
            chip::app::Clusters::NitricOxideConcentrationMeasurement::MeasurementMediumEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementMedium", 1, value);
        }
        case NitricOxideConcentrationMeasurement::Attributes::LevelValue::Id: {
            chip::app::Clusters::NitricOxideConcentrationMeasurement::LevelValueEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LevelValue", 1, value);
        }
        case NitricOxideConcentrationMeasurement::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case NitricOxideConcentrationMeasurement::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case NitricOxideConcentrationMeasurement::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case NitricOxideConcentrationMeasurement::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case NitricOxideConcentrationMeasurement::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case NitricOxideConcentrationMeasurement::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case NitrogenDioxideConcentrationMeasurement::Id: {
        switch (path.mAttributeId)
        {
        case NitrogenDioxideConcentrationMeasurement::Attributes::MeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasuredValue", 1, value);
        }
        case NitrogenDioxideConcentrationMeasurement::Attributes::MinMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MinMeasuredValue", 1, value);
        }
        case NitrogenDioxideConcentrationMeasurement::Attributes::MaxMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxMeasuredValue", 1, value);
        }
        case NitrogenDioxideConcentrationMeasurement::Attributes::PeakMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValue", 1, value);
        }
        case NitrogenDioxideConcentrationMeasurement::Attributes::PeakMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValueWindow", 1, value);
        }
        case NitrogenDioxideConcentrationMeasurement::Attributes::AverageMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValue", 1, value);
        }
        case NitrogenDioxideConcentrationMeasurement::Attributes::AverageMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValueWindow", 1, value);
        }
        case NitrogenDioxideConcentrationMeasurement::Attributes::Uncertainty::Id: {
            float value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Uncertainty", 1, value);
        }
        case NitrogenDioxideConcentrationMeasurement::Attributes::MeasurementUnit::Id: {
            chip::app::Clusters::NitrogenDioxideConcentrationMeasurement::MeasurementUnitEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementUnit", 1, value);
        }
        case NitrogenDioxideConcentrationMeasurement::Attributes::MeasurementMedium::Id: {
            chip::app::Clusters::NitrogenDioxideConcentrationMeasurement::MeasurementMediumEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementMedium", 1, value);
        }
        case NitrogenDioxideConcentrationMeasurement::Attributes::LevelValue::Id: {
            chip::app::Clusters::NitrogenDioxideConcentrationMeasurement::LevelValueEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LevelValue", 1, value);
        }
        case NitrogenDioxideConcentrationMeasurement::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case NitrogenDioxideConcentrationMeasurement::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case NitrogenDioxideConcentrationMeasurement::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case NitrogenDioxideConcentrationMeasurement::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case NitrogenDioxideConcentrationMeasurement::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case NitrogenDioxideConcentrationMeasurement::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case OxygenConcentrationMeasurement::Id: {
        switch (path.mAttributeId)
        {
        case OxygenConcentrationMeasurement::Attributes::MeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasuredValue", 1, value);
        }
        case OxygenConcentrationMeasurement::Attributes::MinMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MinMeasuredValue", 1, value);
        }
        case OxygenConcentrationMeasurement::Attributes::MaxMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxMeasuredValue", 1, value);
        }
        case OxygenConcentrationMeasurement::Attributes::PeakMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValue", 1, value);
        }
        case OxygenConcentrationMeasurement::Attributes::PeakMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValueWindow", 1, value);
        }
        case OxygenConcentrationMeasurement::Attributes::AverageMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValue", 1, value);
        }
        case OxygenConcentrationMeasurement::Attributes::AverageMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValueWindow", 1, value);
        }
        case OxygenConcentrationMeasurement::Attributes::Uncertainty::Id: {
            float value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Uncertainty", 1, value);
        }
        case OxygenConcentrationMeasurement::Attributes::MeasurementUnit::Id: {
            chip::app::Clusters::OxygenConcentrationMeasurement::MeasurementUnitEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementUnit", 1, value);
        }
        case OxygenConcentrationMeasurement::Attributes::MeasurementMedium::Id: {
            chip::app::Clusters::OxygenConcentrationMeasurement::MeasurementMediumEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementMedium", 1, value);
        }
        case OxygenConcentrationMeasurement::Attributes::LevelValue::Id: {
            chip::app::Clusters::OxygenConcentrationMeasurement::LevelValueEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LevelValue", 1, value);
        }
        case OxygenConcentrationMeasurement::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case OxygenConcentrationMeasurement::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case OxygenConcentrationMeasurement::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case OxygenConcentrationMeasurement::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case OxygenConcentrationMeasurement::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case OxygenConcentrationMeasurement::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case OzoneConcentrationMeasurement::Id: {
        switch (path.mAttributeId)
        {
        case OzoneConcentrationMeasurement::Attributes::MeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasuredValue", 1, value);
        }
        case OzoneConcentrationMeasurement::Attributes::MinMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MinMeasuredValue", 1, value);
        }
        case OzoneConcentrationMeasurement::Attributes::MaxMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxMeasuredValue", 1, value);
        }
        case OzoneConcentrationMeasurement::Attributes::PeakMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValue", 1, value);
        }
        case OzoneConcentrationMeasurement::Attributes::PeakMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValueWindow", 1, value);
        }
        case OzoneConcentrationMeasurement::Attributes::AverageMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValue", 1, value);
        }
        case OzoneConcentrationMeasurement::Attributes::AverageMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValueWindow", 1, value);
        }
        case OzoneConcentrationMeasurement::Attributes::Uncertainty::Id: {
            float value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Uncertainty", 1, value);
        }
        case OzoneConcentrationMeasurement::Attributes::MeasurementUnit::Id: {
            chip::app::Clusters::OzoneConcentrationMeasurement::MeasurementUnitEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementUnit", 1, value);
        }
        case OzoneConcentrationMeasurement::Attributes::MeasurementMedium::Id: {
            chip::app::Clusters::OzoneConcentrationMeasurement::MeasurementMediumEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementMedium", 1, value);
        }
        case OzoneConcentrationMeasurement::Attributes::LevelValue::Id: {
            chip::app::Clusters::OzoneConcentrationMeasurement::LevelValueEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LevelValue", 1, value);
        }
        case OzoneConcentrationMeasurement::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case OzoneConcentrationMeasurement::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case OzoneConcentrationMeasurement::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case OzoneConcentrationMeasurement::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case OzoneConcentrationMeasurement::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case OzoneConcentrationMeasurement::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case SulfurDioxideConcentrationMeasurement::Id: {
        switch (path.mAttributeId)
        {
        case SulfurDioxideConcentrationMeasurement::Attributes::MeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasuredValue", 1, value);
        }
        case SulfurDioxideConcentrationMeasurement::Attributes::MinMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MinMeasuredValue", 1, value);
        }
        case SulfurDioxideConcentrationMeasurement::Attributes::MaxMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxMeasuredValue", 1, value);
        }
        case SulfurDioxideConcentrationMeasurement::Attributes::PeakMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValue", 1, value);
        }
        case SulfurDioxideConcentrationMeasurement::Attributes::PeakMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValueWindow", 1, value);
        }
        case SulfurDioxideConcentrationMeasurement::Attributes::AverageMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValue", 1, value);
        }
        case SulfurDioxideConcentrationMeasurement::Attributes::AverageMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValueWindow", 1, value);
        }
        case SulfurDioxideConcentrationMeasurement::Attributes::Uncertainty::Id: {
            float value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Uncertainty", 1, value);
        }
        case SulfurDioxideConcentrationMeasurement::Attributes::MeasurementUnit::Id: {
            chip::app::Clusters::SulfurDioxideConcentrationMeasurement::MeasurementUnitEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementUnit", 1, value);
        }
        case SulfurDioxideConcentrationMeasurement::Attributes::MeasurementMedium::Id: {
            chip::app::Clusters::SulfurDioxideConcentrationMeasurement::MeasurementMediumEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementMedium", 1, value);
        }
        case SulfurDioxideConcentrationMeasurement::Attributes::LevelValue::Id: {
            chip::app::Clusters::SulfurDioxideConcentrationMeasurement::LevelValueEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LevelValue", 1, value);
        }
        case SulfurDioxideConcentrationMeasurement::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case SulfurDioxideConcentrationMeasurement::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case SulfurDioxideConcentrationMeasurement::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case SulfurDioxideConcentrationMeasurement::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case SulfurDioxideConcentrationMeasurement::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case SulfurDioxideConcentrationMeasurement::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case DissolvedOxygenConcentrationMeasurement::Id: {
        switch (path.mAttributeId)
        {
        case DissolvedOxygenConcentrationMeasurement::Attributes::MeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasuredValue", 1, value);
        }
        case DissolvedOxygenConcentrationMeasurement::Attributes::MinMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MinMeasuredValue", 1, value);
        }
        case DissolvedOxygenConcentrationMeasurement::Attributes::MaxMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxMeasuredValue", 1, value);
        }
        case DissolvedOxygenConcentrationMeasurement::Attributes::PeakMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValue", 1, value);
        }
        case DissolvedOxygenConcentrationMeasurement::Attributes::PeakMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValueWindow", 1, value);
        }
        case DissolvedOxygenConcentrationMeasurement::Attributes::AverageMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValue", 1, value);
        }
        case DissolvedOxygenConcentrationMeasurement::Attributes::AverageMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValueWindow", 1, value);
        }
        case DissolvedOxygenConcentrationMeasurement::Attributes::Uncertainty::Id: {
            float value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Uncertainty", 1, value);
        }
        case DissolvedOxygenConcentrationMeasurement::Attributes::MeasurementUnit::Id: {
            chip::app::Clusters::DissolvedOxygenConcentrationMeasurement::MeasurementUnitEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementUnit", 1, value);
        }
        case DissolvedOxygenConcentrationMeasurement::Attributes::MeasurementMedium::Id: {
            chip::app::Clusters::DissolvedOxygenConcentrationMeasurement::MeasurementMediumEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementMedium", 1, value);
        }
        case DissolvedOxygenConcentrationMeasurement::Attributes::LevelValue::Id: {
            chip::app::Clusters::DissolvedOxygenConcentrationMeasurement::LevelValueEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LevelValue", 1, value);
        }
        case DissolvedOxygenConcentrationMeasurement::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case DissolvedOxygenConcentrationMeasurement::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case DissolvedOxygenConcentrationMeasurement::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case DissolvedOxygenConcentrationMeasurement::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case DissolvedOxygenConcentrationMeasurement::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case DissolvedOxygenConcentrationMeasurement::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case BromateConcentrationMeasurement::Id: {
        switch (path.mAttributeId)
        {
        case BromateConcentrationMeasurement::Attributes::MeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasuredValue", 1, value);
        }
        case BromateConcentrationMeasurement::Attributes::MinMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MinMeasuredValue", 1, value);
        }
        case BromateConcentrationMeasurement::Attributes::MaxMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxMeasuredValue", 1, value);
        }
        case BromateConcentrationMeasurement::Attributes::PeakMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValue", 1, value);
        }
        case BromateConcentrationMeasurement::Attributes::PeakMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValueWindow", 1, value);
        }
        case BromateConcentrationMeasurement::Attributes::AverageMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValue", 1, value);
        }
        case BromateConcentrationMeasurement::Attributes::AverageMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValueWindow", 1, value);
        }
        case BromateConcentrationMeasurement::Attributes::Uncertainty::Id: {
            float value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Uncertainty", 1, value);
        }
        case BromateConcentrationMeasurement::Attributes::MeasurementUnit::Id: {
            chip::app::Clusters::BromateConcentrationMeasurement::MeasurementUnitEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementUnit", 1, value);
        }
        case BromateConcentrationMeasurement::Attributes::MeasurementMedium::Id: {
            chip::app::Clusters::BromateConcentrationMeasurement::MeasurementMediumEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementMedium", 1, value);
        }
        case BromateConcentrationMeasurement::Attributes::LevelValue::Id: {
            chip::app::Clusters::BromateConcentrationMeasurement::LevelValueEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LevelValue", 1, value);
        }
        case BromateConcentrationMeasurement::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case BromateConcentrationMeasurement::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case BromateConcentrationMeasurement::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case BromateConcentrationMeasurement::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case BromateConcentrationMeasurement::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case BromateConcentrationMeasurement::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case ChloraminesConcentrationMeasurement::Id: {
        switch (path.mAttributeId)
        {
        case ChloraminesConcentrationMeasurement::Attributes::MeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasuredValue", 1, value);
        }
        case ChloraminesConcentrationMeasurement::Attributes::MinMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MinMeasuredValue", 1, value);
        }
        case ChloraminesConcentrationMeasurement::Attributes::MaxMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxMeasuredValue", 1, value);
        }
        case ChloraminesConcentrationMeasurement::Attributes::PeakMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValue", 1, value);
        }
        case ChloraminesConcentrationMeasurement::Attributes::PeakMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValueWindow", 1, value);
        }
        case ChloraminesConcentrationMeasurement::Attributes::AverageMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValue", 1, value);
        }
        case ChloraminesConcentrationMeasurement::Attributes::AverageMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValueWindow", 1, value);
        }
        case ChloraminesConcentrationMeasurement::Attributes::Uncertainty::Id: {
            float value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Uncertainty", 1, value);
        }
        case ChloraminesConcentrationMeasurement::Attributes::MeasurementUnit::Id: {
            chip::app::Clusters::ChloraminesConcentrationMeasurement::MeasurementUnitEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementUnit", 1, value);
        }
        case ChloraminesConcentrationMeasurement::Attributes::MeasurementMedium::Id: {
            chip::app::Clusters::ChloraminesConcentrationMeasurement::MeasurementMediumEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementMedium", 1, value);
        }
        case ChloraminesConcentrationMeasurement::Attributes::LevelValue::Id: {
            chip::app::Clusters::ChloraminesConcentrationMeasurement::LevelValueEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LevelValue", 1, value);
        }
        case ChloraminesConcentrationMeasurement::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case ChloraminesConcentrationMeasurement::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case ChloraminesConcentrationMeasurement::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case ChloraminesConcentrationMeasurement::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case ChloraminesConcentrationMeasurement::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case ChloraminesConcentrationMeasurement::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case ChlorineConcentrationMeasurement::Id: {
        switch (path.mAttributeId)
        {
        case ChlorineConcentrationMeasurement::Attributes::MeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasuredValue", 1, value);
        }
        case ChlorineConcentrationMeasurement::Attributes::MinMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MinMeasuredValue", 1, value);
        }
        case ChlorineConcentrationMeasurement::Attributes::MaxMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxMeasuredValue", 1, value);
        }
        case ChlorineConcentrationMeasurement::Attributes::PeakMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValue", 1, value);
        }
        case ChlorineConcentrationMeasurement::Attributes::PeakMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValueWindow", 1, value);
        }
        case ChlorineConcentrationMeasurement::Attributes::AverageMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValue", 1, value);
        }
        case ChlorineConcentrationMeasurement::Attributes::AverageMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValueWindow", 1, value);
        }
        case ChlorineConcentrationMeasurement::Attributes::Uncertainty::Id: {
            float value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Uncertainty", 1, value);
        }
        case ChlorineConcentrationMeasurement::Attributes::MeasurementUnit::Id: {
            chip::app::Clusters::ChlorineConcentrationMeasurement::MeasurementUnitEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementUnit", 1, value);
        }
        case ChlorineConcentrationMeasurement::Attributes::MeasurementMedium::Id: {
            chip::app::Clusters::ChlorineConcentrationMeasurement::MeasurementMediumEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementMedium", 1, value);
        }
        case ChlorineConcentrationMeasurement::Attributes::LevelValue::Id: {
            chip::app::Clusters::ChlorineConcentrationMeasurement::LevelValueEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LevelValue", 1, value);
        }
        case ChlorineConcentrationMeasurement::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case ChlorineConcentrationMeasurement::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case ChlorineConcentrationMeasurement::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case ChlorineConcentrationMeasurement::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case ChlorineConcentrationMeasurement::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case ChlorineConcentrationMeasurement::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case FecalColiformEColiConcentrationMeasurement::Id: {
        switch (path.mAttributeId)
        {
        case FecalColiformEColiConcentrationMeasurement::Attributes::MeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasuredValue", 1, value);
        }
        case FecalColiformEColiConcentrationMeasurement::Attributes::MinMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MinMeasuredValue", 1, value);
        }
        case FecalColiformEColiConcentrationMeasurement::Attributes::MaxMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxMeasuredValue", 1, value);
        }
        case FecalColiformEColiConcentrationMeasurement::Attributes::PeakMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValue", 1, value);
        }
        case FecalColiformEColiConcentrationMeasurement::Attributes::PeakMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValueWindow", 1, value);
        }
        case FecalColiformEColiConcentrationMeasurement::Attributes::AverageMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValue", 1, value);
        }
        case FecalColiformEColiConcentrationMeasurement::Attributes::AverageMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValueWindow", 1, value);
        }
        case FecalColiformEColiConcentrationMeasurement::Attributes::Uncertainty::Id: {
            float value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Uncertainty", 1, value);
        }
        case FecalColiformEColiConcentrationMeasurement::Attributes::MeasurementUnit::Id: {
            chip::app::Clusters::FecalColiformEColiConcentrationMeasurement::MeasurementUnitEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementUnit", 1, value);
        }
        case FecalColiformEColiConcentrationMeasurement::Attributes::MeasurementMedium::Id: {
            chip::app::Clusters::FecalColiformEColiConcentrationMeasurement::MeasurementMediumEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementMedium", 1, value);
        }
        case FecalColiformEColiConcentrationMeasurement::Attributes::LevelValue::Id: {
            chip::app::Clusters::FecalColiformEColiConcentrationMeasurement::LevelValueEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LevelValue", 1, value);
        }
        case FecalColiformEColiConcentrationMeasurement::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case FecalColiformEColiConcentrationMeasurement::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case FecalColiformEColiConcentrationMeasurement::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case FecalColiformEColiConcentrationMeasurement::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case FecalColiformEColiConcentrationMeasurement::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case FecalColiformEColiConcentrationMeasurement::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case FluorideConcentrationMeasurement::Id: {
        switch (path.mAttributeId)
        {
        case FluorideConcentrationMeasurement::Attributes::MeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasuredValue", 1, value);
        }
        case FluorideConcentrationMeasurement::Attributes::MinMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MinMeasuredValue", 1, value);
        }
        case FluorideConcentrationMeasurement::Attributes::MaxMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxMeasuredValue", 1, value);
        }
        case FluorideConcentrationMeasurement::Attributes::PeakMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValue", 1, value);
        }
        case FluorideConcentrationMeasurement::Attributes::PeakMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValueWindow", 1, value);
        }
        case FluorideConcentrationMeasurement::Attributes::AverageMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValue", 1, value);
        }
        case FluorideConcentrationMeasurement::Attributes::AverageMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValueWindow", 1, value);
        }
        case FluorideConcentrationMeasurement::Attributes::Uncertainty::Id: {
            float value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Uncertainty", 1, value);
        }
        case FluorideConcentrationMeasurement::Attributes::MeasurementUnit::Id: {
            chip::app::Clusters::FluorideConcentrationMeasurement::MeasurementUnitEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementUnit", 1, value);
        }
        case FluorideConcentrationMeasurement::Attributes::MeasurementMedium::Id: {
            chip::app::Clusters::FluorideConcentrationMeasurement::MeasurementMediumEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementMedium", 1, value);
        }
        case FluorideConcentrationMeasurement::Attributes::LevelValue::Id: {
            chip::app::Clusters::FluorideConcentrationMeasurement::LevelValueEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LevelValue", 1, value);
        }
        case FluorideConcentrationMeasurement::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case FluorideConcentrationMeasurement::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case FluorideConcentrationMeasurement::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case FluorideConcentrationMeasurement::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case FluorideConcentrationMeasurement::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case FluorideConcentrationMeasurement::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case HaloaceticAcidsConcentrationMeasurement::Id: {
        switch (path.mAttributeId)
        {
        case HaloaceticAcidsConcentrationMeasurement::Attributes::MeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasuredValue", 1, value);
        }
        case HaloaceticAcidsConcentrationMeasurement::Attributes::MinMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MinMeasuredValue", 1, value);
        }
        case HaloaceticAcidsConcentrationMeasurement::Attributes::MaxMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxMeasuredValue", 1, value);
        }
        case HaloaceticAcidsConcentrationMeasurement::Attributes::PeakMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValue", 1, value);
        }
        case HaloaceticAcidsConcentrationMeasurement::Attributes::PeakMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValueWindow", 1, value);
        }
        case HaloaceticAcidsConcentrationMeasurement::Attributes::AverageMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValue", 1, value);
        }
        case HaloaceticAcidsConcentrationMeasurement::Attributes::AverageMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValueWindow", 1, value);
        }
        case HaloaceticAcidsConcentrationMeasurement::Attributes::Uncertainty::Id: {
            float value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Uncertainty", 1, value);
        }
        case HaloaceticAcidsConcentrationMeasurement::Attributes::MeasurementUnit::Id: {
            chip::app::Clusters::HaloaceticAcidsConcentrationMeasurement::MeasurementUnitEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementUnit", 1, value);
        }
        case HaloaceticAcidsConcentrationMeasurement::Attributes::MeasurementMedium::Id: {
            chip::app::Clusters::HaloaceticAcidsConcentrationMeasurement::MeasurementMediumEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementMedium", 1, value);
        }
        case HaloaceticAcidsConcentrationMeasurement::Attributes::LevelValue::Id: {
            chip::app::Clusters::HaloaceticAcidsConcentrationMeasurement::LevelValueEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LevelValue", 1, value);
        }
        case HaloaceticAcidsConcentrationMeasurement::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case HaloaceticAcidsConcentrationMeasurement::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case HaloaceticAcidsConcentrationMeasurement::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case HaloaceticAcidsConcentrationMeasurement::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case HaloaceticAcidsConcentrationMeasurement::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case HaloaceticAcidsConcentrationMeasurement::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case TotalTrihalomethanesConcentrationMeasurement::Id: {
        switch (path.mAttributeId)
        {
        case TotalTrihalomethanesConcentrationMeasurement::Attributes::MeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasuredValue", 1, value);
        }
        case TotalTrihalomethanesConcentrationMeasurement::Attributes::MinMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MinMeasuredValue", 1, value);
        }
        case TotalTrihalomethanesConcentrationMeasurement::Attributes::MaxMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxMeasuredValue", 1, value);
        }
        case TotalTrihalomethanesConcentrationMeasurement::Attributes::PeakMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValue", 1, value);
        }
        case TotalTrihalomethanesConcentrationMeasurement::Attributes::PeakMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValueWindow", 1, value);
        }
        case TotalTrihalomethanesConcentrationMeasurement::Attributes::AverageMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValue", 1, value);
        }
        case TotalTrihalomethanesConcentrationMeasurement::Attributes::AverageMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValueWindow", 1, value);
        }
        case TotalTrihalomethanesConcentrationMeasurement::Attributes::Uncertainty::Id: {
            float value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Uncertainty", 1, value);
        }
        case TotalTrihalomethanesConcentrationMeasurement::Attributes::MeasurementUnit::Id: {
            chip::app::Clusters::TotalTrihalomethanesConcentrationMeasurement::MeasurementUnitEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementUnit", 1, value);
        }
        case TotalTrihalomethanesConcentrationMeasurement::Attributes::MeasurementMedium::Id: {
            chip::app::Clusters::TotalTrihalomethanesConcentrationMeasurement::MeasurementMediumEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementMedium", 1, value);
        }
        case TotalTrihalomethanesConcentrationMeasurement::Attributes::LevelValue::Id: {
            chip::app::Clusters::TotalTrihalomethanesConcentrationMeasurement::LevelValueEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LevelValue", 1, value);
        }
        case TotalTrihalomethanesConcentrationMeasurement::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case TotalTrihalomethanesConcentrationMeasurement::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case TotalTrihalomethanesConcentrationMeasurement::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case TotalTrihalomethanesConcentrationMeasurement::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case TotalTrihalomethanesConcentrationMeasurement::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case TotalTrihalomethanesConcentrationMeasurement::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case TotalColiformBacteriaConcentrationMeasurement::Id: {
        switch (path.mAttributeId)
        {
        case TotalColiformBacteriaConcentrationMeasurement::Attributes::MeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasuredValue", 1, value);
        }
        case TotalColiformBacteriaConcentrationMeasurement::Attributes::MinMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MinMeasuredValue", 1, value);
        }
        case TotalColiformBacteriaConcentrationMeasurement::Attributes::MaxMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxMeasuredValue", 1, value);
        }
        case TotalColiformBacteriaConcentrationMeasurement::Attributes::PeakMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValue", 1, value);
        }
        case TotalColiformBacteriaConcentrationMeasurement::Attributes::PeakMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValueWindow", 1, value);
        }
        case TotalColiformBacteriaConcentrationMeasurement::Attributes::AverageMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValue", 1, value);
        }
        case TotalColiformBacteriaConcentrationMeasurement::Attributes::AverageMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValueWindow", 1, value);
        }
        case TotalColiformBacteriaConcentrationMeasurement::Attributes::Uncertainty::Id: {
            float value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Uncertainty", 1, value);
        }
        case TotalColiformBacteriaConcentrationMeasurement::Attributes::MeasurementUnit::Id: {
            chip::app::Clusters::TotalColiformBacteriaConcentrationMeasurement::MeasurementUnitEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementUnit", 1, value);
        }
        case TotalColiformBacteriaConcentrationMeasurement::Attributes::MeasurementMedium::Id: {
            chip::app::Clusters::TotalColiformBacteriaConcentrationMeasurement::MeasurementMediumEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementMedium", 1, value);
        }
        case TotalColiformBacteriaConcentrationMeasurement::Attributes::LevelValue::Id: {
            chip::app::Clusters::TotalColiformBacteriaConcentrationMeasurement::LevelValueEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LevelValue", 1, value);
        }
        case TotalColiformBacteriaConcentrationMeasurement::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case TotalColiformBacteriaConcentrationMeasurement::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case TotalColiformBacteriaConcentrationMeasurement::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case TotalColiformBacteriaConcentrationMeasurement::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case TotalColiformBacteriaConcentrationMeasurement::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case TotalColiformBacteriaConcentrationMeasurement::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case TurbidityConcentrationMeasurement::Id: {
        switch (path.mAttributeId)
        {
        case TurbidityConcentrationMeasurement::Attributes::MeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasuredValue", 1, value);
        }
        case TurbidityConcentrationMeasurement::Attributes::MinMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MinMeasuredValue", 1, value);
        }
        case TurbidityConcentrationMeasurement::Attributes::MaxMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxMeasuredValue", 1, value);
        }
        case TurbidityConcentrationMeasurement::Attributes::PeakMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValue", 1, value);
        }
        case TurbidityConcentrationMeasurement::Attributes::PeakMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValueWindow", 1, value);
        }
        case TurbidityConcentrationMeasurement::Attributes::AverageMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValue", 1, value);
        }
        case TurbidityConcentrationMeasurement::Attributes::AverageMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValueWindow", 1, value);
        }
        case TurbidityConcentrationMeasurement::Attributes::Uncertainty::Id: {
            float value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Uncertainty", 1, value);
        }
        case TurbidityConcentrationMeasurement::Attributes::MeasurementUnit::Id: {
            chip::app::Clusters::TurbidityConcentrationMeasurement::MeasurementUnitEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementUnit", 1, value);
        }
        case TurbidityConcentrationMeasurement::Attributes::MeasurementMedium::Id: {
            chip::app::Clusters::TurbidityConcentrationMeasurement::MeasurementMediumEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementMedium", 1, value);
        }
        case TurbidityConcentrationMeasurement::Attributes::LevelValue::Id: {
            chip::app::Clusters::TurbidityConcentrationMeasurement::LevelValueEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LevelValue", 1, value);
        }
        case TurbidityConcentrationMeasurement::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case TurbidityConcentrationMeasurement::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case TurbidityConcentrationMeasurement::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case TurbidityConcentrationMeasurement::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case TurbidityConcentrationMeasurement::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case TurbidityConcentrationMeasurement::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case CopperConcentrationMeasurement::Id: {
        switch (path.mAttributeId)
        {
        case CopperConcentrationMeasurement::Attributes::MeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasuredValue", 1, value);
        }
        case CopperConcentrationMeasurement::Attributes::MinMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MinMeasuredValue", 1, value);
        }
        case CopperConcentrationMeasurement::Attributes::MaxMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxMeasuredValue", 1, value);
        }
        case CopperConcentrationMeasurement::Attributes::PeakMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValue", 1, value);
        }
        case CopperConcentrationMeasurement::Attributes::PeakMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValueWindow", 1, value);
        }
        case CopperConcentrationMeasurement::Attributes::AverageMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValue", 1, value);
        }
        case CopperConcentrationMeasurement::Attributes::AverageMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValueWindow", 1, value);
        }
        case CopperConcentrationMeasurement::Attributes::Uncertainty::Id: {
            float value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Uncertainty", 1, value);
        }
        case CopperConcentrationMeasurement::Attributes::MeasurementUnit::Id: {
            chip::app::Clusters::CopperConcentrationMeasurement::MeasurementUnitEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementUnit", 1, value);
        }
        case CopperConcentrationMeasurement::Attributes::MeasurementMedium::Id: {
            chip::app::Clusters::CopperConcentrationMeasurement::MeasurementMediumEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementMedium", 1, value);
        }
        case CopperConcentrationMeasurement::Attributes::LevelValue::Id: {
            chip::app::Clusters::CopperConcentrationMeasurement::LevelValueEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LevelValue", 1, value);
        }
        case CopperConcentrationMeasurement::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case CopperConcentrationMeasurement::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case CopperConcentrationMeasurement::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case CopperConcentrationMeasurement::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case CopperConcentrationMeasurement::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case CopperConcentrationMeasurement::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case LeadConcentrationMeasurement::Id: {
        switch (path.mAttributeId)
        {
        case LeadConcentrationMeasurement::Attributes::MeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasuredValue", 1, value);
        }
        case LeadConcentrationMeasurement::Attributes::MinMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MinMeasuredValue", 1, value);
        }
        case LeadConcentrationMeasurement::Attributes::MaxMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxMeasuredValue", 1, value);
        }
        case LeadConcentrationMeasurement::Attributes::PeakMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValue", 1, value);
        }
        case LeadConcentrationMeasurement::Attributes::PeakMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValueWindow", 1, value);
        }
        case LeadConcentrationMeasurement::Attributes::AverageMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValue", 1, value);
        }
        case LeadConcentrationMeasurement::Attributes::AverageMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValueWindow", 1, value);
        }
        case LeadConcentrationMeasurement::Attributes::Uncertainty::Id: {
            float value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Uncertainty", 1, value);
        }
        case LeadConcentrationMeasurement::Attributes::MeasurementUnit::Id: {
            chip::app::Clusters::LeadConcentrationMeasurement::MeasurementUnitEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementUnit", 1, value);
        }
        case LeadConcentrationMeasurement::Attributes::MeasurementMedium::Id: {
            chip::app::Clusters::LeadConcentrationMeasurement::MeasurementMediumEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementMedium", 1, value);
        }
        case LeadConcentrationMeasurement::Attributes::LevelValue::Id: {
            chip::app::Clusters::LeadConcentrationMeasurement::LevelValueEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LevelValue", 1, value);
        }
        case LeadConcentrationMeasurement::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case LeadConcentrationMeasurement::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case LeadConcentrationMeasurement::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case LeadConcentrationMeasurement::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case LeadConcentrationMeasurement::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case LeadConcentrationMeasurement::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case ManganeseConcentrationMeasurement::Id: {
        switch (path.mAttributeId)
        {
        case ManganeseConcentrationMeasurement::Attributes::MeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasuredValue", 1, value);
        }
        case ManganeseConcentrationMeasurement::Attributes::MinMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MinMeasuredValue", 1, value);
        }
        case ManganeseConcentrationMeasurement::Attributes::MaxMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxMeasuredValue", 1, value);
        }
        case ManganeseConcentrationMeasurement::Attributes::PeakMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValue", 1, value);
        }
        case ManganeseConcentrationMeasurement::Attributes::PeakMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValueWindow", 1, value);
        }
        case ManganeseConcentrationMeasurement::Attributes::AverageMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValue", 1, value);
        }
        case ManganeseConcentrationMeasurement::Attributes::AverageMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValueWindow", 1, value);
        }
        case ManganeseConcentrationMeasurement::Attributes::Uncertainty::Id: {
            float value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Uncertainty", 1, value);
        }
        case ManganeseConcentrationMeasurement::Attributes::MeasurementUnit::Id: {
            chip::app::Clusters::ManganeseConcentrationMeasurement::MeasurementUnitEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementUnit", 1, value);
        }
        case ManganeseConcentrationMeasurement::Attributes::MeasurementMedium::Id: {
            chip::app::Clusters::ManganeseConcentrationMeasurement::MeasurementMediumEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementMedium", 1, value);
        }
        case ManganeseConcentrationMeasurement::Attributes::LevelValue::Id: {
            chip::app::Clusters::ManganeseConcentrationMeasurement::LevelValueEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LevelValue", 1, value);
        }
        case ManganeseConcentrationMeasurement::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case ManganeseConcentrationMeasurement::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case ManganeseConcentrationMeasurement::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case ManganeseConcentrationMeasurement::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case ManganeseConcentrationMeasurement::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case ManganeseConcentrationMeasurement::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case SulfateConcentrationMeasurement::Id: {
        switch (path.mAttributeId)
        {
        case SulfateConcentrationMeasurement::Attributes::MeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasuredValue", 1, value);
        }
        case SulfateConcentrationMeasurement::Attributes::MinMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MinMeasuredValue", 1, value);
        }
        case SulfateConcentrationMeasurement::Attributes::MaxMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxMeasuredValue", 1, value);
        }
        case SulfateConcentrationMeasurement::Attributes::PeakMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValue", 1, value);
        }
        case SulfateConcentrationMeasurement::Attributes::PeakMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValueWindow", 1, value);
        }
        case SulfateConcentrationMeasurement::Attributes::AverageMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValue", 1, value);
        }
        case SulfateConcentrationMeasurement::Attributes::AverageMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValueWindow", 1, value);
        }
        case SulfateConcentrationMeasurement::Attributes::Uncertainty::Id: {
            float value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Uncertainty", 1, value);
        }
        case SulfateConcentrationMeasurement::Attributes::MeasurementUnit::Id: {
            chip::app::Clusters::SulfateConcentrationMeasurement::MeasurementUnitEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementUnit", 1, value);
        }
        case SulfateConcentrationMeasurement::Attributes::MeasurementMedium::Id: {
            chip::app::Clusters::SulfateConcentrationMeasurement::MeasurementMediumEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementMedium", 1, value);
        }
        case SulfateConcentrationMeasurement::Attributes::LevelValue::Id: {
            chip::app::Clusters::SulfateConcentrationMeasurement::LevelValueEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LevelValue", 1, value);
        }
        case SulfateConcentrationMeasurement::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case SulfateConcentrationMeasurement::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case SulfateConcentrationMeasurement::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case SulfateConcentrationMeasurement::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case SulfateConcentrationMeasurement::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case SulfateConcentrationMeasurement::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case BromodichloromethaneConcentrationMeasurement::Id: {
        switch (path.mAttributeId)
        {
        case BromodichloromethaneConcentrationMeasurement::Attributes::MeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasuredValue", 1, value);
        }
        case BromodichloromethaneConcentrationMeasurement::Attributes::MinMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MinMeasuredValue", 1, value);
        }
        case BromodichloromethaneConcentrationMeasurement::Attributes::MaxMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxMeasuredValue", 1, value);
        }
        case BromodichloromethaneConcentrationMeasurement::Attributes::PeakMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValue", 1, value);
        }
        case BromodichloromethaneConcentrationMeasurement::Attributes::PeakMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValueWindow", 1, value);
        }
        case BromodichloromethaneConcentrationMeasurement::Attributes::AverageMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValue", 1, value);
        }
        case BromodichloromethaneConcentrationMeasurement::Attributes::AverageMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValueWindow", 1, value);
        }
        case BromodichloromethaneConcentrationMeasurement::Attributes::Uncertainty::Id: {
            float value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Uncertainty", 1, value);
        }
        case BromodichloromethaneConcentrationMeasurement::Attributes::MeasurementUnit::Id: {
            chip::app::Clusters::BromodichloromethaneConcentrationMeasurement::MeasurementUnitEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementUnit", 1, value);
        }
        case BromodichloromethaneConcentrationMeasurement::Attributes::MeasurementMedium::Id: {
            chip::app::Clusters::BromodichloromethaneConcentrationMeasurement::MeasurementMediumEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementMedium", 1, value);
        }
        case BromodichloromethaneConcentrationMeasurement::Attributes::LevelValue::Id: {
            chip::app::Clusters::BromodichloromethaneConcentrationMeasurement::LevelValueEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LevelValue", 1, value);
        }
        case BromodichloromethaneConcentrationMeasurement::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case BromodichloromethaneConcentrationMeasurement::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case BromodichloromethaneConcentrationMeasurement::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case BromodichloromethaneConcentrationMeasurement::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case BromodichloromethaneConcentrationMeasurement::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case BromodichloromethaneConcentrationMeasurement::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case BromoformConcentrationMeasurement::Id: {
        switch (path.mAttributeId)
        {
        case BromoformConcentrationMeasurement::Attributes::MeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasuredValue", 1, value);
        }
        case BromoformConcentrationMeasurement::Attributes::MinMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MinMeasuredValue", 1, value);
        }
        case BromoformConcentrationMeasurement::Attributes::MaxMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxMeasuredValue", 1, value);
        }
        case BromoformConcentrationMeasurement::Attributes::PeakMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValue", 1, value);
        }
        case BromoformConcentrationMeasurement::Attributes::PeakMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValueWindow", 1, value);
        }
        case BromoformConcentrationMeasurement::Attributes::AverageMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValue", 1, value);
        }
        case BromoformConcentrationMeasurement::Attributes::AverageMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValueWindow", 1, value);
        }
        case BromoformConcentrationMeasurement::Attributes::Uncertainty::Id: {
            float value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Uncertainty", 1, value);
        }
        case BromoformConcentrationMeasurement::Attributes::MeasurementUnit::Id: {
            chip::app::Clusters::BromoformConcentrationMeasurement::MeasurementUnitEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementUnit", 1, value);
        }
        case BromoformConcentrationMeasurement::Attributes::MeasurementMedium::Id: {
            chip::app::Clusters::BromoformConcentrationMeasurement::MeasurementMediumEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementMedium", 1, value);
        }
        case BromoformConcentrationMeasurement::Attributes::LevelValue::Id: {
            chip::app::Clusters::BromoformConcentrationMeasurement::LevelValueEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LevelValue", 1, value);
        }
        case BromoformConcentrationMeasurement::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case BromoformConcentrationMeasurement::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case BromoformConcentrationMeasurement::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case BromoformConcentrationMeasurement::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case BromoformConcentrationMeasurement::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case BromoformConcentrationMeasurement::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case ChlorodibromomethaneConcentrationMeasurement::Id: {
        switch (path.mAttributeId)
        {
        case ChlorodibromomethaneConcentrationMeasurement::Attributes::MeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasuredValue", 1, value);
        }
        case ChlorodibromomethaneConcentrationMeasurement::Attributes::MinMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MinMeasuredValue", 1, value);
        }
        case ChlorodibromomethaneConcentrationMeasurement::Attributes::MaxMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxMeasuredValue", 1, value);
        }
        case ChlorodibromomethaneConcentrationMeasurement::Attributes::PeakMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValue", 1, value);
        }
        case ChlorodibromomethaneConcentrationMeasurement::Attributes::PeakMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValueWindow", 1, value);
        }
        case ChlorodibromomethaneConcentrationMeasurement::Attributes::AverageMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValue", 1, value);
        }
        case ChlorodibromomethaneConcentrationMeasurement::Attributes::AverageMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValueWindow", 1, value);
        }
        case ChlorodibromomethaneConcentrationMeasurement::Attributes::Uncertainty::Id: {
            float value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Uncertainty", 1, value);
        }
        case ChlorodibromomethaneConcentrationMeasurement::Attributes::MeasurementUnit::Id: {
            chip::app::Clusters::ChlorodibromomethaneConcentrationMeasurement::MeasurementUnitEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementUnit", 1, value);
        }
        case ChlorodibromomethaneConcentrationMeasurement::Attributes::MeasurementMedium::Id: {
            chip::app::Clusters::ChlorodibromomethaneConcentrationMeasurement::MeasurementMediumEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementMedium", 1, value);
        }
        case ChlorodibromomethaneConcentrationMeasurement::Attributes::LevelValue::Id: {
            chip::app::Clusters::ChlorodibromomethaneConcentrationMeasurement::LevelValueEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LevelValue", 1, value);
        }
        case ChlorodibromomethaneConcentrationMeasurement::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case ChlorodibromomethaneConcentrationMeasurement::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case ChlorodibromomethaneConcentrationMeasurement::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case ChlorodibromomethaneConcentrationMeasurement::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case ChlorodibromomethaneConcentrationMeasurement::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case ChlorodibromomethaneConcentrationMeasurement::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case ChloroformConcentrationMeasurement::Id: {
        switch (path.mAttributeId)
        {
        case ChloroformConcentrationMeasurement::Attributes::MeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasuredValue", 1, value);
        }
        case ChloroformConcentrationMeasurement::Attributes::MinMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MinMeasuredValue", 1, value);
        }
        case ChloroformConcentrationMeasurement::Attributes::MaxMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxMeasuredValue", 1, value);
        }
        case ChloroformConcentrationMeasurement::Attributes::PeakMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValue", 1, value);
        }
        case ChloroformConcentrationMeasurement::Attributes::PeakMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValueWindow", 1, value);
        }
        case ChloroformConcentrationMeasurement::Attributes::AverageMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValue", 1, value);
        }
        case ChloroformConcentrationMeasurement::Attributes::AverageMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValueWindow", 1, value);
        }
        case ChloroformConcentrationMeasurement::Attributes::Uncertainty::Id: {
            float value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Uncertainty", 1, value);
        }
        case ChloroformConcentrationMeasurement::Attributes::MeasurementUnit::Id: {
            chip::app::Clusters::ChloroformConcentrationMeasurement::MeasurementUnitEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementUnit", 1, value);
        }
        case ChloroformConcentrationMeasurement::Attributes::MeasurementMedium::Id: {
            chip::app::Clusters::ChloroformConcentrationMeasurement::MeasurementMediumEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementMedium", 1, value);
        }
        case ChloroformConcentrationMeasurement::Attributes::LevelValue::Id: {
            chip::app::Clusters::ChloroformConcentrationMeasurement::LevelValueEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LevelValue", 1, value);
        }
        case ChloroformConcentrationMeasurement::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case ChloroformConcentrationMeasurement::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case ChloroformConcentrationMeasurement::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case ChloroformConcentrationMeasurement::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case ChloroformConcentrationMeasurement::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case ChloroformConcentrationMeasurement::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case SodiumConcentrationMeasurement::Id: {
        switch (path.mAttributeId)
        {
        case SodiumConcentrationMeasurement::Attributes::MeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasuredValue", 1, value);
        }
        case SodiumConcentrationMeasurement::Attributes::MinMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MinMeasuredValue", 1, value);
        }
        case SodiumConcentrationMeasurement::Attributes::MaxMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxMeasuredValue", 1, value);
        }
        case SodiumConcentrationMeasurement::Attributes::PeakMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValue", 1, value);
        }
        case SodiumConcentrationMeasurement::Attributes::PeakMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValueWindow", 1, value);
        }
        case SodiumConcentrationMeasurement::Attributes::AverageMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValue", 1, value);
        }
        case SodiumConcentrationMeasurement::Attributes::AverageMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValueWindow", 1, value);
        }
        case SodiumConcentrationMeasurement::Attributes::Uncertainty::Id: {
            float value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Uncertainty", 1, value);
        }
        case SodiumConcentrationMeasurement::Attributes::MeasurementUnit::Id: {
            chip::app::Clusters::SodiumConcentrationMeasurement::MeasurementUnitEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementUnit", 1, value);
        }
        case SodiumConcentrationMeasurement::Attributes::MeasurementMedium::Id: {
            chip::app::Clusters::SodiumConcentrationMeasurement::MeasurementMediumEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementMedium", 1, value);
        }
        case SodiumConcentrationMeasurement::Attributes::LevelValue::Id: {
            chip::app::Clusters::SodiumConcentrationMeasurement::LevelValueEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LevelValue", 1, value);
        }
        case SodiumConcentrationMeasurement::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case SodiumConcentrationMeasurement::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case SodiumConcentrationMeasurement::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case SodiumConcentrationMeasurement::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case SodiumConcentrationMeasurement::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case SodiumConcentrationMeasurement::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case Pm25ConcentrationMeasurement::Id: {
        switch (path.mAttributeId)
        {
        case Pm25ConcentrationMeasurement::Attributes::MeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasuredValue", 1, value);
        }
        case Pm25ConcentrationMeasurement::Attributes::MinMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MinMeasuredValue", 1, value);
        }
        case Pm25ConcentrationMeasurement::Attributes::MaxMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxMeasuredValue", 1, value);
        }
        case Pm25ConcentrationMeasurement::Attributes::PeakMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValue", 1, value);
        }
        case Pm25ConcentrationMeasurement::Attributes::PeakMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValueWindow", 1, value);
        }
        case Pm25ConcentrationMeasurement::Attributes::AverageMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValue", 1, value);
        }
        case Pm25ConcentrationMeasurement::Attributes::AverageMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValueWindow", 1, value);
        }
        case Pm25ConcentrationMeasurement::Attributes::Uncertainty::Id: {
            float value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Uncertainty", 1, value);
        }
        case Pm25ConcentrationMeasurement::Attributes::MeasurementUnit::Id: {
            chip::app::Clusters::Pm25ConcentrationMeasurement::MeasurementUnitEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementUnit", 1, value);
        }
        case Pm25ConcentrationMeasurement::Attributes::MeasurementMedium::Id: {
            chip::app::Clusters::Pm25ConcentrationMeasurement::MeasurementMediumEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementMedium", 1, value);
        }
        case Pm25ConcentrationMeasurement::Attributes::LevelValue::Id: {
            chip::app::Clusters::Pm25ConcentrationMeasurement::LevelValueEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LevelValue", 1, value);
        }
        case Pm25ConcentrationMeasurement::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case Pm25ConcentrationMeasurement::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case Pm25ConcentrationMeasurement::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case Pm25ConcentrationMeasurement::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case Pm25ConcentrationMeasurement::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case Pm25ConcentrationMeasurement::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case FormaldehydeConcentrationMeasurement::Id: {
        switch (path.mAttributeId)
        {
        case FormaldehydeConcentrationMeasurement::Attributes::MeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasuredValue", 1, value);
        }
        case FormaldehydeConcentrationMeasurement::Attributes::MinMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MinMeasuredValue", 1, value);
        }
        case FormaldehydeConcentrationMeasurement::Attributes::MaxMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxMeasuredValue", 1, value);
        }
        case FormaldehydeConcentrationMeasurement::Attributes::PeakMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValue", 1, value);
        }
        case FormaldehydeConcentrationMeasurement::Attributes::PeakMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValueWindow", 1, value);
        }
        case FormaldehydeConcentrationMeasurement::Attributes::AverageMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValue", 1, value);
        }
        case FormaldehydeConcentrationMeasurement::Attributes::AverageMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValueWindow", 1, value);
        }
        case FormaldehydeConcentrationMeasurement::Attributes::Uncertainty::Id: {
            float value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Uncertainty", 1, value);
        }
        case FormaldehydeConcentrationMeasurement::Attributes::MeasurementUnit::Id: {
            chip::app::Clusters::FormaldehydeConcentrationMeasurement::MeasurementUnitEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementUnit", 1, value);
        }
        case FormaldehydeConcentrationMeasurement::Attributes::MeasurementMedium::Id: {
            chip::app::Clusters::FormaldehydeConcentrationMeasurement::MeasurementMediumEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementMedium", 1, value);
        }
        case FormaldehydeConcentrationMeasurement::Attributes::LevelValue::Id: {
            chip::app::Clusters::FormaldehydeConcentrationMeasurement::LevelValueEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LevelValue", 1, value);
        }
        case FormaldehydeConcentrationMeasurement::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case FormaldehydeConcentrationMeasurement::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case FormaldehydeConcentrationMeasurement::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case FormaldehydeConcentrationMeasurement::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case FormaldehydeConcentrationMeasurement::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case FormaldehydeConcentrationMeasurement::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case Pm1ConcentrationMeasurement::Id: {
        switch (path.mAttributeId)
        {
        case Pm1ConcentrationMeasurement::Attributes::MeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasuredValue", 1, value);
        }
        case Pm1ConcentrationMeasurement::Attributes::MinMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MinMeasuredValue", 1, value);
        }
        case Pm1ConcentrationMeasurement::Attributes::MaxMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxMeasuredValue", 1, value);
        }
        case Pm1ConcentrationMeasurement::Attributes::PeakMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValue", 1, value);
        }
        case Pm1ConcentrationMeasurement::Attributes::PeakMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValueWindow", 1, value);
        }
        case Pm1ConcentrationMeasurement::Attributes::AverageMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValue", 1, value);
        }
        case Pm1ConcentrationMeasurement::Attributes::AverageMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValueWindow", 1, value);
        }
        case Pm1ConcentrationMeasurement::Attributes::Uncertainty::Id: {
            float value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Uncertainty", 1, value);
        }
        case Pm1ConcentrationMeasurement::Attributes::MeasurementUnit::Id: {
            chip::app::Clusters::Pm1ConcentrationMeasurement::MeasurementUnitEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementUnit", 1, value);
        }
        case Pm1ConcentrationMeasurement::Attributes::MeasurementMedium::Id: {
            chip::app::Clusters::Pm1ConcentrationMeasurement::MeasurementMediumEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementMedium", 1, value);
        }
        case Pm1ConcentrationMeasurement::Attributes::LevelValue::Id: {
            chip::app::Clusters::Pm1ConcentrationMeasurement::LevelValueEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LevelValue", 1, value);
        }
        case Pm1ConcentrationMeasurement::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case Pm1ConcentrationMeasurement::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case Pm1ConcentrationMeasurement::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case Pm1ConcentrationMeasurement::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case Pm1ConcentrationMeasurement::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case Pm1ConcentrationMeasurement::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case Pm10ConcentrationMeasurement::Id: {
        switch (path.mAttributeId)
        {
        case Pm10ConcentrationMeasurement::Attributes::MeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasuredValue", 1, value);
        }
        case Pm10ConcentrationMeasurement::Attributes::MinMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MinMeasuredValue", 1, value);
        }
        case Pm10ConcentrationMeasurement::Attributes::MaxMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxMeasuredValue", 1, value);
        }
        case Pm10ConcentrationMeasurement::Attributes::PeakMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValue", 1, value);
        }
        case Pm10ConcentrationMeasurement::Attributes::PeakMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValueWindow", 1, value);
        }
        case Pm10ConcentrationMeasurement::Attributes::AverageMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValue", 1, value);
        }
        case Pm10ConcentrationMeasurement::Attributes::AverageMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValueWindow", 1, value);
        }
        case Pm10ConcentrationMeasurement::Attributes::Uncertainty::Id: {
            float value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Uncertainty", 1, value);
        }
        case Pm10ConcentrationMeasurement::Attributes::MeasurementUnit::Id: {
            chip::app::Clusters::Pm10ConcentrationMeasurement::MeasurementUnitEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementUnit", 1, value);
        }
        case Pm10ConcentrationMeasurement::Attributes::MeasurementMedium::Id: {
            chip::app::Clusters::Pm10ConcentrationMeasurement::MeasurementMediumEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementMedium", 1, value);
        }
        case Pm10ConcentrationMeasurement::Attributes::LevelValue::Id: {
            chip::app::Clusters::Pm10ConcentrationMeasurement::LevelValueEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LevelValue", 1, value);
        }
        case Pm10ConcentrationMeasurement::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case Pm10ConcentrationMeasurement::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case Pm10ConcentrationMeasurement::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case Pm10ConcentrationMeasurement::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case Pm10ConcentrationMeasurement::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case Pm10ConcentrationMeasurement::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case TotalVolatileOrganicCompoundsConcentrationMeasurement::Id: {
        switch (path.mAttributeId)
        {
        case TotalVolatileOrganicCompoundsConcentrationMeasurement::Attributes::MeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasuredValue", 1, value);
        }
        case TotalVolatileOrganicCompoundsConcentrationMeasurement::Attributes::MinMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MinMeasuredValue", 1, value);
        }
        case TotalVolatileOrganicCompoundsConcentrationMeasurement::Attributes::MaxMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxMeasuredValue", 1, value);
        }
        case TotalVolatileOrganicCompoundsConcentrationMeasurement::Attributes::PeakMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValue", 1, value);
        }
        case TotalVolatileOrganicCompoundsConcentrationMeasurement::Attributes::PeakMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValueWindow", 1, value);
        }
        case TotalVolatileOrganicCompoundsConcentrationMeasurement::Attributes::AverageMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValue", 1, value);
        }
        case TotalVolatileOrganicCompoundsConcentrationMeasurement::Attributes::AverageMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValueWindow", 1, value);
        }
        case TotalVolatileOrganicCompoundsConcentrationMeasurement::Attributes::Uncertainty::Id: {
            float value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Uncertainty", 1, value);
        }
        case TotalVolatileOrganicCompoundsConcentrationMeasurement::Attributes::MeasurementUnit::Id: {
            chip::app::Clusters::TotalVolatileOrganicCompoundsConcentrationMeasurement::MeasurementUnitEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementUnit", 1, value);
        }
        case TotalVolatileOrganicCompoundsConcentrationMeasurement::Attributes::MeasurementMedium::Id: {
            chip::app::Clusters::TotalVolatileOrganicCompoundsConcentrationMeasurement::MeasurementMediumEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementMedium", 1, value);
        }
        case TotalVolatileOrganicCompoundsConcentrationMeasurement::Attributes::LevelValue::Id: {
            chip::app::Clusters::TotalVolatileOrganicCompoundsConcentrationMeasurement::LevelValueEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LevelValue", 1, value);
        }
        case TotalVolatileOrganicCompoundsConcentrationMeasurement::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case TotalVolatileOrganicCompoundsConcentrationMeasurement::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case TotalVolatileOrganicCompoundsConcentrationMeasurement::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case TotalVolatileOrganicCompoundsConcentrationMeasurement::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case TotalVolatileOrganicCompoundsConcentrationMeasurement::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case TotalVolatileOrganicCompoundsConcentrationMeasurement::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case RadonConcentrationMeasurement::Id: {
        switch (path.mAttributeId)
        {
        case RadonConcentrationMeasurement::Attributes::MeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasuredValue", 1, value);
        }
        case RadonConcentrationMeasurement::Attributes::MinMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MinMeasuredValue", 1, value);
        }
        case RadonConcentrationMeasurement::Attributes::MaxMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MaxMeasuredValue", 1, value);
        }
        case RadonConcentrationMeasurement::Attributes::PeakMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValue", 1, value);
        }
        case RadonConcentrationMeasurement::Attributes::PeakMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PeakMeasuredValueWindow", 1, value);
        }
        case RadonConcentrationMeasurement::Attributes::AverageMeasuredValue::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValue", 1, value);
        }
        case RadonConcentrationMeasurement::Attributes::AverageMeasuredValueWindow::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AverageMeasuredValueWindow", 1, value);
        }
        case RadonConcentrationMeasurement::Attributes::Uncertainty::Id: {
            float value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Uncertainty", 1, value);
        }
        case RadonConcentrationMeasurement::Attributes::MeasurementUnit::Id: {
            chip::app::Clusters::RadonConcentrationMeasurement::MeasurementUnitEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementUnit", 1, value);
        }
        case RadonConcentrationMeasurement::Attributes::MeasurementMedium::Id: {
            chip::app::Clusters::RadonConcentrationMeasurement::MeasurementMediumEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MeasurementMedium", 1, value);
        }
        case RadonConcentrationMeasurement::Attributes::LevelValue::Id: {
            chip::app::Clusters::RadonConcentrationMeasurement::LevelValueEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LevelValue", 1, value);
        }
        case RadonConcentrationMeasurement::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case RadonConcentrationMeasurement::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case RadonConcentrationMeasurement::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case RadonConcentrationMeasurement::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case RadonConcentrationMeasurement::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case RadonConcentrationMeasurement::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case WakeOnLan::Id: {
        switch (path.mAttributeId)
        {
        case WakeOnLan::Attributes::MACAddress::Id: {
            chip::CharSpan value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MACAddress", 1, value);
        }
        case WakeOnLan::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case WakeOnLan::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case WakeOnLan::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case WakeOnLan::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case WakeOnLan::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case WakeOnLan::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case Channel::Id: {
        switch (path.mAttributeId)
        {
        case Channel::Attributes::ChannelList::Id: {
            chip::app::DataModel::DecodableList<chip::app::Clusters::Channel::Structs::ChannelInfoStruct::DecodableType> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ChannelList", 1, value);
        }
        case Channel::Attributes::Lineup::Id: {
            chip::app::DataModel::Nullable<chip::app::Clusters::Channel::Structs::LineupInfoStruct::DecodableType> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Lineup", 1, value);
        }
        case Channel::Attributes::CurrentChannel::Id: {
            chip::app::DataModel::Nullable<chip::app::Clusters::Channel::Structs::ChannelInfoStruct::DecodableType> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("CurrentChannel", 1, value);
        }
        case Channel::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case Channel::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case Channel::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case Channel::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case Channel::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case Channel::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case TargetNavigator::Id: {
        switch (path.mAttributeId)
        {
        case TargetNavigator::Attributes::TargetList::Id: {
            chip::app::DataModel::DecodableList<chip::app::Clusters::TargetNavigator::Structs::TargetInfoStruct::DecodableType>
                value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("TargetList", 1, value);
        }
        case TargetNavigator::Attributes::CurrentTarget::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("CurrentTarget", 1, value);
        }
        case TargetNavigator::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case TargetNavigator::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case TargetNavigator::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case TargetNavigator::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case TargetNavigator::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case TargetNavigator::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case MediaPlayback::Id: {
        switch (path.mAttributeId)
        {
        case MediaPlayback::Attributes::CurrentState::Id: {
            chip::app::Clusters::MediaPlayback::PlaybackStateEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("CurrentState", 1, value);
        }
        case MediaPlayback::Attributes::StartTime::Id: {
            chip::app::DataModel::Nullable<uint64_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("StartTime", 1, value);
        }
        case MediaPlayback::Attributes::Duration::Id: {
            chip::app::DataModel::Nullable<uint64_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Duration", 1, value);
        }
        case MediaPlayback::Attributes::SampledPosition::Id: {
            chip::app::DataModel::Nullable<chip::app::Clusters::MediaPlayback::Structs::PlaybackPositionStruct::DecodableType>
                value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("SampledPosition", 1, value);
        }
        case MediaPlayback::Attributes::PlaybackSpeed::Id: {
            float value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PlaybackSpeed", 1, value);
        }
        case MediaPlayback::Attributes::SeekRangeEnd::Id: {
            chip::app::DataModel::Nullable<uint64_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("SeekRangeEnd", 1, value);
        }
        case MediaPlayback::Attributes::SeekRangeStart::Id: {
            chip::app::DataModel::Nullable<uint64_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("SeekRangeStart", 1, value);
        }
        case MediaPlayback::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case MediaPlayback::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case MediaPlayback::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case MediaPlayback::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case MediaPlayback::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case MediaPlayback::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case MediaInput::Id: {
        switch (path.mAttributeId)
        {
        case MediaInput::Attributes::InputList::Id: {
            chip::app::DataModel::DecodableList<chip::app::Clusters::MediaInput::Structs::InputInfoStruct::DecodableType> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("InputList", 1, value);
        }
        case MediaInput::Attributes::CurrentInput::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("CurrentInput", 1, value);
        }
        case MediaInput::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case MediaInput::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case MediaInput::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case MediaInput::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case MediaInput::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case MediaInput::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case LowPower::Id: {
        switch (path.mAttributeId)
        {
        case LowPower::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case LowPower::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case LowPower::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case LowPower::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case LowPower::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case LowPower::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case KeypadInput::Id: {
        switch (path.mAttributeId)
        {
        case KeypadInput::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case KeypadInput::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case KeypadInput::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case KeypadInput::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case KeypadInput::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case KeypadInput::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case ContentLauncher::Id: {
        switch (path.mAttributeId)
        {
        case ContentLauncher::Attributes::AcceptHeader::Id: {
            chip::app::DataModel::DecodableList<chip::CharSpan> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptHeader", 1, value);
        }
        case ContentLauncher::Attributes::SupportedStreamingProtocols::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("SupportedStreamingProtocols", 1, value);
        }
        case ContentLauncher::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case ContentLauncher::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case ContentLauncher::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case ContentLauncher::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case ContentLauncher::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case ContentLauncher::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case AudioOutput::Id: {
        switch (path.mAttributeId)
        {
        case AudioOutput::Attributes::OutputList::Id: {
            chip::app::DataModel::DecodableList<chip::app::Clusters::AudioOutput::Structs::OutputInfoStruct::DecodableType> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("OutputList", 1, value);
        }
        case AudioOutput::Attributes::CurrentOutput::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("CurrentOutput", 1, value);
        }
        case AudioOutput::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case AudioOutput::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case AudioOutput::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case AudioOutput::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case AudioOutput::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case AudioOutput::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case ApplicationLauncher::Id: {
        switch (path.mAttributeId)
        {
        case ApplicationLauncher::Attributes::CatalogList::Id: {
            chip::app::DataModel::DecodableList<uint16_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("CatalogList", 1, value);
        }
        case ApplicationLauncher::Attributes::CurrentApp::Id: {
            chip::app::DataModel::Nullable<chip::app::Clusters::ApplicationLauncher::Structs::ApplicationEPStruct::DecodableType>
                value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("CurrentApp", 1, value);
        }
        case ApplicationLauncher::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case ApplicationLauncher::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case ApplicationLauncher::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case ApplicationLauncher::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case ApplicationLauncher::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case ApplicationLauncher::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case ApplicationBasic::Id: {
        switch (path.mAttributeId)
        {
        case ApplicationBasic::Attributes::VendorName::Id: {
            chip::CharSpan value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("VendorName", 1, value);
        }
        case ApplicationBasic::Attributes::VendorID::Id: {
            chip::VendorId value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("VendorID", 1, value);
        }
        case ApplicationBasic::Attributes::ApplicationName::Id: {
            chip::CharSpan value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ApplicationName", 1, value);
        }
        case ApplicationBasic::Attributes::ProductID::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ProductID", 1, value);
        }
        case ApplicationBasic::Attributes::Application::Id: {
            chip::app::Clusters::ApplicationBasic::Structs::ApplicationStruct::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Application", 1, value);
        }
        case ApplicationBasic::Attributes::Status::Id: {
            chip::app::Clusters::ApplicationBasic::ApplicationStatusEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Status", 1, value);
        }
        case ApplicationBasic::Attributes::ApplicationVersion::Id: {
            chip::CharSpan value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ApplicationVersion", 1, value);
        }
        case ApplicationBasic::Attributes::AllowedVendorList::Id: {
            chip::app::DataModel::DecodableList<chip::VendorId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AllowedVendorList", 1, value);
        }
        case ApplicationBasic::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case ApplicationBasic::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case ApplicationBasic::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case ApplicationBasic::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case ApplicationBasic::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case ApplicationBasic::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case AccountLogin::Id: {
        switch (path.mAttributeId)
        {
        case AccountLogin::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case AccountLogin::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case AccountLogin::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case AccountLogin::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case AccountLogin::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case AccountLogin::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case ElectricalMeasurement::Id: {
        switch (path.mAttributeId)
        {
        case ElectricalMeasurement::Attributes::MeasurementType::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("measurement type", 1, value);
        }
        case ElectricalMeasurement::Attributes::DcVoltage::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("dc voltage", 1, value);
        }
        case ElectricalMeasurement::Attributes::DcVoltageMin::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("dc voltage min", 1, value);
        }
        case ElectricalMeasurement::Attributes::DcVoltageMax::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("dc voltage max", 1, value);
        }
        case ElectricalMeasurement::Attributes::DcCurrent::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("dc current", 1, value);
        }
        case ElectricalMeasurement::Attributes::DcCurrentMin::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("dc current min", 1, value);
        }
        case ElectricalMeasurement::Attributes::DcCurrentMax::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("dc current max", 1, value);
        }
        case ElectricalMeasurement::Attributes::DcPower::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("dc power", 1, value);
        }
        case ElectricalMeasurement::Attributes::DcPowerMin::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("dc power min", 1, value);
        }
        case ElectricalMeasurement::Attributes::DcPowerMax::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("dc power max", 1, value);
        }
        case ElectricalMeasurement::Attributes::DcVoltageMultiplier::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("dc voltage multiplier", 1, value);
        }
        case ElectricalMeasurement::Attributes::DcVoltageDivisor::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("dc voltage divisor", 1, value);
        }
        case ElectricalMeasurement::Attributes::DcCurrentMultiplier::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("dc current multiplier", 1, value);
        }
        case ElectricalMeasurement::Attributes::DcCurrentDivisor::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("dc current divisor", 1, value);
        }
        case ElectricalMeasurement::Attributes::DcPowerMultiplier::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("dc power multiplier", 1, value);
        }
        case ElectricalMeasurement::Attributes::DcPowerDivisor::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("dc power divisor", 1, value);
        }
        case ElectricalMeasurement::Attributes::AcFrequency::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ac frequency", 1, value);
        }
        case ElectricalMeasurement::Attributes::AcFrequencyMin::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ac frequency min", 1, value);
        }
        case ElectricalMeasurement::Attributes::AcFrequencyMax::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ac frequency max", 1, value);
        }
        case ElectricalMeasurement::Attributes::NeutralCurrent::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("neutral current", 1, value);
        }
        case ElectricalMeasurement::Attributes::TotalActivePower::Id: {
            int32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("total active power", 1, value);
        }
        case ElectricalMeasurement::Attributes::TotalReactivePower::Id: {
            int32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("total reactive power", 1, value);
        }
        case ElectricalMeasurement::Attributes::TotalApparentPower::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("total apparent power", 1, value);
        }
        case ElectricalMeasurement::Attributes::Measured1stHarmonicCurrent::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("measured 1st harmonic current", 1, value);
        }
        case ElectricalMeasurement::Attributes::Measured3rdHarmonicCurrent::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("measured 3rd harmonic current", 1, value);
        }
        case ElectricalMeasurement::Attributes::Measured5thHarmonicCurrent::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("measured 5th harmonic current", 1, value);
        }
        case ElectricalMeasurement::Attributes::Measured7thHarmonicCurrent::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("measured 7th harmonic current", 1, value);
        }
        case ElectricalMeasurement::Attributes::Measured9thHarmonicCurrent::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("measured 9th harmonic current", 1, value);
        }
        case ElectricalMeasurement::Attributes::Measured11thHarmonicCurrent::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("measured 11th harmonic current", 1, value);
        }
        case ElectricalMeasurement::Attributes::MeasuredPhase1stHarmonicCurrent::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("measured phase 1st harmonic current", 1, value);
        }
        case ElectricalMeasurement::Attributes::MeasuredPhase3rdHarmonicCurrent::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("measured phase 3rd harmonic current", 1, value);
        }
        case ElectricalMeasurement::Attributes::MeasuredPhase5thHarmonicCurrent::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("measured phase 5th harmonic current", 1, value);
        }
        case ElectricalMeasurement::Attributes::MeasuredPhase7thHarmonicCurrent::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("measured phase 7th harmonic current", 1, value);
        }
        case ElectricalMeasurement::Attributes::MeasuredPhase9thHarmonicCurrent::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("measured phase 9th harmonic current", 1, value);
        }
        case ElectricalMeasurement::Attributes::MeasuredPhase11thHarmonicCurrent::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("measured phase 11th harmonic current", 1, value);
        }
        case ElectricalMeasurement::Attributes::AcFrequencyMultiplier::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ac frequency multiplier", 1, value);
        }
        case ElectricalMeasurement::Attributes::AcFrequencyDivisor::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ac frequency divisor", 1, value);
        }
        case ElectricalMeasurement::Attributes::PowerMultiplier::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("power multiplier", 1, value);
        }
        case ElectricalMeasurement::Attributes::PowerDivisor::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("power divisor", 1, value);
        }
        case ElectricalMeasurement::Attributes::HarmonicCurrentMultiplier::Id: {
            int8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("harmonic current multiplier", 1, value);
        }
        case ElectricalMeasurement::Attributes::PhaseHarmonicCurrentMultiplier::Id: {
            int8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("phase harmonic current multiplier", 1, value);
        }
        case ElectricalMeasurement::Attributes::InstantaneousVoltage::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("instantaneous voltage", 1, value);
        }
        case ElectricalMeasurement::Attributes::InstantaneousLineCurrent::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("instantaneous line current", 1, value);
        }
        case ElectricalMeasurement::Attributes::InstantaneousActiveCurrent::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("instantaneous active current", 1, value);
        }
        case ElectricalMeasurement::Attributes::InstantaneousReactiveCurrent::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("instantaneous reactive current", 1, value);
        }
        case ElectricalMeasurement::Attributes::InstantaneousPower::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("instantaneous power", 1, value);
        }
        case ElectricalMeasurement::Attributes::RmsVoltage::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("rms voltage", 1, value);
        }
        case ElectricalMeasurement::Attributes::RmsVoltageMin::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("rms voltage min", 1, value);
        }
        case ElectricalMeasurement::Attributes::RmsVoltageMax::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("rms voltage max", 1, value);
        }
        case ElectricalMeasurement::Attributes::RmsCurrent::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("rms current", 1, value);
        }
        case ElectricalMeasurement::Attributes::RmsCurrentMin::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("rms current min", 1, value);
        }
        case ElectricalMeasurement::Attributes::RmsCurrentMax::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("rms current max", 1, value);
        }
        case ElectricalMeasurement::Attributes::ActivePower::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("active power", 1, value);
        }
        case ElectricalMeasurement::Attributes::ActivePowerMin::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("active power min", 1, value);
        }
        case ElectricalMeasurement::Attributes::ActivePowerMax::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("active power max", 1, value);
        }
        case ElectricalMeasurement::Attributes::ReactivePower::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("reactive power", 1, value);
        }
        case ElectricalMeasurement::Attributes::ApparentPower::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("apparent power", 1, value);
        }
        case ElectricalMeasurement::Attributes::PowerFactor::Id: {
            int8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("power factor", 1, value);
        }
        case ElectricalMeasurement::Attributes::AverageRmsVoltageMeasurementPeriod::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("average rms voltage measurement period", 1, value);
        }
        case ElectricalMeasurement::Attributes::AverageRmsUnderVoltageCounter::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("average rms under voltage counter", 1, value);
        }
        case ElectricalMeasurement::Attributes::RmsExtremeOverVoltagePeriod::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("rms extreme over voltage period", 1, value);
        }
        case ElectricalMeasurement::Attributes::RmsExtremeUnderVoltagePeriod::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("rms extreme under voltage period", 1, value);
        }
        case ElectricalMeasurement::Attributes::RmsVoltageSagPeriod::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("rms voltage sag period", 1, value);
        }
        case ElectricalMeasurement::Attributes::RmsVoltageSwellPeriod::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("rms voltage swell period", 1, value);
        }
        case ElectricalMeasurement::Attributes::AcVoltageMultiplier::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ac voltage multiplier", 1, value);
        }
        case ElectricalMeasurement::Attributes::AcVoltageDivisor::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ac voltage divisor", 1, value);
        }
        case ElectricalMeasurement::Attributes::AcCurrentMultiplier::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ac current multiplier", 1, value);
        }
        case ElectricalMeasurement::Attributes::AcCurrentDivisor::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ac current divisor", 1, value);
        }
        case ElectricalMeasurement::Attributes::AcPowerMultiplier::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ac power multiplier", 1, value);
        }
        case ElectricalMeasurement::Attributes::AcPowerDivisor::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ac power divisor", 1, value);
        }
        case ElectricalMeasurement::Attributes::OverloadAlarmsMask::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("overload alarms mask", 1, value);
        }
        case ElectricalMeasurement::Attributes::VoltageOverload::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("voltage overload", 1, value);
        }
        case ElectricalMeasurement::Attributes::CurrentOverload::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("current overload", 1, value);
        }
        case ElectricalMeasurement::Attributes::AcOverloadAlarmsMask::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ac overload alarms mask", 1, value);
        }
        case ElectricalMeasurement::Attributes::AcVoltageOverload::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ac voltage overload", 1, value);
        }
        case ElectricalMeasurement::Attributes::AcCurrentOverload::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ac current overload", 1, value);
        }
        case ElectricalMeasurement::Attributes::AcActivePowerOverload::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ac active power overload", 1, value);
        }
        case ElectricalMeasurement::Attributes::AcReactivePowerOverload::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ac reactive power overload", 1, value);
        }
        case ElectricalMeasurement::Attributes::AverageRmsOverVoltage::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("average rms over voltage", 1, value);
        }
        case ElectricalMeasurement::Attributes::AverageRmsUnderVoltage::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("average rms under voltage", 1, value);
        }
        case ElectricalMeasurement::Attributes::RmsExtremeOverVoltage::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("rms extreme over voltage", 1, value);
        }
        case ElectricalMeasurement::Attributes::RmsExtremeUnderVoltage::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("rms extreme under voltage", 1, value);
        }
        case ElectricalMeasurement::Attributes::RmsVoltageSag::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("rms voltage sag", 1, value);
        }
        case ElectricalMeasurement::Attributes::RmsVoltageSwell::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("rms voltage swell", 1, value);
        }
        case ElectricalMeasurement::Attributes::LineCurrentPhaseB::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("line current phase b", 1, value);
        }
        case ElectricalMeasurement::Attributes::ActiveCurrentPhaseB::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("active current phase b", 1, value);
        }
        case ElectricalMeasurement::Attributes::ReactiveCurrentPhaseB::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("reactive current phase b", 1, value);
        }
        case ElectricalMeasurement::Attributes::RmsVoltagePhaseB::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("rms voltage phase b", 1, value);
        }
        case ElectricalMeasurement::Attributes::RmsVoltageMinPhaseB::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("rms voltage min phase b", 1, value);
        }
        case ElectricalMeasurement::Attributes::RmsVoltageMaxPhaseB::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("rms voltage max phase b", 1, value);
        }
        case ElectricalMeasurement::Attributes::RmsCurrentPhaseB::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("rms current phase b", 1, value);
        }
        case ElectricalMeasurement::Attributes::RmsCurrentMinPhaseB::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("rms current min phase b", 1, value);
        }
        case ElectricalMeasurement::Attributes::RmsCurrentMaxPhaseB::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("rms current max phase b", 1, value);
        }
        case ElectricalMeasurement::Attributes::ActivePowerPhaseB::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("active power phase b", 1, value);
        }
        case ElectricalMeasurement::Attributes::ActivePowerMinPhaseB::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("active power min phase b", 1, value);
        }
        case ElectricalMeasurement::Attributes::ActivePowerMaxPhaseB::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("active power max phase b", 1, value);
        }
        case ElectricalMeasurement::Attributes::ReactivePowerPhaseB::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("reactive power phase b", 1, value);
        }
        case ElectricalMeasurement::Attributes::ApparentPowerPhaseB::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("apparent power phase b", 1, value);
        }
        case ElectricalMeasurement::Attributes::PowerFactorPhaseB::Id: {
            int8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("power factor phase b", 1, value);
        }
        case ElectricalMeasurement::Attributes::AverageRmsVoltageMeasurementPeriodPhaseB::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("average rms voltage measurement period phase b", 1, value);
        }
        case ElectricalMeasurement::Attributes::AverageRmsOverVoltageCounterPhaseB::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("average rms over voltage counter phase b", 1, value);
        }
        case ElectricalMeasurement::Attributes::AverageRmsUnderVoltageCounterPhaseB::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("average rms under voltage counter phase b", 1, value);
        }
        case ElectricalMeasurement::Attributes::RmsExtremeOverVoltagePeriodPhaseB::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("rms extreme over voltage period phase b", 1, value);
        }
        case ElectricalMeasurement::Attributes::RmsExtremeUnderVoltagePeriodPhaseB::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("rms extreme under voltage period phase b", 1, value);
        }
        case ElectricalMeasurement::Attributes::RmsVoltageSagPeriodPhaseB::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("rms voltage sag period phase b", 1, value);
        }
        case ElectricalMeasurement::Attributes::RmsVoltageSwellPeriodPhaseB::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("rms voltage swell period phase b", 1, value);
        }
        case ElectricalMeasurement::Attributes::LineCurrentPhaseC::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("line current phase c", 1, value);
        }
        case ElectricalMeasurement::Attributes::ActiveCurrentPhaseC::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("active current phase c", 1, value);
        }
        case ElectricalMeasurement::Attributes::ReactiveCurrentPhaseC::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("reactive current phase c", 1, value);
        }
        case ElectricalMeasurement::Attributes::RmsVoltagePhaseC::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("rms voltage phase c", 1, value);
        }
        case ElectricalMeasurement::Attributes::RmsVoltageMinPhaseC::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("rms voltage min phase c", 1, value);
        }
        case ElectricalMeasurement::Attributes::RmsVoltageMaxPhaseC::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("rms voltage max phase c", 1, value);
        }
        case ElectricalMeasurement::Attributes::RmsCurrentPhaseC::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("rms current phase c", 1, value);
        }
        case ElectricalMeasurement::Attributes::RmsCurrentMinPhaseC::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("rms current min phase c", 1, value);
        }
        case ElectricalMeasurement::Attributes::RmsCurrentMaxPhaseC::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("rms current max phase c", 1, value);
        }
        case ElectricalMeasurement::Attributes::ActivePowerPhaseC::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("active power phase c", 1, value);
        }
        case ElectricalMeasurement::Attributes::ActivePowerMinPhaseC::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("active power min phase c", 1, value);
        }
        case ElectricalMeasurement::Attributes::ActivePowerMaxPhaseC::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("active power max phase c", 1, value);
        }
        case ElectricalMeasurement::Attributes::ReactivePowerPhaseC::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("reactive power phase c", 1, value);
        }
        case ElectricalMeasurement::Attributes::ApparentPowerPhaseC::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("apparent power phase c", 1, value);
        }
        case ElectricalMeasurement::Attributes::PowerFactorPhaseC::Id: {
            int8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("power factor phase c", 1, value);
        }
        case ElectricalMeasurement::Attributes::AverageRmsVoltageMeasurementPeriodPhaseC::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("average rms voltage measurement period phase c", 1, value);
        }
        case ElectricalMeasurement::Attributes::AverageRmsOverVoltageCounterPhaseC::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("average rms over voltage counter phase c", 1, value);
        }
        case ElectricalMeasurement::Attributes::AverageRmsUnderVoltageCounterPhaseC::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("average rms under voltage counter phase c", 1, value);
        }
        case ElectricalMeasurement::Attributes::RmsExtremeOverVoltagePeriodPhaseC::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("rms extreme over voltage period phase c", 1, value);
        }
        case ElectricalMeasurement::Attributes::RmsExtremeUnderVoltagePeriodPhaseC::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("rms extreme under voltage period phase c", 1, value);
        }
        case ElectricalMeasurement::Attributes::RmsVoltageSagPeriodPhaseC::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("rms voltage sag period phase c", 1, value);
        }
        case ElectricalMeasurement::Attributes::RmsVoltageSwellPeriodPhaseC::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("rms voltage swell period phase c", 1, value);
        }
        case ElectricalMeasurement::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case ElectricalMeasurement::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case ElectricalMeasurement::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case ElectricalMeasurement::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case ElectricalMeasurement::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case ElectricalMeasurement::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case UnitTesting::Id: {
        switch (path.mAttributeId)
        {
        case UnitTesting::Attributes::Boolean::Id: {
            bool value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("boolean", 1, value);
        }
        case UnitTesting::Attributes::Bitmap8::Id: {
            chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap8MaskMap> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("bitmap8", 1, value);
        }
        case UnitTesting::Attributes::Bitmap16::Id: {
            chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap16MaskMap> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("bitmap16", 1, value);
        }
        case UnitTesting::Attributes::Bitmap32::Id: {
            chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("bitmap32", 1, value);
        }
        case UnitTesting::Attributes::Bitmap64::Id: {
            chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap64MaskMap> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("bitmap64", 1, value);
        }
        case UnitTesting::Attributes::Int8u::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("int8u", 1, value);
        }
        case UnitTesting::Attributes::Int16u::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("int16u", 1, value);
        }
        case UnitTesting::Attributes::Int24u::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("int24u", 1, value);
        }
        case UnitTesting::Attributes::Int32u::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("int32u", 1, value);
        }
        case UnitTesting::Attributes::Int40u::Id: {
            uint64_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("int40u", 1, value);
        }
        case UnitTesting::Attributes::Int48u::Id: {
            uint64_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("int48u", 1, value);
        }
        case UnitTesting::Attributes::Int56u::Id: {
            uint64_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("int56u", 1, value);
        }
        case UnitTesting::Attributes::Int64u::Id: {
            uint64_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("int64u", 1, value);
        }
        case UnitTesting::Attributes::Int8s::Id: {
            int8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("int8s", 1, value);
        }
        case UnitTesting::Attributes::Int16s::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("int16s", 1, value);
        }
        case UnitTesting::Attributes::Int24s::Id: {
            int32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("int24s", 1, value);
        }
        case UnitTesting::Attributes::Int32s::Id: {
            int32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("int32s", 1, value);
        }
        case UnitTesting::Attributes::Int40s::Id: {
            int64_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("int40s", 1, value);
        }
        case UnitTesting::Attributes::Int48s::Id: {
            int64_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("int48s", 1, value);
        }
        case UnitTesting::Attributes::Int56s::Id: {
            int64_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("int56s", 1, value);
        }
        case UnitTesting::Attributes::Int64s::Id: {
            int64_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("int64s", 1, value);
        }
        case UnitTesting::Attributes::Enum8::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("enum8", 1, value);
        }
        case UnitTesting::Attributes::Enum16::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("enum16", 1, value);
        }
        case UnitTesting::Attributes::FloatSingle::Id: {
            float value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("float_single", 1, value);
        }
        case UnitTesting::Attributes::FloatDouble::Id: {
            double value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("float_double", 1, value);
        }
        case UnitTesting::Attributes::OctetString::Id: {
            chip::ByteSpan value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("octet_string", 1, value);
        }
        case UnitTesting::Attributes::ListInt8u::Id: {
            chip::app::DataModel::DecodableList<uint8_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("list_int8u", 1, value);
        }
        case UnitTesting::Attributes::ListOctetString::Id: {
            chip::app::DataModel::DecodableList<chip::ByteSpan> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("list_octet_string", 1, value);
        }
        case UnitTesting::Attributes::ListStructOctetString::Id: {
            chip::app::DataModel::DecodableList<chip::app::Clusters::UnitTesting::Structs::TestListStructOctet::DecodableType>
                value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("list_struct_octet_string", 1, value);
        }
        case UnitTesting::Attributes::LongOctetString::Id: {
            chip::ByteSpan value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("long_octet_string", 1, value);
        }
        case UnitTesting::Attributes::CharString::Id: {
            chip::CharSpan value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("char_string", 1, value);
        }
        case UnitTesting::Attributes::LongCharString::Id: {
            chip::CharSpan value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("long_char_string", 1, value);
        }
        case UnitTesting::Attributes::EpochUs::Id: {
            uint64_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("epoch_us", 1, value);
        }
        case UnitTesting::Attributes::EpochS::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("epoch_s", 1, value);
        }
        case UnitTesting::Attributes::VendorId::Id: {
            chip::VendorId value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("vendor_id", 1, value);
        }
        case UnitTesting::Attributes::ListNullablesAndOptionalsStruct::Id: {
            chip::app::DataModel::DecodableList<
                chip::app::Clusters::UnitTesting::Structs::NullablesAndOptionalsStruct::DecodableType>
                value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("list_nullables_and_optionals_struct", 1, value);
        }
        case UnitTesting::Attributes::EnumAttr::Id: {
            chip::app::Clusters::UnitTesting::SimpleEnum value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("enum_attr", 1, value);
        }
        case UnitTesting::Attributes::StructAttr::Id: {
            chip::app::Clusters::UnitTesting::Structs::SimpleStruct::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("struct_attr", 1, value);
        }
        case UnitTesting::Attributes::RangeRestrictedInt8u::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("range_restricted_int8u", 1, value);
        }
        case UnitTesting::Attributes::RangeRestrictedInt8s::Id: {
            int8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("range_restricted_int8s", 1, value);
        }
        case UnitTesting::Attributes::RangeRestrictedInt16u::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("range_restricted_int16u", 1, value);
        }
        case UnitTesting::Attributes::RangeRestrictedInt16s::Id: {
            int16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("range_restricted_int16s", 1, value);
        }
        case UnitTesting::Attributes::ListLongOctetString::Id: {
            chip::app::DataModel::DecodableList<chip::ByteSpan> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("list_long_octet_string", 1, value);
        }
        case UnitTesting::Attributes::ListFabricScoped::Id: {
            chip::app::DataModel::DecodableList<chip::app::Clusters::UnitTesting::Structs::TestFabricScoped::DecodableType> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("list_fabric_scoped", 1, value);
        }
        case UnitTesting::Attributes::TimedWriteBoolean::Id: {
            bool value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("timed_write_boolean", 1, value);
        }
        case UnitTesting::Attributes::GeneralErrorBoolean::Id: {
            bool value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("general_error_boolean", 1, value);
        }
        case UnitTesting::Attributes::ClusterErrorBoolean::Id: {
            bool value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("cluster_error_boolean", 1, value);
        }
        case UnitTesting::Attributes::Unsupported::Id: {
            bool value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("unsupported", 1, value);
        }
        case UnitTesting::Attributes::NullableBoolean::Id: {
            chip::app::DataModel::Nullable<bool> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("nullable_boolean", 1, value);
        }
        case UnitTesting::Attributes::NullableBitmap8::Id: {
            chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap8MaskMap>> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("nullable_bitmap8", 1, value);
        }
        case UnitTesting::Attributes::NullableBitmap16::Id: {
            chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap16MaskMap>> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("nullable_bitmap16", 1, value);
        }
        case UnitTesting::Attributes::NullableBitmap32::Id: {
            chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap32MaskMap>> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("nullable_bitmap32", 1, value);
        }
        case UnitTesting::Attributes::NullableBitmap64::Id: {
            chip::app::DataModel::Nullable<chip::BitMask<chip::app::Clusters::UnitTesting::Bitmap64MaskMap>> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("nullable_bitmap64", 1, value);
        }
        case UnitTesting::Attributes::NullableInt8u::Id: {
            chip::app::DataModel::Nullable<uint8_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("nullable_int8u", 1, value);
        }
        case UnitTesting::Attributes::NullableInt16u::Id: {
            chip::app::DataModel::Nullable<uint16_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("nullable_int16u", 1, value);
        }
        case UnitTesting::Attributes::NullableInt24u::Id: {
            chip::app::DataModel::Nullable<uint32_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("nullable_int24u", 1, value);
        }
        case UnitTesting::Attributes::NullableInt32u::Id: {
            chip::app::DataModel::Nullable<uint32_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("nullable_int32u", 1, value);
        }
        case UnitTesting::Attributes::NullableInt40u::Id: {
            chip::app::DataModel::Nullable<uint64_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("nullable_int40u", 1, value);
        }
        case UnitTesting::Attributes::NullableInt48u::Id: {
            chip::app::DataModel::Nullable<uint64_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("nullable_int48u", 1, value);
        }
        case UnitTesting::Attributes::NullableInt56u::Id: {
            chip::app::DataModel::Nullable<uint64_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("nullable_int56u", 1, value);
        }
        case UnitTesting::Attributes::NullableInt64u::Id: {
            chip::app::DataModel::Nullable<uint64_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("nullable_int64u", 1, value);
        }
        case UnitTesting::Attributes::NullableInt8s::Id: {
            chip::app::DataModel::Nullable<int8_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("nullable_int8s", 1, value);
        }
        case UnitTesting::Attributes::NullableInt16s::Id: {
            chip::app::DataModel::Nullable<int16_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("nullable_int16s", 1, value);
        }
        case UnitTesting::Attributes::NullableInt24s::Id: {
            chip::app::DataModel::Nullable<int32_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("nullable_int24s", 1, value);
        }
        case UnitTesting::Attributes::NullableInt32s::Id: {
            chip::app::DataModel::Nullable<int32_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("nullable_int32s", 1, value);
        }
        case UnitTesting::Attributes::NullableInt40s::Id: {
            chip::app::DataModel::Nullable<int64_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("nullable_int40s", 1, value);
        }
        case UnitTesting::Attributes::NullableInt48s::Id: {
            chip::app::DataModel::Nullable<int64_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("nullable_int48s", 1, value);
        }
        case UnitTesting::Attributes::NullableInt56s::Id: {
            chip::app::DataModel::Nullable<int64_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("nullable_int56s", 1, value);
        }
        case UnitTesting::Attributes::NullableInt64s::Id: {
            chip::app::DataModel::Nullable<int64_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("nullable_int64s", 1, value);
        }
        case UnitTesting::Attributes::NullableEnum8::Id: {
            chip::app::DataModel::Nullable<uint8_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("nullable_enum8", 1, value);
        }
        case UnitTesting::Attributes::NullableEnum16::Id: {
            chip::app::DataModel::Nullable<uint16_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("nullable_enum16", 1, value);
        }
        case UnitTesting::Attributes::NullableFloatSingle::Id: {
            chip::app::DataModel::Nullable<float> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("nullable_float_single", 1, value);
        }
        case UnitTesting::Attributes::NullableFloatDouble::Id: {
            chip::app::DataModel::Nullable<double> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("nullable_float_double", 1, value);
        }
        case UnitTesting::Attributes::NullableOctetString::Id: {
            chip::app::DataModel::Nullable<chip::ByteSpan> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("nullable_octet_string", 1, value);
        }
        case UnitTesting::Attributes::NullableCharString::Id: {
            chip::app::DataModel::Nullable<chip::CharSpan> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("nullable_char_string", 1, value);
        }
        case UnitTesting::Attributes::NullableEnumAttr::Id: {
            chip::app::DataModel::Nullable<chip::app::Clusters::UnitTesting::SimpleEnum> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("nullable_enum_attr", 1, value);
        }
        case UnitTesting::Attributes::NullableStruct::Id: {
            chip::app::DataModel::Nullable<chip::app::Clusters::UnitTesting::Structs::SimpleStruct::DecodableType> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("nullable_struct", 1, value);
        }
        case UnitTesting::Attributes::NullableRangeRestrictedInt8u::Id: {
            chip::app::DataModel::Nullable<uint8_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("nullable_range_restricted_int8u", 1, value);
        }
        case UnitTesting::Attributes::NullableRangeRestrictedInt8s::Id: {
            chip::app::DataModel::Nullable<int8_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("nullable_range_restricted_int8s", 1, value);
        }
        case UnitTesting::Attributes::NullableRangeRestrictedInt16u::Id: {
            chip::app::DataModel::Nullable<uint16_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("nullable_range_restricted_int16u", 1, value);
        }
        case UnitTesting::Attributes::NullableRangeRestrictedInt16s::Id: {
            chip::app::DataModel::Nullable<int16_t> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("nullable_range_restricted_int16s", 1, value);
        }
        case UnitTesting::Attributes::WriteOnlyInt8u::Id: {
            uint8_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("write_only_int8u", 1, value);
        }
        case UnitTesting::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case UnitTesting::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case UnitTesting::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case UnitTesting::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case UnitTesting::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case UnitTesting::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    case FaultInjection::Id: {
        switch (path.mAttributeId)
        {
        case FaultInjection::Attributes::GeneratedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneratedCommandList", 1, value);
        }
        case FaultInjection::Attributes::AcceptedCommandList::Id: {
            chip::app::DataModel::DecodableList<chip::CommandId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AcceptedCommandList", 1, value);
        }
        case FaultInjection::Attributes::EventList::Id: {
            chip::app::DataModel::DecodableList<chip::EventId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EventList", 1, value);
        }
        case FaultInjection::Attributes::AttributeList::Id: {
            chip::app::DataModel::DecodableList<chip::AttributeId> value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttributeList", 1, value);
        }
        case FaultInjection::Attributes::FeatureMap::Id: {
            uint32_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("FeatureMap", 1, value);
        }
        case FaultInjection::Attributes::ClusterRevision::Id: {
            uint16_t value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ClusterRevision", 1, value);
        }
        }
        break;
    }
    default:
        break;
    }
    ChipLogProgress(chipTool, "  Don't know how to log atribute value");
    return CHIP_NO_ERROR;
}

CHIP_ERROR DataModelLogger::LogCommand(const chip::app::ConcreteCommandPath & path, chip::TLV::TLVReader * data)
{
    ChipLogProgress(chipTool, "Endpoint: %u Cluster: " ChipLogFormatMEI " Command " ChipLogFormatMEI, path.mEndpointId,
                    ChipLogValueMEI(path.mClusterId), ChipLogValueMEI(path.mCommandId));

    switch (path.mClusterId)
    {
    case Groups::Id: {
        switch (path.mCommandId)
        {
        case Groups::Commands::AddGroupResponse::Id: {
            Groups::Commands::AddGroupResponse::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AddGroupResponse", 1, value);
        }
        case Groups::Commands::ViewGroupResponse::Id: {
            Groups::Commands::ViewGroupResponse::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ViewGroupResponse", 1, value);
        }
        case Groups::Commands::GetGroupMembershipResponse::Id: {
            Groups::Commands::GetGroupMembershipResponse::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GetGroupMembershipResponse", 1, value);
        }
        case Groups::Commands::RemoveGroupResponse::Id: {
            Groups::Commands::RemoveGroupResponse::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("RemoveGroupResponse", 1, value);
        }
        }
        break;
    }
    case Scenes::Id: {
        switch (path.mCommandId)
        {
        case Scenes::Commands::AddSceneResponse::Id: {
            Scenes::Commands::AddSceneResponse::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AddSceneResponse", 1, value);
        }
        case Scenes::Commands::ViewSceneResponse::Id: {
            Scenes::Commands::ViewSceneResponse::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ViewSceneResponse", 1, value);
        }
        case Scenes::Commands::RemoveSceneResponse::Id: {
            Scenes::Commands::RemoveSceneResponse::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("RemoveSceneResponse", 1, value);
        }
        case Scenes::Commands::RemoveAllScenesResponse::Id: {
            Scenes::Commands::RemoveAllScenesResponse::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("RemoveAllScenesResponse", 1, value);
        }
        case Scenes::Commands::StoreSceneResponse::Id: {
            Scenes::Commands::StoreSceneResponse::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("StoreSceneResponse", 1, value);
        }
        case Scenes::Commands::GetSceneMembershipResponse::Id: {
            Scenes::Commands::GetSceneMembershipResponse::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GetSceneMembershipResponse", 1, value);
        }
        case Scenes::Commands::EnhancedAddSceneResponse::Id: {
            Scenes::Commands::EnhancedAddSceneResponse::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EnhancedAddSceneResponse", 1, value);
        }
        case Scenes::Commands::EnhancedViewSceneResponse::Id: {
            Scenes::Commands::EnhancedViewSceneResponse::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EnhancedViewSceneResponse", 1, value);
        }
        case Scenes::Commands::CopySceneResponse::Id: {
            Scenes::Commands::CopySceneResponse::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("CopySceneResponse", 1, value);
        }
        }
        break;
    }
    case OtaSoftwareUpdateProvider::Id: {
        switch (path.mCommandId)
        {
        case OtaSoftwareUpdateProvider::Commands::QueryImageResponse::Id: {
            OtaSoftwareUpdateProvider::Commands::QueryImageResponse::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("QueryImageResponse", 1, value);
        }
        case OtaSoftwareUpdateProvider::Commands::ApplyUpdateResponse::Id: {
            OtaSoftwareUpdateProvider::Commands::ApplyUpdateResponse::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ApplyUpdateResponse", 1, value);
        }
        }
        break;
    }
    case GeneralCommissioning::Id: {
        switch (path.mCommandId)
        {
        case GeneralCommissioning::Commands::ArmFailSafeResponse::Id: {
            GeneralCommissioning::Commands::ArmFailSafeResponse::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ArmFailSafeResponse", 1, value);
        }
        case GeneralCommissioning::Commands::SetRegulatoryConfigResponse::Id: {
            GeneralCommissioning::Commands::SetRegulatoryConfigResponse::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("SetRegulatoryConfigResponse", 1, value);
        }
        case GeneralCommissioning::Commands::CommissioningCompleteResponse::Id: {
            GeneralCommissioning::Commands::CommissioningCompleteResponse::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("CommissioningCompleteResponse", 1, value);
        }
        }
        break;
    }
    case NetworkCommissioning::Id: {
        switch (path.mCommandId)
        {
        case NetworkCommissioning::Commands::ScanNetworksResponse::Id: {
            NetworkCommissioning::Commands::ScanNetworksResponse::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ScanNetworksResponse", 1, value);
        }
        case NetworkCommissioning::Commands::NetworkConfigResponse::Id: {
            NetworkCommissioning::Commands::NetworkConfigResponse::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("NetworkConfigResponse", 1, value);
        }
        case NetworkCommissioning::Commands::ConnectNetworkResponse::Id: {
            NetworkCommissioning::Commands::ConnectNetworkResponse::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ConnectNetworkResponse", 1, value);
        }
        }
        break;
    }
    case DiagnosticLogs::Id: {
        switch (path.mCommandId)
        {
        case DiagnosticLogs::Commands::RetrieveLogsResponse::Id: {
            DiagnosticLogs::Commands::RetrieveLogsResponse::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("RetrieveLogsResponse", 1, value);
        }
        }
        break;
    }
    case TimeSynchronization::Id: {
        switch (path.mCommandId)
        {
        case TimeSynchronization::Commands::SetTimeZoneResponse::Id: {
            TimeSynchronization::Commands::SetTimeZoneResponse::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("SetTimeZoneResponse", 1, value);
        }
        }
        break;
    }
    case OperationalCredentials::Id: {
        switch (path.mCommandId)
        {
        case OperationalCredentials::Commands::AttestationResponse::Id: {
            OperationalCredentials::Commands::AttestationResponse::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AttestationResponse", 1, value);
        }
        case OperationalCredentials::Commands::CertificateChainResponse::Id: {
            OperationalCredentials::Commands::CertificateChainResponse::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("CertificateChainResponse", 1, value);
        }
        case OperationalCredentials::Commands::CSRResponse::Id: {
            OperationalCredentials::Commands::CSRResponse::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("CSRResponse", 1, value);
        }
        case OperationalCredentials::Commands::NOCResponse::Id: {
            OperationalCredentials::Commands::NOCResponse::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("NOCResponse", 1, value);
        }
        }
        break;
    }
    case GroupKeyManagement::Id: {
        switch (path.mCommandId)
        {
        case GroupKeyManagement::Commands::KeySetReadResponse::Id: {
            GroupKeyManagement::Commands::KeySetReadResponse::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("KeySetReadResponse", 1, value);
        }
        case GroupKeyManagement::Commands::KeySetReadAllIndicesResponse::Id: {
            GroupKeyManagement::Commands::KeySetReadAllIndicesResponse::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("KeySetReadAllIndicesResponse", 1, value);
        }
        }
        break;
    }
    case IcdManagement::Id: {
        switch (path.mCommandId)
        {
        case IcdManagement::Commands::RegisterClientResponse::Id: {
            IcdManagement::Commands::RegisterClientResponse::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("RegisterClientResponse", 1, value);
        }
        }
        break;
    }
    case OperationalState::Id: {
        switch (path.mCommandId)
        {
        case OperationalState::Commands::OperationalCommandResponse::Id: {
            OperationalState::Commands::OperationalCommandResponse::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("OperationalCommandResponse", 1, value);
        }
        }
        break;
    }
    case DoorLock::Id: {
        switch (path.mCommandId)
        {
        case DoorLock::Commands::GetWeekDayScheduleResponse::Id: {
            DoorLock::Commands::GetWeekDayScheduleResponse::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GetWeekDayScheduleResponse", 1, value);
        }
        case DoorLock::Commands::GetYearDayScheduleResponse::Id: {
            DoorLock::Commands::GetYearDayScheduleResponse::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GetYearDayScheduleResponse", 1, value);
        }
        case DoorLock::Commands::GetHolidayScheduleResponse::Id: {
            DoorLock::Commands::GetHolidayScheduleResponse::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GetHolidayScheduleResponse", 1, value);
        }
        case DoorLock::Commands::GetUserResponse::Id: {
            DoorLock::Commands::GetUserResponse::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GetUserResponse", 1, value);
        }
        case DoorLock::Commands::SetCredentialResponse::Id: {
            DoorLock::Commands::SetCredentialResponse::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("SetCredentialResponse", 1, value);
        }
        case DoorLock::Commands::GetCredentialStatusResponse::Id: {
            DoorLock::Commands::GetCredentialStatusResponse::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GetCredentialStatusResponse", 1, value);
        }
        }
        break;
    }
    case Thermostat::Id: {
        switch (path.mCommandId)
        {
        case Thermostat::Commands::GetWeeklyScheduleResponse::Id: {
            Thermostat::Commands::GetWeeklyScheduleResponse::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GetWeeklyScheduleResponse", 1, value);
        }
        }
        break;
    }
    case Channel::Id: {
        switch (path.mCommandId)
        {
        case Channel::Commands::ChangeChannelResponse::Id: {
            Channel::Commands::ChangeChannelResponse::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ChangeChannelResponse", 1, value);
        }
        }
        break;
    }
    case TargetNavigator::Id: {
        switch (path.mCommandId)
        {
        case TargetNavigator::Commands::NavigateTargetResponse::Id: {
            TargetNavigator::Commands::NavigateTargetResponse::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("NavigateTargetResponse", 1, value);
        }
        }
        break;
    }
    case MediaPlayback::Id: {
        switch (path.mCommandId)
        {
        case MediaPlayback::Commands::PlaybackResponse::Id: {
            MediaPlayback::Commands::PlaybackResponse::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PlaybackResponse", 1, value);
        }
        }
        break;
    }
    case KeypadInput::Id: {
        switch (path.mCommandId)
        {
        case KeypadInput::Commands::SendKeyResponse::Id: {
            KeypadInput::Commands::SendKeyResponse::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("SendKeyResponse", 1, value);
        }
        }
        break;
    }
    case ContentLauncher::Id: {
        switch (path.mCommandId)
        {
        case ContentLauncher::Commands::LauncherResponse::Id: {
            ContentLauncher::Commands::LauncherResponse::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LauncherResponse", 1, value);
        }
        }
        break;
    }
    case ApplicationLauncher::Id: {
        switch (path.mCommandId)
        {
        case ApplicationLauncher::Commands::LauncherResponse::Id: {
            ApplicationLauncher::Commands::LauncherResponse::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LauncherResponse", 1, value);
        }
        }
        break;
    }
    case AccountLogin::Id: {
        switch (path.mCommandId)
        {
        case AccountLogin::Commands::GetSetupPINResponse::Id: {
            AccountLogin::Commands::GetSetupPINResponse::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GetSetupPINResponse", 1, value);
        }
        }
        break;
    }
    case ElectricalMeasurement::Id: {
        switch (path.mCommandId)
        {
        case ElectricalMeasurement::Commands::GetProfileInfoResponseCommand::Id: {
            ElectricalMeasurement::Commands::GetProfileInfoResponseCommand::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GetProfileInfoResponseCommand", 1, value);
        }
        case ElectricalMeasurement::Commands::GetMeasurementProfileResponseCommand::Id: {
            ElectricalMeasurement::Commands::GetMeasurementProfileResponseCommand::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GetMeasurementProfileResponseCommand", 1, value);
        }
        }
        break;
    }
    case UnitTesting::Id: {
        switch (path.mCommandId)
        {
        case UnitTesting::Commands::TestSpecificResponse::Id: {
            UnitTesting::Commands::TestSpecificResponse::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("TestSpecificResponse", 1, value);
        }
        case UnitTesting::Commands::TestAddArgumentsResponse::Id: {
            UnitTesting::Commands::TestAddArgumentsResponse::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("TestAddArgumentsResponse", 1, value);
        }
        case UnitTesting::Commands::TestSimpleArgumentResponse::Id: {
            UnitTesting::Commands::TestSimpleArgumentResponse::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("TestSimpleArgumentResponse", 1, value);
        }
        case UnitTesting::Commands::TestStructArrayArgumentResponse::Id: {
            UnitTesting::Commands::TestStructArrayArgumentResponse::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("TestStructArrayArgumentResponse", 1, value);
        }
        case UnitTesting::Commands::TestListInt8UReverseResponse::Id: {
            UnitTesting::Commands::TestListInt8UReverseResponse::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("TestListInt8UReverseResponse", 1, value);
        }
        case UnitTesting::Commands::TestEnumsResponse::Id: {
            UnitTesting::Commands::TestEnumsResponse::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("TestEnumsResponse", 1, value);
        }
        case UnitTesting::Commands::TestNullableOptionalResponse::Id: {
            UnitTesting::Commands::TestNullableOptionalResponse::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("TestNullableOptionalResponse", 1, value);
        }
        case UnitTesting::Commands::TestComplexNullableOptionalResponse::Id: {
            UnitTesting::Commands::TestComplexNullableOptionalResponse::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("TestComplexNullableOptionalResponse", 1, value);
        }
        case UnitTesting::Commands::BooleanResponse::Id: {
            UnitTesting::Commands::BooleanResponse::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("BooleanResponse", 1, value);
        }
        case UnitTesting::Commands::SimpleStructResponse::Id: {
            UnitTesting::Commands::SimpleStructResponse::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("SimpleStructResponse", 1, value);
        }
        case UnitTesting::Commands::TestEmitTestEventResponse::Id: {
            UnitTesting::Commands::TestEmitTestEventResponse::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("TestEmitTestEventResponse", 1, value);
        }
        case UnitTesting::Commands::TestEmitTestFabricScopedEventResponse::Id: {
            UnitTesting::Commands::TestEmitTestFabricScopedEventResponse::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("TestEmitTestFabricScopedEventResponse", 1, value);
        }
        }
        break;
    }
    default:
        break;
    }
    ChipLogProgress(chipTool, "  Don't know how to log command response data");
    return CHIP_NO_ERROR;
}

CHIP_ERROR DataModelLogger::LogEvent(const chip::app::EventHeader & header, chip::TLV::TLVReader * data)
{
    ChipLogProgress(chipTool, "Endpoint: %u Cluster: " ChipLogFormatMEI " Event " ChipLogFormatMEI, header.mPath.mEndpointId,
                    ChipLogValueMEI(header.mPath.mClusterId), ChipLogValueMEI(header.mPath.mEventId));

    ChipLogProgress(chipTool, "  Event number: %" PRIu64, header.mEventNumber);

    if (header.mPriorityLevel == chip::app::PriorityLevel::Info)
    {
        ChipLogProgress(chipTool, "  Priority: Info");
    }
    else if (header.mPriorityLevel == chip::app::PriorityLevel::Critical)
    {
        ChipLogProgress(chipTool, "  Priority: Critical");
    }
    else if (header.mPriorityLevel == chip::app::PriorityLevel::Debug)
    {
        ChipLogProgress(chipTool, "  Priority: Debug");
    }
    else
    {
        ChipLogProgress(chipTool, "  Priority: Unknown");
    }

    ChipLogProgress(chipTool, "  Timestamp: %" PRIu64, header.mTimestamp.mValue);

    switch (header.mPath.mClusterId)
    {
    case AccessControl::Id: {
        switch (header.mPath.mEventId)
        {
        case AccessControl::Events::AccessControlEntryChanged::Id: {
            chip::app::Clusters::AccessControl::Events::AccessControlEntryChanged::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AccessControlEntryChanged", 1, value);
        }
        case AccessControl::Events::AccessControlExtensionChanged::Id: {
            chip::app::Clusters::AccessControl::Events::AccessControlExtensionChanged::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AccessControlExtensionChanged", 1, value);
        }
        }
        break;
    }
    case Actions::Id: {
        switch (header.mPath.mEventId)
        {
        case Actions::Events::StateChanged::Id: {
            chip::app::Clusters::Actions::Events::StateChanged::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("StateChanged", 1, value);
        }
        case Actions::Events::ActionFailed::Id: {
            chip::app::Clusters::Actions::Events::ActionFailed::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ActionFailed", 1, value);
        }
        }
        break;
    }
    case BasicInformation::Id: {
        switch (header.mPath.mEventId)
        {
        case BasicInformation::Events::StartUp::Id: {
            chip::app::Clusters::BasicInformation::Events::StartUp::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("StartUp", 1, value);
        }
        case BasicInformation::Events::ShutDown::Id: {
            chip::app::Clusters::BasicInformation::Events::ShutDown::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ShutDown", 1, value);
        }
        case BasicInformation::Events::Leave::Id: {
            chip::app::Clusters::BasicInformation::Events::Leave::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Leave", 1, value);
        }
        case BasicInformation::Events::ReachableChanged::Id: {
            chip::app::Clusters::BasicInformation::Events::ReachableChanged::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ReachableChanged", 1, value);
        }
        }
        break;
    }
    case OtaSoftwareUpdateRequestor::Id: {
        switch (header.mPath.mEventId)
        {
        case OtaSoftwareUpdateRequestor::Events::StateTransition::Id: {
            chip::app::Clusters::OtaSoftwareUpdateRequestor::Events::StateTransition::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("StateTransition", 1, value);
        }
        case OtaSoftwareUpdateRequestor::Events::VersionApplied::Id: {
            chip::app::Clusters::OtaSoftwareUpdateRequestor::Events::VersionApplied::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("VersionApplied", 1, value);
        }
        case OtaSoftwareUpdateRequestor::Events::DownloadError::Id: {
            chip::app::Clusters::OtaSoftwareUpdateRequestor::Events::DownloadError::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("DownloadError", 1, value);
        }
        }
        break;
    }
    case PowerSource::Id: {
        switch (header.mPath.mEventId)
        {
        case PowerSource::Events::WiredFaultChange::Id: {
            chip::app::Clusters::PowerSource::Events::WiredFaultChange::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("WiredFaultChange", 1, value);
        }
        case PowerSource::Events::BatFaultChange::Id: {
            chip::app::Clusters::PowerSource::Events::BatFaultChange::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("BatFaultChange", 1, value);
        }
        case PowerSource::Events::BatChargeFaultChange::Id: {
            chip::app::Clusters::PowerSource::Events::BatChargeFaultChange::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("BatChargeFaultChange", 1, value);
        }
        }
        break;
    }
    case GeneralDiagnostics::Id: {
        switch (header.mPath.mEventId)
        {
        case GeneralDiagnostics::Events::HardwareFaultChange::Id: {
            chip::app::Clusters::GeneralDiagnostics::Events::HardwareFaultChange::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("HardwareFaultChange", 1, value);
        }
        case GeneralDiagnostics::Events::RadioFaultChange::Id: {
            chip::app::Clusters::GeneralDiagnostics::Events::RadioFaultChange::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("RadioFaultChange", 1, value);
        }
        case GeneralDiagnostics::Events::NetworkFaultChange::Id: {
            chip::app::Clusters::GeneralDiagnostics::Events::NetworkFaultChange::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("NetworkFaultChange", 1, value);
        }
        case GeneralDiagnostics::Events::BootReason::Id: {
            chip::app::Clusters::GeneralDiagnostics::Events::BootReason::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("BootReason", 1, value);
        }
        }
        break;
    }
    case SoftwareDiagnostics::Id: {
        switch (header.mPath.mEventId)
        {
        case SoftwareDiagnostics::Events::SoftwareFault::Id: {
            chip::app::Clusters::SoftwareDiagnostics::Events::SoftwareFault::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("SoftwareFault", 1, value);
        }
        }
        break;
    }
    case ThreadNetworkDiagnostics::Id: {
        switch (header.mPath.mEventId)
        {
        case ThreadNetworkDiagnostics::Events::ConnectionStatus::Id: {
            chip::app::Clusters::ThreadNetworkDiagnostics::Events::ConnectionStatus::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ConnectionStatus", 1, value);
        }
        case ThreadNetworkDiagnostics::Events::NetworkFaultChange::Id: {
            chip::app::Clusters::ThreadNetworkDiagnostics::Events::NetworkFaultChange::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("NetworkFaultChange", 1, value);
        }
        }
        break;
    }
    case WiFiNetworkDiagnostics::Id: {
        switch (header.mPath.mEventId)
        {
        case WiFiNetworkDiagnostics::Events::Disconnection::Id: {
            chip::app::Clusters::WiFiNetworkDiagnostics::Events::Disconnection::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Disconnection", 1, value);
        }
        case WiFiNetworkDiagnostics::Events::AssociationFailure::Id: {
            chip::app::Clusters::WiFiNetworkDiagnostics::Events::AssociationFailure::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AssociationFailure", 1, value);
        }
        case WiFiNetworkDiagnostics::Events::ConnectionStatus::Id: {
            chip::app::Clusters::WiFiNetworkDiagnostics::Events::ConnectionStatus::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ConnectionStatus", 1, value);
        }
        }
        break;
    }
    case TimeSynchronization::Id: {
        switch (header.mPath.mEventId)
        {
        case TimeSynchronization::Events::DSTTableEmpty::Id: {
            chip::app::Clusters::TimeSynchronization::Events::DSTTableEmpty::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("DSTTableEmpty", 1, value);
        }
        case TimeSynchronization::Events::DSTStatus::Id: {
            chip::app::Clusters::TimeSynchronization::Events::DSTStatus::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("DSTStatus", 1, value);
        }
        case TimeSynchronization::Events::TimeZoneStatus::Id: {
            chip::app::Clusters::TimeSynchronization::Events::TimeZoneStatus::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("TimeZoneStatus", 1, value);
        }
        case TimeSynchronization::Events::TimeFailure::Id: {
            chip::app::Clusters::TimeSynchronization::Events::TimeFailure::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("TimeFailure", 1, value);
        }
        case TimeSynchronization::Events::MissingTrustedTimeSource::Id: {
            chip::app::Clusters::TimeSynchronization::Events::MissingTrustedTimeSource::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MissingTrustedTimeSource", 1, value);
        }
        }
        break;
    }
    case BridgedDeviceBasicInformation::Id: {
        switch (header.mPath.mEventId)
        {
        case BridgedDeviceBasicInformation::Events::StartUp::Id: {
            chip::app::Clusters::BridgedDeviceBasicInformation::Events::StartUp::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("StartUp", 1, value);
        }
        case BridgedDeviceBasicInformation::Events::ShutDown::Id: {
            chip::app::Clusters::BridgedDeviceBasicInformation::Events::ShutDown::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ShutDown", 1, value);
        }
        case BridgedDeviceBasicInformation::Events::Leave::Id: {
            chip::app::Clusters::BridgedDeviceBasicInformation::Events::Leave::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Leave", 1, value);
        }
        case BridgedDeviceBasicInformation::Events::ReachableChanged::Id: {
            chip::app::Clusters::BridgedDeviceBasicInformation::Events::ReachableChanged::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ReachableChanged", 1, value);
        }
        }
        break;
    }
    case Switch::Id: {
        switch (header.mPath.mEventId)
        {
        case Switch::Events::SwitchLatched::Id: {
            chip::app::Clusters::Switch::Events::SwitchLatched::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("SwitchLatched", 1, value);
        }
        case Switch::Events::InitialPress::Id: {
            chip::app::Clusters::Switch::Events::InitialPress::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("InitialPress", 1, value);
        }
        case Switch::Events::LongPress::Id: {
            chip::app::Clusters::Switch::Events::LongPress::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LongPress", 1, value);
        }
        case Switch::Events::ShortRelease::Id: {
            chip::app::Clusters::Switch::Events::ShortRelease::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ShortRelease", 1, value);
        }
        case Switch::Events::LongRelease::Id: {
            chip::app::Clusters::Switch::Events::LongRelease::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LongRelease", 1, value);
        }
        case Switch::Events::MultiPressOngoing::Id: {
            chip::app::Clusters::Switch::Events::MultiPressOngoing::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MultiPressOngoing", 1, value);
        }
        case Switch::Events::MultiPressComplete::Id: {
            chip::app::Clusters::Switch::Events::MultiPressComplete::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MultiPressComplete", 1, value);
        }
        }
        break;
    }
    case BooleanState::Id: {
        switch (header.mPath.mEventId)
        {
        case BooleanState::Events::StateChange::Id: {
            chip::app::Clusters::BooleanState::Events::StateChange::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("StateChange", 1, value);
        }
        }
        break;
    }
    case RefrigeratorAlarm::Id: {
        switch (header.mPath.mEventId)
        {
        case RefrigeratorAlarm::Events::Notify::Id: {
            chip::app::Clusters::RefrigeratorAlarm::Events::Notify::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Notify", 1, value);
        }
        }
        break;
    }
    case SmokeCoAlarm::Id: {
        switch (header.mPath.mEventId)
        {
        case SmokeCoAlarm::Events::SmokeAlarm::Id: {
            chip::app::Clusters::SmokeCoAlarm::Events::SmokeAlarm::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("SmokeAlarm", 1, value);
        }
        case SmokeCoAlarm::Events::COAlarm::Id: {
            chip::app::Clusters::SmokeCoAlarm::Events::COAlarm::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("COAlarm", 1, value);
        }
        case SmokeCoAlarm::Events::LowBattery::Id: {
            chip::app::Clusters::SmokeCoAlarm::Events::LowBattery::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LowBattery", 1, value);
        }
        case SmokeCoAlarm::Events::HardwareFault::Id: {
            chip::app::Clusters::SmokeCoAlarm::Events::HardwareFault::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("HardwareFault", 1, value);
        }
        case SmokeCoAlarm::Events::EndOfService::Id: {
            chip::app::Clusters::SmokeCoAlarm::Events::EndOfService::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("EndOfService", 1, value);
        }
        case SmokeCoAlarm::Events::SelfTestComplete::Id: {
            chip::app::Clusters::SmokeCoAlarm::Events::SelfTestComplete::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("SelfTestComplete", 1, value);
        }
        case SmokeCoAlarm::Events::AlarmMuted::Id: {
            chip::app::Clusters::SmokeCoAlarm::Events::AlarmMuted::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AlarmMuted", 1, value);
        }
        case SmokeCoAlarm::Events::MuteEnded::Id: {
            chip::app::Clusters::SmokeCoAlarm::Events::MuteEnded::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MuteEnded", 1, value);
        }
        case SmokeCoAlarm::Events::InterconnectSmokeAlarm::Id: {
            chip::app::Clusters::SmokeCoAlarm::Events::InterconnectSmokeAlarm::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("InterconnectSmokeAlarm", 1, value);
        }
        case SmokeCoAlarm::Events::InterconnectCOAlarm::Id: {
            chip::app::Clusters::SmokeCoAlarm::Events::InterconnectCOAlarm::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("InterconnectCOAlarm", 1, value);
        }
        case SmokeCoAlarm::Events::AllClear::Id: {
            chip::app::Clusters::SmokeCoAlarm::Events::AllClear::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AllClear", 1, value);
        }
        }
        break;
    }
    case OperationalState::Id: {
        switch (header.mPath.mEventId)
        {
        case OperationalState::Events::OperationalError::Id: {
            chip::app::Clusters::OperationalState::Events::OperationalError::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("OperationalError", 1, value);
        }
        case OperationalState::Events::OperationCompletion::Id: {
            chip::app::Clusters::OperationalState::Events::OperationCompletion::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("OperationCompletion", 1, value);
        }
        }
        break;
    }
    case DoorLock::Id: {
        switch (header.mPath.mEventId)
        {
        case DoorLock::Events::DoorLockAlarm::Id: {
            chip::app::Clusters::DoorLock::Events::DoorLockAlarm::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("DoorLockAlarm", 1, value);
        }
        case DoorLock::Events::DoorStateChange::Id: {
            chip::app::Clusters::DoorLock::Events::DoorStateChange::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("DoorStateChange", 1, value);
        }
        case DoorLock::Events::LockOperation::Id: {
            chip::app::Clusters::DoorLock::Events::LockOperation::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LockOperation", 1, value);
        }
        case DoorLock::Events::LockOperationError::Id: {
            chip::app::Clusters::DoorLock::Events::LockOperationError::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LockOperationError", 1, value);
        }
        case DoorLock::Events::LockUserChange::Id: {
            chip::app::Clusters::DoorLock::Events::LockUserChange::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("LockUserChange", 1, value);
        }
        }
        break;
    }
    case PumpConfigurationAndControl::Id: {
        switch (header.mPath.mEventId)
        {
        case PumpConfigurationAndControl::Events::SupplyVoltageLow::Id: {
            chip::app::Clusters::PumpConfigurationAndControl::Events::SupplyVoltageLow::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("SupplyVoltageLow", 1, value);
        }
        case PumpConfigurationAndControl::Events::SupplyVoltageHigh::Id: {
            chip::app::Clusters::PumpConfigurationAndControl::Events::SupplyVoltageHigh::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("SupplyVoltageHigh", 1, value);
        }
        case PumpConfigurationAndControl::Events::PowerMissingPhase::Id: {
            chip::app::Clusters::PumpConfigurationAndControl::Events::PowerMissingPhase::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PowerMissingPhase", 1, value);
        }
        case PumpConfigurationAndControl::Events::SystemPressureLow::Id: {
            chip::app::Clusters::PumpConfigurationAndControl::Events::SystemPressureLow::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("SystemPressureLow", 1, value);
        }
        case PumpConfigurationAndControl::Events::SystemPressureHigh::Id: {
            chip::app::Clusters::PumpConfigurationAndControl::Events::SystemPressureHigh::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("SystemPressureHigh", 1, value);
        }
        case PumpConfigurationAndControl::Events::DryRunning::Id: {
            chip::app::Clusters::PumpConfigurationAndControl::Events::DryRunning::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("DryRunning", 1, value);
        }
        case PumpConfigurationAndControl::Events::MotorTemperatureHigh::Id: {
            chip::app::Clusters::PumpConfigurationAndControl::Events::MotorTemperatureHigh::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("MotorTemperatureHigh", 1, value);
        }
        case PumpConfigurationAndControl::Events::PumpMotorFatalFailure::Id: {
            chip::app::Clusters::PumpConfigurationAndControl::Events::PumpMotorFatalFailure::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PumpMotorFatalFailure", 1, value);
        }
        case PumpConfigurationAndControl::Events::ElectronicTemperatureHigh::Id: {
            chip::app::Clusters::PumpConfigurationAndControl::Events::ElectronicTemperatureHigh::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ElectronicTemperatureHigh", 1, value);
        }
        case PumpConfigurationAndControl::Events::PumpBlocked::Id: {
            chip::app::Clusters::PumpConfigurationAndControl::Events::PumpBlocked::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("PumpBlocked", 1, value);
        }
        case PumpConfigurationAndControl::Events::SensorFailure::Id: {
            chip::app::Clusters::PumpConfigurationAndControl::Events::SensorFailure::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("SensorFailure", 1, value);
        }
        case PumpConfigurationAndControl::Events::ElectronicNonFatalFailure::Id: {
            chip::app::Clusters::PumpConfigurationAndControl::Events::ElectronicNonFatalFailure::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ElectronicNonFatalFailure", 1, value);
        }
        case PumpConfigurationAndControl::Events::ElectronicFatalFailure::Id: {
            chip::app::Clusters::PumpConfigurationAndControl::Events::ElectronicFatalFailure::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("ElectronicFatalFailure", 1, value);
        }
        case PumpConfigurationAndControl::Events::GeneralFault::Id: {
            chip::app::Clusters::PumpConfigurationAndControl::Events::GeneralFault::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("GeneralFault", 1, value);
        }
        case PumpConfigurationAndControl::Events::Leakage::Id: {
            chip::app::Clusters::PumpConfigurationAndControl::Events::Leakage::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("Leakage", 1, value);
        }
        case PumpConfigurationAndControl::Events::AirDetection::Id: {
            chip::app::Clusters::PumpConfigurationAndControl::Events::AirDetection::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("AirDetection", 1, value);
        }
        case PumpConfigurationAndControl::Events::TurbineOperation::Id: {
            chip::app::Clusters::PumpConfigurationAndControl::Events::TurbineOperation::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("TurbineOperation", 1, value);
        }
        }
        break;
    }
    case UnitTesting::Id: {
        switch (header.mPath.mEventId)
        {
        case UnitTesting::Events::TestEvent::Id: {
            chip::app::Clusters::UnitTesting::Events::TestEvent::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("TestEvent", 1, value);
        }
        case UnitTesting::Events::TestFabricScopedEvent::Id: {
            chip::app::Clusters::UnitTesting::Events::TestFabricScopedEvent::DecodableType value;
            ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value));
            return DataModelLogger::LogValue("TestFabricScopedEvent", 1, value);
        }
        }
        break;
    }
    default:
        break;
    }
    ChipLogProgress(chipTool, "  Don't know how to log event data");
    return CHIP_NO_ERROR;
}
