7 static const char *
const TAG =
"climate";
14 ESP_LOGD(TAG,
" Mode: %s", LOG_STR_ARG(mode_s));
23 ESP_LOGD(TAG,
" Fan: %s", LOG_STR_ARG(fan_mode_s));
32 ESP_LOGD(TAG,
" Preset: %s", LOG_STR_ARG(preset_s));
36 ESP_LOGD(TAG,
" Swing: %s", LOG_STR_ARG(swing_mode_s));
54 if (!traits.supports_mode(
mode)) {
62 ESP_LOGW(TAG,
" Fan Mode %s is not supported by this device!",
custom_fan_mode.c_str());
67 if (!traits.supports_fan_mode(
fan_mode)) {
68 ESP_LOGW(TAG,
" Fan Mode %s is not supported by this device!",
76 ESP_LOGW(TAG,
" Preset %s is not supported by this device!",
custom_preset.c_str());
81 if (!traits.supports_preset(
preset)) {
89 ESP_LOGW(TAG,
" Swing Mode %s is not supported by this device!",
96 if (traits.get_supports_two_point_target_temperature()) {
97 ESP_LOGW(TAG,
" Cannot set target temperature for climate device " 98 "with two-point target temperature!");
100 }
else if (std::isnan(target)) {
101 ESP_LOGW(TAG,
" Target temperature must not be NAN!");
106 if (!traits.get_supports_two_point_target_temperature()) {
107 ESP_LOGW(TAG,
" Cannot set low/high target temperature for this device!");
113 ESP_LOGW(TAG,
" Target temperature low must not be NAN!");
117 ESP_LOGW(TAG,
" Target temperature low must not be NAN!");
124 ESP_LOGW(TAG,
" Target temperature low %.2f must be smaller than target temperature high %.2f!", low, high);
150 ESP_LOGW(TAG,
"'%s' - Unrecognized mode %s", this->
parent_->
get_name().c_str(), mode.c_str());
185 ESP_LOGW(TAG,
"'%s' - Unrecognized fan mode %s", this->
parent_->
get_name().c_str(), fan_mode.c_str());
221 ESP_LOGW(TAG,
"'%s' - Unrecognized preset %s", this->
parent_->
get_name().c_str(), preset.c_str());
246 ESP_LOGW(TAG,
"'%s' - Unrecognized swing mode %s", this->
parent_->
get_name().c_str(), swing_mode.c_str());
318 this->state_callback_.add(std::move(callback));
322 this->control_callback_.add(std::move(callback));
326 static const uint32_t RESTORE_STATE_VERSION = 0x848EA6ADUL;
330 RESTORE_STATE_VERSION);
332 if (!this->rtc_.load(&recovered))
337 #if (defined(USE_ESP_IDF) || (defined(USE_ESP8266) && USE_ARDUINO_VERSION_CODE >= VERSION_CODE(3, 0, 0))) && \ 339 #pragma GCC diagnostic ignored "-Wclass-memaccess" 340 #define TEMP_IGNORE_MEMACCESS 345 #ifdef TEMP_IGNORE_MEMACCESS 346 #pragma GCC diagnostic pop 347 #undef TEMP_IGNORE_MEMACCESS 351 auto traits = this->get_traits();
352 if (traits.get_supports_two_point_target_temperature()) {
358 if (traits.get_supports_fan_modes() &&
fan_mode.has_value()) {
359 state.uses_custom_fan_mode =
false;
362 if (!traits.get_supported_custom_fan_modes().empty() &&
custom_fan_mode.has_value()) {
363 state.uses_custom_fan_mode =
true;
364 const auto &supported = traits.get_supported_custom_fan_modes();
365 std::vector<std::string> vec{supported.begin(), supported.end()};
367 if (it != vec.end()) {
368 state.custom_fan_mode = std::distance(vec.begin(), it);
371 if (traits.get_supports_presets() &&
preset.has_value()) {
372 state.uses_custom_preset =
false;
375 if (!traits.get_supported_custom_presets().empty() &&
custom_preset.has_value()) {
376 state.uses_custom_preset =
true;
377 const auto &supported = traits.get_supported_custom_presets();
378 std::vector<std::string> vec{supported.begin(), supported.end()};
381 if (it != vec.cend()) {
382 state.custom_preset = std::distance(vec.begin(), it);
385 if (traits.get_supports_swing_modes()) {
389 this->rtc_.save(&
state);
392 ESP_LOGD(TAG,
"'%s' - Sending state:", this->name_.c_str());
393 auto traits = this->get_traits();
396 if (traits.get_supports_action()) {
399 if (traits.get_supports_fan_modes() && this->
fan_mode.has_value()) {
402 if (!traits.get_supported_custom_fan_modes().empty() && this->
custom_fan_mode.has_value()) {
403 ESP_LOGD(TAG,
" Custom Fan Mode: %s", this->
custom_fan_mode.value().c_str());
405 if (traits.get_supports_presets() && this->
preset.has_value()) {
408 if (!traits.get_supported_custom_presets().empty() && this->
custom_preset.has_value()) {
409 ESP_LOGD(TAG,
" Custom Preset: %s", this->
custom_preset.value().c_str());
411 if (traits.get_supports_swing_modes()) {
414 if (traits.get_supports_current_temperature()) {
415 ESP_LOGD(TAG,
" Current Temperature: %.2f°C", this->current_temperature);
417 if (traits.get_supports_two_point_target_temperature()) {
425 this->state_callback_.call();
431 auto traits = this->traits();
432 if (this->visual_min_temperature_override_.has_value()) {
433 traits.set_visual_min_temperature(*this->visual_min_temperature_override_);
435 if (this->visual_max_temperature_override_.has_value()) {
436 traits.set_visual_max_temperature(*this->visual_max_temperature_override_);
438 if (this->visual_target_temperature_step_override_.has_value()) {
439 traits.set_visual_target_temperature_step(*this->visual_target_temperature_step_override_);
440 traits.set_visual_current_temperature_step(*this->visual_current_temperature_step_override_);
447 this->visual_min_temperature_override_ = visual_min_temperature_override;
450 this->visual_max_temperature_override_ = visual_max_temperature_override;
453 this->visual_target_temperature_step_override_ = target;
454 this->visual_current_temperature_step_override_ = current;
456 #pragma GCC diagnostic push 457 #pragma GCC diagnostic ignored "-Wdeprecated-declarations" 459 #pragma GCC diagnostic pop 467 call.set_mode(this->
mode);
478 call.set_preset(this->
preset);
500 std::vector<std::string> modes_vec{modes.begin(), modes.end()};
511 std::vector<std::string> presets_vec{presets.begin(), presets.end()};
525 if (is_changed || dst != src) {
548 ESP_LOGCONFIG(tag,
"ClimateTraits:");
549 ESP_LOGCONFIG(tag,
" [x] Visual settings:");
552 ESP_LOGCONFIG(tag,
" - Step:");
556 ESP_LOGCONFIG(tag,
" [x] Supports current temperature");
559 ESP_LOGCONFIG(tag,
" [x] Supports two-point target temperature");
562 ESP_LOGCONFIG(tag,
" [x] Supports action");
565 ESP_LOGCONFIG(tag,
" [x] Supported modes:");
570 ESP_LOGCONFIG(tag,
" [x] Supported fan modes:");
575 ESP_LOGCONFIG(tag,
" [x] Supported custom fan modes:");
577 ESP_LOGCONFIG(tag,
" - %s", s.c_str());
580 ESP_LOGCONFIG(tag,
" [x] Supported presets:");
585 ESP_LOGCONFIG(tag,
" [x] Supported custom presets:");
587 ESP_LOGCONFIG(tag,
" - %s", s.c_str());
590 ESP_LOGCONFIG(tag,
" [x] Supported swing modes:");
This class is used to encode all control actions on a climate device.
The fan mode is set to Low.
value_type const & value() const
The fan mode is set to Quiet.
ClimateSwingMode swing_mode
The active swing mode of the climate device.
float target_temperature_low
bool get_supports_fan_modes() const
optional< std::string > custom_preset_
The fan mode is set to Both.
ClimatePreset
Enum for all preset modes.
CallbackManager< void()> control_callback_
float target_temperature
The target temperature of the climate device.
Device is in home preset.
const optional< ClimateMode > & get_mode() const
optional< float > target_temperature_
The fan mode is set to Middle.
This class contains all static data for climate devices.
const LogString * climate_mode_to_string(ClimateMode mode)
Convert the given ClimateMode to a human-readable string.
std::set< ClimateSwingMode > get_supported_swing_modes() const
The climate device is set to heat to reach the target temperature.
Struct used to save the state of the climate device in restore memory.
Climate()
Construct a climate device with empty name (will be set later).
ClimateMode mode
The active mode of the climate device.
bool set_alternative(optional< T1 > &dst, optional< T2 > &alt, const T1 &src)
optional< ClimateFanMode > fan_mode_
const optional< float > & get_target_temperature_low() const
float target_temperature_high
The maximum target temperature of the climate device, for climate devices with split target temperatu...
The fan mode is set to Diffuse.
const std::string & get_name() const
float get_visual_max_temperature() const
optional< float > target_temperature_high_
The climate device is set to dry/humidity mode.
float target_temperature_high
bool uses_custom_fan_mode
const std::set< std::string > & get_supported_custom_fan_modes() const
ClimateCall & set_swing_mode(ClimateSwingMode swing_mode)
Set the swing mode of the climate device.
ClimateSwingMode swing_mode
ClimateSwingMode
Enum for all modes a climate swing can be in.
const std::set< std::string > & get_supported_custom_presets() const
void add_on_state_callback(std::function< void()> &&callback)
Add a callback for the climate device state, each time the state of the climate device is updated (us...
bool supports_custom_preset(const std::string &custom_preset) const
bool get_supports_swing_modes() const
Device is prepared for sleep.
optional< std::string > custom_fan_mode
The active custom fan mode of the climate device.
Device is in away preset.
bool supports_custom_fan_mode(const std::string &custom_fan_mode) const
void apply(Climate *climate)
Apply these settings to the climate device.
ClimateCall & set_target_temperature_low(float target_temperature_low)
Set the low point target temperature of the climate device.
void add_on_control_callback(std::function< void()> &&callback)
Add a callback for the climate device configuration; each time the configuration parameters of a clim...
ClimateCall make_call()
Make a climate device control call, this is used to control the climate device, see the ClimateCall d...
Device is in comfort preset.
float get_visual_current_temperature_step() const
const optional< std::string > & get_custom_preset() const
ClimateCall & set_target_temperature(float target_temperature)
Set the target temperature of the climate device.
The fan mode is set to Horizontal.
The climate device is set to cool to reach the target temperature.
optional< ClimateSwingMode > swing_mode_
Device is reacting to activity (e.g., movement sensors)
const optional< ClimatePreset > & get_preset() const
The fan mode is set to Auto.
float get_visual_min_temperature() const
optional< ClimatePreset > preset
The active preset of the climate device.
const std::set< climate::ClimatePreset > & get_supported_presets() const
ESPPreferences * global_preferences
optional< ClimatePreset > preset_
float get_visual_target_temperature_step() const
virtual ClimateTraits traits()=0
Get the default traits of this climate device.
ClimateCall & set_preset(ClimatePreset preset)
Set the preset of the climate device.
BedjetMode mode
BedJet operating mode.
virtual void control(const ClimateCall &call)=0
Control the climate device, this is a virtual method that each climate integration must implement...
ClimateCall & set_fan_mode(ClimateFanMode fan_mode)
Set the fan mode of the climate device.
ClimateTraits get_traits()
Get the traits of this climate device with all overrides applied.
bool get_supports_presets() const
std::set< ClimateMode > get_supported_modes() const
const LogString * climate_preset_to_string(ClimatePreset preset)
Convert the given PresetMode to a human-readable string.
The climate device is adjusting the temperatre dynamically.
The climate device is set to heat/cool to reach the target temperature.
The fan mode is set to Vertical.
void set_visual_max_temperature_override(float visual_max_temperature_override)
The fan mode is set to Focus.
const optional< std::string > & get_custom_fan_mode() const
void set_visual_min_temperature_override(float visual_min_temperature_override)
The fan mode is set to Off.
const optional< float > & get_target_temperature() const
optional< std::string > custom_fan_mode_
void publish_state()
Publish the state of the climate device, to be called from integrations.
bool set_custom_fan_mode_(const std::string &mode)
Set custom fan mode. Reset primary fan mode. Return true if fan mode has been changed.
The fan mode is set to High.
ClimateMode
Enum for all modes a climate device can be in.
The swing mode is set to Off.
The climate device is off.
optional< std::string > custom_preset
The active custom preset mode of the climate device.
ClimateCall & set_target_temperature_high(float target_temperature_high)
Set the high point target temperature of the climate device.
const LogString * climate_fan_mode_to_string(ClimateFanMode fan_mode)
Convert the given ClimateFanMode to a human-readable string.
optional< ClimateFanMode > fan_mode
The active fan mode of the climate device.
void set_visual_temperature_step_override(float target, float current)
const optional< ClimateFanMode > & get_fan_mode() const
Device is in boost preset.
virtual ESPPreferenceObject make_preference(size_t length, uint32_t type, bool in_flash)=0
bool get_supports_current_temperature() const
ClimateCall & set_mode(ClimateMode mode)
Set the mode of the climate device.
The fan mode is set to On.
bool set_custom_preset_(const std::string &preset)
Set custom preset. Reset primary preset. Return true if preset has been changed.
const optional< ClimateSwingMode > & get_swing_mode() const
void save_state_()
Internal method to save the state of the climate device to recover memory.
optional< ClimateMode > mode_
void dump_traits_(const char *tag)
Device is running an energy-saving preset.
optional< ClimateDeviceRestoreState > restore_state_()
Restore the state of the climate device, call this from your setup() method.
bool get_supports_action() const
The fan mode is set to Medium.
bool get_supports_two_point_target_temperature() const
const optional< float > & get_target_temperature_high() const
The climate device only has the fan enabled, no heating or cooling is taking place.
const LogString * climate_action_to_string(ClimateAction action)
Convert the given ClimateAction to a human-readable string.
bool set_preset_(ClimatePreset preset)
Set preset. Reset custom preset. Return true if preset has been changed.
optional< float > target_temperature_low_
ClimateCall to_call(Climate *climate)
Convert this struct to a climate call that can be performed.
float target_temperature_low
The minimum target temperature of the climate device, for climate devices with split target temperatu...
std::set< ClimateFanMode > get_supported_fan_modes() const
bool set_fan_mode_(ClimateFanMode mode)
Set fan mode. Reset custom fan mode. Return true if fan mode has been changed.
ClimateDevice - This is the base class for all climate integrations.
bool str_equals_case_insensitive(const std::string &a, const std::string &b)
Compare strings for equality in case-insensitive manner.
const LogString * climate_swing_mode_to_string(ClimateSwingMode swing_mode)
Convert the given ClimateSwingMode to a human-readable string.