ESPHome 2026.2.1
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, size_t len) {
24 for (const char *item : vec) {
25 if (strncmp(item, value, len) == 0 && item[len] == '\0')
26 return true;
27 }
28 return false;
29}
30
31inline bool vector_contains(const std::vector<const char *> &vec, const char *value) {
32 return vector_contains(vec, value, strlen(value));
33}
34
35// Find and return matching pointer from vector, or nullptr if not found
36inline const char *vector_find(const std::vector<const char *> &vec, const char *value, size_t len) {
37 for (const char *item : vec) {
38 if (strncmp(item, value, len) == 0 && item[len] == '\0')
39 return item;
40 }
41 return nullptr;
42}
43
71class Climate; // Forward declaration
72
74 friend class Climate; // Allow Climate to access protected find methods
75
76 public:
78 uint32_t get_feature_flags() const { return this->feature_flags_; }
79 void add_feature_flags(uint32_t feature_flags) { this->feature_flags_ |= feature_flags; }
80 void clear_feature_flags(uint32_t feature_flags) { this->feature_flags_ &= ~feature_flags; }
81 bool has_feature_flags(uint32_t feature_flags) const { return this->feature_flags_ & feature_flags; }
82 void set_feature_flags(uint32_t feature_flags) { this->feature_flags_ = feature_flags; }
83
84 ESPDEPRECATED("This method is deprecated, use get_feature_flags() instead", "2025.11.0")
85 bool get_supports_current_temperature() const {
87 }
88 ESPDEPRECATED("This method is deprecated, use add_feature_flags() instead", "2025.11.0")
89 void set_supports_current_temperature(bool supports_current_temperature) {
90 if (supports_current_temperature) {
92 } else {
94 }
95 }
96 ESPDEPRECATED("This method is deprecated, use get_feature_flags() instead", "2025.11.0")
97 bool get_supports_current_humidity() const { return this->has_feature_flags(CLIMATE_SUPPORTS_CURRENT_HUMIDITY); }
98 ESPDEPRECATED("This method is deprecated, use add_feature_flags() instead", "2025.11.0")
99 void set_supports_current_humidity(bool supports_current_humidity) {
100 if (supports_current_humidity) {
102 } else {
104 }
105 }
106 ESPDEPRECATED("This method is deprecated, use get_feature_flags() instead", "2025.11.0")
107 bool get_supports_two_point_target_temperature() const {
109 }
110 ESPDEPRECATED("This method is deprecated, use add_feature_flags() instead", "2025.11.0")
111 void set_supports_two_point_target_temperature(bool supports_two_point_target_temperature) {
112 if (supports_two_point_target_temperature)
113 // Use CLIMATE_REQUIRES_TWO_POINT_TARGET_TEMPERATURE to mimic previous behavior
114 {
116 } else {
118 }
119 }
120 ESPDEPRECATED("This method is deprecated, use get_feature_flags() instead", "2025.11.0")
121 bool get_supports_target_humidity() const { return this->has_feature_flags(CLIMATE_SUPPORTS_TARGET_HUMIDITY); }
122 ESPDEPRECATED("This method is deprecated, use add_feature_flags() instead", "2025.11.0")
123 void set_supports_target_humidity(bool supports_target_humidity) {
124 if (supports_target_humidity) {
126 } else {
128 }
129 }
130 ESPDEPRECATED("This method is deprecated, use get_feature_flags() instead", "2025.11.0")
131 bool get_supports_action() const { return this->has_feature_flags(CLIMATE_SUPPORTS_ACTION); }
132 ESPDEPRECATED("This method is deprecated, use add_feature_flags() instead", "2025.11.0")
133 void set_supports_action(bool supports_action) {
134 if (supports_action) {
136 } else {
138 }
139 }
140
143 bool supports_mode(ClimateMode mode) const { return this->supported_modes_.count(mode); }
144 const ClimateModeMask &get_supported_modes() const { return this->supported_modes_; }
145
150 return !this->supported_fan_modes_.empty() || !this->supported_custom_fan_modes_.empty();
151 }
153
154 void set_supported_custom_fan_modes(std::initializer_list<const char *> modes) {
155 this->supported_custom_fan_modes_ = modes;
156 }
157 void set_supported_custom_fan_modes(const std::vector<const char *> &modes) {
158 this->supported_custom_fan_modes_ = modes;
159 }
160 template<size_t N> void set_supported_custom_fan_modes(const char *const (&modes)[N]) {
161 this->supported_custom_fan_modes_.assign(modes, modes + N);
162 }
163
164 // Deleted overloads to catch incorrect std::string usage at compile time with clear error messages
165 void set_supported_custom_fan_modes(const std::vector<std::string> &modes) = delete;
166 void set_supported_custom_fan_modes(std::initializer_list<std::string> modes) = delete;
167
168 const std::vector<const char *> &get_supported_custom_fan_modes() const { return this->supported_custom_fan_modes_; }
170 return vector_contains(this->supported_custom_fan_modes_, custom_fan_mode);
171 }
172 bool supports_custom_fan_mode(const std::string &custom_fan_mode) const {
173 return this->supports_custom_fan_mode(custom_fan_mode.c_str());
174 }
175
178 bool supports_preset(ClimatePreset preset) const { return this->supported_presets_.count(preset); }
179 bool get_supports_presets() const { return !this->supported_presets_.empty(); }
181
182 void set_supported_custom_presets(std::initializer_list<const char *> presets) {
183 this->supported_custom_presets_ = presets;
184 }
185 void set_supported_custom_presets(const std::vector<const char *> &presets) {
186 this->supported_custom_presets_ = presets;
187 }
188 template<size_t N> void set_supported_custom_presets(const char *const (&presets)[N]) {
189 this->supported_custom_presets_.assign(presets, presets + N);
190 }
191
192 // Deleted overloads to catch incorrect std::string usage at compile time with clear error messages
193 void set_supported_custom_presets(const std::vector<std::string> &presets) = delete;
194 void set_supported_custom_presets(std::initializer_list<std::string> presets) = delete;
195
196 const std::vector<const char *> &get_supported_custom_presets() const { return this->supported_custom_presets_; }
197 bool supports_custom_preset(const char *custom_preset) const {
198 return vector_contains(this->supported_custom_presets_, custom_preset);
199 }
200 bool supports_custom_preset(const std::string &custom_preset) const {
201 return this->supports_custom_preset(custom_preset.c_str());
202 }
203
207 bool get_supports_swing_modes() const { return !this->supported_swing_modes_.empty(); }
209
211 void set_visual_min_temperature(float visual_min_temperature) {
212 this->visual_min_temperature_ = visual_min_temperature;
213 }
215 void set_visual_max_temperature(float visual_max_temperature) {
216 this->visual_max_temperature_ = visual_max_temperature;
217 }
220 void set_visual_target_temperature_step(float temperature_step) {
221 this->visual_target_temperature_step_ = temperature_step;
222 }
223 void set_visual_current_temperature_step(float temperature_step) {
224 this->visual_current_temperature_step_ = temperature_step;
225 }
226 void set_visual_temperature_step(float temperature_step) {
227 this->visual_target_temperature_step_ = temperature_step;
228 this->visual_current_temperature_step_ = temperature_step;
229 }
232
233 float get_visual_min_humidity() const { return this->visual_min_humidity_; }
234 void set_visual_min_humidity(float visual_min_humidity) { this->visual_min_humidity_ = visual_min_humidity; }
235 float get_visual_max_humidity() const { return this->visual_max_humidity_; }
236 void set_visual_max_humidity(float visual_max_humidity) { this->visual_max_humidity_ = visual_max_humidity; }
237
238 protected:
240 if (supported) {
241 this->supported_modes_.insert(mode);
242 } else {
243 this->supported_modes_.erase(mode);
244 }
245 }
247 if (supported) {
248 this->supported_fan_modes_.insert(mode);
249 } else {
250 this->supported_fan_modes_.erase(mode);
251 }
252 }
254 if (supported) {
255 this->supported_swing_modes_.insert(mode);
256 } else {
257 this->supported_swing_modes_.erase(mode);
258 }
259 }
260
263 const char *find_custom_fan_mode_(const char *custom_fan_mode) const {
264 return this->find_custom_fan_mode_(custom_fan_mode, strlen(custom_fan_mode));
265 }
266 const char *find_custom_fan_mode_(const char *custom_fan_mode, size_t len) const {
267 return vector_find(this->supported_custom_fan_modes_, custom_fan_mode, len);
268 }
269
272 const char *find_custom_preset_(const char *custom_preset) const {
273 return this->find_custom_preset_(custom_preset, strlen(custom_preset));
274 }
275 const char *find_custom_preset_(const char *custom_preset, size_t len) const {
276 return vector_find(this->supported_custom_presets_, custom_preset, len);
277 }
278
279 uint32_t feature_flags_{0};
286
291
300 std::vector<const char *> supported_custom_fan_modes_;
301 std::vector<const char *> supported_custom_presets_;
302};
303
304} // 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:182
void set_visual_max_temperature(float visual_max_temperature)
const char * find_custom_fan_mode_(const char *custom_fan_mode, size_t len) const
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
const char * find_custom_preset_(const char *custom_preset, size_t len) 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
bool vector_contains(const std::vector< const char * > &vec, const char *value, size_t len)
@ CLIMATE_SUPPORTS_CURRENT_HUMIDITY
@ CLIMATE_SUPPORTS_CURRENT_TEMPERATURE
@ CLIMATE_REQUIRES_TWO_POINT_TARGET_TEMPERATURE
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.
ClimateFanMode
NOTE: If adding values, update ClimateFanModeMask in climate_traits.h to use the new last value.
const char * vector_find(const std::vector< const char * > &vec, const char *value, size_t len)
std::string size_t len
Definition helpers.h:692