diff --git a/esphome/components/api/api_connection.cpp b/esphome/components/api/api_connection.cpp index faa39a01a9d..5ee432dc0c6 100644 --- a/esphome/components/api/api_connection.cpp +++ b/esphome/components/api/api_connection.cpp @@ -2021,19 +2021,21 @@ uint16_t APIConnection::encode_to_buffer(uint32_t calculated_size, MessageEncode auto &shared_buf = conn->parent_->get_shared_buffer_ref(); + size_t write_start; if (conn->flags_.batch_first_message) { // First message - buffer already prepared by caller, just clear flag conn->flags_.batch_first_message = false; + write_start = shared_buf.size(); + shared_buf.resize(write_start + calculated_size); } else { // Batch message second or later - // Add padding for previous message footer + this message header + // Reserve for full message, resize to include footer gap + header padding + payload size_t current_size = shared_buf.size(); - shared_buf.reserve_and_resize(current_size + total_calculated_size, current_size + footer_size + header_padding); + shared_buf.reserve_and_resize(current_size + total_calculated_size, + current_size + footer_size + header_padding + calculated_size); + write_start = shared_buf.size() - calculated_size; } - // Pre-resize buffer to include payload, then encode through raw pointer - size_t write_start = shared_buf.size(); - shared_buf.resize(write_start + calculated_size); ProtoWriteBuffer buffer{&shared_buf, write_start}; encode_fn(msg, buffer);