ESPHome 2026.11.0-dev
Loading...
Searching...
No Matches
homeassistant_text.cpp
Go to the documentation of this file.
2
3#include <cstring>
4
8#include "esphome/core/log.h"
11
12namespace esphome::homeassistant {
13
14ESPHOME_LOG_TAG(TAG, "homeassistant.text");
15
17 if (state == this->state) {
18 return;
19 }
20 ESP_LOGD(TAG, "'%s': Got state %s", this->entity_id_, state.c_str());
21 this->publish_state(state.c_str(), state.size());
22}
23
25 auto min_value = parse_number<int>(min.c_str());
26 if (!min_value.has_value()) {
27 ESP_LOGE(TAG, "'%s': Can't convert 'min' value '%s' to number!", this->entity_id_, min.c_str());
28 return;
29 }
30 ESP_LOGD(TAG, "'%s': Min retrieved: %s", this->entity_id_, min.c_str());
31 this->traits.set_min_length(min_value.value());
32}
33
35 auto max_value = parse_number<int>(max.c_str());
36 if (!max_value.has_value()) {
37 ESP_LOGE(TAG, "'%s': Can't convert 'max' value '%s' to number!", this->entity_id_, max.c_str());
38 return;
39 }
40 ESP_LOGD(TAG, "'%s': Max retrieved: %s", this->entity_id_, max.c_str());
41 this->traits.set_max_length(max_value.value());
42}
43
45 if (mode == "text") {
47 } else if (mode == "password") {
49 } else {
50 ESP_LOGW(TAG, "'%s': Unknown 'mode' value '%s'", this->entity_id_, mode.c_str());
51 return;
52 }
53 ESP_LOGD(TAG, "'%s': Mode retrieved: %s", this->entity_id_, mode.c_str());
54}
55
58 [this](StringRef state) { this->state_changed_(state); });
59
61 [this](StringRef min) { this->min_retrieved_(min); });
63 [this](StringRef max) { this->max_retrieved_(max); });
65 [this](StringRef mode) { this->mode_retrieved_(mode); });
66 // The "pattern" attribute is not fetched: Home Assistant sends "None" when it is unset,
67 // and a runtime pattern would need its own buffer.
68}
69
71 LOG_TEXT("", "Homeassistant Text", this);
72 ESP_LOGCONFIG(TAG, " Entity ID: '%s'", this->entity_id_);
73}
74
76
77void HomeassistantText::control(const std::string &value) {
78 if (!api::global_api_server->is_connected()) {
79 ESP_LOGE(TAG, "No clients connected to API server");
80 return;
81 }
82
83#ifdef USE_API_WIZARD_LINKED_INPUTS
84 if (this->entity_id_[0] == '\0') {
85 ESP_LOGW(TAG, "'%s': No entity ID set yet", this->get_name().c_str());
86 return;
87 }
88#endif
89
90 // In flash on the ESP8266 and encoded from there
91 static const char SERVICE_TEXT[] PROGMEM = "text.set_value";
92 static const char SERVICE_INPUT_TEXT[] PROGMEM = "input_text.set_value";
93 static const char ENTITY_ID_KEY[] PROGMEM = "entity_id";
94 static const char VALUE_KEY[] PROGMEM = "value";
95
97 // An input helper entity id starts with the "input_" its action name starts with
98 const bool input_helper = ESPHOME_strncmp_P(this->entity_id_, SERVICE_INPUT_TEXT, sizeof("input_") - 1) == 0;
99 resp.service =
100 input_helper ? ProgmemStringRef::from_lit(SERVICE_INPUT_TEXT) : ProgmemStringRef::from_lit(SERVICE_TEXT);
101
102 resp.data.init(2);
103 auto &entity_id_kv = resp.data.emplace_back();
104 entity_id_kv.key = ProgmemStringRef::from_lit(ENTITY_ID_KEY);
105 entity_id_kv.value = ProgmemStringRef(StringRef(this->entity_id_));
106
107 auto &value_kv = resp.data.emplace_back();
108 value_kv.key = ProgmemStringRef::from_lit(VALUE_KEY);
109 value_kv.value = ProgmemStringRef(value.data(), value.size());
110
112}
113
114} // namespace esphome::homeassistant
BedjetMode mode
BedJet operating mode.
const StringRef & get_name() const
Definition entity_base.h:71
A string that may live in flash (on ESP8266): pointer and length, with no byte-reading operations.
Definition string_ref.h:230
static constexpr ProgmemStringRef from_lit(const char(&s)[N])
A PROGMEM char array, with its length known at compile time.
Definition string_ref.h:236
StringRef is a reference to a string owned by something else.
Definition string_ref.h:31
constexpr const char * c_str() const
Definition string_ref.h:78
void get_home_assistant_state(const char *entity_id, const char *attribute, std::function< void(StringRef)> &&f)
void send_homeassistant_action(const HomeassistantActionRequest &call)
void subscribe_home_assistant_state(const char *entity_id, const char *attribute, std::function< void(StringRef)> &&f)
FixedVector< HomeassistantServiceMap > data
Definition api_pb2.h:1414
void control(const std::string &value) override
void publish_state(const std::string &state)
Definition text.h:26
std::string state
Definition text.h:23
TextTraits traits
Definition text.h:24
void set_mode(TextMode mode)
Definition text_traits.h:29
void set_max_length(int max_length)
Definition text_traits.h:19
void set_min_length(int min_length)
Definition text_traits.h:17
bool state
Definition fan.h:2
APIServer * global_api_server
ESPHOME_LOG_TAG(TAG, "homeassistant.binary_sensor")
constexpr float AFTER_CONNECTION
For components that should be initialized after a data connection (API/MQTT) is connected.
Definition component.h:57
optional< T > parse_number(const char *str)
Parse an unsigned decimal number from a null-terminated string.
Definition helpers.h:1276