ESPHome 2025.12.2
Loading...
Searching...
No Matches
select.cpp
Go to the documentation of this file.
1#include "select.h"
4#include "esphome/core/log.h"
5#include <cstring>
6
7namespace esphome::select {
8
9static const char *const TAG = "select";
10
11void Select::publish_state(const std::string &state) { this->publish_state(state.c_str()); }
12
13void Select::publish_state(const char *state) {
14 auto index = this->index_of(state);
15 if (index.has_value()) {
16 this->publish_state(index.value());
17 } else {
18 ESP_LOGE(TAG, "'%s': Invalid option %s", this->get_name().c_str(), state);
19 }
20}
21
22void Select::publish_state(size_t index) {
23 if (!this->has_index(index)) {
24 ESP_LOGE(TAG, "'%s': Invalid index %zu", this->get_name().c_str(), index);
25 return;
26 }
27 const char *option = this->option_at(index);
28 this->set_has_state(true);
29 this->active_index_ = index;
30#pragma GCC diagnostic push
31#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
32 this->state = option; // Update deprecated member for backward compatibility
33#pragma GCC diagnostic pop
34 ESP_LOGD(TAG, "'%s': Sending state %s (index %zu)", this->get_name().c_str(), option, index);
35 // Callback signature requires std::string, create temporary for compatibility
36 this->state_callback_.call(std::string(option), index);
37#if defined(USE_SELECT) && defined(USE_CONTROLLER_REGISTRY)
39#endif
40}
41
42const char *Select::current_option() const { return this->has_state() ? this->option_at(this->active_index_) : ""; }
43
44void Select::add_on_state_callback(std::function<void(std::string, size_t)> &&callback) {
45 this->state_callback_.add(std::move(callback));
46}
47
48bool Select::has_option(const std::string &option) const { return this->index_of(option.c_str()).has_value(); }
49
50bool Select::has_option(const char *option) const { return this->index_of(option).has_value(); }
51
52bool Select::has_index(size_t index) const { return index < this->size(); }
53
54size_t Select::size() const {
55 const auto &options = traits.get_options();
56 return options.size();
57}
58
59optional<size_t> Select::index_of(const char *option, size_t len) const {
60 const auto &options = traits.get_options();
61 for (size_t i = 0; i < options.size(); i++) {
62 if (strncmp(options[i], option, len) == 0 && options[i][len] == '\0') {
63 return i;
64 }
65 }
66 return {};
67}
68
70 if (this->has_state()) {
71 return this->active_index_;
72 }
73 return {};
74}
75
76optional<std::string> Select::at(size_t index) const {
77 if (this->has_index(index)) {
78 const auto &options = traits.get_options();
79 return std::string(options.at(index));
80 }
81 return {};
82}
83
84const char *Select::option_at(size_t index) const { return traits.get_options().at(index); }
85
86} // namespace esphome::select
static void notify_select_update(select::Select *obj)
const StringRef & get_name() const
void set_has_state(bool state)
Definition entity_base.h:96
bool has_state() const
Definition entity_base.h:93
size_t size() const
Definition helpers.h:341
T & at(size_t i)
Access element with bounds checking (matches std::vector behavior) Note: No exception thrown on out o...
Definition helpers.h:351
bool has_value() const
Definition optional.h:92
void add_on_state_callback(std::function< void(std::string, size_t)> &&callback)
Definition select.cpp:44
const char * option_at(size_t index) const
Return the option value at the provided index offset (as const char* from flash).
Definition select.cpp:84
optional< size_t > active_index() const
Return the (optional) index offset of the currently active option.
Definition select.cpp:69
size_t size() const
Return the number of options in this select component.
Definition select.cpp:54
optional< std::string > at(size_t index) const
Return the (optional) option value at the provided index offset.
Definition select.cpp:76
bool has_option(const std::string &option) const
Return whether this select component contains the provided option.
Definition select.cpp:48
optional< size_t > index_of(const char *option, size_t len) const
Find the (optional) index offset of the provided option value.
Definition select.cpp:59
bool has_index(size_t index) const
Return whether this select component contains the provided index offset.
Definition select.cpp:52
const char * current_option() const
Return the currently selected option (as const char* from flash).
Definition select.cpp:42
SelectTraits traits
Definition select.h:32
CallbackManager< void(std::string, size_t)> state_callback_
Definition select.h:114
void publish_state(const std::string &state)
Definition select.cpp:11
const FixedVector< const char * > & get_options() const
uint8_t options
bool state
Definition fan.h:0
std::string size_t len
Definition helpers.h:503