21 return FanDirectionStrings::get_log_str(
static_cast<uint8_t
>(
direction), FanDirectionStrings::LAST_INDEX);
41 if (validated_mode !=
nullptr) {
45 ESP_LOGW(TAG,
"%s: Preset mode '%.*s' not supported", LOG_STR_ARG(this->
parent_.
get_log_name()), (
int) len,
59 ESP_LOGV(TAG,
" Oscillating: %s", YESNO(*this->
oscillating_));
61 if (this->
speed_.has_value()) {
62 ESP_LOGV(TAG,
" Speed: %d", *this->
speed_);
76 if (this->
speed_.has_value()) {
77 this->
speed_ = clamp(*this->
speed_, 1, traits.supported_speed_count());
85 if (!this->
parent_.
state && this->binary_state_.has_value() &&
88 && !this->has_preset_mode() &&
89 !this->parent_.has_preset_mode()
91 && traits.supports_speed() && this->parent_.speed == 0 && !this->speed_.has_value()) {
93 this->
speed_ = traits.supported_speed_count();
96 if (this->
oscillating_.has_value() && !traits.supports_oscillation()) {
101 if (this->
speed_.has_value() && !traits.supports_speed()) {
102 ESP_LOGW(TAG,
"%s: Speed control not supported", LOG_STR_ARG(this->
parent_.
get_log_name()));
106 if (this->
direction_.has_value() && !traits.supports_direction()) {
107 ESP_LOGW(TAG,
"%s: Direction control not supported", LOG_STR_ARG(this->
parent_.
get_log_name()));
120 if (traits.supports_preset_modes()) {
122 const auto &preset_modes = traits.supported_preset_modes();
124 call.set_preset_mode(preset_modes[this->
preset_mode]);
136 if (traits.supports_preset_modes()) {
138 const auto &preset_modes = traits.supported_preset_modes();
155 for (
const char *
mode : this->supported_preset_modes_) {
166 if (this->preset_mode_ ==
nullptr) {
173 if (validated ==
nullptr || this->preset_mode_ == validated) {
176 this->preset_mode_ = validated;
199 }
else if (call.
get_speed().has_value()) {
212 if (traits.supports_speed()) {
213 ESP_LOGV(TAG,
" Speed: %d", this->
speed);
215 if (traits.supports_oscillation()) {
216 ESP_LOGV(TAG,
" Oscillating: %s", YESNO(this->
oscillating));
218 if (traits.supports_direction()) {
221 if (this->preset_mode_ !=
nullptr) {
222 ESP_LOGV(TAG,
" Preset Mode: %s", this->preset_mode_);
225#if defined(USE_FAN) && defined(USE_CONTROLLER_REGISTRY)
226 ControllerRegistry::notify_fan_update(
this);
236 bool restored = this->
rtc_.
load(&recovered);
247 recovered.state =
false;
250 recovered.state =
true;
253 recovered.state = restored ? recovered.state :
false;
256 recovered.state = restored ? recovered.state :
true;
259 recovered.state = restored ? !recovered.state :
false;
262 recovered.state = restored ? !recovered.state :
true;
281 for (
size_t i = 0; i < this->supported_preset_modes_.
size(); i++) {
282 if (this->supported_preset_modes_[i] == this->preset_mode_) {
283 state.preset_mode = i;
295 if (traits.supports_speed()) {
298 "%s Speed count: %d",
299 prefix, prefix, traits.supported_speed_count());
301 if (traits.supports_oscillation()) {
302 ESP_LOGCONFIG(tag,
"%s Oscillation: YES", prefix);
304 if (traits.supports_direction()) {
305 ESP_LOGCONFIG(tag,
"%s Direction: YES", prefix);
307 if (traits.supports_preset_modes()) {
308 ESP_LOGCONFIG(tag,
"%s Supported presets:", prefix);
309 for (
const char *s : traits.supported_preset_modes()) {
310 ESP_LOGCONFIG(tag,
"%s - %s", prefix, s);
BedjetMode mode
BedJet operating mode.
constexpr size_t size() const
const LogString * get_log_name() const
Get the name for a "%s" log argument (LOG_STR_ARG).
ESPPreferenceObject make_entity_preference(uint32_t version=0)
Create a preference object for storing this entity's state/settings.
StringRef is a reference to a string owned by something else.
constexpr const char * c_str() const
FanCall & set_oscillating(bool oscillating)
FanCall & set_direction(FanDirection direction)
optional< bool > binary_state_
optional< FanDirection > direction_
const char * preset_mode_
const char * get_preset_mode() const
bool has_preset_mode() const
FanCall & set_speed(int speed)
FanCall & set_state(bool binary_state)
optional< int > get_speed() const
optional< bool > oscillating_
FanCall & set_preset_mode(const std::string &preset_mode)
virtual FanTraits get_traits()=0
LazyCallbackManager< void()> state_callback_
void apply_preset_mode_(const FanCall &call)
Apply preset mode from a FanCall (handles speed-clears-preset convention)
void clear_preset_mode_()
Clear the preset mode.
bool set_preset_mode_(const char *preset_mode, size_t len)
Set the preset mode (finds and stores pointer from traits).
FanDirection direction
The current direction of the fan.
FanRestoreMode restore_mode_
bool oscillating
The current oscillation state of the fan.
virtual void control(const FanCall &call)=0
bool state
The current on/off state of the fan.
const char * find_preset_mode_(const char *preset_mode)
Find and return the matching preset mode pointer from traits, or nullptr if not found.
bool has_preset_mode() const
Check if a preset mode is currently active.
int speed
The current fan speed level.
void dump_traits_(const char *tag, const char *prefix)
optional< FanRestoreState > restore_state_()
const FanPresetModes & supported_preset_modes() const
Empty when the fan has no preset modes. Set them on the Fan entity.
const FanPresetModes * preset_modes_
const char * find_preset_mode(const char *preset_mode) const
Find and return the matching preset mode pointer from supported modes, or nullptr if not found.
ESPHOME_LOG_TAG(TAG, "fan")
@ RESTORE_INVERTED_DEFAULT_OFF
@ RESTORE_INVERTED_DEFAULT_ON
const LogString * fan_direction_to_string(FanDirection direction)
constexpr uint32_t RESTORE_STATE_VERSION
FanDirection
Simple enum to represent the direction of a fan.
PROGMEM_STRING_TABLE(FanDirectionStrings, "FORWARD", "REVERSE", "UNKNOWN")
static constexpr uint8_t NO_PRESET
void apply(Fan &fan)
Apply these settings to the fan.
FanCall to_call(Fan &fan)
Convert this struct to a fan call that can be performed.