Commit Graph

22561 Commits

Author SHA1 Message Date
J. Nick Koston
18b4818fb1 Merge branch 'web_server_reduce_set_json_id' into integration 2026-02-17 14:52:00 -06:00
J. Nick Koston
75e5ba93cd Merge remote-tracking branch 'upstream/dev' into integration 2026-02-17 13:21:13 -06:00
Rodrigo Martín
81ed70325c [esp32_ble_server] fix infinitely large characteristic value (#14011) 2026-02-17 07:45:21 -10:00
schrob
e826d71bd8 [openthread] Fix compiler format warning (#14030) 2026-02-17 10:16:57 -05:00
J. Nick Koston
090b85742b [web_server] Reduce set_json_id code size by ~48 bytes
Reuse a single stack buffer for both name_id and legacy id
construction instead of two separate buffers. ArduinoJson
copies from char* before the buffer is overwritten.

Use .c_str() instead of passing StringRef directly to
ArduinoJson assignments, routing through the already-
instantiated set<const char*> template and eliminating
the 24-byte set<StringRef> wrapper from the binary.
2026-02-16 23:46:49 -06:00
J. Nick Koston
4cd3f6c36a [api] Remove unused reserve from APIServer constructor (#14017) 2026-02-17 16:30:57 +13:00
Jesse Hills
6b4b8cb2f9 Merge branch 'beta' into dev 2026-02-17 16:22:46 +13:00
Jesse Hills
fd43bd2b7e Merge pull request #14025 from esphome/bump-2026.2.0b3
2026.2.0b3
2026.2.0b3
2026-02-17 16:22:12 +13:00
J. Nick Koston
aeefb7fc43 Merge branch 'http_request_remove_list' into integration 2026-02-16 19:49:45 -06:00
J. Nick Koston
4d5010db5d [http_request] Replace std::list<Header> with std::vector<Header> in perform() chain
std::list uses per-node heap allocation (one allocation per element)
and has poor cache locality. std::vector is contiguous and uses a
single allocation.

Changes:
- Replace std::list<Header> with std::vector<Header> in perform()
  virtual method signature across all platforms (IDF, Arduino, Host)
- Update all start(), get(), post() overloads accordingly
- Add ESPDEPRECATED overloads for std::list<Header> callers
- Update online_image to use std::vector<Header>
- Clean up request_headers construction in play() using structured
  bindings and reserve()
2026-02-16 19:37:38 -06:00
J. Nick Koston
0797ece7ce Merge branch 'http_request_remove_action_maps' into integration 2026-02-16 19:19:11 -06:00
J. Nick Koston
3cc096188c [http_request] Use FixedVector for request_headers_ and json_ in action
The sizes are known at Python codegen time, so use FixedVector with
init() for a single allocation and no reallocation machinery. This
eliminates _M_realloc_append template instantiations for these types.
2026-02-16 19:18:25 -06:00
J. Nick Koston
999ebf9496 [http_request] Use FixedVector for request_headers_ and json_ in action
The sizes are known at Python codegen time, so use FixedVector with
init() for a single allocation and no reallocation machinery. This
eliminates _M_realloc_append template instantiations for these types.
2026-02-16 19:18:11 -06:00
J. Nick Koston
24fa4a137d Merge branch 'http_request_remove_action_maps' into integration 2026-02-16 19:12:54 -06:00
J. Nick Koston
87e998f455 [http_request] Replace std::map with std::vector<std::pair> in action template
request_headers_ and json_ are populated at config time via
add_request_header()/add_json() and only iterated linearly at
runtime. std::map's red-black tree is unnecessary overhead for
these small collections. Drop the <map> include.
2026-02-16 19:05:44 -06:00
J. Nick Koston
2b21c0a2b2 [http_request] Rename response_headers param to collect_headers in host
Align with IDF and Arduino implementations where the parameter is
named collect_headers.
2026-02-16 18:59:40 -06:00
J. Nick Koston
0c5d3ad77a [http_request] Rename response_headers param to collect_headers in host
Align with IDF and Arduino implementations where the parameter is
named collect_headers.
2026-02-16 18:59:20 -06:00
J. Nick Koston
b2b5bf0996 Merge branch 'http_request_reduce_stl_overhead' into integration 2026-02-16 18:54:09 -06:00
J. Nick Koston
aa3ac552c8 [http_request] Restore descriptive variable name in start() 2026-02-16 18:48:32 -06:00
J. Nick Koston
2fa6c15fc1 [http_request] Remove unnecessary lowercase_headers template helper
The template only existed to share a loop between set and vector
iterators. Instead, have the deprecated set overload forward to
the vector overload, and inline the loop there.
2026-02-16 18:38:31 -06:00
J. Nick Koston
7726d0aac9 [http_request] Rename should_collect_header param to lower_header_name
Makes it clear the caller must pass an already-lowercased header name.
2026-02-16 18:37:08 -06:00
J. Nick Koston
f43ef21c69 [http_request] Remove redundant lowercasing from add_collect_header
start() already lowercases all collect_headers via lowercase_headers(),
so pre-lowercasing at insertion time was redundant double work on
every request.
2026-02-16 18:34:41 -06:00
J. Nick Koston
d2037aef8d [http_request] Extract lowercase_headers helper to avoid double-copy
Both start() overloads now use a shared lowercase_headers() template
that does a single pass from any iterator range, avoiding the extra
vector copy that the set overload was doing.
2026-02-16 18:28:04 -06:00
J. Nick Koston
a55abd8e5f [http_request] Deduplicate lowercasing in start() overloads
Have the deprecated std::set overload forward to the vector overload
which already handles lowercasing.
2026-02-16 18:26:12 -06:00
J. Nick Koston
7c36dfa1fc [http_request] Ensure start() vector overload lowercases collect_headers
The vector overload of start() was passing collect_headers directly
to perform() without lowercasing. This meant callers using get()/post()
with mixed-case header names (e.g. {"ETag"}) would fail to match
against the lowercased header names from the HTTP response.
2026-02-16 18:24:41 -06:00
Jesse Hills
5904808804 Bump version to 2026.2.0b3 2026-02-17 13:24:35 +13:00
Jonathan Swoboda
e945e9b659 [esp32_rmt] Handle ESP32 variants without RMT hardware (#14001)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 13:24:35 +13:00
Jonathan Swoboda
df29cdbf17 [fan] Fix preset_mode not restored on boot (#14002)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 13:24:35 +13:00
Jonathan Swoboda
f6362aa8da [combination] Fix 'coeffecient' typo with backward-compatible deprecation (#14004)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 13:24:35 +13:00
J. Nick Koston
1517b7799a [wifi] Fix ESP8266 DHCP state corruption from premature dhcp_renew() (#13983)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 13:24:35 +13:00
J. Nick Koston
5e7b4c1e6c [http_request] Add comment explaining why start() calls perform() directly
The no-collect-headers start() overload calls perform() directly
instead of the vector start() overload to avoid ambiguity with
the deprecated std::set overload.
2026-02-16 18:17:53 -06:00
J. Nick Koston
3043ba8d89 [http_request] Deprecate std::set overloads of start(), use std::vector for get()/post()
- Change get()/post() collect_headers param from std::set to std::vector
  (initializer list callers like online_image work unchanged)
- Add ESPDEPRECATED on start() std::set overload with clear message
  about the collect_headers parameter
2026-02-16 18:17:11 -06:00
J. Nick Koston
8120bd373c [http_request] Replace std::map/std::set/std::list with std::vector for response headers
Replace heavy STL containers with simple std::vector and linear scan
for response header collection. This eliminates red-black tree (_Rb_tree)
and hash table template instantiations that are unnecessary for the small
number of headers typically collected (1-5 elements).

Changes:
- response_headers_: std::map<string, list<string>> -> std::vector<Header>
- collect_headers_: std::set<string> -> std::vector<string>
- perform() signature: std::set -> std::vector
- Add should_collect_header() inline helper for linear scan
- Lowercase collect_headers at config/insertion time instead of per-request
- IDF UserData now holds references to container's vector instead of
  owning a separate map that gets moved after the request
- Reuse existing Header struct instead of std::pair

Reduces stack usage in perform() and eliminates STL container overhead
on memory-constrained ESP devices.
2026-02-16 18:11:58 -06:00
J. Nick Koston
63bf03c467 Merge branch 'api-proto-write-presized-buffer' into integration 2026-02-16 16:09:01 -06:00
J. Nick Koston
5aef550c71 address copilot revie wcomments 2026-02-16 16:05:54 -06:00
J. Nick Koston
9d387b66db address copilot revie wcomments 2026-02-16 16:03:35 -06:00
J. Nick Koston
61c4288097 [api] Address review: comment noinline, simplify non-debug signature 2026-02-16 15:27:11 -06:00
J. Nick Koston
9710ba3093 Merge remote-tracking branch 'origin/integration' into integration 2026-02-16 15:17:35 -06:00
J. Nick Koston
09f604f2fc Merge branch 'api-proto-write-presized-buffer' into integration
# Conflicts:
#	esphome/components/api/proto.h
2026-02-16 15:17:06 -06:00
J. Nick Koston
f1d51773af Revert "[api] Pass ProtoWriteBuffer by reference in encode()"
This reverts commit 6369f3b279.
2026-02-16 15:12:10 -06:00
J. Nick Koston
6369f3b279 [api] Pass ProtoWriteBuffer by reference in encode()
Pass ProtoWriteBuffer by reference instead of by value in virtual
encode() methods. This avoids copying both buffer_ and pos_ pointers
for every encode call - only a single pointer is passed.

Also simplifies encode_message since child writes directly advance
the shared pos_. Adds debug_check_size_ to verify calculate_size
matches actual encode output.
2026-02-16 15:01:59 -06:00
J. Nick Koston
af4579ca87 [api] Write protobuf encode output to pre-sized buffer directly
ProtoSize::calculate_size() already computes the exact encoded size
before encode() runs and is the boundary validation. The buffer is
pre-sized to match. Since the buffer size is always correct,
push_back() capacity checks on every byte are redundant overhead.

Rename ProtoWriteBuffer to ProtoWritePreSizedBuffer to document the
contract. Write through a raw uint8_t* pointer instead of push_back().
Pre-resize the buffer to include payload space before encoding.

Add ESPHOME_DEBUG_API bounds checks to validate writes stay within the
pre-sized region during development and integration testing.
2026-02-16 14:40:55 -06:00
J. Nick Koston
d0973fd327 Merge branch 'api-proto-write-presized-buffer' into integration 2026-02-16 11:30:09 -06:00
J. Nick Koston
7177add985 [api] Write protobuf encode output to pre-sized buffer directly
ProtoSize::calculate_size() already computes the exact encoded size
before encode() runs and is the boundary validation. The buffer is
pre-sized to match. Since the buffer size is always correct,
push_back() capacity checks on every byte are redundant overhead.

Rename ProtoWriteBuffer to ProtoWritePreSizedBuffer to document the
contract. Write through a raw uint8_t* pointer instead of push_back().
Pre-resize the buffer to include payload space before encoding.

Add ESPHOME_DEBUG_API bounds checks to validate writes stay within the
pre-sized region during development and integration testing.
2026-02-16 11:29:18 -06:00
J. Nick Koston
ab26e5d574 Merge remote-tracking branch 'origin/api-proto-write-presized-buffer' into integration 2026-02-16 11:20:30 -06:00
J. Nick Koston
ee9de5c412 [api] Write protobuf encode output to pre-sized buffer directly
ProtoSize::calculate_size() already computes the exact encoded size
before encode() runs and is the boundary validation. The buffer is
pre-sized to match. Since the buffer size is always correct,
push_back() capacity checks on every byte are redundant overhead.

Rename ProtoWriteBuffer to ProtoWritePreSizedBuffer to document the
contract. Write through a raw uint8_t* pointer instead of push_back().
Pre-resize the buffer to include payload space before encoding.

Add ESPHOME_DEBUG_API bounds checks to validate writes stay within the
pre-sized region during development and integration testing.
2026-02-16 11:10:10 -06:00
J. Nick Koston
b86cd229cc Merge remote-tracking branch 'upstream/api-remove-unused-reserve' into integration 2026-02-16 10:08:55 -06:00
J. Nick Koston
f40fa97883 [api] Remove unused reserve from APIServer constructor
All send paths already call prepare_first_message_buffer which does
clear() + reserve() with the exact needed size, making the initial
reserve(64) redundant. Removing it saves 68 bytes of flash.
2026-02-16 10:07:41 -06:00
J. Nick Koston
4a5639e9f7 Merge remote-tracking branch 'upstream/dev' into integration 2026-02-16 10:03:06 -06:00
J. Nick Koston
0c4827d348 [json, core] Remove stored RAMAllocator, make constructors constexpr (#14000) 2026-02-16 08:09:53 -06:00