/*
 *
 *    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
// This file is generated from clusters-Attributes.h.zapt

#pragma once

#include <app/ConcreteAttributePath.h>
#include <app/data-model/DecodableList.h>
#include <app/data-model/List.h>
#include <app/data-model/Nullable.h>
#include <app/util/basic-types.h>
#include <lib/core/TLV.h>
#include <lib/support/BitMask.h>

#include <clusters/shared/Attributes.h>
#include <clusters/shared/Enums.h>
#include <clusters/shared/Structs.h>

#include <clusters/Thermostat/AttributeIds.h>
#include <clusters/Thermostat/ClusterId.h>
#include <clusters/Thermostat/Enums.h>
#include <clusters/Thermostat/Structs.h>

namespace chip {
namespace app {
namespace Clusters {
namespace Thermostat {
namespace Attributes {

namespace LocalTemperature {
struct TypeInfo {
  using Type = chip::app::DataModel::Nullable<int16_t>;
  using DecodableType = chip::app::DataModel::Nullable<int16_t>;
  using DecodableArgType = const chip::app::DataModel::Nullable<int16_t> &;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::LocalTemperature::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace LocalTemperature
namespace OutdoorTemperature {
struct TypeInfo {
  using Type = chip::app::DataModel::Nullable<int16_t>;
  using DecodableType = chip::app::DataModel::Nullable<int16_t>;
  using DecodableArgType = const chip::app::DataModel::Nullable<int16_t> &;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::OutdoorTemperature::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace OutdoorTemperature
namespace Occupancy {
struct TypeInfo {
  using Type = chip::BitMask<chip::app::Clusters::Thermostat::OccupancyBitmap>;
  using DecodableType =
      chip::BitMask<chip::app::Clusters::Thermostat::OccupancyBitmap>;
  using DecodableArgType =
      chip::BitMask<chip::app::Clusters::Thermostat::OccupancyBitmap>;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::Occupancy::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace Occupancy
namespace AbsMinHeatSetpointLimit {
struct TypeInfo {
  using Type = int16_t;
  using DecodableType = int16_t;
  using DecodableArgType = int16_t;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::AbsMinHeatSetpointLimit::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace AbsMinHeatSetpointLimit
namespace AbsMaxHeatSetpointLimit {
struct TypeInfo {
  using Type = int16_t;
  using DecodableType = int16_t;
  using DecodableArgType = int16_t;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::AbsMaxHeatSetpointLimit::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace AbsMaxHeatSetpointLimit
namespace AbsMinCoolSetpointLimit {
struct TypeInfo {
  using Type = int16_t;
  using DecodableType = int16_t;
  using DecodableArgType = int16_t;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::AbsMinCoolSetpointLimit::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace AbsMinCoolSetpointLimit
namespace AbsMaxCoolSetpointLimit {
struct TypeInfo {
  using Type = int16_t;
  using DecodableType = int16_t;
  using DecodableArgType = int16_t;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::AbsMaxCoolSetpointLimit::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace AbsMaxCoolSetpointLimit
namespace PICoolingDemand {
struct TypeInfo {
  using Type = uint8_t;
  using DecodableType = uint8_t;
  using DecodableArgType = uint8_t;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::PICoolingDemand::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace PICoolingDemand
namespace PIHeatingDemand {
struct TypeInfo {
  using Type = uint8_t;
  using DecodableType = uint8_t;
  using DecodableArgType = uint8_t;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::PIHeatingDemand::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace PIHeatingDemand
namespace HVACSystemTypeConfiguration {
struct TypeInfo {
  using Type =
      chip::BitMask<chip::app::Clusters::Thermostat::HVACSystemTypeBitmap>;
  using DecodableType =
      chip::BitMask<chip::app::Clusters::Thermostat::HVACSystemTypeBitmap>;
  using DecodableArgType =
      chip::BitMask<chip::app::Clusters::Thermostat::HVACSystemTypeBitmap>;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::HVACSystemTypeConfiguration::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace HVACSystemTypeConfiguration
namespace LocalTemperatureCalibration {
struct TypeInfo {
  using Type = int8_t;
  using DecodableType = int8_t;
  using DecodableArgType = int8_t;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::LocalTemperatureCalibration::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace LocalTemperatureCalibration
namespace OccupiedCoolingSetpoint {
struct TypeInfo {
  using Type = int16_t;
  using DecodableType = int16_t;
  using DecodableArgType = int16_t;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::OccupiedCoolingSetpoint::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace OccupiedCoolingSetpoint
namespace OccupiedHeatingSetpoint {
struct TypeInfo {
  using Type = int16_t;
  using DecodableType = int16_t;
  using DecodableArgType = int16_t;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::OccupiedHeatingSetpoint::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace OccupiedHeatingSetpoint
namespace UnoccupiedCoolingSetpoint {
struct TypeInfo {
  using Type = int16_t;
  using DecodableType = int16_t;
  using DecodableArgType = int16_t;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::UnoccupiedCoolingSetpoint::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace UnoccupiedCoolingSetpoint
namespace UnoccupiedHeatingSetpoint {
struct TypeInfo {
  using Type = int16_t;
  using DecodableType = int16_t;
  using DecodableArgType = int16_t;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::UnoccupiedHeatingSetpoint::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace UnoccupiedHeatingSetpoint
namespace MinHeatSetpointLimit {
struct TypeInfo {
  using Type = int16_t;
  using DecodableType = int16_t;
  using DecodableArgType = int16_t;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::MinHeatSetpointLimit::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace MinHeatSetpointLimit
namespace MaxHeatSetpointLimit {
struct TypeInfo {
  using Type = int16_t;
  using DecodableType = int16_t;
  using DecodableArgType = int16_t;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::MaxHeatSetpointLimit::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace MaxHeatSetpointLimit
namespace MinCoolSetpointLimit {
struct TypeInfo {
  using Type = int16_t;
  using DecodableType = int16_t;
  using DecodableArgType = int16_t;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::MinCoolSetpointLimit::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace MinCoolSetpointLimit
namespace MaxCoolSetpointLimit {
struct TypeInfo {
  using Type = int16_t;
  using DecodableType = int16_t;
  using DecodableArgType = int16_t;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::MaxCoolSetpointLimit::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace MaxCoolSetpointLimit
namespace MinSetpointDeadBand {
struct TypeInfo {
  using Type = int8_t;
  using DecodableType = int8_t;
  using DecodableArgType = int8_t;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::MinSetpointDeadBand::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace MinSetpointDeadBand
namespace RemoteSensing {
struct TypeInfo {
  using Type =
      chip::BitMask<chip::app::Clusters::Thermostat::RemoteSensingBitmap>;
  using DecodableType =
      chip::BitMask<chip::app::Clusters::Thermostat::RemoteSensingBitmap>;
  using DecodableArgType =
      chip::BitMask<chip::app::Clusters::Thermostat::RemoteSensingBitmap>;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::RemoteSensing::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace RemoteSensing
namespace ControlSequenceOfOperation {
struct TypeInfo {
  using Type = chip::app::Clusters::Thermostat::ControlSequenceOfOperationEnum;
  using DecodableType =
      chip::app::Clusters::Thermostat::ControlSequenceOfOperationEnum;
  using DecodableArgType =
      chip::app::Clusters::Thermostat::ControlSequenceOfOperationEnum;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::ControlSequenceOfOperation::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace ControlSequenceOfOperation
namespace SystemMode {
struct TypeInfo {
  using Type = chip::app::Clusters::Thermostat::SystemModeEnum;
  using DecodableType = chip::app::Clusters::Thermostat::SystemModeEnum;
  using DecodableArgType = chip::app::Clusters::Thermostat::SystemModeEnum;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::SystemMode::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace SystemMode
namespace ThermostatRunningMode {
struct TypeInfo {
  using Type = chip::app::Clusters::Thermostat::ThermostatRunningModeEnum;
  using DecodableType =
      chip::app::Clusters::Thermostat::ThermostatRunningModeEnum;
  using DecodableArgType =
      chip::app::Clusters::Thermostat::ThermostatRunningModeEnum;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::ThermostatRunningMode::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace ThermostatRunningMode
namespace StartOfWeek {
struct TypeInfo {
  using Type = chip::app::Clusters::Thermostat::StartOfWeekEnum;
  using DecodableType = chip::app::Clusters::Thermostat::StartOfWeekEnum;
  using DecodableArgType = chip::app::Clusters::Thermostat::StartOfWeekEnum;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::StartOfWeek::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace StartOfWeek
namespace NumberOfWeeklyTransitions {
struct TypeInfo {
  using Type = uint8_t;
  using DecodableType = uint8_t;
  using DecodableArgType = uint8_t;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::NumberOfWeeklyTransitions::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace NumberOfWeeklyTransitions
namespace NumberOfDailyTransitions {
struct TypeInfo {
  using Type = uint8_t;
  using DecodableType = uint8_t;
  using DecodableArgType = uint8_t;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::NumberOfDailyTransitions::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace NumberOfDailyTransitions
namespace TemperatureSetpointHold {
struct TypeInfo {
  using Type = chip::app::Clusters::Thermostat::TemperatureSetpointHoldEnum;
  using DecodableType =
      chip::app::Clusters::Thermostat::TemperatureSetpointHoldEnum;
  using DecodableArgType =
      chip::app::Clusters::Thermostat::TemperatureSetpointHoldEnum;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::TemperatureSetpointHold::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace TemperatureSetpointHold
namespace TemperatureSetpointHoldDuration {
struct TypeInfo {
  using Type = chip::app::DataModel::Nullable<uint16_t>;
  using DecodableType = chip::app::DataModel::Nullable<uint16_t>;
  using DecodableArgType = const chip::app::DataModel::Nullable<uint16_t> &;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::TemperatureSetpointHoldDuration::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace TemperatureSetpointHoldDuration
namespace ThermostatProgrammingOperationMode {
struct TypeInfo {
  using Type = chip::BitMask<
      chip::app::Clusters::Thermostat::ProgrammingOperationModeBitmap>;
  using DecodableType = chip::BitMask<
      chip::app::Clusters::Thermostat::ProgrammingOperationModeBitmap>;
  using DecodableArgType = chip::BitMask<
      chip::app::Clusters::Thermostat::ProgrammingOperationModeBitmap>;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::ThermostatProgrammingOperationMode::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace ThermostatProgrammingOperationMode
namespace ThermostatRunningState {
struct TypeInfo {
  using Type = chip::BitMask<chip::app::Clusters::Thermostat::RelayStateBitmap>;
  using DecodableType =
      chip::BitMask<chip::app::Clusters::Thermostat::RelayStateBitmap>;
  using DecodableArgType =
      chip::BitMask<chip::app::Clusters::Thermostat::RelayStateBitmap>;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::ThermostatRunningState::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace ThermostatRunningState
namespace SetpointChangeSource {
struct TypeInfo {
  using Type = chip::app::Clusters::Thermostat::SetpointChangeSourceEnum;
  using DecodableType =
      chip::app::Clusters::Thermostat::SetpointChangeSourceEnum;
  using DecodableArgType =
      chip::app::Clusters::Thermostat::SetpointChangeSourceEnum;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::SetpointChangeSource::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace SetpointChangeSource
namespace SetpointChangeAmount {
struct TypeInfo {
  using Type = chip::app::DataModel::Nullable<int16_t>;
  using DecodableType = chip::app::DataModel::Nullable<int16_t>;
  using DecodableArgType = const chip::app::DataModel::Nullable<int16_t> &;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::SetpointChangeAmount::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace SetpointChangeAmount
namespace SetpointChangeSourceTimestamp {
struct TypeInfo {
  using Type = uint32_t;
  using DecodableType = uint32_t;
  using DecodableArgType = uint32_t;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::SetpointChangeSourceTimestamp::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace SetpointChangeSourceTimestamp
namespace OccupiedSetback {
struct TypeInfo {
  using Type = chip::app::DataModel::Nullable<uint8_t>;
  using DecodableType = chip::app::DataModel::Nullable<uint8_t>;
  using DecodableArgType = const chip::app::DataModel::Nullable<uint8_t> &;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::OccupiedSetback::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace OccupiedSetback
namespace OccupiedSetbackMin {
struct TypeInfo {
  using Type = chip::app::DataModel::Nullable<uint8_t>;
  using DecodableType = chip::app::DataModel::Nullable<uint8_t>;
  using DecodableArgType = const chip::app::DataModel::Nullable<uint8_t> &;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::OccupiedSetbackMin::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace OccupiedSetbackMin
namespace OccupiedSetbackMax {
struct TypeInfo {
  using Type = chip::app::DataModel::Nullable<uint8_t>;
  using DecodableType = chip::app::DataModel::Nullable<uint8_t>;
  using DecodableArgType = const chip::app::DataModel::Nullable<uint8_t> &;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::OccupiedSetbackMax::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace OccupiedSetbackMax
namespace UnoccupiedSetback {
struct TypeInfo {
  using Type = chip::app::DataModel::Nullable<uint8_t>;
  using DecodableType = chip::app::DataModel::Nullable<uint8_t>;
  using DecodableArgType = const chip::app::DataModel::Nullable<uint8_t> &;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::UnoccupiedSetback::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace UnoccupiedSetback
namespace UnoccupiedSetbackMin {
struct TypeInfo {
  using Type = chip::app::DataModel::Nullable<uint8_t>;
  using DecodableType = chip::app::DataModel::Nullable<uint8_t>;
  using DecodableArgType = const chip::app::DataModel::Nullable<uint8_t> &;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::UnoccupiedSetbackMin::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace UnoccupiedSetbackMin
namespace UnoccupiedSetbackMax {
struct TypeInfo {
  using Type = chip::app::DataModel::Nullable<uint8_t>;
  using DecodableType = chip::app::DataModel::Nullable<uint8_t>;
  using DecodableArgType = const chip::app::DataModel::Nullable<uint8_t> &;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::UnoccupiedSetbackMax::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace UnoccupiedSetbackMax
namespace EmergencyHeatDelta {
struct TypeInfo {
  using Type = uint8_t;
  using DecodableType = uint8_t;
  using DecodableArgType = uint8_t;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::EmergencyHeatDelta::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace EmergencyHeatDelta
namespace ACType {
struct TypeInfo {
  using Type = chip::app::Clusters::Thermostat::ACTypeEnum;
  using DecodableType = chip::app::Clusters::Thermostat::ACTypeEnum;
  using DecodableArgType = chip::app::Clusters::Thermostat::ACTypeEnum;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::ACType::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace ACType
namespace ACCapacity {
struct TypeInfo {
  using Type = uint16_t;
  using DecodableType = uint16_t;
  using DecodableArgType = uint16_t;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::ACCapacity::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace ACCapacity
namespace ACRefrigerantType {
struct TypeInfo {
  using Type = chip::app::Clusters::Thermostat::ACRefrigerantTypeEnum;
  using DecodableType = chip::app::Clusters::Thermostat::ACRefrigerantTypeEnum;
  using DecodableArgType =
      chip::app::Clusters::Thermostat::ACRefrigerantTypeEnum;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::ACRefrigerantType::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace ACRefrigerantType
namespace ACCompressorType {
struct TypeInfo {
  using Type = chip::app::Clusters::Thermostat::ACCompressorTypeEnum;
  using DecodableType = chip::app::Clusters::Thermostat::ACCompressorTypeEnum;
  using DecodableArgType =
      chip::app::Clusters::Thermostat::ACCompressorTypeEnum;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::ACCompressorType::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace ACCompressorType
namespace ACErrorCode {
struct TypeInfo {
  using Type =
      chip::BitMask<chip::app::Clusters::Thermostat::ACErrorCodeBitmap>;
  using DecodableType =
      chip::BitMask<chip::app::Clusters::Thermostat::ACErrorCodeBitmap>;
  using DecodableArgType =
      chip::BitMask<chip::app::Clusters::Thermostat::ACErrorCodeBitmap>;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::ACErrorCode::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace ACErrorCode
namespace ACLouverPosition {
struct TypeInfo {
  using Type = chip::app::Clusters::Thermostat::ACLouverPositionEnum;
  using DecodableType = chip::app::Clusters::Thermostat::ACLouverPositionEnum;
  using DecodableArgType =
      chip::app::Clusters::Thermostat::ACLouverPositionEnum;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::ACLouverPosition::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace ACLouverPosition
namespace ACCoilTemperature {
struct TypeInfo {
  using Type = chip::app::DataModel::Nullable<int16_t>;
  using DecodableType = chip::app::DataModel::Nullable<int16_t>;
  using DecodableArgType = const chip::app::DataModel::Nullable<int16_t> &;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::ACCoilTemperature::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace ACCoilTemperature
namespace ACCapacityformat {
struct TypeInfo {
  using Type = chip::app::Clusters::Thermostat::ACCapacityFormatEnum;
  using DecodableType = chip::app::Clusters::Thermostat::ACCapacityFormatEnum;
  using DecodableArgType =
      chip::app::Clusters::Thermostat::ACCapacityFormatEnum;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::ACCapacityformat::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace ACCapacityformat
namespace PresetTypes {
struct TypeInfo {
  using Type = chip::app::DataModel::List<
      const chip::app::Clusters::Thermostat::Structs::PresetTypeStruct::Type>;
  using DecodableType = chip::app::DataModel::DecodableList<
      chip::app::Clusters::Thermostat::Structs::PresetTypeStruct::
          DecodableType>;
  using DecodableArgType = const chip::app::DataModel::DecodableList<
      chip::app::Clusters::Thermostat::Structs::PresetTypeStruct::DecodableType>
      &;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::PresetTypes::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace PresetTypes
namespace ScheduleTypes {
struct TypeInfo {
  using Type = chip::app::DataModel::List<
      const chip::app::Clusters::Thermostat::Structs::ScheduleTypeStruct::Type>;
  using DecodableType = chip::app::DataModel::DecodableList<
      chip::app::Clusters::Thermostat::Structs::ScheduleTypeStruct::
          DecodableType>;
  using DecodableArgType = const chip::app::DataModel::DecodableList<
      chip::app::Clusters::Thermostat::Structs::ScheduleTypeStruct::
          DecodableType> &;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::ScheduleTypes::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace ScheduleTypes
namespace NumberOfPresets {
struct TypeInfo {
  using Type = uint8_t;
  using DecodableType = uint8_t;
  using DecodableArgType = uint8_t;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::NumberOfPresets::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace NumberOfPresets
namespace NumberOfSchedules {
struct TypeInfo {
  using Type = uint8_t;
  using DecodableType = uint8_t;
  using DecodableArgType = uint8_t;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::NumberOfSchedules::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace NumberOfSchedules
namespace NumberOfScheduleTransitions {
struct TypeInfo {
  using Type = uint8_t;
  using DecodableType = uint8_t;
  using DecodableArgType = uint8_t;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::NumberOfScheduleTransitions::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace NumberOfScheduleTransitions
namespace NumberOfScheduleTransitionPerDay {
struct TypeInfo {
  using Type = chip::app::DataModel::Nullable<uint8_t>;
  using DecodableType = chip::app::DataModel::Nullable<uint8_t>;
  using DecodableArgType = const chip::app::DataModel::Nullable<uint8_t> &;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::NumberOfScheduleTransitionPerDay::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace NumberOfScheduleTransitionPerDay
namespace ActivePresetHandle {
struct TypeInfo {
  using Type = chip::app::DataModel::Nullable<chip::ByteSpan>;
  using DecodableType = chip::app::DataModel::Nullable<chip::ByteSpan>;
  using DecodableArgType =
      const chip::app::DataModel::Nullable<chip::ByteSpan> &;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::ActivePresetHandle::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
  static constexpr size_t MaxLength() { return 16; }
};
} // namespace ActivePresetHandle
namespace ActiveScheduleHandle {
struct TypeInfo {
  using Type = chip::app::DataModel::Nullable<chip::ByteSpan>;
  using DecodableType = chip::app::DataModel::Nullable<chip::ByteSpan>;
  using DecodableArgType =
      const chip::app::DataModel::Nullable<chip::ByteSpan> &;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::ActiveScheduleHandle::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
  static constexpr size_t MaxLength() { return 16; }
};
} // namespace ActiveScheduleHandle
namespace Presets {
struct TypeInfo {
  using Type = chip::app::DataModel::List<
      const chip::app::Clusters::Thermostat::Structs::PresetStruct::Type>;
  using DecodableType = chip::app::DataModel::DecodableList<
      chip::app::Clusters::Thermostat::Structs::PresetStruct::DecodableType>;
  using DecodableArgType = const chip::app::DataModel::DecodableList<
      chip::app::Clusters::Thermostat::Structs::PresetStruct::DecodableType> &;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::Presets::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace Presets
namespace Schedules {
struct TypeInfo {
  using Type = chip::app::DataModel::List<
      const chip::app::Clusters::Thermostat::Structs::ScheduleStruct::Type>;
  using DecodableType = chip::app::DataModel::DecodableList<
      chip::app::Clusters::Thermostat::Structs::ScheduleStruct::DecodableType>;
  using DecodableArgType = const chip::app::DataModel::DecodableList<
      chip::app::Clusters::Thermostat::Structs::ScheduleStruct::DecodableType>
      &;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::Schedules::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace Schedules
namespace SetpointHoldExpiryTimestamp {
struct TypeInfo {
  using Type = chip::app::DataModel::Nullable<uint32_t>;
  using DecodableType = chip::app::DataModel::Nullable<uint32_t>;
  using DecodableArgType = const chip::app::DataModel::Nullable<uint32_t> &;

  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
  static constexpr AttributeId GetAttributeId() {
    return Attributes::SetpointHoldExpiryTimestamp::Id;
  }
  static constexpr bool MustUseTimedWrite() { return false; }
};
} // namespace SetpointHoldExpiryTimestamp
namespace GeneratedCommandList {
struct TypeInfo
    : public Clusters::Globals::Attributes::GeneratedCommandList::TypeInfo {
  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
};
} // namespace GeneratedCommandList
namespace AcceptedCommandList {
struct TypeInfo
    : public Clusters::Globals::Attributes::AcceptedCommandList::TypeInfo {
  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
};
} // namespace AcceptedCommandList
namespace AttributeList {
struct TypeInfo
    : public Clusters::Globals::Attributes::AttributeList::TypeInfo {
  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
};
} // namespace AttributeList
namespace FeatureMap {
struct TypeInfo : public Clusters::Globals::Attributes::FeatureMap::TypeInfo {
  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
};
} // namespace FeatureMap
namespace ClusterRevision {
struct TypeInfo
    : public Clusters::Globals::Attributes::ClusterRevision::TypeInfo {
  static constexpr ClusterId GetClusterId() { return Clusters::Thermostat::Id; }
};
} // namespace ClusterRevision

struct TypeInfo {
  struct DecodableType {
    static constexpr ClusterId GetClusterId() {
      return Clusters::Thermostat::Id;
    }

    CHIP_ERROR Decode(TLV::TLVReader &reader,
                      const ConcreteAttributePath &path);

    Attributes::LocalTemperature::TypeInfo::DecodableType localTemperature;
    Attributes::OutdoorTemperature::TypeInfo::DecodableType outdoorTemperature;
    Attributes::Occupancy::TypeInfo::DecodableType occupancy = static_cast<
        chip::BitMask<chip::app::Clusters::Thermostat::OccupancyBitmap>>(0);
    Attributes::AbsMinHeatSetpointLimit::TypeInfo::DecodableType
        absMinHeatSetpointLimit = static_cast<int16_t>(0);
    Attributes::AbsMaxHeatSetpointLimit::TypeInfo::DecodableType
        absMaxHeatSetpointLimit = static_cast<int16_t>(0);
    Attributes::AbsMinCoolSetpointLimit::TypeInfo::DecodableType
        absMinCoolSetpointLimit = static_cast<int16_t>(0);
    Attributes::AbsMaxCoolSetpointLimit::TypeInfo::DecodableType
        absMaxCoolSetpointLimit = static_cast<int16_t>(0);
    Attributes::PICoolingDemand::TypeInfo::DecodableType PICoolingDemand =
        static_cast<uint8_t>(0);
    Attributes::PIHeatingDemand::TypeInfo::DecodableType PIHeatingDemand =
        static_cast<uint8_t>(0);
    Attributes::HVACSystemTypeConfiguration::TypeInfo::DecodableType
        HVACSystemTypeConfiguration = static_cast<chip::BitMask<
            chip::app::Clusters::Thermostat::HVACSystemTypeBitmap>>(0);
    Attributes::LocalTemperatureCalibration::TypeInfo::DecodableType
        localTemperatureCalibration = static_cast<int8_t>(0);
    Attributes::OccupiedCoolingSetpoint::TypeInfo::DecodableType
        occupiedCoolingSetpoint = static_cast<int16_t>(0);
    Attributes::OccupiedHeatingSetpoint::TypeInfo::DecodableType
        occupiedHeatingSetpoint = static_cast<int16_t>(0);
    Attributes::UnoccupiedCoolingSetpoint::TypeInfo::DecodableType
        unoccupiedCoolingSetpoint = static_cast<int16_t>(0);
    Attributes::UnoccupiedHeatingSetpoint::TypeInfo::DecodableType
        unoccupiedHeatingSetpoint = static_cast<int16_t>(0);
    Attributes::MinHeatSetpointLimit::TypeInfo::DecodableType
        minHeatSetpointLimit = static_cast<int16_t>(0);
    Attributes::MaxHeatSetpointLimit::TypeInfo::DecodableType
        maxHeatSetpointLimit = static_cast<int16_t>(0);
    Attributes::MinCoolSetpointLimit::TypeInfo::DecodableType
        minCoolSetpointLimit = static_cast<int16_t>(0);
    Attributes::MaxCoolSetpointLimit::TypeInfo::DecodableType
        maxCoolSetpointLimit = static_cast<int16_t>(0);
    Attributes::MinSetpointDeadBand::TypeInfo::DecodableType
        minSetpointDeadBand = static_cast<int8_t>(0);
    Attributes::RemoteSensing::TypeInfo::DecodableType remoteSensing =
        static_cast<chip::BitMask<
            chip::app::Clusters::Thermostat::RemoteSensingBitmap>>(0);
    Attributes::ControlSequenceOfOperation::TypeInfo::DecodableType
        controlSequenceOfOperation = static_cast<
            chip::app::Clusters::Thermostat::ControlSequenceOfOperationEnum>(0);
    Attributes::SystemMode::TypeInfo::DecodableType systemMode =
        static_cast<chip::app::Clusters::Thermostat::SystemModeEnum>(0);
    Attributes::ThermostatRunningMode::TypeInfo::DecodableType
        thermostatRunningMode = static_cast<
            chip::app::Clusters::Thermostat::ThermostatRunningModeEnum>(0);
    Attributes::StartOfWeek::TypeInfo::DecodableType startOfWeek =
        static_cast<chip::app::Clusters::Thermostat::StartOfWeekEnum>(0);
    Attributes::NumberOfWeeklyTransitions::TypeInfo::DecodableType
        numberOfWeeklyTransitions = static_cast<uint8_t>(0);
    Attributes::NumberOfDailyTransitions::TypeInfo::DecodableType
        numberOfDailyTransitions = static_cast<uint8_t>(0);
    Attributes::TemperatureSetpointHold::TypeInfo::DecodableType
        temperatureSetpointHold = static_cast<
            chip::app::Clusters::Thermostat::TemperatureSetpointHoldEnum>(0);
    Attributes::TemperatureSetpointHoldDuration::TypeInfo::DecodableType
        temperatureSetpointHoldDuration;
    Attributes::ThermostatProgrammingOperationMode::TypeInfo::DecodableType
        thermostatProgrammingOperationMode = static_cast<chip::BitMask<
            chip::app::Clusters::Thermostat::ProgrammingOperationModeBitmap>>(
            0);
    Attributes::ThermostatRunningState::TypeInfo::DecodableType
        thermostatRunningState = static_cast<
            chip::BitMask<chip::app::Clusters::Thermostat::RelayStateBitmap>>(
            0);
    Attributes::SetpointChangeSource::TypeInfo::DecodableType
        setpointChangeSource = static_cast<
            chip::app::Clusters::Thermostat::SetpointChangeSourceEnum>(0);
    Attributes::SetpointChangeAmount::TypeInfo::DecodableType
        setpointChangeAmount;
    Attributes::SetpointChangeSourceTimestamp::TypeInfo::DecodableType
        setpointChangeSourceTimestamp = static_cast<uint32_t>(0);
    Attributes::OccupiedSetback::TypeInfo::DecodableType occupiedSetback;
    Attributes::OccupiedSetbackMin::TypeInfo::DecodableType occupiedSetbackMin;
    Attributes::OccupiedSetbackMax::TypeInfo::DecodableType occupiedSetbackMax;
    Attributes::UnoccupiedSetback::TypeInfo::DecodableType unoccupiedSetback;
    Attributes::UnoccupiedSetbackMin::TypeInfo::DecodableType
        unoccupiedSetbackMin;
    Attributes::UnoccupiedSetbackMax::TypeInfo::DecodableType
        unoccupiedSetbackMax;
    Attributes::EmergencyHeatDelta::TypeInfo::DecodableType emergencyHeatDelta =
        static_cast<uint8_t>(0);
    Attributes::ACType::TypeInfo::DecodableType ACType =
        static_cast<chip::app::Clusters::Thermostat::ACTypeEnum>(0);
    Attributes::ACCapacity::TypeInfo::DecodableType ACCapacity =
        static_cast<uint16_t>(0);
    Attributes::ACRefrigerantType::TypeInfo::DecodableType ACRefrigerantType =
        static_cast<chip::app::Clusters::Thermostat::ACRefrigerantTypeEnum>(0);
    Attributes::ACCompressorType::TypeInfo::DecodableType ACCompressorType =
        static_cast<chip::app::Clusters::Thermostat::ACCompressorTypeEnum>(0);
    Attributes::ACErrorCode::TypeInfo::DecodableType ACErrorCode = static_cast<
        chip::BitMask<chip::app::Clusters::Thermostat::ACErrorCodeBitmap>>(0);
    Attributes::ACLouverPosition::TypeInfo::DecodableType ACLouverPosition =
        static_cast<chip::app::Clusters::Thermostat::ACLouverPositionEnum>(0);
    Attributes::ACCoilTemperature::TypeInfo::DecodableType ACCoilTemperature;
    Attributes::ACCapacityformat::TypeInfo::DecodableType ACCapacityformat =
        static_cast<chip::app::Clusters::Thermostat::ACCapacityFormatEnum>(0);
    Attributes::PresetTypes::TypeInfo::DecodableType presetTypes;
    Attributes::ScheduleTypes::TypeInfo::DecodableType scheduleTypes;
    Attributes::NumberOfPresets::TypeInfo::DecodableType numberOfPresets =
        static_cast<uint8_t>(0);
    Attributes::NumberOfSchedules::TypeInfo::DecodableType numberOfSchedules =
        static_cast<uint8_t>(0);
    Attributes::NumberOfScheduleTransitions::TypeInfo::DecodableType
        numberOfScheduleTransitions = static_cast<uint8_t>(0);
    Attributes::NumberOfScheduleTransitionPerDay::TypeInfo::DecodableType
        numberOfScheduleTransitionPerDay;
    Attributes::ActivePresetHandle::TypeInfo::DecodableType activePresetHandle;
    Attributes::ActiveScheduleHandle::TypeInfo::DecodableType
        activeScheduleHandle;
    Attributes::Presets::TypeInfo::DecodableType presets;
    Attributes::Schedules::TypeInfo::DecodableType schedules;
    Attributes::SetpointHoldExpiryTimestamp::TypeInfo::DecodableType
        setpointHoldExpiryTimestamp;
    Attributes::GeneratedCommandList::TypeInfo::DecodableType
        generatedCommandList;
    Attributes::AcceptedCommandList::TypeInfo::DecodableType
        acceptedCommandList;
    Attributes::AttributeList::TypeInfo::DecodableType attributeList;
    Attributes::FeatureMap::TypeInfo::DecodableType featureMap =
        static_cast<uint32_t>(0);
    Attributes::ClusterRevision::TypeInfo::DecodableType clusterRevision =
        static_cast<uint16_t>(0);
  };
};
} // namespace Attributes
} // namespace Thermostat
} // namespace Clusters
} // namespace app
} // namespace chip
