def gatt_procedure_write_handle_async(stack_connection, connection_handle, handle, data, timeout=15 * 1000):
    """
    Writes data to target attribute handle and returns a GATTRequest object that contains either
    a GATTResponse for a GATTError. This is an asynchronous function that issues the request
    and returns a GATTRequest object. The GATTRequest can then be manually managed using the
    has_response and has_error class instance functions to wait for a response.

    :param stack_connection: Connection to the pybt core that allows us to send BLE packets
    :type stack_connection: blesuite.pybt.core.Connection
    :param connection_handle: Connection handle to send the request to
    :type connection_handle: int
    :param handle: Target handle
    :param data: Data to write to handle
    :type handle: int - base 10
    :type data: str
    :param timeout: Timeout for the ATT request (miliseconds)
    :type timeout: int
    :rtype: blesuite.pybyt.core.GATTRequest
    :return: GATTRequest object
    """

    request = stack_connection.write_req_async(handle, data, connection_handle, timeout=timeout)
    return request