ESPHome 2025.12.0-dev
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 {
10namespace climate {
11
12// Type aliases for climate enum bitmasks
13// These replace std::set<EnumType> to eliminate red-black tree overhead
14// For contiguous enums starting at 0, DefaultBitPolicy provides 1:1 mapping (enum value = bit position)
15// Bitmask size is automatically calculated from the last enum value
21
22// Lightweight linear search for small vectors (1-20 items) of const char* pointers
23// Avoids std::find template overhead
24inline bool vector_contains(const std::vector<const char *> &vec, const char *value) {
25 for (const char *item : vec) {
26 if (strcmp(item, value) == 0)
27 return true;
28 }
29 return false;
30}
31
32// Find and return matching pointer from vector, or nullptr if not found
33inline const char *vector_find(const std::vector<const char *> &vec, const char *value) {
34 for (const char *item : vec) {
35 if (strcmp(item, value) == 0)
36 return item;
37 }
38 return nullptr;
39}
40
68class Climate; // Forward declaration
69
71 friend class Climate; // Allow Climate to access protected find methods
72
73 public:
75 uint32_t get_feature_flags() const { return this->feature_flags_; }
76 void add_feature_flags(uint32_t feature_flags) { this->feature_flags_ |= feature_flags; }
77 void clear_feature_flags(uint32_t feature_flags) { this->feature_flags_ &= ~feature_flags; }
78 bool has_feature_flags(uint32_t feature_flags) const { return this->feature_flags_ & feature_flags; }
79 void set_feature_flags(uint32_t feature_flags) { this->feature_flags_ = feature_flags; }
80
81 ESPDEPRECATED("This method is deprecated, use get_feature_flags() instead", "2025.11.0")
82 bool get_supports_current_temperature() const {
84 }
85 ESPDEPRECATED("This method is deprecated, use add_feature_flags() instead", "2025.11.0")
86 void set_supports_current_temperature(bool supports_current_temperature) {
87 if (supports_current_temperature) {
89 } else {
91 }
92 }
93 ESPDEPRECATED("This method is deprecated, use get_feature_flags() instead", "2025.11.0")
94 bool get_supports_current_humidity() const { return this->has_feature_flags(CLIMATE_SUPPORTS_CURRENT_HUMIDITY); }
95 ESPDEPRECATED("This method is deprecated, use add_feature_flags() instead", "2025.11.0")
96 void set_supports_current_humidity(bool supports_current_humidity) {
97 if (supports_current_humidity) {
99 } else {
101 }
102 }
103 ESPDEPRECATED("This method is deprecated, use get_feature_flags() instead", "2025.11.0")
104 bool get_supports_two_point_target_temperature() const {
106 }
107 ESPDEPRECATED("This method is deprecated, use add_feature_flags() instead", "2025.11.0")
108 void set_supports_two_point_target_temperature(bool supports_two_point_target_temperature) {
109 if (supports_two_point_target_temperature)
110 // Use CLIMATE_REQUIRES_TWO_POINT_TARGET_TEMPERATURE to mimic previous behavior
111 {
113 } else {
115 }
116 }
117 ESPDEPRECATED("This method is deprecated, use get_feature_flags() instead", "2025.11.0")
118 bool get_supports_target_humidity() const { return this->has_feature_flags(CLIMATE_SUPPORTS_TARGET_HUMIDITY); }
119 ESPDEPRECATED("This method is deprecated, use add_feature_flags() instead", "2025.11.0")
120 void set_supports_target_humidity(bool supports_target_humidity) {
121 if (supports_target_humidity) {
123 } else {
125 }
126 }
127 ESPDEPRECATED("This method is deprecated, use get_feature_flags() instead", "2025.11.0")
128 bool get_supports_action() const { return this->has_feature_flags(CLIMATE_SUPPORTS_ACTION); }
129 ESPDEPRECATED("This method is deprecated, use add_feature_flags() instead", "2025.11.0")
130 void set_supports_action(bool supports_action) {
131 if (supports_action) {
133 } else {
135 }
136 }
137
140 bool supports_mode(ClimateMode mode) const { return this->supported_modes_.count(mode); }
141 const ClimateModeMask &get_supported_modes() const { return this->supported_modes_; }
142
147 return !this->supported_fan_modes_.empty() || !this->supported_custom_fan_modes_.empty();
148 }
150
151 void set_supported_custom_fan_modes(std::initializer_list<const char *> modes) {
152 this->supported_custom_fan_modes_ = modes;
153 }
154 void set_supported_custom_fan_modes(const std::vector<const char *> &modes) {
155 this->supported_custom_fan_modes_ = modes;
156 }
157 template<size_t N> void set_supported_custom_fan_modes(const char *const (&modes)[N]) {
158 this->supported_custom_fan_modes_.assign(modes, modes + N);
159 }
160
161 // Deleted overloads to catch incorrect std::string usage at compile time with clear error messages
162 void set_supported_custom_fan_modes(const std::vector<std::string> &modes) = delete;
163 void set_supported_custom_fan_modes(std::initializer_list<std::string> modes) = delete;
164
165 const std::vector<const char *> &get_supported_custom_fan_modes() const { return this->supported_custom_fan_modes_; }
167 return vector_contains(this->supported_custom_fan_modes_, custom_fan_mode);
168 }
169 bool supports_custom_fan_mode(const std::string &custom_fan_mode) const {
170 return this->supports_custom_fan_mode(custom_fan_mode.c_str());
171 }
172
175 bool supports_preset(ClimatePreset preset) const { return this->supported_presets_.count(preset); }
176 bool get_supports_presets() const { return !this->supported_presets_.empty(); }
178
179 void set_supported_custom_presets(std::initializer_list<const char *> presets) {
180 this->supported_custom_presets_ = presets;
181 }
182 void set_supported_custom_presets(const std::vector<const char *> &presets) {
183 this->supported_custom_presets_ = presets;
184 }
185 template<size_t N> void set_supported_custom_presets(const char *const (&presets)[N]) {
186 this->supported_custom_presets_.assign(presets, presets + N);
187 }
188
189 // Deleted overloads to catch incorrect std::string usage at compile time with clear error messages
190 void set_supported_custom_presets(const std::vector<std::string> &presets) = delete;
191 void set_supported_custom_presets(std::initializer_list<std::string> presets) = delete;
192
193 const std::vector<const char *> &get_supported_custom_presets() const { return this->supported_custom_presets_; }
194 bool supports_custom_preset(const char *custom_preset) const {
195 return vector_contains(this->supported_custom_presets_, custom_preset);
196 }
197 bool supports_custom_preset(const std::string &custom_preset) const {
198 return this->supports_custom_preset(custom_preset.c_str());
199 }
200
204 bool get_supports_swing_modes() const { return !this->supported_swing_modes_.empty(); }
206
208 void set_visual_min_temperature(float visual_min_temperature) {
209 this->visual_min_temperature_ = visual_min_temperature;
210 }
212 void set_visual_max_temperature(float visual_max_temperature) {
213 this->visual_max_temperature_ = visual_max_temperature;
214 }
217 void set_visual_target_temperature_step(float temperature_step) {
218 this->visual_target_temperature_step_ = temperature_step;
219 }
220 void set_visual_current_temperature_step(float temperature_step) {
221 this->visual_current_temperature_step_ = temperature_step;
222 }
223 void set_visual_temperature_step(float temperature_step) {
224 this->visual_target_temperature_step_ = temperature_step;
225 this->visual_current_temperature_step_ = temperature_step;
226 }
229
230 float get_visual_min_humidity() const { return this->visual_min_humidity_; }
231 void set_visual_min_humidity(float visual_min_humidity) { this->visual_min_humidity_ = visual_min_humidity; }
232 float get_visual_max_humidity() const { return this->visual_max_humidity_; }
233 void set_visual_max_humidity(float visual_max_humidity) { this->visual_max_humidity_ = visual_max_humidity; }
234
235 protected:
237 if (supported) {
238 this->supported_modes_.insert(mode);
239 } else {
240 this->supported_modes_.erase(mode);
241 }
242 }
244 if (supported) {
245 this->supported_fan_modes_.insert(mode);
246 } else {
247 this->supported_fan_modes_.erase(mode);
248 }
249 }
251 if (supported) {
252 this->supported_swing_modes_.insert(mode);
253 } else {
254 this->supported_swing_modes_.erase(mode);
255 }
256 }
257
260 const char *find_custom_fan_mode_(const char *custom_fan_mode) const {
261 return vector_find(this->supported_custom_fan_modes_, custom_fan_mode);
262 }
263
266 const char *find_custom_preset_(const char *custom_preset) const {
267 return vector_find(this->supported_custom_presets_, custom_preset);
268 }
269
270 uint32_t feature_flags_{0};
277
282
291 std::vector<const char *> supported_custom_fan_modes_;
292 std::vector<const char *> supported_custom_presets_;
293};
294
295} // namespace climate
296} // namespace esphome
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:178
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.
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7