ESPHome 2026.11.0-dev
Loading...
Searching...
No Matches
user_services.cpp
Go to the documentation of this file.
1#include "user_services.h"
2#include "esphome/core/hal.h"
3#include "esphome/core/log.h"
6
7namespace esphome::api {
8
10 const char *s = progmem_read_ptr(&this->strings_[idx]);
11 if (s == nullptr)
12 return {};
13 return ProgmemStringRef(s, ESPHOME_strlen_P(s));
14}
15
17 std::span<const enums::ServiceArgType> arg_types) const {
19 msg.name = this->str_(0);
20 msg.key = this->key_;
22#ifdef USE_API_USER_DEFINED_ACTION_METADATA
23 msg.description = this->str_(1);
24#endif
25 msg.args.init(arg_types.size());
26 for (size_t i = 0; i < arg_types.size(); i++) {
27 size_t base = USER_ACTION_HEADER_STRINGS + i * USER_ACTION_ARG_STRINGS;
28 auto &arg = msg.args.emplace_back();
29 arg.type = arg_types[i];
30 arg.name = this->str_(base);
31#ifdef USE_API_USER_DEFINED_ACTION_METADATA
32 arg.description = this->str_(base + 1);
33 arg.example = this->str_(base + 2);
34#endif
35#ifdef USE_API_USER_DEFINED_ACTION_OPTIONAL_ARGS
36 // The default slot doubles as the optional flag: nullptr is required, "" optional without a default
37 const char *d = progmem_read_ptr(&this->strings_[base + USER_ACTION_ARG_BASE_STRINGS]);
38 arg.optional = d != nullptr;
39 if (d != nullptr)
40 arg.default_value = ProgmemStringRef(d, ESPHOME_strlen_P(d));
41#endif
42 }
43 return msg;
44}
45
46template<> bool get_execute_arg_value<bool>(const ExecuteServiceArgument &arg) { return arg.bool_; }
48 if (arg.legacy_int != 0)
49 return arg.legacy_int;
50 return arg.int_;
51}
52template<> float get_execute_arg_value<float>(const ExecuteServiceArgument &arg) { return arg.float_; }
53template<> std::string get_execute_arg_value<std::string>(const ExecuteServiceArgument &arg) { return arg.string_; }
54// Zero-copy StringRef version for YAML-generated services (string_ is null-terminated after decode)
56
57// Legacy std::vector versions for external components using custom_api_device.h - optimized with reserve
58template<> std::vector<bool> get_execute_arg_value<std::vector<bool>>(const ExecuteServiceArgument &arg) {
59 std::vector<bool> result;
60 result.reserve(arg.bool_array.size());
61 result.insert(result.end(), arg.bool_array.begin(), arg.bool_array.end());
62 return result;
63}
64template<> std::vector<int32_t> get_execute_arg_value<std::vector<int32_t>>(const ExecuteServiceArgument &arg) {
65 std::vector<int32_t> result;
66 result.reserve(arg.int_array.size());
67 result.insert(result.end(), arg.int_array.begin(), arg.int_array.end());
68 return result;
69}
70template<> std::vector<float> get_execute_arg_value<std::vector<float>>(const ExecuteServiceArgument &arg) {
71 std::vector<float> result;
72 result.reserve(arg.float_array.size());
73 result.insert(result.end(), arg.float_array.begin(), arg.float_array.end());
74 return result;
75}
76template<> std::vector<std::string> get_execute_arg_value<std::vector<std::string>>(const ExecuteServiceArgument &arg) {
77 std::vector<std::string> result;
78 result.reserve(arg.string_array.size());
79 result.insert(result.end(), arg.string_array.begin(), arg.string_array.end());
80 return result;
81}
82
83// New FixedVector const reference versions for YAML-generated services - zero-copy
84template<>
88template<>
92template<>
96template<>
101
106// Zero-copy StringRef version for YAML-generated services
108
109// Legacy std::vector versions for external components using custom_api_device.h
120
121// New FixedVector const reference versions for YAML-generated services
134
135} // namespace esphome::api
Fixed-capacity vector - sized once through init() or try_init(); push_back never reallocates This avo...
Definition helpers.h:624
A string that may live in flash (on ESP8266): pointer and length, with no byte-reading operations.
Definition string_ref.h:230
StringRef is a reference to a string owned by something else.
Definition string_ref.h:31
enums::SupportsResponseType supports_response
Definition api_pb2.h:1625
FixedVector< ListEntitiesServicesArgument > args
Definition api_pb2.h:1624
ListEntitiesServicesResponse encode_list_service_response_(std::span< const enums::ServiceArgType > arg_types) const
ProgmemStringRef str_(size_t idx) const
Table entry idx as it sits in flash; nullptr gives an empty string.
enums::SupportsResponseType supports_response_
@ SERVICE_ARG_TYPE_BOOL_ARRAY
Definition api_pb2.h:96
@ SERVICE_ARG_TYPE_STRING_ARRAY
Definition api_pb2.h:99
@ SERVICE_ARG_TYPE_FLOAT_ARRAY
Definition api_pb2.h:98
float get_execute_arg_value< float >(const ExecuteServiceArgument &arg)
bool get_execute_arg_value< bool >(const ExecuteServiceArgument &arg)
int32_t get_execute_arg_value< int32_t >(const ExecuteServiceArgument &arg)
enums::ServiceArgType to_service_arg_type()
enums::ServiceArgType to_service_arg_type< StringRef >()
StringRef get_execute_arg_value< StringRef >(const ExecuteServiceArgument &arg)
enums::ServiceArgType to_service_arg_type< int32_t >()
enums::ServiceArgType to_service_arg_type< bool >()
enums::ServiceArgType to_service_arg_type< std::string >()
std::string get_execute_arg_value< std::string >(const ExecuteServiceArgument &arg)
T get_execute_arg_value(const ExecuteServiceArgument &arg)
enums::ServiceArgType to_service_arg_type< float >()
const char * progmem_read_ptr(const char *const *addr)
Definition hal.h:52