ESPHome 2025.12.5
Loading...
Searching...
No Matches
climate_traits.h
Go to the documentation of this file.
1#pragma once
2
3#include <cstring>
4#include <vector>
5#include "climate_mode.h"
8
9namespace esphome::climate {
10
11// Type aliases for climate enum bitmasks
12// These replace std::set<EnumType> to eliminate red-black tree overhead
13// For contiguous enums starting at 0, DefaultBitPolicy provides 1:1 mapping (enum value = bit position)
14// Bitmask size is automatically calculated from the last enum value
20
21// Lightweight linear search for small vectors (1-20 items) of const char* pointers
22// Avoids std::find template overhead
23inline bool vector_contains(const std::vector<const char *> &vec, const char *value) {
24 for (const char *item : vec) {
25 if (strcmp(item, value) == 0)
26 return true;
27 }
28 return false;
29}
30
31// Find and return matching pointer from vector, or nullptr if not found
32inline const char *vector_find(const std::vector<const char *> &vec, const char *value) {
33 for (const char *item : vec) {
34 if (strcmp(item, value) == 0)
35 return item;
36 }
37 return nullptr;
38}
39
67class Climate; // Forward declaration
68
70 friend class Climate; // Allow Climate to access protected find methods
71
72 public:
74 uint32_t get_feature_flags() const { return this->feature_flags_; }
75 void add_feature_flags(uint32_t feature_flags) { this->feature_flags_ |= feature_flags; }
76 void clear_feature_flags(uint32_t feature_flags) { this->feature_flags_ &= ~feature_flags; }
77 bool has_feature_flags(uint32_t feature_flags) const { return this->feature_flags_ & feature_flags; }
78 void set_feature_flags(uint32_t feature_flags) { this->feature_flags_ = feature_flags; }
79
80 ESPDEPRECATED("This method is deprecated, use get_feature_flags() instead", "2025.11.0")
81 bool get_supports_current_temperature() const {
83 }
84 ESPDEPRECATED("This method is deprecated, use add_feature_flags() instead", "2025.11.0")
85 void set_supports_current_temperature(bool supports_current_temperature) {
86 if (supports_current_temperature) {
88 } else {
90 }
91 }
92 ESPDEPRECATED("This method is deprecated, use get_feature_flags() instead", "2025.11.0")
93 bool get_supports_current_humidity() const { return this->has_feature_flags(CLIMATE_SUPPORTS_CURRENT_HUMIDITY); }
94 ESPDEPRECATED("This method is deprecated, use add_feature_flags() instead", "2025.11.0")
95 void set_supports_current_humidity(bool supports_current_humidity) {
96 if (supports_current_humidity) {
98 } else {
100 }
101 }
102 ESPDEPRECATED("This method is deprecated, use get_feature_flags() instead", "2025.11.0")
103 bool get_supports_two_point_target_temperature() const {
105 }
106 ESPDEPRECATED("This method is deprecated, use add_feature_flags() instead", "2025.11.0")
107 void set_supports_two_point_target_temperature(bool supports_two_point_target_temperature) {
108 if (supports_two_point_target_temperature)
109 // Use CLIMATE_REQUIRES_TWO_POINT_TARGET_TEMPERATURE to mimic previous behavior
110 {
112 } else {
114 }
115 }
116 ESPDEPRECATED("This method is deprecated, use get_feature_flags() instead", "2025.11.0")
117 bool get_supports_target_humidity() const { return this->has_feature_flags(CLIMATE_SUPPORTS_TARGET_HUMIDITY); }
118 ESPDEPRECATED("This method is deprecated, use add_feature_flags() instead", "2025.11.0")
119 void set_supports_target_humidity(bool supports_target_humidity) {
120 if (supports_target_humidity) {
122 } else {
124 }
125 }
126 ESPDEPRECATED("This method is deprecated, use get_feature_flags() instead", "2025.11.0")
127 bool get_supports_action() const { return this->has_feature_flags(CLIMATE_SUPPORTS_ACTION); }
128 ESPDEPRECATED("This method is deprecated, use add_feature_flags() instead", "2025.11.0")
129 void set_supports_action(bool supports_action) {
130 if (supports_action) {
132 } else {
134 }
135 }
136
139 bool supports_mode(ClimateMode mode) const { return this->supported_modes_.count(mode); }
140 const ClimateModeMask &get_supported_modes() const { return this->supported_modes_; }
141
146 return !this->supported_fan_modes_.empty() || !this->supported_custom_fan_modes_.empty();
147 }
149
150 void set_supported_custom_fan_modes(std::initializer_list<const char *> modes) {
151 this->supported_custom_fan_modes_ = modes;
152 }
153 void set_supported_custom_fan_modes(const std::vector<const char *> &modes) {
154 this->supported_custom_fan_modes_ = modes;
155 }
156 template<size_t N> void set_supported_custom_fan_modes(const char *const (&modes)[N]) {
157 this->supported_custom_fan_modes_.assign(modes, modes + N);
158 }
159
160 // Deleted overloads to catch incorrect std::string usage at compile time with clear error messages
161 void set_supported_custom_fan_modes(const std::vector<std::string> &modes) = delete;
162 void set_supported_custom_fan_modes(std::initializer_list<std::string> modes) = delete;
163
164 const std::vector<const char *> &get_supported_custom_fan_modes() const { return this->supported_custom_fan_modes_; }
166 return vector_contains(this->supported_custom_fan_modes_, custom_fan_mode);
167 }
168 bool supports_custom_fan_mode(const std::string &custom_fan_mode) const {
169 return this->supports_custom_fan_mode(custom_fan_mode.c_str());
170 }
171
174 bool supports_preset(ClimatePreset preset) const { return this->supported_presets_.count(preset); }
175 bool get_supports_presets() const { return !this->supported_presets_.empty(); }
177
178 void set_supported_custom_presets(std::initializer_list<const char *> presets) {
179 this->supported_custom_presets_ = presets;
180 }
181 void set_supported_custom_presets(const std::vector<const char *> &presets) {
182 this->supported_custom_presets_ = presets;
183 }
184 template<size_t N> void set_supported_custom_presets(const char *const (&presets)[N]) {
185 this->supported_custom_presets_.assign(presets, presets + N);
186 }
187
188 // Deleted overloads to catch incorrect std::string usage at compile time with clear error messages
189 void set_supported_custom_presets(const std::vector<std::string> &presets) = delete;
190 void set_supported_custom_presets(std::initializer_list<std::string> presets) = delete;
191
192 const std::vector<const char *> &get_supported_custom_presets() const { return this->supported_custom_presets_; }
193 bool supports_custom_preset(const char *custom_preset) const {
194 return vector_contains(this->supported_custom_presets_, custom_preset);
195 }
196 bool supports_custom_preset(const std::string &custom_preset) const {
197 return this->supports_custom_preset(custom_preset.c_str());
198 }
199
203 bool get_supports_swing_modes() const { return !this->supported_swing_modes_.empty(); }
205
207 void set_visual_min_temperature(float visual_min_temperature) {
208 this->visual_min_temperature_ = visual_min_temperature;
209 }
211 void set_visual_max_temperature(float visual_max_temperature) {
212 this->visual_max_temperature_ = visual_max_temperature;
213 }
216 void set_visual_target_temperature_step(float temperature_step) {
217 this->visual_target_temperature_step_ = temperature_step;
218 }
219 void set_visual_current_temperature_step(float temperature_step) {
220 this->visual_current_temperature_step_ = temperature_step;
221 }
222 void set_visual_temperature_step(float temperature_step) {
223 this->visual_target_temperature_step_ = temperature_step;
224 this->visual_current_temperature_step_ = temperature_step;
225 }
228
229 float get_visual_min_humidity() const { return this->visual_min_humidity_; }
230 void set_visual_min_humidity(float visual_min_humidity) { this->visual_min_humidity_ = visual_min_humidity; }
231 float get_visual_max_humidity() const { return this->visual_max_humidity_; }
232 void set_visual_max_humidity(float visual_max_humidity) { this->visual_max_humidity_ = visual_max_humidity; }
233
234 protected:
236 if (supported) {
237 this->supported_modes_.insert(mode);
238 } else {
239 this->supported_modes_.erase(mode);
240 }
241 }
243 if (supported) {
244 this->supported_fan_modes_.insert(mode);
245 } else {
246 this->supported_fan_modes_.erase(mode);
247 }
248 }
250 if (supported) {
251 this->supported_swing_modes_.insert(mode);
252 } else {
253 this->supported_swing_modes_.erase(mode);
254 }
255 }
256
259 const char *find_custom_fan_mode_(const char *custom_fan_mode) const {
260 return vector_find(this->supported_custom_fan_modes_, custom_fan_mode);
261 }
262
265 const char *find_custom_preset_(const char *custom_preset) const {
266 return vector_find(this->supported_custom_presets_, custom_preset);
267 }
268
269 uint32_t feature_flags_{0};
276
281
290 std::vector<const char *> supported_custom_fan_modes_;
291 std::vector<const char *> supported_custom_presets_;
292};
293
294} // namespace esphome::climate
BedjetMode mode
BedJet operating mode.
constexpr size_t count(ValueType value) const
Check if the set contains a specific value (std::set compatibility) Returns 1 if present,...
constexpr void insert(ValueType value)
Add a single value to the set (std::set compatibility)
constexpr void erase(ValueType value)
Remove a value from the set (std::set compatibility)
constexpr bool empty() const
Check if the set is empty.
ClimateDevice - This is the base class for all climate integrations.
Definition climate.h:177
void set_visual_max_temperature(float visual_max_temperature)
void add_feature_flags(uint32_t feature_flags)
ESPDEPRECATED("This method is deprecated, use add_feature_flags() instead", "2025.11.0") void set_supports_current_humidity(bool supports_current_humidity)
std::vector< const char * > supported_custom_fan_modes_
Custom mode storage using const char* pointers to eliminate std::string overhead.
void add_supported_fan_mode(ClimateFanMode mode)
const ClimatePresetMask & get_supported_presets() const
ESPDEPRECATED("This method is deprecated, use add_feature_flags() instead", "2025.11.0") void set_supports_current_temperature(bool supports_current_temperature)
void set_supported_custom_fan_modes(const std::vector< const char * > &modes)
ESPDEPRECATED("This method is deprecated, use add_feature_flags() instead", "2025.11.0") void set_supports_target_humidity(bool supports_target_humidity)
void set_supported_custom_presets(const std::vector< std::string > &presets)=delete
void set_supported_custom_fan_modes(std::initializer_list< std::string > modes)=delete
const std::vector< const char * > & get_supported_custom_fan_modes() const
const ClimateSwingModeMask & get_supported_swing_modes() const
void set_visual_temperature_step(float temperature_step)
void add_supported_preset(ClimatePreset preset)
void set_visual_target_temperature_step(float temperature_step)
ESPDEPRECATED("This method is deprecated, use add_feature_flags() instead", "2025.11.0") void set_supports_two_point_target_temperature(bool supports_two_point_target_temperature)
ESPDEPRECATED("This method is deprecated, use add_feature_flags() instead", "2025.11.0") void set_supports_action(bool supports_action)
float get_visual_current_temperature_step() const
void set_supported_presets(ClimatePresetMask presets)
void set_supported_swing_modes(ClimateSwingModeMask modes)
void set_visual_min_temperature(float visual_min_temperature)
bool supports_mode(ClimateMode mode) const
int8_t get_target_temperature_accuracy_decimals() const
const ClimateFanModeMask & get_supported_fan_modes() const
float get_visual_target_temperature_step() const
void set_visual_min_humidity(float visual_min_humidity)
ESPDEPRECATED("This method is deprecated, use get_feature_flags() instead", "2025.11.0") bool get_supports_two_point_target_temperature() const
bool supports_custom_preset(const std::string &custom_preset) const
ESPDEPRECATED("This method is deprecated, use get_feature_flags() instead", "2025.11.0") bool get_supports_current_temperature() const
void set_visual_current_temperature_step(float temperature_step)
bool supports_custom_fan_mode(const char *custom_fan_mode) const
void set_supported_custom_presets(std::initializer_list< std::string > presets)=delete
void set_supported_custom_fan_modes(const char *const (&modes)[N])
void set_supported_modes(ClimateModeMask modes)
climate::ClimateFanModeMask supported_fan_modes_
bool supports_custom_preset(const char *custom_preset) const
climate::ClimateSwingModeMask supported_swing_modes_
ESPDEPRECATED("This method is deprecated, use get_feature_flags() instead", "2025.11.0") bool get_supports_action() const
bool has_feature_flags(uint32_t feature_flags) const
void set_supported_custom_presets(const std::vector< const char * > &presets)
climate::ClimatePresetMask supported_presets_
int8_t get_current_temperature_accuracy_decimals() const
void set_visual_max_humidity(float visual_max_humidity)
ESPDEPRECATED("This method is deprecated, use get_feature_flags() instead", "2025.11.0") bool get_supports_target_humidity() const
bool supports_fan_mode(ClimateFanMode fan_mode) const
ESPDEPRECATED("This method is deprecated, use get_feature_flags() instead", "2025.11.0") bool get_supports_current_humidity() const
void add_supported_mode(ClimateMode mode)
void set_feature_flags(uint32_t feature_flags)
bool supports_custom_fan_mode(const std::string &custom_fan_mode) const
void set_swing_mode_support_(climate::ClimateSwingMode mode, bool supported)
void set_supported_custom_presets(const char *const (&presets)[N])
void clear_feature_flags(uint32_t feature_flags)
climate::ClimateModeMask supported_modes_
bool supports_preset(ClimatePreset preset) const
void set_supported_fan_modes(ClimateFanModeMask modes)
const char * find_custom_fan_mode_(const char *custom_fan_mode) const
Find and return the matching custom fan mode pointer from supported modes, or nullptr if not found Th...
const char * find_custom_preset_(const char *custom_preset) const
Find and return the matching custom preset pointer from supported presets, or nullptr if not found Th...
void set_supported_custom_fan_modes(std::initializer_list< const char * > modes)
void set_supported_custom_presets(std::initializer_list< const char * > presets)
const std::vector< const char * > & get_supported_custom_presets() const
void set_fan_mode_support_(climate::ClimateFanMode mode, bool supported)
const ClimateModeMask & get_supported_modes() const
void add_supported_swing_mode(ClimateSwingMode mode)
uint32_t get_feature_flags() const
Get/set feature flags (see ClimateFeatures enum in climate_mode.h)
void set_supported_custom_fan_modes(const std::vector< std::string > &modes)=delete
bool supports_swing_mode(ClimateSwingMode swing_mode) const
void set_mode_support_(climate::ClimateMode mode, bool supported)
std::vector< const char * > supported_custom_presets_
ClimateSwingMode swing_mode
Definition climate.h:11
uint8_t custom_preset
Definition climate.h:9
ClimateFanMode fan_mode
Definition climate.h:3
ClimatePreset preset
Definition climate.h:8
uint8_t custom_fan_mode
Definition climate.h:4
@ CLIMATE_SUPPORTS_CURRENT_HUMIDITY
@ CLIMATE_SUPPORTS_CURRENT_TEMPERATURE
@ CLIMATE_REQUIRES_TWO_POINT_TARGET_TEMPERATURE
bool vector_contains(const std::vector< const char * > &vec, const char *value)
ClimatePreset
Enum for all preset modes NOTE: If adding values, update ClimatePresetMask in climate_traits....
ClimateSwingMode
Enum for all modes a climate swing can be in NOTE: If adding values, update ClimateSwingModeMask in c...
ClimateMode
Enum for all modes a climate device can be in.
@ CLIMATE_MODE_OFF
The climate device is off.
const char * vector_find(const std::vector< const char * > &vec, const char *value)
ClimateFanMode
NOTE: If adding values, update ClimateFanModeMask in climate_traits.h to use the new last value.