mirror of
https://github.com/esphome/esphome.git
synced 2024-11-23 15:38:11 +01:00
[time_based] : Implemented activation delay to help with position precision
This commit is contained in:
parent
9630c60f4d
commit
c016c85c5f
4 changed files with 26 additions and 7 deletions
|
@ -18,6 +18,7 @@ TimeBasedCover = time_based_ns.class_("TimeBasedCover", cover.Cover, cg.Componen
|
||||||
CONF_HAS_BUILT_IN_ENDSTOP = "has_built_in_endstop"
|
CONF_HAS_BUILT_IN_ENDSTOP = "has_built_in_endstop"
|
||||||
CONF_MANUAL_CONTROL = "manual_control"
|
CONF_MANUAL_CONTROL = "manual_control"
|
||||||
CONF_TILT_DURATION = "tilt_duration"
|
CONF_TILT_DURATION = "tilt_duration"
|
||||||
|
CONF_ACTIVATION_DELAY = "activation_delay"
|
||||||
|
|
||||||
CONFIG_SCHEMA = cover.COVER_SCHEMA.extend(
|
CONFIG_SCHEMA = cover.COVER_SCHEMA.extend(
|
||||||
{
|
{
|
||||||
|
@ -31,7 +32,10 @@ CONFIG_SCHEMA = cover.COVER_SCHEMA.extend(
|
||||||
cv.Optional(CONF_MANUAL_CONTROL, default=False): cv.boolean,
|
cv.Optional(CONF_MANUAL_CONTROL, default=False): cv.boolean,
|
||||||
cv.Optional(CONF_ASSUMED_STATE, default=True): cv.boolean,
|
cv.Optional(CONF_ASSUMED_STATE, default=True): cv.boolean,
|
||||||
cv.Optional(
|
cv.Optional(
|
||||||
CONF_TILT_DURATION, default=0
|
CONF_TILT_DURATION, default="0s"
|
||||||
|
): cv.positive_time_period_milliseconds,
|
||||||
|
cv.Optional(
|
||||||
|
CONF_ACTIVATION_DELAY, default="0s"
|
||||||
): cv.positive_time_period_milliseconds,
|
): cv.positive_time_period_milliseconds,
|
||||||
}
|
}
|
||||||
).extend(cv.COMPONENT_SCHEMA)
|
).extend(cv.COMPONENT_SCHEMA)
|
||||||
|
@ -60,3 +64,4 @@ async def to_code(config):
|
||||||
cg.add(var.set_manual_control(config[CONF_MANUAL_CONTROL]))
|
cg.add(var.set_manual_control(config[CONF_MANUAL_CONTROL]))
|
||||||
cg.add(var.set_assumed_state(config[CONF_ASSUMED_STATE]))
|
cg.add(var.set_assumed_state(config[CONF_ASSUMED_STATE]))
|
||||||
cg.add(var.set_tilt_duration(config[CONF_TILT_DURATION]))
|
cg.add(var.set_tilt_duration(config[CONF_TILT_DURATION]))
|
||||||
|
cg.add(var.set_activation_delay(config[CONF_ACTIVATION_DELAY]))
|
||||||
|
|
|
@ -16,6 +16,8 @@ void TimeBasedCover::dump_config() {
|
||||||
|
|
||||||
if (this->tilt_duration_ > 0)
|
if (this->tilt_duration_ > 0)
|
||||||
ESP_LOGCONFIG(TAG, " Tilt Duration: %ums", this->tilt_duration_);
|
ESP_LOGCONFIG(TAG, " Tilt Duration: %ums", this->tilt_duration_);
|
||||||
|
|
||||||
|
ESP_LOGCONFIG(TAG, " Activation delay: %ums", this->activation_delay_);
|
||||||
}
|
}
|
||||||
void TimeBasedCover::setup() {
|
void TimeBasedCover::setup() {
|
||||||
auto restore = this->restore_state_();
|
auto restore = this->restore_state_();
|
||||||
|
@ -122,8 +124,9 @@ void TimeBasedCover::control(const CoverCall &call) {
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto tilt_change_duration_ms = (requested_tilt - this->tilt) * this->tilt_duration_;
|
const auto tilt_change_duration_ms = (requested_tilt - this->tilt) * this->tilt_duration_;
|
||||||
const auto new_pos = tilt_change_duration_ms / operation_duration_ms;
|
const auto position_shift = tilt_change_duration_ms / operation_duration_ms;
|
||||||
this->target_position_ += new_pos;
|
|
||||||
|
this->target_position_ = this->position + position_shift;
|
||||||
this->start_direction_(op);
|
this->start_direction_(op);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -176,6 +179,7 @@ void TimeBasedCover::start_direction_(CoverOperation dir) {
|
||||||
this->stop_prev_trigger_();
|
this->stop_prev_trigger_();
|
||||||
trig->trigger();
|
trig->trigger();
|
||||||
this->prev_command_trigger_ = trig;
|
this->prev_command_trigger_ = trig;
|
||||||
|
this->remaining_activation_delay_ = this->activation_delay_;
|
||||||
}
|
}
|
||||||
void TimeBasedCover::recompute_position_() {
|
void TimeBasedCover::recompute_position_() {
|
||||||
if (this->current_operation == COVER_OPERATION_IDLE)
|
if (this->current_operation == COVER_OPERATION_IDLE)
|
||||||
|
@ -199,11 +203,17 @@ void TimeBasedCover::recompute_position_() {
|
||||||
const uint32_t now = millis();
|
const uint32_t now = millis();
|
||||||
const uint32_t step_duration = now - this->last_recompute_time_;
|
const uint32_t step_duration = now - this->last_recompute_time_;
|
||||||
|
|
||||||
this->position += dir * (step_duration) / action_dur;
|
this->remaining_activation_delay_ -= step_duration;
|
||||||
this->position = clamp(this->position, 0.0f, 1.0f);
|
|
||||||
|
|
||||||
this->tilt += dir * (step_duration) / this->tilt_duration_;
|
if (this->remaining_activation_delay_ <= 0) {
|
||||||
this->tilt = clamp(this->tilt, 0.0f, 1.0f);
|
this->remaining_activation_delay_ = 0;
|
||||||
|
|
||||||
|
this->position += dir * (step_duration) / action_dur;
|
||||||
|
this->position = clamp(this->position, 0.0f, 1.0f);
|
||||||
|
|
||||||
|
this->tilt += dir * (step_duration) / this->tilt_duration_;
|
||||||
|
this->tilt = clamp(this->tilt, 0.0f, 1.0f);
|
||||||
|
}
|
||||||
|
|
||||||
this->last_recompute_time_ = now;
|
this->last_recompute_time_ = now;
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,6 +20,7 @@ class TimeBasedCover : public cover::Cover, public Component {
|
||||||
void set_open_duration(uint32_t open_duration) { this->open_duration_ = open_duration; }
|
void set_open_duration(uint32_t open_duration) { this->open_duration_ = open_duration; }
|
||||||
void set_close_duration(uint32_t close_duration) { this->close_duration_ = close_duration; }
|
void set_close_duration(uint32_t close_duration) { this->close_duration_ = close_duration; }
|
||||||
void set_tilt_duration(uint32_t tilt_duration_ms) { this->tilt_duration_ = tilt_duration_ms; }
|
void set_tilt_duration(uint32_t tilt_duration_ms) { this->tilt_duration_ = tilt_duration_ms; }
|
||||||
|
void set_activation_delay(uint32_t activation_delay_ms) { this->activation_delay_ = activation_delay_ms; }
|
||||||
cover::CoverTraits get_traits() override;
|
cover::CoverTraits get_traits() override;
|
||||||
void set_has_built_in_endstop(bool value) { this->has_built_in_endstop_ = value; }
|
void set_has_built_in_endstop(bool value) { this->has_built_in_endstop_ = value; }
|
||||||
void set_manual_control(bool value) { this->manual_control_ = value; }
|
void set_manual_control(bool value) { this->manual_control_ = value; }
|
||||||
|
@ -41,11 +42,13 @@ class TimeBasedCover : public cover::Cover, public Component {
|
||||||
uint32_t close_duration_;
|
uint32_t close_duration_;
|
||||||
Trigger<> *stop_trigger_{new Trigger<>()};
|
Trigger<> *stop_trigger_{new Trigger<>()};
|
||||||
uint32_t tilt_duration_;
|
uint32_t tilt_duration_;
|
||||||
|
uint32_t activation_delay_;
|
||||||
|
|
||||||
Trigger<> *prev_command_trigger_{nullptr};
|
Trigger<> *prev_command_trigger_{nullptr};
|
||||||
uint32_t last_recompute_time_{0};
|
uint32_t last_recompute_time_{0};
|
||||||
uint32_t start_dir_time_{0};
|
uint32_t start_dir_time_{0};
|
||||||
uint32_t last_publish_time_{0};
|
uint32_t last_publish_time_{0};
|
||||||
|
int32_t remaining_activation_delay_{0};
|
||||||
float target_position_{0};
|
float target_position_{0};
|
||||||
bool has_built_in_endstop_{false};
|
bool has_built_in_endstop_{false};
|
||||||
bool manual_control_{false};
|
bool manual_control_{false};
|
||||||
|
|
|
@ -11,3 +11,4 @@ cover:
|
||||||
- logger.log: close_action
|
- logger.log: close_action
|
||||||
close_duration: 4.5min
|
close_duration: 4.5min
|
||||||
tilt_duration: 1s
|
tilt_duration: 1s
|
||||||
|
activation_delay: 300ms
|
||||||
|
|
Loading…
Reference in a new issue