#pragma once #include "esphome/core/component.h" #include "esphome/core/helpers.h" namespace esphome { namespace binary_sensor { class BinarySensor; class Filter { public: virtual optional new_value(bool value, bool is_initial) = 0; void input(bool value, bool is_initial); void output(bool value, bool is_initial); protected: friend BinarySensor; Filter *next_{nullptr}; BinarySensor *parent_{nullptr}; Deduplicator dedup_; }; class DelayedOnFilter : public Filter, public Component { public: explicit DelayedOnFilter(uint32_t delay); optional new_value(bool value, bool is_initial) override; float get_setup_priority() const override; protected: uint32_t delay_; }; class DelayedOffFilter : public Filter, public Component { public: explicit DelayedOffFilter(uint32_t delay); optional new_value(bool value, bool is_initial) override; float get_setup_priority() const override; protected: uint32_t delay_; }; class InvertFilter : public Filter { public: optional new_value(bool value, bool is_initial) override; }; class LambdaFilter : public Filter { public: explicit LambdaFilter(const std::function(bool)> &f); optional new_value(bool value, bool is_initial) override; protected: std::function(bool)> f_; }; class UniqueFilter : public Filter { public: optional new_value(bool value, bool is_initial) override; protected: optional last_value_{}; }; } // namespace binary_sensor } // namespace esphome