9static const char *
const TAG =
"climate";
53 ESP_LOGD(TAG,
" Mode: %s", LOG_STR_ARG(mode_s));
55 if (this->custom_fan_mode_ !=
nullptr) {
57 ESP_LOGD(TAG,
" Custom Fan: %s", this->custom_fan_mode_);
60 this->custom_fan_mode_ =
nullptr;
62 ESP_LOGD(TAG,
" Fan: %s", LOG_STR_ARG(fan_mode_s));
64 if (this->custom_preset_ !=
nullptr) {
66 ESP_LOGD(TAG,
" Custom Preset: %s", this->custom_preset_);
69 this->custom_preset_ =
nullptr;
71 ESP_LOGD(TAG,
" Preset: %s", LOG_STR_ARG(preset_s));
75 ESP_LOGD(TAG,
" Swing: %s", LOG_STR_ARG(swing_mode_s));
96 if (!traits.supports_mode(
mode)) {
101 if (this->custom_fan_mode_ !=
nullptr) {
102 if (!traits.supports_custom_fan_mode(this->custom_fan_mode_)) {
103 ESP_LOGW(TAG,
" Fan Mode %s not supported", this->custom_fan_mode_);
104 this->custom_fan_mode_ =
nullptr;
108 if (!traits.supports_fan_mode(
fan_mode)) {
113 if (this->custom_preset_ !=
nullptr) {
114 if (!traits.supports_custom_preset(this->custom_preset_)) {
115 ESP_LOGW(TAG,
" Preset %s not supported", this->custom_preset_);
116 this->custom_preset_ =
nullptr;
120 if (!traits.supports_preset(
preset)) {
127 if (!traits.supports_swing_mode(
swing_mode)) {
136 ESP_LOGW(TAG,
" Cannot set target temperature for climate device "
137 "with two-point target temperature");
139 }
else if (std::isnan(target)) {
140 ESP_LOGW(TAG,
" Target temperature must not be NAN");
147 ESP_LOGW(TAG,
" Cannot set low/high target temperature");
153 ESP_LOGW(TAG,
" Target temperature low must not be NAN");
157 ESP_LOGW(TAG,
" Target temperature high must not be NAN");
164 ESP_LOGW(TAG,
" Target temperature low %.2f must be less than target temperature high %.2f", low, high);
189 this->custom_fan_mode_ =
nullptr;
202 this->custom_fan_mode_ = mode_ptr;
206 ESP_LOGW(TAG,
"'%s' - Unrecognized fan mode %s", this->
parent_->
get_name().
c_str(), custom_fan_mode);
221 this->custom_preset_ =
nullptr;
234 this->custom_preset_ = preset_ptr;
238 ESP_LOGW(TAG,
"'%s' - Unrecognized preset %s", this->
parent_->
get_name().
c_str(), custom_preset);
263 ESP_LOGW(TAG,
"'%s' - Unrecognized swing mode %s", this->
parent_->
get_name().
c_str(), swing_mode.c_str());
324 this->custom_fan_mode_ =
nullptr;
330 this->custom_preset_ =
nullptr;
348static const uint32_t RESTORE_STATE_VERSION = 0x848EA6ADUL;
352 RESTORE_STATE_VERSION);
360#if (defined(USE_ESP_IDF) || (defined(USE_ESP8266) && USE_ARDUINO_VERSION_CODE >= VERSION_CODE(3, 0, 0))) && \
362#pragma GCC diagnostic ignored "-Wclass-memaccess"
363#define TEMP_IGNORE_MEMACCESS
368#ifdef TEMP_IGNORE_MEMACCESS
369#pragma GCC diagnostic pop
370#undef TEMP_IGNORE_MEMACCESS
386 state.uses_custom_fan_mode =
false;
390 state.uses_custom_fan_mode =
true;
394 for (
const char *
mode : supported) {
395 if (strcmp(
mode, this->custom_fan_mode_) == 0) {
396 state.custom_fan_mode = i;
403 state.uses_custom_preset =
false;
407 state.uses_custom_preset =
true;
411 for (
const char *
preset : supported) {
412 if (strcmp(
preset, this->custom_preset_) == 0) {
413 state.custom_preset = i;
427 ESP_LOGD(TAG,
"'%s' - Sending state:", this->
name_.
c_str());
438 ESP_LOGD(TAG,
" Custom Fan Mode: %s", this->custom_fan_mode_);
444 ESP_LOGD(TAG,
" Custom Preset: %s", this->custom_preset_);
468#if defined(USE_CLIMATE) && defined(USE_CONTROLLER_REGISTRY)
523 call.set_mode(this->
mode);
535 if (this->
custom_fan_mode < traits.get_supported_custom_fan_modes().size()) {
536 call.fan_mode_.reset();
537 call.custom_fan_mode_ = traits.get_supported_custom_fan_modes()[this->
custom_fan_mode];
539 }
else if (traits.supports_fan_mode(this->fan_mode)) {
543 if (this->
custom_preset < traits.get_supported_custom_presets().size()) {
544 call.preset_.reset();
545 call.custom_preset_ = traits.get_supported_custom_presets()[this->
custom_preset];
547 }
else if (traits.supports_preset(this->preset)) {
548 call.set_preset(this->
preset);
550 if (traits.supports_swing_mode(this->swing_mode)) {
570 if (this->
custom_fan_mode < traits.get_supported_custom_fan_modes().size()) {
572 climate->custom_fan_mode_ = traits.get_supported_custom_fan_modes()[this->
custom_fan_mode];
574 }
else if (traits.supports_fan_mode(this->fan_mode)) {
579 if (this->
custom_preset < traits.get_supported_custom_presets().size()) {
581 climate->custom_preset_ = traits.get_supported_custom_presets()[this->
custom_preset];
583 }
else if (traits.supports_preset(this->preset)) {
587 if (traits.supports_swing_mode(this->swing_mode)) {
614 bool changed = custom_ptr !=
nullptr;
615 custom_ptr =
nullptr;
617 if (changed || !primary.
has_value() || primary.
value() != value) {
647 if (found_ptr !=
nullptr) {
652 if (changed || custom_ptr != found_ptr) {
653 custom_ptr = found_ptr;
660 custom_ptr =
nullptr;
673 this->has_custom_fan_mode());
683 this->has_custom_preset());
698 ESP_LOGCONFIG(tag,
"ClimateTraits:");
700 " Visual settings:\n"
701 " - Min temperature: %.1f\n"
702 " - Max temperature: %.1f\n"
703 " - Temperature step:\n"
713 " - Min humidity: %.0f\n"
714 " - Max humidity: %.0f",
719 ESP_LOGCONFIG(tag,
" Supports two-point target temperature");
722 ESP_LOGCONFIG(tag,
" Supports current temperature");
725 ESP_LOGCONFIG(tag,
" Supports target humidity");
728 ESP_LOGCONFIG(tag,
" Supports current humidity");
731 ESP_LOGCONFIG(tag,
" Supports action");
734 ESP_LOGCONFIG(tag,
" Supported modes:");
739 ESP_LOGCONFIG(tag,
" Supported fan modes:");
744 ESP_LOGCONFIG(tag,
" Supported custom fan modes:");
746 ESP_LOGCONFIG(tag,
" - %s", s);
749 ESP_LOGCONFIG(tag,
" Supported presets:");
754 ESP_LOGCONFIG(tag,
" Supported custom presets:");
756 ESP_LOGCONFIG(tag,
" - %s", s);
759 ESP_LOGCONFIG(tag,
" Supported swing modes:");
BedjetMode mode
BedJet operating mode.
static void notify_climate_update(climate::Climate *obj)
virtual ESPPreferenceObject make_preference(size_t length, uint32_t type, bool in_flash)=0
const StringRef & get_name() const
uint32_t get_preference_hash()
Get a unique hash for storing preferences/settings for this entity.
constexpr bool empty() const
Check if the set is empty.
constexpr const char * c_str() const
This class is used to encode all control actions on a climate device.
const optional< ClimateSwingMode > & get_swing_mode() const
optional< float > target_temperature_high_
const optional< float > & get_target_humidity() const
ClimateCall & set_target_temperature(float target_temperature)
Set the target temperature of the climate device.
const optional< float > & get_target_temperature_low() const
ClimateCall & set_swing_mode(ClimateSwingMode swing_mode)
Set the swing mode of the climate device.
optional< ClimateFanMode > fan_mode_
ClimateCall & set_target_temperature_low(float target_temperature_low)
Set the low point target temperature of the climate device.
optional< float > target_temperature_
const optional< float > & get_target_temperature() const
const optional< ClimatePreset > & get_preset() const
optional< ClimateSwingMode > swing_mode_
optional< ClimateMode > mode_
ClimateCall & set_preset(ClimatePreset preset)
Set the preset of the climate device.
const optional< float > & get_target_temperature_high() const
const optional< ClimateFanMode > & get_fan_mode() const
optional< float > target_humidity_
ClimateCall & set_fan_mode(ClimateFanMode fan_mode)
Set the fan mode of the climate device.
optional< ClimatePreset > preset_
ClimateCall & set_target_humidity(float target_humidity)
Set the target humidity of the climate device.
optional< float > target_temperature_low_
ClimateCall & set_target_temperature_high(float target_temperature_high)
Set the high point target temperature of the climate device.
ClimateCall & set_mode(ClimateMode mode)
Set the mode of the climate device.
const optional< ClimateMode > & get_mode() const
ClimateDevice - This is the base class for all climate integrations.
ClimateMode mode
The active mode of the climate device.
optional< ClimateFanMode > fan_mode
The active fan mode of the climate device.
optional< float > visual_max_humidity_override_
ClimateTraits get_traits()
Get the traits of this climate device with all overrides applied.
float target_temperature
The target temperature of the climate device.
float current_humidity
The current humidity of the climate device, as reported from the integration.
void set_visual_min_humidity_override(float visual_min_humidity_override)
optional< float > visual_current_temperature_step_override_
void dump_traits_(const char *tag)
CallbackManager< void(ClimateCall &)> control_callback_
CallbackManager< void(Climate &)> state_callback_
ClimateSwingMode swing_mode
The active swing mode of the climate device.
optional< float > visual_target_temperature_step_override_
void save_state_()
Internal method to save the state of the climate device to recover memory.
float target_temperature_low
The minimum target temperature of the climate device, for climate devices with split target temperatu...
void set_visual_max_humidity_override(float visual_max_humidity_override)
void add_on_state_callback(std::function< void(Climate &)> &&callback)
Add a callback for the climate device state, each time the state of the climate device is updated (us...
virtual ClimateTraits traits()=0
Get the default traits of this climate device.
bool set_preset_(ClimatePreset preset)
Set preset. Reset custom preset. Return true if preset has been changed.
bool set_custom_preset_(const char *preset)
Set custom preset. Reset primary preset. Return true if preset has been changed.
const char * find_custom_fan_mode_(const char *custom_fan_mode)
Find and return the matching custom fan mode pointer from traits, or nullptr if not found.
void set_visual_max_temperature_override(float visual_max_temperature_override)
optional< float > visual_min_humidity_override_
void clear_custom_preset_()
Clear custom preset.
optional< float > visual_max_temperature_override_
bool set_fan_mode_(ClimateFanMode mode)
Set fan mode. Reset custom fan mode. Return true if fan mode has been changed.
optional< float > visual_min_temperature_override_
const char * find_custom_preset_(const char *custom_preset)
Find and return the matching custom preset pointer from traits, or nullptr if not found.
void clear_custom_fan_mode_()
Clear custom fan mode.
void add_on_control_callback(std::function< void(ClimateCall &)> &&callback)
Add a callback for the climate device configuration; each time the configuration parameters of a clim...
float current_temperature
The current temperature of the climate device, as reported from the integration.
ClimateAction action
The active state of the climate device.
ClimateCall make_call()
Make a climate device control call, this is used to control the climate device, see the ClimateCall d...
virtual void control(const ClimateCall &call)=0
Control the climate device, this is a virtual method that each climate integration must implement.
void publish_state()
Publish the state of the climate device, to be called from integrations.
void set_visual_temperature_step_override(float target, float current)
optional< ClimatePreset > preset
The active preset of the climate device.
void set_visual_min_temperature_override(float visual_min_temperature_override)
optional< ClimateDeviceRestoreState > restore_state_()
Restore the state of the climate device, call this from your setup() method.
float target_humidity
The target humidity of the climate device.
bool set_custom_fan_mode_(const char *mode)
Set custom fan mode. Reset primary fan mode. Return true if fan mode has been changed.
float target_temperature_high
The maximum target temperature of the climate device, for climate devices with split target temperatu...
void set_visual_max_temperature(float visual_max_temperature)
const ClimatePresetMask & get_supported_presets() const
float get_visual_min_humidity() const
bool get_supports_swing_modes() const
const std::vector< const char * > & get_supported_custom_fan_modes() const
const ClimateSwingModeMask & get_supported_swing_modes() const
void set_visual_target_temperature_step(float temperature_step)
float get_visual_current_temperature_step() const
void set_visual_min_temperature(float visual_min_temperature)
bool get_supports_fan_modes() const
const ClimateFanModeMask & get_supported_fan_modes() const
float get_visual_target_temperature_step() const
void set_visual_min_humidity(float visual_min_humidity)
void set_visual_current_temperature_step(float temperature_step)
bool has_feature_flags(uint32_t feature_flags) const
void set_visual_max_humidity(float visual_max_humidity)
float get_visual_max_humidity() const
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...
const std::vector< const char * > & get_supported_custom_presets() const
const ClimateModeMask & get_supported_modes() const
bool get_supports_presets() const
float get_visual_max_temperature() const
float get_visual_min_temperature() const
value_type const & value() const
float target_temperature_high
ClimateSwingMode swing_mode
float target_temperature_low
const LogString * climate_action_to_string(ClimateAction action)
Convert the given ClimateAction to a human-readable string.
constexpr StringToUint8 CLIMATE_MODES_BY_STR[]
@ CLIMATE_SUPPORTS_CURRENT_HUMIDITY
@ CLIMATE_SUPPORTS_TARGET_HUMIDITY
@ CLIMATE_SUPPORTS_TWO_POINT_TARGET_TEMPERATURE
@ CLIMATE_SUPPORTS_CURRENT_TEMPERATURE
@ CLIMATE_SUPPORTS_ACTION
@ CLIMATE_REQUIRES_TWO_POINT_TARGET_TEMPERATURE
const LogString * climate_swing_mode_to_string(ClimateSwingMode swing_mode)
Convert the given ClimateSwingMode to a human-readable string.
constexpr StringToUint8 CLIMATE_PRESETS_BY_STR[]
const LogString * climate_preset_to_string(ClimatePreset preset)
Convert the given PresetMode to a human-readable string.
ClimatePreset
Enum for all preset modes NOTE: If adding values, update ClimatePresetMask in climate_traits....
@ CLIMATE_PRESET_NONE
No preset is active.
@ CLIMATE_PRESET_COMFORT
Device is in comfort preset.
@ CLIMATE_PRESET_AWAY
Device is in away preset.
@ CLIMATE_PRESET_BOOST
Device is in boost preset.
@ CLIMATE_PRESET_ACTIVITY
Device is reacting to activity (e.g., movement sensors)
@ CLIMATE_PRESET_SLEEP
Device is prepared for sleep.
@ CLIMATE_PRESET_HOME
Device is in home preset.
@ CLIMATE_PRESET_ECO
Device is running an energy-saving preset.
const LogString * climate_fan_mode_to_string(ClimateFanMode fan_mode)
Convert the given ClimateFanMode to a human-readable string.
constexpr StringToUint8 CLIMATE_FAN_MODES_BY_STR[]
ClimateSwingMode
Enum for all modes a climate swing can be in NOTE: If adding values, update ClimateSwingModeMask in c...
@ CLIMATE_SWING_OFF
The swing mode is set to Off.
@ CLIMATE_SWING_HORIZONTAL
The fan mode is set to Horizontal.
@ CLIMATE_SWING_VERTICAL
The fan mode is set to Vertical.
@ CLIMATE_SWING_BOTH
The fan mode is set to Both.
ClimateMode
Enum for all modes a climate device can be in.
@ CLIMATE_MODE_DRY
The climate device is set to dry/humidity mode.
@ CLIMATE_MODE_FAN_ONLY
The climate device only has the fan enabled, no heating or cooling is taking place.
@ CLIMATE_MODE_HEAT
The climate device is set to heat to reach the target temperature.
@ CLIMATE_MODE_COOL
The climate device is set to cool to reach the target temperature.
@ CLIMATE_MODE_HEAT_COOL
The climate device is set to heat/cool to reach the target temperature.
@ CLIMATE_MODE_OFF
The climate device is off.
@ CLIMATE_MODE_AUTO
The climate device is adjusting the temperature dynamically.
const LogString * climate_mode_to_string(ClimateMode mode)
Convert the given ClimateMode to a human-readable string.
bool set_primary_mode(optional< T > &primary, const char *&custom_ptr, T value)
Template helper for setting primary modes (fan_mode, preset) with mutual exclusion.
constexpr StringToUint8 CLIMATE_SWING_MODES_BY_STR[]
bool set_custom_mode(const char *&custom_ptr, optional< T > &primary, const char *found_ptr, bool has_custom)
Template helper for setting custom modes (custom_fan_mode_, custom_preset_) with mutual exclusion.
ClimateFanMode
NOTE: If adding values, update ClimateFanModeMask in climate_traits.h to use the new last value.
@ CLIMATE_FAN_MEDIUM
The fan mode is set to Medium.
@ CLIMATE_FAN_DIFFUSE
The fan mode is set to Diffuse.
@ CLIMATE_FAN_ON
The fan mode is set to On.
@ CLIMATE_FAN_AUTO
The fan mode is set to Auto.
@ CLIMATE_FAN_FOCUS
The fan mode is set to Focus.
@ CLIMATE_FAN_LOW
The fan mode is set to Low.
@ CLIMATE_FAN_MIDDLE
The fan mode is set to Middle.
@ CLIMATE_FAN_QUIET
The fan mode is set to Quiet.
@ CLIMATE_FAN_OFF
The fan mode is set to Off.
@ CLIMATE_FAN_HIGH
The fan mode is set to High.
Providing packet encoding functions for exchanging data with a remote host.
ESPPreferences * global_preferences
bool str_equals_case_insensitive(const std::string &a, const std::string &b)
Compare strings for equality in case-insensitive manner.
Struct used to save the state of the climate device in restore memory.
ClimateCall to_call(Climate *climate)
Convert this struct to a climate call that can be performed.
float target_temperature_high
void apply(Climate *climate)
Apply these settings to the climate device.
bool uses_custom_fan_mode
ClimateSwingMode swing_mode
float target_temperature_low