BLE Component
=============

.. seo::
    :description: Instructions for setting up Bluetooth LE in ESPHome.
    :image: bluetooth.svg

The ``esp32_ble`` component in ESPHome sets up the Bluetooth LE stack on the device so that a :doc:`esp32_ble_server`
can run.

.. warning::

    The BLE software stack on the ESP32 consumes a significant amount of RAM on the device.
    
    **Crashes are likely to occur** if you include too many additional components in your device's
    configuration. Memory-intensive components such as :doc:`/components/voice_assistant` and other
    audio components are most likely to cause issues.

.. code-block:: yaml

    # Example configuration

    esp32_ble:
      io_capability: keyboard_only

Configuration variables:
------------------------

- **io_capability** (*Optional*, enum): The IO capability of this ESP32, used for securely connecting to other BLE devices. Defaults to ``none``.

    - ``none`` - No IO capability (Connections that require PIN code authentication will fail)
    - ``keyboard_only`` - Only a keyboard to enter PIN codes (or a fixed PIN code)
    - ``display_only`` - Only a display to show PIN codes
    - ``keyboard_display`` - A keyboard and a display
    - ``display_yes_no`` - A display to show PIN codes and buttons to confirm or deny the connection

- **enable_on_boot** (*Optional*, boolean): If enabled, the BLE interface will be enabled on boot. Defaults to ``true``.

``ble.disable`` Action
-----------------------

This action turns off the BLE interface on demand.

.. code-block:: yaml

    on_...:
      then:
        - ble.disable:

.. note::

    The configuration option ``enable_on_boot`` can be set to ``false`` if you do not want BLE to be enabled on boot.


``ble.enable`` Action
----------------------

This action turns on the BLE interface on demand.

.. code-block:: yaml

    on_...:
      then:
        - ble.enable:

.. note::

    The configuration option ``enable_on_boot`` can be set to ``false`` if you do not want BLE to be enabled on boot.


.. _ble-enabled_condition:

``ble.enabled`` Condition
--------------------------

This :ref:`Condition <config-condition>` checks if BLE is currently enabled or not.

.. code-block:: yaml

    on_...:
      - if:
          condition: ble.enabled
          then:
            - ble.disable:
          else:
            - ble.enable:


The lambda equivalent for this is ``id(ble_id).is_active()``.


See Also
--------

- :doc:`esp32_ble_server`
- :doc:`esp32_improv`
- :apiref:`esp32_ble/ble.h`
- :ghedit:`Edit`