ESPHome 2026.1.2
Loading...
Searching...
No Matches
sensor.cpp
Go to the documentation of this file.
1#include "sensor.h"
4#include "esphome/core/log.h"
5
6namespace esphome::sensor {
7
8static const char *const TAG = "sensor";
9
10// Function implementation of LOG_SENSOR macro to reduce code size
11void log_sensor(const char *tag, const char *prefix, const char *type, Sensor *obj) {
12 if (obj == nullptr) {
13 return;
14 }
15
16 ESP_LOGCONFIG(tag,
17 "%s%s '%s'\n"
18 "%s State Class: '%s'\n"
19 "%s Unit of Measurement: '%s'\n"
20 "%s Accuracy Decimals: %d",
21 prefix, type, obj->get_name().c_str(), prefix,
22 LOG_STR_ARG(state_class_to_string(obj->get_state_class())), prefix,
24
25 if (!obj->get_device_class_ref().empty()) {
26 ESP_LOGCONFIG(tag, "%s Device Class: '%s'", prefix, obj->get_device_class_ref().c_str());
27 }
28
29 if (!obj->get_icon_ref().empty()) {
30 ESP_LOGCONFIG(tag, "%s Icon: '%s'", prefix, obj->get_icon_ref().c_str());
31 }
32
33 if (obj->get_force_update()) {
34 ESP_LOGV(tag, "%s Force Update: YES", prefix);
35 }
36}
37
38const LogString *state_class_to_string(StateClass state_class) {
39 switch (state_class) {
41 return LOG_STR("measurement");
43 return LOG_STR("total_increasing");
45 return LOG_STR("total");
47 return LOG_STR("measurement_angle");
49 default:
50 return LOG_STR("");
51 }
52}
53
54Sensor::Sensor() : state(NAN), raw_state(NAN) {}
55
58 return this->accuracy_decimals_;
59 return 0;
60}
61void Sensor::set_accuracy_decimals(int8_t accuracy_decimals) {
62 this->accuracy_decimals_ = accuracy_decimals;
64}
65
67 this->state_class_ = state_class;
69}
75
77 this->raw_state = state;
78 this->raw_callback_.call(state);
79
80 ESP_LOGV(TAG, "'%s': Received new state %f", this->name_.c_str(), state);
81
82 if (this->filter_list_ == nullptr) {
84 } else {
85 this->filter_list_->input(state);
86 }
87}
88
89void Sensor::add_on_state_callback(std::function<void(float)> &&callback) { this->callback_.add(std::move(callback)); }
90void Sensor::add_on_raw_state_callback(std::function<void(float)> &&callback) {
91 this->raw_callback_.add(std::move(callback));
92}
93
95 // inefficient, but only happens once on every sensor setup and nobody's going to have massive amounts of
96 // filters
97 ESP_LOGVV(TAG, "Sensor(%p)::add_filter(%p)", this, filter);
98 if (this->filter_list_ == nullptr) {
99 this->filter_list_ = filter;
100 } else {
101 Filter *last_filter = this->filter_list_;
102 while (last_filter->next_ != nullptr)
103 last_filter = last_filter->next_;
104 last_filter->initialize(this, filter);
105 }
106 filter->initialize(this, nullptr);
107}
108void Sensor::add_filters(std::initializer_list<Filter *> filters) {
109 for (Filter *filter : filters) {
110 this->add_filter(filter);
111 }
112}
113void Sensor::set_filters(std::initializer_list<Filter *> filters) {
114 this->clear_filters();
115 this->add_filters(filters);
116}
118 if (this->filter_list_ != nullptr) {
119 ESP_LOGVV(TAG, "Sensor(%p)::clear_filters()", this);
120 }
121 this->filter_list_ = nullptr;
122}
123float Sensor::get_state() const { return this->state; }
124float Sensor::get_raw_state() const { return this->raw_state; }
125
127 this->set_has_state(true);
128 this->state = state;
129 ESP_LOGD(TAG, "'%s' >> %.*f %s", this->get_name().c_str(), std::max(0, (int) this->get_accuracy_decimals()), state,
130 this->get_unit_of_measurement_ref().c_str());
131 this->callback_.call(state);
132#if defined(USE_SENSOR) && defined(USE_CONTROLLER_REGISTRY)
134#endif
135}
136
137} // namespace esphome::sensor
static void notify_sensor_update(sensor::Sensor *obj)
StringRef get_device_class_ref() const
Get the device class as StringRef.
StringRef get_unit_of_measurement_ref() const
Get the unit of measurement as StringRef.
const StringRef & get_name() const
StringRef get_icon_ref() const
Definition entity_base.h:97
void set_has_state(bool state)
constexpr const char * c_str() const
Definition string_ref.h:73
constexpr bool empty() const
Definition string_ref.h:75
Apply a filter to sensor values such as moving average.
Definition filter.h:19
virtual void initialize(Sensor *parent, Filter *next)
Initialize this filter, please note this can be called more than once.
Definition filter.cpp:28
void input(float value)
Definition filter.cpp:13
Base-class for all sensors.
Definition sensor.h:42
void set_state_class(StateClass state_class)
Manually set the state class.
Definition sensor.cpp:66
void add_filter(Filter *filter)
Add a filter to the filter chain. Will be appended to the back.
Definition sensor.cpp:94
void publish_state(float state)
Publish a new state to the front-end.
Definition sensor.cpp:76
LazyCallbackManager< void(float)> callback_
Storage for filtered state callbacks.
Definition sensor.h:128
void internal_send_state_to_frontend(float state)
Definition sensor.cpp:126
float get_raw_state() const
Getter-syntax for .raw_state.
Definition sensor.cpp:124
float get_state() const
Getter-syntax for .state.
Definition sensor.cpp:123
void set_accuracy_decimals(int8_t accuracy_decimals)
Manually set the accuracy in decimals.
Definition sensor.cpp:61
void add_on_state_callback(std::function< void(float)> &&callback)
Add a callback that will be called every time a filtered value arrives.
Definition sensor.cpp:89
float state
This member variable stores the last state that has passed through all filters.
Definition sensor.h:116
StateClass get_state_class()
Get the state class, using the manual override if set.
Definition sensor.cpp:70
Filter * filter_list_
Store all active filters.
Definition sensor.h:130
float raw_state
This member variable stores the current raw state of the sensor, without any filters applied.
Definition sensor.h:122
LazyCallbackManager< void(float)> raw_callback_
Storage for raw state callbacks.
Definition sensor.h:127
int8_t get_accuracy_decimals()
Get the accuracy in decimals, using the manual override if set.
Definition sensor.cpp:56
void clear_filters()
Clear the entire filter chain.
Definition sensor.cpp:117
int8_t accuracy_decimals_
Accuracy in decimals (-1 = not set)
Definition sensor.h:133
StateClass state_class_
State class (STATE_CLASS_NONE = not set)
Definition sensor.h:134
bool get_force_update() const
Get whether force update mode is enabled.
Definition sensor.h:63
struct esphome::sensor::Sensor::SensorFlags sensor_flags_
void add_on_raw_state_callback(std::function< void(float)> &&callback)
Add a callback that will be called every time the sensor sends a raw value.
Definition sensor.cpp:90
void set_filters(std::initializer_list< Filter * > filters)
Clear the filters and replace them by filters.
Definition sensor.cpp:113
void add_filters(std::initializer_list< Filter * > filters)
Add a list of vectors to the back of the filter chain.
Definition sensor.cpp:108
uint16_t type
bool state
Definition fan.h:0
StateClass
Sensor state classes.
Definition sensor.h:28
@ STATE_CLASS_TOTAL
Definition sensor.h:32
@ STATE_CLASS_TOTAL_INCREASING
Definition sensor.h:31
@ STATE_CLASS_MEASUREMENT_ANGLE
Definition sensor.h:33
@ STATE_CLASS_MEASUREMENT
Definition sensor.h:30
void log_sensor(const char *tag, const char *prefix, const char *type, Sensor *obj)
Definition sensor.cpp:11
const LogString * state_class_to_string(StateClass state_class)
Definition sensor.cpp:38