ESPHome 2025.11.4
Loading...
Searching...
No Matches
filter.cpp
Go to the documentation of this file.
1#include "filter.h"
2#include "text_sensor.h"
3#include "esphome/core/log.h"
4#include "esphome/core/hal.h"
5
6namespace esphome {
7namespace text_sensor {
8
9static const char *const TAG = "text_sensor.filter";
10
11// Filter
12void Filter::input(const std::string &value) {
13 ESP_LOGVV(TAG, "Filter(%p)::input(%s)", this, value.c_str());
14 optional<std::string> out = this->new_value(value);
15 if (out.has_value())
16 this->output(*out);
17}
18void Filter::output(const std::string &value) {
19 if (this->next_ == nullptr) {
20 ESP_LOGVV(TAG, "Filter(%p)::output(%s) -> SENSOR", this, value.c_str());
22 } else {
23 ESP_LOGVV(TAG, "Filter(%p)::output(%s) -> %p", this, value.c_str(), this->next_);
24 this->next_->input(value);
25 }
26}
27void Filter::initialize(TextSensor *parent, Filter *next) {
28 ESP_LOGVV(TAG, "Filter(%p)::initialize(parent=%p next=%p)", this, parent, next);
29 this->parent_ = parent;
30 this->next_ = next;
31}
32
33// LambdaFilter
34LambdaFilter::LambdaFilter(lambda_filter_t lambda_filter) : lambda_filter_(std::move(lambda_filter)) {}
36void LambdaFilter::set_lambda_filter(const lambda_filter_t &lambda_filter) { this->lambda_filter_ = lambda_filter; }
37
39 auto it = this->lambda_filter_(value);
40 ESP_LOGVV(TAG, "LambdaFilter(%p)::new_value(%s) -> %s", this, value.c_str(), it.value_or("").c_str());
41 return it;
42}
43
44// ToUpperFilter
46 for (char &c : value)
47 c = ::toupper(c);
48 return value;
49}
50
51// ToLowerFilter
53 for (char &c : value)
54 c = ::tolower(c);
55 return value;
56}
57
58// Append
59optional<std::string> AppendFilter::new_value(std::string value) { return value + this->suffix_; }
60
61// Prepend
62optional<std::string> PrependFilter::new_value(std::string value) { return this->prefix_ + value; }
63
64// Substitute
65SubstituteFilter::SubstituteFilter(const std::initializer_list<Substitution> &substitutions)
66 : substitutions_(substitutions) {}
67
69 for (const auto &sub : this->substitutions_) {
70 std::size_t pos = 0;
71 while ((pos = value.find(sub.from, pos)) != std::string::npos) {
72 value.replace(pos, sub.from.size(), sub.to);
73 // Advance past the replacement to avoid infinite loop when
74 // the replacement contains the search pattern (e.g., f -> foo)
75 pos += sub.to.size();
76 }
77 }
78 return value;
79}
80
81// Map
82MapFilter::MapFilter(const std::initializer_list<Substitution> &mappings) : mappings_(mappings) {}
83
85 for (const auto &mapping : this->mappings_) {
86 if (mapping.from == value)
87 return mapping.to;
88 }
89 return value; // Pass through if no match
90}
91
92} // namespace text_sensor
93} // namespace esphome
bool has_value() const
Definition optional.h:92
optional< std::string > new_value(std::string value) override
Definition filter.cpp:59
Apply a filter to text sensor values such as to_upper.
Definition filter.h:16
void output(const std::string &value)
Definition filter.cpp:18
void input(const std::string &value)
Definition filter.cpp:12
virtual void initialize(TextSensor *parent, Filter *next)
Initialize this filter, please note this can be called more than once.
Definition filter.cpp:27
virtual optional< std::string > new_value(std::string value)=0
This will be called every time the filter receives a new value.
lambda_filter_t lambda_filter_
Definition filter.h:62
LambdaFilter(lambda_filter_t lambda_filter)
Definition filter.cpp:34
void set_lambda_filter(const lambda_filter_t &lambda_filter)
Definition filter.cpp:36
optional< std::string > new_value(std::string value) override
Definition filter.cpp:38
const lambda_filter_t & get_lambda_filter() const
Definition filter.cpp:35
optional< std::string > new_value(std::string value) override
Definition filter.cpp:84
MapFilter(const std::initializer_list< Substitution > &mappings)
Definition filter.cpp:82
FixedVector< Substitution > mappings_
Definition filter.h:157
optional< std::string > new_value(std::string value) override
Definition filter.cpp:62
FixedVector< Substitution > substitutions_
Definition filter.h:124
SubstituteFilter(const std::initializer_list< Substitution > &substitutions)
Definition filter.cpp:65
optional< std::string > new_value(std::string value) override
Definition filter.cpp:68
void internal_send_state_to_frontend(const std::string &state)
optional< std::string > new_value(std::string value) override
Definition filter.cpp:52
optional< std::string > new_value(std::string value) override
Definition filter.cpp:45
const char *const TAG
Definition spi.cpp:8
std::function< optional< std::string >(std::string)> lambda_filter_t
Definition filter.h:43
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7