mirror of
https://github.com/esphome/esphome.git
synced 2024-11-25 16:38:16 +01:00
Add a Binary Sensor Filter for state settling (#5900)
This commit is contained in:
parent
70fdc3c3f8
commit
3de5b26d77
4 changed files with 46 additions and 0 deletions
|
@ -141,6 +141,7 @@ DelayedOffFilter = binary_sensor_ns.class_("DelayedOffFilter", Filter, cg.Compon
|
||||||
InvertFilter = binary_sensor_ns.class_("InvertFilter", Filter)
|
InvertFilter = binary_sensor_ns.class_("InvertFilter", Filter)
|
||||||
AutorepeatFilter = binary_sensor_ns.class_("AutorepeatFilter", Filter, cg.Component)
|
AutorepeatFilter = binary_sensor_ns.class_("AutorepeatFilter", Filter, cg.Component)
|
||||||
LambdaFilter = binary_sensor_ns.class_("LambdaFilter", Filter)
|
LambdaFilter = binary_sensor_ns.class_("LambdaFilter", Filter)
|
||||||
|
SettleFilter = binary_sensor_ns.class_("SettleFilter", Filter, cg.Component)
|
||||||
|
|
||||||
FILTER_REGISTRY = Registry()
|
FILTER_REGISTRY = Registry()
|
||||||
validate_filters = cv.validate_registry("filter", FILTER_REGISTRY)
|
validate_filters = cv.validate_registry("filter", FILTER_REGISTRY)
|
||||||
|
@ -259,6 +260,19 @@ async def lambda_filter_to_code(config, filter_id):
|
||||||
return cg.new_Pvariable(filter_id, lambda_)
|
return cg.new_Pvariable(filter_id, lambda_)
|
||||||
|
|
||||||
|
|
||||||
|
@register_filter(
|
||||||
|
"settle",
|
||||||
|
SettleFilter,
|
||||||
|
cv.templatable(cv.positive_time_period_milliseconds),
|
||||||
|
)
|
||||||
|
async def settle_filter_to_code(config, filter_id):
|
||||||
|
var = cg.new_Pvariable(filter_id)
|
||||||
|
await cg.register_component(var, {})
|
||||||
|
template_ = await cg.templatable(config, [], cg.uint32)
|
||||||
|
cg.add(var.set_delay(template_))
|
||||||
|
return var
|
||||||
|
|
||||||
|
|
||||||
MULTI_CLICK_TIMING_SCHEMA = cv.Schema(
|
MULTI_CLICK_TIMING_SCHEMA = cv.Schema(
|
||||||
{
|
{
|
||||||
cv.Optional(CONF_STATE): cv.boolean,
|
cv.Optional(CONF_STATE): cv.boolean,
|
||||||
|
|
|
@ -111,6 +111,23 @@ LambdaFilter::LambdaFilter(std::function<optional<bool>(bool)> f) : f_(std::move
|
||||||
|
|
||||||
optional<bool> LambdaFilter::new_value(bool value, bool is_initial) { return this->f_(value); }
|
optional<bool> LambdaFilter::new_value(bool value, bool is_initial) { return this->f_(value); }
|
||||||
|
|
||||||
|
optional<bool> SettleFilter::new_value(bool value, bool is_initial) {
|
||||||
|
if (!this->steady_) {
|
||||||
|
this->set_timeout("SETTLE", this->delay_.value(), [this, value, is_initial]() {
|
||||||
|
this->steady_ = true;
|
||||||
|
this->output(value, is_initial);
|
||||||
|
});
|
||||||
|
return {};
|
||||||
|
} else {
|
||||||
|
this->steady_ = false;
|
||||||
|
this->output(value, is_initial);
|
||||||
|
this->set_timeout("SETTLE", this->delay_.value(), [this]() { this->steady_ = true; });
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
float SettleFilter::get_setup_priority() const { return setup_priority::HARDWARE; }
|
||||||
|
|
||||||
} // namespace binary_sensor
|
} // namespace binary_sensor
|
||||||
|
|
||||||
} // namespace esphome
|
} // namespace esphome
|
||||||
|
|
|
@ -108,6 +108,19 @@ class LambdaFilter : public Filter {
|
||||||
std::function<optional<bool>(bool)> f_;
|
std::function<optional<bool>(bool)> f_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class SettleFilter : public Filter, public Component {
|
||||||
|
public:
|
||||||
|
optional<bool> new_value(bool value, bool is_initial) override;
|
||||||
|
|
||||||
|
float get_setup_priority() const override;
|
||||||
|
|
||||||
|
template<typename T> void set_delay(T delay) { this->delay_ = delay; }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
TemplatableValue<uint32_t> delay_{};
|
||||||
|
bool steady_{true};
|
||||||
|
};
|
||||||
|
|
||||||
} // namespace binary_sensor
|
} // namespace binary_sensor
|
||||||
|
|
||||||
} // namespace esphome
|
} // namespace esphome
|
||||||
|
|
|
@ -1732,6 +1732,8 @@ binary_sensor:
|
||||||
- delayed_on_off: !lambda "return 10;"
|
- delayed_on_off: !lambda "return 10;"
|
||||||
- delayed_on: !lambda "return 1000;"
|
- delayed_on: !lambda "return 1000;"
|
||||||
- delayed_off: !lambda "return 0;"
|
- delayed_off: !lambda "return 0;"
|
||||||
|
- settle: 40ms
|
||||||
|
- settle: !lambda "return 10;"
|
||||||
on_press:
|
on_press:
|
||||||
then:
|
then:
|
||||||
- lambda: >-
|
- lambda: >-
|
||||||
|
|
Loading…
Reference in a new issue