mirror of
https://github.com/esphome/esphome.git
synced 2025-10-28 21:53:48 +00:00
fixed
This commit is contained in:
@@ -39,7 +39,7 @@ void FanCall::perform() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void FanCall::validate_() {
|
void FanCall::validate_() {
|
||||||
const auto &traits = this->parent_.get_traits();
|
auto traits = this->parent_.get_traits();
|
||||||
|
|
||||||
if (this->speed_.has_value()) {
|
if (this->speed_.has_value()) {
|
||||||
this->speed_ = clamp(*this->speed_, 1, traits.supported_speed_count());
|
this->speed_ = clamp(*this->speed_, 1, traits.supported_speed_count());
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
#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"
|
||||||
@@ -132,6 +133,20 @@ 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;
|
||||||
|
|
||||||
@@ -145,6 +160,7 @@ 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
|
||||||
|
|||||||
@@ -18,6 +18,8 @@ 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 &operator=(FanTraits &&) = default;
|
||||||
|
|
||||||
/// 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_; }
|
||||||
|
|||||||
@@ -33,10 +33,12 @@ void HBridgeFan::setup() {
|
|||||||
restore->apply(*this);
|
restore->apply(*this);
|
||||||
this->write_state_();
|
this->write_state_();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Construct traits
|
fan::FanTraits HBridgeFan::get_traits() {
|
||||||
this->traits_ = fan::FanTraits(this->oscillating_ != nullptr, true, true, this->speed_count_);
|
auto traits = fan::FanTraits(this->oscillating_ != nullptr, true, true, this->speed_count_);
|
||||||
this->traits_.set_supported_preset_modes(this->preset_modes_);
|
traits.set_supported_preset_modes(this->preset_modes_);
|
||||||
|
return traits;
|
||||||
}
|
}
|
||||||
|
|
||||||
void HBridgeFan::dump_config() {
|
void HBridgeFan::dump_config() {
|
||||||
|
|||||||
@@ -21,11 +21,10 @@ 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_preset_modes(const FixedVector<std::string> &presets) { preset_modes_ = presets; }
|
|
||||||
|
|
||||||
void setup() override;
|
void setup() override;
|
||||||
void dump_config() override;
|
void dump_config() override;
|
||||||
fan::FanTraits get_traits() override { return this->traits_; }
|
fan::FanTraits get_traits() override;
|
||||||
|
|
||||||
fan::FanCall brake();
|
fan::FanCall brake();
|
||||||
|
|
||||||
@@ -36,8 +35,6 @@ 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};
|
||||||
fan::FanTraits traits_;
|
|
||||||
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_();
|
||||||
|
|||||||
@@ -12,10 +12,12 @@ void SpeedFan::setup() {
|
|||||||
restore->apply(*this);
|
restore->apply(*this);
|
||||||
this->write_state_();
|
this->write_state_();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Construct traits
|
fan::FanTraits SpeedFan::get_traits() {
|
||||||
this->traits_ = fan::FanTraits(this->oscillating_ != nullptr, true, this->direction_ != nullptr, this->speed_count_);
|
auto traits = fan::FanTraits(this->oscillating_ != nullptr, true, this->direction_ != nullptr, this->speed_count_);
|
||||||
this->traits_.set_supported_preset_modes(this->preset_modes_);
|
traits.set_supported_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); }
|
||||||
|
|||||||
@@ -17,8 +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 FixedVector<std::string> &presets) { this->preset_modes_ = presets; }
|
fan::FanTraits get_traits() override;
|
||||||
fan::FanTraits get_traits() override { return this->traits_; }
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void control(const fan::FanCall &call) override;
|
void control(const fan::FanCall &call) override;
|
||||||
@@ -28,8 +27,6 @@ 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_{};
|
||||||
fan::FanTraits traits_;
|
|
||||||
FixedVector<std::string> preset_modes_{};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace speed
|
} // namespace speed
|
||||||
|
|||||||
@@ -11,11 +11,13 @@ void TemplateFan::setup() {
|
|||||||
if (restore.has_value()) {
|
if (restore.has_value()) {
|
||||||
restore->apply(*this);
|
restore->apply(*this);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Construct traits
|
fan::FanTraits TemplateFan::get_traits() {
|
||||||
this->traits_ =
|
auto traits =
|
||||||
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->traits_.set_supported_preset_modes(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); }
|
||||||
|
|||||||
@@ -15,8 +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 FixedVector<std::string> &presets) { this->preset_modes_ = presets; }
|
fan::FanTraits get_traits() override;
|
||||||
fan::FanTraits get_traits() override { return this->traits_; }
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void control(const fan::FanCall &call) override;
|
void control(const fan::FanCall &call) override;
|
||||||
@@ -24,8 +23,6 @@ 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};
|
||||||
fan::FanTraits traits_;
|
|
||||||
FixedVector<std::string> preset_modes_{};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace template_
|
} // namespace template_
|
||||||
|
|||||||
Reference in New Issue
Block a user