From cb129194da1625b960d20fc8f0813aa9d8d2d8f1 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 8 Jun 2021 11:56:31 +1200 Subject: [PATCH] Add docs for Improv and new BLE base/server (#1203) Co-authored-by: Franck Nijhof --- components/esp32_ble.rst | 34 ++++++++++++++++++++++++++++ components/esp32_improv.rst | 44 ++++++++++++++++++++++++++++++++++++ components/esphome.rst | 2 ++ images/improv-social.png | Bin 0 -> 45419 bytes images/improv.svg | 1 + index.rst | 1 + 6 files changed, 82 insertions(+) create mode 100644 components/esp32_ble.rst create mode 100644 components/esp32_improv.rst create mode 100644 images/improv-social.png create mode 100644 images/improv.svg diff --git a/components/esp32_ble.rst b/components/esp32_ble.rst new file mode 100644 index 000000000..39e5d0348 --- /dev/null +++ b/components/esp32_ble.rst @@ -0,0 +1,34 @@ +BLE Component +============= + +.. seo:: + :description: Instructions for setting up Bluetooth LE in ESPHome. + :image: bluetooth.svg + +The ``esp32_ble`` component in ESPHome sets up a simple BLE GATT server that exposes the device name, +manufacturer and board. This component allows other components to create their own services to expose +data and control. + +.. code-block:: yaml + + # Example configuration + + esp32_ble: + server: + + +Configuration variables: +------------------------ + +- **server** (*Optional*): Starts the BLE GATT server + + - **manufacturer** (*Optional*, string): The name of the manufacturer/firmware creator. Defaults to ``ESPHome``. + - **model** (*Optional*, string): The model name of the device. Defaults to the friendly name of the ``board`` chosen + in the :ref:`core configuration `. + +See Also +-------- + +- :doc:`esp32_improv` +- :apiref:`esp32_ble/ble.h` +- :ghedit:`Edit` diff --git a/components/esp32_improv.rst b/components/esp32_improv.rst new file mode 100644 index 000000000..d0405c872 --- /dev/null +++ b/components/esp32_improv.rst @@ -0,0 +1,44 @@ +Improv +====== + +.. seo:: + :description: Instructions for setting up Improv WiFi in ESPHome. + :image: improv-social.png + +The ``esp32_improv`` component in ESPHome implements the open `Improv standard `__ +for configuring Wi-Fi on an ESP32 device by using Bluetooth Low Energy to receive the credentials. + +The ``esp32_improv`` component requires the :doc:`BLE Server ` to be set up. + + +.. code-block:: yaml + + # Example configuration entry + wifi: + # ... + + esp32_ble: + server: # A BLE server is required + + esp32_improv: + authorizer: binary_sensor_id + + +Configuration variables: +------------------------ + +- **authorizer** (**Required**, :ref:`config-id`): A :doc:`binary sensor ` to authorize with. + Also accepts ``none``/``false`` to skip authorization. +- **authorized_duration** (*Optional*, :ref:`config-time`): The amount of time until authorization times out and needs + to be re-authorized. Defaults to ``1min``. +- **status_indicator** (*Optional*, :ref:`config-id`): An :doc:`output ` to display feedback to the user. +- **identify_duration** (*Optional*, :ref:`config-time`): The amount of time to identify for. Defaults to ``10s``. + +See Also +-------- + +- :doc:`wifi` +- :doc:`captive_portal` +- `Improv Wi-Fi `__ +- :apiref:`esp32_improv/esp32_improv_component.h` +- :ghedit:`Edit` diff --git a/components/esphome.rst b/components/esphome.rst index 06624a8c1..ae059b0e5 100644 --- a/components/esphome.rst +++ b/components/esphome.rst @@ -19,6 +19,8 @@ where you specify the **name** of the node, the **platform** and platform: ESP32 board: nodemcu-32s +.. _esphome-configuration_variables: + Configuration variables: ------------------------ diff --git a/images/improv-social.png b/images/improv-social.png new file mode 100644 index 0000000000000000000000000000000000000000..294f7911b01c4dc8701b1d33adec3c40c7c74860 GIT binary patch literal 45419 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

nqSS$t3uNM( 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 QZz5yxboFyt=akR{06J(awEzGB literal 0 HcmV?d00001 diff --git a/images/improv.svg b/images/improv.svg new file mode 100644 index 000000000..f64a154de --- /dev/null +++ b/images/improv.svg @@ -0,0 +1 @@ + diff --git a/index.rst b/index.rst index e63e56069..3ce494959 100644 --- a/index.rst +++ b/index.rst @@ -383,6 +383,7 @@ Misc Components SIM800L, components/sim800l, sim800l.jpg DFPlayer, components/dfplayer, dfplayer.svg Captive Portal, components/captive_portal, wifi-strength-alert-outline.svg + Improv, components/esp32_improv, improv.svg Debug Component, components/debug, bug-report.svg TM1651 Battery Display, components/tm1651, tm1651_battery_display.jpg RF Bridge, components/rf_bridge, rf_bridge.jpg