1
0
mirror of https://github.com/esphome/esphome.git synced 2025-10-29 06:04:01 +00:00
This commit is contained in:
J. Nick Koston
2025-10-22 11:37:19 -10:00
parent 657e6f0bce
commit eaf0a367b4
9 changed files with 25 additions and 40 deletions

View File

@@ -35,7 +35,7 @@ fan::FanTraits CopyFan::get_traits() {
traits.set_speed(base.supports_speed()); traits.set_speed(base.supports_speed());
traits.set_supported_speed_count(base.supported_speed_count()); traits.set_supported_speed_count(base.supported_speed_count());
traits.set_direction(base.supports_direction()); traits.set_direction(base.supports_direction());
traits.set_supported_preset_modes(base.supported_preset_modes()); traits.set_supported_preset_modes(&source_->preset_modes_);
return traits; return traits;
} }

View File

@@ -1,6 +1,5 @@
#pragma once #pragma once
#include <initializer_list>
#include "esphome/core/entity_base.h" #include "esphome/core/entity_base.h"
#include "esphome/core/helpers.h" #include "esphome/core/helpers.h"
#include "esphome/core/log.h" #include "esphome/core/log.h"
@@ -133,20 +132,6 @@ class Fan : public EntityBase {
/// Set the restore mode of this fan. /// Set the restore mode of this fan.
void set_restore_mode(FanRestoreMode restore_mode) { this->restore_mode_ = restore_mode; } void set_restore_mode(FanRestoreMode restore_mode) { this->restore_mode_ = restore_mode; }
/// Set preset modes - helper for components
void set_preset_modes(const std::initializer_list<std::string> &presets) {
this->preset_modes_.init(presets.size());
for (const auto &mode : presets) {
this->preset_modes_.push_back(mode);
}
}
template<typename T> void set_preset_modes(const T &presets) {
this->preset_modes_.init(presets.size());
for (const auto &mode : presets) {
this->preset_modes_.push_back(mode);
}
}
protected: protected:
friend FanCall; friend FanCall;
@@ -160,7 +145,6 @@ class Fan : public EntityBase {
CallbackManager<void()> state_callback_{}; CallbackManager<void()> state_callback_{};
ESPPreferenceObject rtc_; ESPPreferenceObject rtc_;
FanRestoreMode restore_mode_; FanRestoreMode restore_mode_;
FixedVector<std::string> preset_modes_{};
}; };
} // namespace fan } // namespace fan

View File

@@ -18,8 +18,12 @@ class FanTraits {
FanTraits() = default; FanTraits() = default;
FanTraits(bool oscillation, bool speed, bool direction, int speed_count) FanTraits(bool oscillation, bool speed, bool direction, int speed_count)
: oscillation_(oscillation), speed_(speed), direction_(direction), speed_count_(speed_count) {} : oscillation_(oscillation), speed_(speed), direction_(direction), speed_count_(speed_count) {}
FanTraits(FanTraits &&) = default; FanTraits(bool oscillation, bool speed, bool direction, int speed_count, const FixedVector<std::string> *preset_modes)
FanTraits &operator=(FanTraits &&) = default; : oscillation_(oscillation),
speed_(speed),
direction_(direction),
speed_count_(speed_count),
preset_modes_(preset_modes) {}
/// Return if this fan supports oscillation. /// Return if this fan supports oscillation.
bool supports_oscillation() const { return this->oscillation_; } bool supports_oscillation() const { return this->oscillation_; }
@@ -38,16 +42,11 @@ class FanTraits {
/// Set whether this fan supports changing direction /// Set whether this fan supports changing direction
void set_direction(bool direction) { this->direction_ = direction; } void set_direction(bool direction) { this->direction_ = direction; }
/// Return the preset modes supported by the fan. /// Return the preset modes supported by the fan.
const FixedVector<std::string> &supported_preset_modes() const { return this->preset_modes_; } const FixedVector<std::string> &supported_preset_modes() const { return *this->preset_modes_; }
/// Set the preset modes supported by the fan. /// Set the preset modes pointer (points to parent Fan's preset_modes_)
template<typename T> void set_supported_preset_modes(const T &preset_modes) { void set_supported_preset_modes(const FixedVector<std::string> *preset_modes) { this->preset_modes_ = preset_modes; }
this->preset_modes_.init(preset_modes.size());
for (const auto &mode : preset_modes) {
this->preset_modes_.push_back(mode);
}
}
/// Return if preset modes are supported /// Return if preset modes are supported
bool supports_preset_modes() const { return !this->preset_modes_.empty(); } bool supports_preset_modes() const { return !this->preset_modes_->empty(); }
protected: protected:
#ifdef USE_API #ifdef USE_API
@@ -57,13 +56,13 @@ class FanTraits {
// It is used by the API to avoid copying data when encoding messages. // It is used by the API to avoid copying data when encoding messages.
// Warning: Do not use this method outside of the API connection code. // Warning: Do not use this method outside of the API connection code.
// It returns a reference to internal data that can be invalidated. // It returns a reference to internal data that can be invalidated.
const FixedVector<std::string> &supported_preset_modes_for_api_() const { return this->preset_modes_; } const FixedVector<std::string> &supported_preset_modes_for_api_() const { return *this->preset_modes_; }
#endif #endif
bool oscillation_{false}; bool oscillation_{false};
bool speed_{false}; bool speed_{false};
bool direction_{false}; bool direction_{false};
int speed_count_{}; int speed_count_{};
FixedVector<std::string> preset_modes_{}; const FixedVector<std::string> *preset_modes_{nullptr};
}; };
} // namespace fan } // namespace fan

View File

@@ -36,9 +36,7 @@ void HBridgeFan::setup() {
} }
fan::FanTraits HBridgeFan::get_traits() { fan::FanTraits HBridgeFan::get_traits() {
auto traits = fan::FanTraits(this->oscillating_ != nullptr, true, true, this->speed_count_); return fan::FanTraits(this->oscillating_ != nullptr, true, true, this->speed_count_, &this->preset_modes_);
traits.set_supported_preset_modes(this->preset_modes_);
return traits;
} }
void HBridgeFan::dump_config() { void HBridgeFan::dump_config() {

View File

@@ -21,6 +21,8 @@ class HBridgeFan : public Component, public fan::Fan {
void set_pin_a(output::FloatOutput *pin_a) { pin_a_ = pin_a; } void set_pin_a(output::FloatOutput *pin_a) { pin_a_ = pin_a; }
void set_pin_b(output::FloatOutput *pin_b) { pin_b_ = pin_b; } void set_pin_b(output::FloatOutput *pin_b) { pin_b_ = pin_b; }
void set_enable_pin(output::FloatOutput *enable) { enable_ = enable; } void set_enable_pin(output::FloatOutput *enable) { enable_ = enable; }
void set_oscillating(output::BinaryOutput *oscillating) { this->oscillating_ = oscillating; }
void set_preset_modes(const std::initializer_list<std::string> &presets) { this->preset_modes_ = presets; }
void setup() override; void setup() override;
void dump_config() override; void dump_config() override;
@@ -35,6 +37,7 @@ class HBridgeFan : public Component, public fan::Fan {
output::BinaryOutput *oscillating_{nullptr}; output::BinaryOutput *oscillating_{nullptr};
int speed_count_{}; int speed_count_{};
DecayMode decay_mode_{DECAY_MODE_SLOW}; DecayMode decay_mode_{DECAY_MODE_SLOW};
FixedVector<std::string> preset_modes_{};
void control(const fan::FanCall &call) override; void control(const fan::FanCall &call) override;
void write_state_(); void write_state_();

View File

@@ -15,9 +15,8 @@ void SpeedFan::setup() {
} }
fan::FanTraits SpeedFan::get_traits() { fan::FanTraits SpeedFan::get_traits() {
auto traits = fan::FanTraits(this->oscillating_ != nullptr, true, this->direction_ != nullptr, this->speed_count_); return fan::FanTraits(this->oscillating_ != nullptr, true, this->direction_ != nullptr, this->speed_count_,
traits.set_supported_preset_modes(this->preset_modes_); &this->preset_modes_);
return traits;
} }
void SpeedFan::dump_config() { LOG_FAN("", "Speed Fan", this); } void SpeedFan::dump_config() { LOG_FAN("", "Speed Fan", this); }

View File

@@ -17,6 +17,7 @@ class SpeedFan : public Component, public fan::Fan {
void set_output(output::FloatOutput *output) { this->output_ = output; } void set_output(output::FloatOutput *output) { this->output_ = output; }
void set_oscillating(output::BinaryOutput *oscillating) { this->oscillating_ = oscillating; } void set_oscillating(output::BinaryOutput *oscillating) { this->oscillating_ = oscillating; }
void set_direction(output::BinaryOutput *direction) { this->direction_ = direction; } void set_direction(output::BinaryOutput *direction) { this->direction_ = direction; }
void set_preset_modes(const std::initializer_list<std::string> &presets) { this->preset_modes_ = presets; }
fan::FanTraits get_traits() override; fan::FanTraits get_traits() override;
protected: protected:
@@ -27,6 +28,7 @@ class SpeedFan : public Component, public fan::Fan {
output::BinaryOutput *oscillating_{nullptr}; output::BinaryOutput *oscillating_{nullptr};
output::BinaryOutput *direction_{nullptr}; output::BinaryOutput *direction_{nullptr};
int speed_count_{}; int speed_count_{};
FixedVector<std::string> preset_modes_{};
}; };
} // namespace speed } // namespace speed

View File

@@ -14,10 +14,8 @@ void TemplateFan::setup() {
} }
fan::FanTraits TemplateFan::get_traits() { fan::FanTraits TemplateFan::get_traits() {
auto traits = return fan::FanTraits(this->has_oscillating_, this->speed_count_ > 0, this->has_direction_, this->speed_count_,
fan::FanTraits(this->has_oscillating_, this->speed_count_ > 0, this->has_direction_, this->speed_count_); &this->preset_modes_);
traits.set_supported_preset_modes(this->preset_modes_);
return traits;
} }
void TemplateFan::dump_config() { LOG_FAN("", "Template Fan", this); } void TemplateFan::dump_config() { LOG_FAN("", "Template Fan", this); }

View File

@@ -15,6 +15,7 @@ class TemplateFan : public Component, public fan::Fan {
void set_has_direction(bool has_direction) { this->has_direction_ = has_direction; } void set_has_direction(bool has_direction) { this->has_direction_ = has_direction; }
void set_has_oscillating(bool has_oscillating) { this->has_oscillating_ = has_oscillating; } void set_has_oscillating(bool has_oscillating) { this->has_oscillating_ = has_oscillating; }
void set_speed_count(int count) { this->speed_count_ = count; } void set_speed_count(int count) { this->speed_count_ = count; }
void set_preset_modes(const std::initializer_list<std::string> &presets) { this->preset_modes_ = presets; }
fan::FanTraits get_traits() override; fan::FanTraits get_traits() override;
protected: protected:
@@ -23,6 +24,7 @@ class TemplateFan : public Component, public fan::Fan {
bool has_oscillating_{false}; bool has_oscillating_{false};
bool has_direction_{false}; bool has_direction_{false};
int speed_count_{0}; int speed_count_{0};
FixedVector<std::string> preset_modes_{};
}; };
} // namespace template_ } // namespace template_