From 896afdcfa10bf2432d09d2ab8f82cfd1f3f4540d Mon Sep 17 00:00:00 2001 From: Guillermo Ruffino Date: Sat, 20 Feb 2021 18:02:46 -0300 Subject: [PATCH] Fix format next (#1023) * Missing colon * update sun * format fix and adaptation * fix format * fix format 2 * fix format 3 * fix format * fix format * fix format * format fix * revert title as heads * rename image case-sensitive * rename again --- components/binary_sensor/ble_presence.rst | 2 +- components/binary_sensor/mpr121.rst | 18 ++- components/binary_sensor/pn532.rst | 71 +++++++--- components/binary_sensor/rc522.rst | 85 ++++++------ components/binary_sensor/rdm6300.rst | 4 +- components/binary_sensor/ttp229.rst | 20 +-- components/canbus.rst | 15 ++- components/climate/bang_bang.rst | 4 +- components/climate/ir_climate.rst | 71 +++++----- components/climate/pid.rst | 10 +- components/climate/thermostat.rst | 3 +- components/debug.rst | 2 +- components/deep_sleep.rst | 7 +- components/dfplayer.rst | 10 +- components/display/ili9341.rst | 8 +- components/display/images/inkplate.jpg | Bin 0 -> 33233 bytes components/display/index.rst | 63 ++++++++- .../display/{Inkplate.rst => inkplate6.rst} | 12 +- components/display/lcd_display.rst | 8 +- components/display/nextion.rst | 3 +- components/display/pcd8544.rst | 6 +- components/display/ssd1306.rst | 5 +- components/display/ssd1322.rst | 10 +- components/display/ssd1325.rst | 14 +- components/display/ssd1327.rst | 13 +- components/display/ssd1331.rst | 8 +- components/display/ssd1351.rst | 15 +-- components/display/st7735.rst | 14 +- components/display/st7789v.rst | 12 +- components/display/waveshare_epaper.rst | 5 +- components/esp32_ble_tracker.rst | 8 +- components/gps.rst | 5 +- components/i2c.rst | 8 +- components/light/index.rst | 43 ++++--- components/logger.rst | 3 + components/mcp230xx.rst | 12 +- components/mcp23Sxx.rst | 8 +- components/mqtt.rst | 2 +- components/output/index.rst | 13 +- components/output/mcp4725.rst | 33 +---- components/output/my9231.rst | 70 +++++----- components/output/sm16716.rst | 8 +- components/output/template.rst | 10 +- components/remote_receiver.rst | 4 +- components/sensor/apds9960.rst | 22 +++- components/sensor/as3935.rst | 121 +++++++++++------- components/sensor/custom.rst | 13 +- components/sensor/dallas.rst | 4 +- components/sensor/mcp3008.rst | 24 ++-- components/sensor/mcp9808.rst | 10 +- components/sensor/ruuvitag.rst | 2 +- components/sensor/tmp117.rst | 4 +- components/stepper/index.rst | 78 ++++++----- components/sun.rst | 8 +- components/sx1509.rst | 13 +- components/time.rst | 6 +- components/wifi.rst | 2 +- .../uart.rst => cookbook/uart_text_sensor.rst | 0 custom/custom_component.rst | 3 + guides/automations.rst | 24 ++-- guides/configuration-types.rst | 19 --- images/inkplate.jpg | Bin 0 -> 33233 bytes index.rst | 4 +- 63 files changed, 626 insertions(+), 476 deletions(-) create mode 100644 components/display/images/inkplate.jpg rename components/display/{Inkplate.rst => inkplate6.rst} (98%) rename components/text_sensor/uart.rst => cookbook/uart_text_sensor.rst (100%) create mode 100644 images/inkplate.jpg diff --git a/components/binary_sensor/ble_presence.rst b/components/binary_sensor/ble_presence.rst index 3a0d6d9ce..d19e05b33 100644 --- a/components/binary_sensor/ble_presence.rst +++ b/components/binary_sensor/ble_presence.rst @@ -40,7 +40,7 @@ Configuration variables: - **name** (**Required**, string): The name of the binary sensor. - **mac_address** (*Optional*, MAC Address): The MAC address to track for this binary sensor. Either this or ``service_uuid`` has to be present. -- **service_uuid** (*Optional*, string) 16 bit, 32 bit, or 128 bit BLE Service UUID +- **service_uuid** (*Optional*, string): 16 bit, 32 bit, or 128 bit BLE Service UUID which can be tracked if the device randomizes the MAC address. Either this or ``mac_address`` has to be present. - **id** (*Optional*, :ref:`config-id`): Manually specify diff --git a/components/binary_sensor/mpr121.rst b/components/binary_sensor/mpr121.rst index 62c584c17..181dc67be 100644 --- a/components/binary_sensor/mpr121.rst +++ b/components/binary_sensor/mpr121.rst @@ -6,6 +6,11 @@ MPR121 Capacitive Touch Sensor :image: mpr121.jpg :keywords: MPR121 +.. _mpr121-component: + +Component/Hub +------------- + The ``mpr121`` sensor platform allows you to use your MPR121 (`datasheet `__, `Adafruit`_) Capacitive Touch Sensor with ESPHome. The :ref:`I²C ` is @@ -43,8 +48,6 @@ Configuration variables: The configuration is made up of two parts: The central component, and individual Binary sensors per channel. -Base Configuration: - - **address** (*Optional*, integer): The I²C address of the sensor. Defaults to ``0x5A``. - **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor. - **touch_debounce** (*Optional*, integer): The minimum length before a touch is recognized. Range is from 0 to 7. @@ -55,7 +58,16 @@ Base Configuration: and should be between 5 and 30 (lower = more sensitive). Defaults to 12. Typically the touch threshold is a little bigger than the release threshold. - **release_threshold** (*Optional*, integer): The release defines the sensitivity for touch detection and should be between 5 and 30. Defaults to 6. -Binary Sensor Configuration: +Binary Sensor +------------- + +The ``mpr121`` binary sensor allows you to use your MPR121 with ESPHome. +First, setup a :ref:`mpr121-component` and then use this binary sensor platform to create individual +binary sensors for each touch sensor. + + +Configuration variables: + - **name** (*Optional*, string): The name for the binary sensor. - **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation. diff --git a/components/binary_sensor/pn532.rst b/components/binary_sensor/pn532.rst index bab9ca903..ce1d5fad2 100644 --- a/components/binary_sensor/pn532.rst +++ b/components/binary_sensor/pn532.rst @@ -28,14 +28,62 @@ You will need to switch the dip switches located on the module according to the SPI is usually switch 1 OFF and switch 2 ON and I²C is usually switch 1 ON and switch 2 OFF. You will need to have the :ref:`SPI Bus ` or the :ref:`I²C Bus ` configured depending on your choice. +Over SPI +-------- + +The ``pn532_spi`` component allows you to use PN532 NFC/RFID controllers +(`datasheet `__, `Adafruit `__) +with ESPHome. This component is a global hub that establishes the connection to the PN532 via :ref:`SPI ` and +outputs its data. Using the :ref:`PN532 binary sensors ` you can then +create individual binary sensors that track if an NFC/RFID tag is currently detected by the PN532. + .. code-block:: yaml - # Example configuration for SPI (choose which one!) pn532_spi: cs_pin: D3 update_interval: 1s - # Example configuration for I²C (choose which one!) + + binary_sensor: + - platform: pn532 + uid: 74-10-37-94 + name: "PN532 NFC Tag" + +Configuration variables: +************************ + +- **cs_pin** (**Required**, :ref:`Pin Schema `): The pin on the ESP that the chip select line + is connected to. +- **update_interval** (*Optional*, :ref:`config-time`): The duration of each scan on the PN532. This affects the + duration that the individual binary sensors stay active when they're found. + If a device is not found within this time window, it will be marked as not present. Defaults to 1s. +- **on_tag** (*Optional*, :ref:`Automation `): An automation to perform + when a tag is read. See :ref:`pn532-on_tag`. +- **spi_id** (*Optional*, :ref:`config-id`): Manually specify the ID of the :ref:`SPI Component ` if you want + to use multiple SPI buses. +- **id** (*Optional*, :ref:`config-id`): Manually specify the ID for this component. + +.. figure:: images/pn532-spi.jpg + :align: center + :width: 80.0% + + Example for hooking up the PN532 via SPI. Notice the position of the two switches on the right. + +.. _pn532-on_tag: + + +Over I²C +-------- + +The ``pn532`` component allows you to use PN532 NFC/RFID controllers +(`datasheet `__, `Adafruit `__) +with ESPHome. This component is a global hub that establishes the connection to the PN532 via :ref:`I²C ` and +outputs its data. Using the :ref:`PN532 binary sensors ` you can then +create individual binary sensors that track if an NFC/RFID tag is currently detected by the PN532. + + +.. code-block:: yaml + pn532_i2c: update_interval: 1s @@ -47,29 +95,18 @@ You will need to have the :ref:`SPI Bus ` or the :ref:`I²C Bus ` conf Configuration variables: ************************ -- **cs_pin** (**Required for SPI**, :ref:`Pin Schema `): The pin on the ESP that the chip select line - is connected to. - **update_interval** (*Optional*, :ref:`config-time`): The duration of each scan on the PN532. This affects the duration that the individual binary sensors stay active when they're found. If a device is not found within this time window, it will be marked as not present. Defaults to 1s. - **on_tag** (*Optional*, :ref:`Automation `): An automation to perform when a tag is read. See :ref:`pn532-on_tag`. -- **spi_id** (*Optional*, :ref:`config-id`): Manually specify the ID of the :ref:`SPI Component ` if you want - to use multiple SPI buses. - **i2c_id** (*Optional*, :ref:`config-id`): Manually specify the ID of the :ref:`I²C Component ` if you want to use multiple I²C buses. - **id** (*Optional*, :ref:`config-id`): Manually specify the ID for this component. -.. figure:: images/pn532-spi.jpg - :align: center - :width: 80.0% - Example for hooking up the PN532 via SPI. Notice the position of the two switches on the right. - -.. _pn532-on_tag: - -``on_tag`` ----------- +``on_tag`` Action +----------------- This automation will be triggered when the PN532 module responds with a tag. This will only be triggered if the tag is changed or goes away for one cycle of ``update_interval``. @@ -120,8 +157,8 @@ Alternatively you could also send the value directly to Home Assistant via a .. _pn532-tag: -NFC/RFID Tag ------------- +``pn532`` Binary Sensor +----------------------- The ``pn532`` binary sensor platform lets you track if an NFC/RFID tag with a given unique id (``uid``) is currently being detected by the PN532 or not. diff --git a/components/binary_sensor/rc522.rst b/components/binary_sensor/rc522.rst index 5c4602887..38f170d4c 100644 --- a/components/binary_sensor/rc522.rst +++ b/components/binary_sensor/rc522.rst @@ -8,30 +8,32 @@ RC522 RFID .. _rc522-component: -Component/Hub -------------- - The ``rc522`` component allows you to use RC522 RFID controllers (`datasheet `__, `Ali Express `__) -with ESPHome. This component is a global hub that establishes the connection to the RC522 via either :ref:`SPI ` or -:ref:`I²C ` and outputs its data. Using the :ref:`RC522 binary sensors ` you can then -create individual binary sensors that track if an RFID tag is currently detected by the RC522. - -.. figure:: images/rc522-full.jpg - :align: center - :width: 60.0% - +with ESPHome. ESPHome can read the tag UID from it, every RFID tag comes with a unique +UID value. Each known tag can be associated to a binary sensor, or you can use the tag information directly. See :ref:`rc522-setting_up_tags` for information on how to setup individual binary sensors for this component. - The RC522 supports SPI, I²C and UART communication protocols, ESPHome can use either SPI or I²C. +Component/Hub +------------- + * If you have a module like the image above, it can only be used in SPI mode (`unless hacked `__) and you need to have an :ref:`SPI bus ` in your configuration with both the **miso_pin** and **mosi_pin** set. * If you have a RC522 which communicates via I²C like in the M5 Stack then you need to have an :ref:`I²C ` bus configured. -SPI Option -********** +.. figure:: images/rc522-full.jpg + :align: center + :width: 60.0% + +Over SPI +-------- + +The ``rc522_spi`` component allows you to use RC522 RFID controllers with ESPHome. This component is a global hub that +establishes the connection to the RC522 via :ref:`SPI ` (also avilable over I²C). Using the +:ref:`RC522 binary sensors ` you can then create individual binary sensors that track if +an RFID tag is currently detected by the RC522. .. code-block:: yaml @@ -45,8 +47,29 @@ SPI Option uid: 74-10-37-94 name: "RC522 RFID Tag" -I²C Option -********** +Configuration variables: +************************ + +- **cs_pin** (**Required**, :ref:`Pin Schema `): The pin on the ESP that the chip select line + is connected to. +- **spi_id** (*Optional*, :ref:`config-id`): Manually specify the ID of the :ref:`SPI Component ` if you want + to use multiple SPI buses. +- **on_tag** (*Optional*, :ref:`Automation `): An automation to perform when a tag is read. See + :ref:`rc522-on_tag`. +- **reset_pin** (*Optional*, :ref:`Pin Schema `): The pin connected to the RST line. Some tests + shows the RC522 working okay without this. +- **update_interval** (*Optional*, :ref:`config-time`): The duration of each scan on the RC522. This affects the + duration that the individual binary sensors stay active when they're found. + If a device is not found within this time window, it will be marked as not present. Defaults to ``1s``. +- **id** (*Optional*, :ref:`config-id`): Manually specify the ID for this component. + +Over I²C +-------- + +The ``rc522_i2c`` component allows you to use RC522 RFID controllers with ESPHome. This component is a global hub that +establishes the connection to the RC522 via :ref:`I²C ` (also avilable over SPI). Using the +:ref:`RC522 binary sensors ` you can then create individual binary sensors that track if +an RFID tag is currently detected by the RC522. .. code-block:: yaml @@ -63,36 +86,24 @@ I²C Option Configuration variables: ************************ +- **address** (*Optional*, int): Manually specify the I²C address of the sensor. Defaults to ``0x28``. +- **i2c_id** (*Optional*, :ref:`config-id`): Manually specify the ID of the :ref:`I²C Component ` if you want + to use multiple I²C buses. +- **on_tag** (*Optional*, :ref:`Automation `): An automation to perform when a tag is read. See + :ref:`rc522-on_tag`. - **reset_pin** (*Optional*, :ref:`Pin Schema `): The pin connected to the RST line. Some tests shows the RC522 working okay without this. - **update_interval** (*Optional*, :ref:`config-time`): The duration of each scan on the RC522. This affects the duration that the individual binary sensors stay active when they're found. If a device is not found within this time window, it will be marked as not present. Defaults to ``1s``. -- **on_tag** (*Optional*, :ref:`Automation `): An automation to perform when a tag is read. See - :ref:`rc522-on_tag`. - **id** (*Optional*, :ref:`config-id`): Manually specify the ID for this component. -SPI Only: -^^^^^^^^^ - -- **cs_pin** (**Required**, :ref:`Pin Schema `): The pin on the ESP that the chip select line - is connected to. -- **spi_id** (*Optional*, :ref:`config-id`): Manually specify the ID of the :ref:`SPI Component ` if you want - to use multiple SPI buses. - - -I²C Only: -^^^^^^^^^ - -- **address** (*Optional*, int): Manually specify the I²C address of the sensor. Defaults to ``0x28``. -- **i2c_id** (*Optional*, :ref:`config-id`): Manually specify the ID of the :ref:`I²C Component ` if you want - to use multiple I²C buses. .. _rc522-on_tag: -``on_tag`` ----------- +``on_tag`` Action +----------------- This automation will be triggered when the RC522 module responds with a tag. Please note that this can be called quite often (with an interval of ``update_interval``) as it's triggered repeatedly @@ -124,8 +135,8 @@ using :ref:`api-homeassistant_tag_scanned_action`. .. _rc522-tag: -RFID Tag --------- +``rc522`` Binary Sensor +----------------------- The ``rc522`` binary sensor platform lets you track if an RFID tag with a given unique id (``uid``) is currently being detected by the RC522 or not. diff --git a/components/binary_sensor/rdm6300.rst b/components/binary_sensor/rdm6300.rst index 2f44bb06d..0026ad3c7 100644 --- a/components/binary_sensor/rdm6300.rst +++ b/components/binary_sensor/rdm6300.rst @@ -83,8 +83,8 @@ using :ref:`api-homeassistant_tag_scanned_action`. .. _rdm6300-tag: -NFC/RFID Tag ------------- +``rdm6300`` Binary Sensor +------------------------- The ``rdm6300`` binary sensor platform lets you track if an NFC/RFID tag with a given unique id (``uid``) is currently being detected by the RDM6300 or not. diff --git a/components/binary_sensor/ttp229.rst b/components/binary_sensor/ttp229.rst index a2f52aa83..4baadf53e 100644 --- a/components/binary_sensor/ttp229.rst +++ b/components/binary_sensor/ttp229.rst @@ -22,8 +22,8 @@ There are two types of this sensor: .. _RobotDyn: https://www.tinytronics.nl/shop/nl/sensoren/touch/robotdyn-touch-module-ttp229-lsf-16-kanaals -``ttp229_lsf`` Type -------------------- +``ttp229_lsf`` Component +------------------------ .. code-block:: yaml @@ -40,19 +40,20 @@ Configuration variables: The configuration is made up of two parts: The central component, and individual Binary sensors per channel. -Base Configuration: - - **id** (*Optional*, :ref:`config-id`): Manually set the ID of this sensor. -Binary Sensor Configuration: +``ttp229_lsf`` Binary Sensor +---------------------------- + +Configuration variables: - **name** (**Required**, string): The name of the binary sensor. - **channel** (**Required**, integer): The channel number at the TTP229 the touchkey is connected to. - **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation. - All other options from :ref:`Binary Sensor `. -``ttp229_bsf`` Type -------------------- +``ttp229_bsf`` Component +------------------------ .. code-block:: yaml @@ -79,7 +80,10 @@ Base Configuration: SCL pin is connected to. - **id** (*Optional*, :ref:`config-id`): Manually set the ID of this component. -Binary Sensor Configuration: +``ttp229_bsf`` Binary Sensor +---------------------------- + +Configuration variables: - **name** (**Required**, string): The name of the binary sensor. - **channel** (**Required**, integer): The channel number at the TTP229 the touchkey is connected to. diff --git a/components/canbus.rst b/components/canbus.rst index cced53cb0..86ac347dd 100644 --- a/components/canbus.rst +++ b/components/canbus.rst @@ -58,7 +58,7 @@ Configuration variables: - **can_id** (**Required**, integer): default *can id* used for transmitting frames. - **use_extended_id** (*Optional*, boolean): default *False* identifies the type of *can_id*: *False*: Standard 11 bits IDs, *True*: Extended 29 bits ID -- **bit_rate** (*Optional*, one of the supported bitrates= defaults to ``125KBPS``. +- **bit_rate** (*Optional*, enum): One of the supported bitrates. Defaults to ``125KBPS``. - 5KBPS - 10KBPS @@ -80,7 +80,7 @@ Configuration variables: Automations: - **on_frame** (*Optional*, :ref:`Automation `): An automation to perform when ability - CAN Frame is received. See below. + CAN Frame is received. See :ref:`canbus-on-frame`. .. _canbus-on-frame: @@ -107,8 +107,8 @@ This automation will be triggered when a can frame is received. A variable ``x` then: light.toggle: light1 -Transmit Frame Action -********************* +``canbus.send`` Action +********************** The can bus can transmit frames by means of the ``canbus.send`` action. There are several forms to use it: @@ -141,14 +141,17 @@ Configuration variables: - **use_extended_id** (*Optional*, boolean): default *False* identifies the type of *can_id*: *False*: Standard 11 Bit IDs, *True*: Extended 29Bit ID -MCP2515 -------- +MCP2515 Component +----------------- The MCP2515 is a spi device and therfore you must first add the configuration for the spi bus to your file. You need to have an :ref:`SPI bus ` in your configuration with both the **mosi_pin** and **miso_pin** set. For wireing up the MSP2515 please refer to the section below. +Configuration variables: +************************ + - **cs_pin** (**Required**, :ref:`Pin Schema `): Is used to tell the receiving SPI device when it should listen for data on the SPI bus. Each device has an individual ``CS`` line. Sometimes also called ``SS``. diff --git a/components/climate/bang_bang.rst b/components/climate/bang_bang.rst index 86d1140da..91555e84b 100644 --- a/components/climate/bang_bang.rst +++ b/components/climate/bang_bang.rst @@ -66,8 +66,8 @@ Do note that the actions are only called when the current temperature leaves the idle_action: - switch.turn_off: heater -Configuration variables ------------------------ +Configuration variables: +------------------------ - **sensor** (**Required**, :ref:`config-id`): The sensor that is used to measure the current temperature. - **default_target_temperature_low** (**Required**, float): The default low target temperature for diff --git a/components/climate/ir_climate.rst b/components/climate/ir_climate.rst index 2de34ef79..fe0a8bbfe 100755 --- a/components/climate/ir_climate.rst +++ b/components/climate/ir_climate.rst @@ -15,30 +15,30 @@ as your remote unit would do. There is a growing list of compatible units. If your unit is not listed below you can fill a feature request so it will be added (see FAQ). -+------------------------+---------------------+----------------------+------------------------------------+ -| Name | Platform name | Supports receiver | | -| | | | | -+========================+=====================+======================+====================================+ -| Coolix | ``coolix`` | yes | | -+------------------------+---------------------+----------------------+------------------------------------+ -| Daikin | ``daikin`` | yes | | -+------------------------+---------------------+----------------------+------------------------------------+ -| Fujitsu General | ``fujitsu_general`` | | | -+------------------------+---------------------+----------------------+------------------------------------+ -| Mitsubishi | ``mitsubishi`` | | | -+------------------------+---------------------+----------------------+------------------------------------+ -| TCL112, Fuego | ``tcl112`` | yes | | -+------------------------+---------------------+----------------------+------------------------------------+ -| Toshiba | ``toshiba`` | yes | | -+------------------------+---------------------+----------------------+------------------------------------+ -| Yashima | ``yashima`` | | | -+------------------------+---------------------+----------------------+------------------------------------+ -| Whirlpool | ``whirlpool`` | yes | :ref:`more info` | -+------------------------+---------------------+----------------------+------------------------------------+ -| LG | ``climate_ir_lg`` | yes | | -+------------------------+---------------------+----------------------+------------------------------------+ -| Hitachi | ``hitachi_ac344`` | yes | | -+------------------------+---------------------+----------------------+------------------------------------+ ++---------------------------------------+---------------------+----------------------+ +| Name | Platform name | Supports receiver | +| | | | ++=======================================+=====================+======================+ +| Coolix | ``coolix`` | yes | ++---------------------------------------+---------------------+----------------------+ +| Daikin | ``daikin`` | yes | ++---------------------------------------+---------------------+----------------------+ +| Fujitsu General | ``fujitsu_general`` | | ++---------------------------------------+---------------------+----------------------+ +| Mitsubishi | ``mitsubishi`` | | ++---------------------------------------+---------------------+----------------------+ +| TCL112, Fuego | ``tcl112`` | yes | ++---------------------------------------+---------------------+----------------------+ +| Toshiba | ``toshiba`` | yes | ++---------------------------------------+---------------------+----------------------+ +| Yashima | ``yashima`` | | ++---------------------------------------+---------------------+----------------------+ +| :ref:`Whirlpool`| ``whirlpool`` | yes | ++---------------------------------------+---------------------+----------------------+ +| :ref:`LG` | ``climate_ir_lg`` | yes | ++---------------------------------------+---------------------+----------------------+ +| Hitachi | ``hitachi_ac344`` | yes | ++---------------------------------------+---------------------+----------------------+ This component requires that you have setup a :doc:`/components/remote_transmitter`. @@ -110,23 +110,32 @@ IR receiver. name: "Living Room AC" receiver_id: rcvr -.. _model_whirlpool: +.. _climate_ir_whirlpool: -Whirlpool ---------- +``whirlpool`` Climate +--------------------- Additional configuration is available for this model + +Configuration variables: + - **model** (*Optional*, string): There are two valid models - * ``MODEL_DG11J1_3A``: Temperature range is from 18 to 32 (default) - * ``MODEL_DG11J1_91``: Temperature range is from 16 to 30 + -* ``DG11J1-3A``: Temperature range is from 18 to 32 (default) + -* ``DG11J1-91``: Temperature range is from 16 to 30 -LG ---------- + +.. _climate_ir_lg: + +``climate_ir_lg`` Climate +------------------------- Additional configuration is available for this platform + +Configuration variables: + - **header_high** (*Optional*, :ref:`config-time`): time for the high part of the header for the LG protocol. Defaults to ``8000us`` - **header_low** (*Optional*, :ref:`config-time`): time for the low part of the header for the LG protocol. Defaults to ``4000us`` - **bit_high** (*Optional*, :ref:`config-time`): time for the high part of any bit in the LG protocol. Defaults to ``600us`` diff --git a/components/climate/pid.rst b/components/climate/pid.rst index 8ec028ea3..7d691bd98 100644 --- a/components/climate/pid.rst +++ b/components/climate/pid.rst @@ -215,8 +215,8 @@ Configuration variables: ``climate.pid.set_control_parameters`` Action --------------------------------------------- -This action sets new values for the control parameters of the PID controller. This can be -used to manually tune the PID controller. Make sure to take update the values you want on +This action sets new values for the control parameters of the PID controller. This can be +used to manually tune the PID controller. Make sure to take update the values you want on the YAML file! They will reset on the next reboot. .. code-block:: yaml @@ -247,14 +247,14 @@ conditions to avoid the control loop to overshoot (or undershoot) a target. on_...: # Basic - - climate.pid.reset_integral_term: pid_climate + - climate.pid.reset_integral_term: pid_climate Configuration variables: - **id** (**Required**, :ref:`config-id`): ID of the PID Climate being reset. -PID Climate Sensor ------------------- +``pid`` Sensor +-------------- Additionally, the PID climate platform provides an optional sensor platform to monitor the calculated PID parameters to help finding good PID values. diff --git a/components/climate/thermostat.rst b/components/climate/thermostat.rst index 47943879e..2d6f52549 100644 --- a/components/climate/thermostat.rst +++ b/components/climate/thermostat.rst @@ -133,8 +133,7 @@ Examples: Got all that? Great. Let's take a closer look at some configuration. -Configuration Variables ------------------------ +Configuration Variables: The thermostat controller uses the sensor to determine whether it should heat or cool. diff --git a/components/debug.rst b/components/debug.rst index e6c592006..182326a03 100644 --- a/components/debug.rst +++ b/components/debug.rst @@ -22,7 +22,7 @@ a bunch of useful information like reset reason, free heap size, ESPHome version logger: level: debug -There are no configuration variables for this component. +No configuration variables. See Also -------- diff --git a/components/deep_sleep.rst b/components/deep_sleep.rst index 3aa3188e8..a261d4101 100644 --- a/components/deep_sleep.rst +++ b/components/deep_sleep.rst @@ -33,9 +33,8 @@ Configuration variables: - **run_duration** (*Optional*, :ref:`config-time`): The time duration the node should be active, i.e. run code. - **sleep_duration** (*Optional*, :ref:`config-time`): The time duration to stay in deep sleep mode. -- **wakeup_pin** (*Optional*, :ref:`Pin Schema `): - Only on ESP32. A pin to wake up to once in deep sleep mode. Use the inverted property to wake up - to LOW signals. +- **wakeup_pin** (*Optional*, :ref:`Pin Schema `): Only on ESP32. A pin to wake up to once + in deep sleep mode. Use the inverted property to wake up to LOW signals. - **wakeup_pin_mode** (*Optional*): Only on ESP32. Specify how to handle waking up from a ``wakeup_pin`` if the wakeup pin is already in the state with which it would wake up when attempting to enter deep sleep. See :ref:`deep_sleep-esp32_wakeup_pin_mode`. Defaults to ``IGNORE`` @@ -116,7 +115,7 @@ Useful for it will no longer enter deep sleep mode and you can upload your OTA update. Remember to turn "OTA mode" off again after the OTA update by sending a MQTT message with the payload - ``OFF``. To enter the the deep sleep again after the OTA update send a message on the topic ``livingroom/sleep_mode`` + ``OFF``. To enter the the deep sleep again after the OTA update send a message on the topic ``livingroom/sleep_mode`` with payload ``ON``. Deep sleep will start immediately. Don't forget to delete the payload before the node wakes up again. diff --git a/components/dfplayer.rst b/components/dfplayer.rst index 115654dab..62ad36a46 100644 --- a/components/dfplayer.rst +++ b/components/dfplayer.rst @@ -21,10 +21,10 @@ Overview -------- The module can be powered by the 3.3V output of an NodeMCU. For communication you can connect only -the ``tx_pin`` of the ``uart`` bus to the module's ``RX`` but if you need feedback of playback active +the ``tx_pin`` of the ``uart`` bus to the module's ``RX`` but if you need feedback of playback active you will also need to connect the ``rx_pin`` to the module's ``TX``. For best quality audio a powered stereo speaker can be connected to the modules ``DAC_R``, -``DAC_I`` and ``GND``, alternatively the module features a built-in 3W audio amplifier, in that case +``DAC_L`` and ``GND``, alternatively the module features a built-in 3W audio amplifier, in that case the pins ``SPK_1`` and ``SPK_2`` should be connected to one passive speaker and a 5V 1A power supply will be required. @@ -115,8 +115,8 @@ Configuration options: ------------------------------- Plays files inside numbered folders, folders must be numbered from 1 and with leading -zeros. Like `01`, `02`, ... etc. Files inside the folders must be numbered with two -leading zeros, like `001.mp3`, `002.mp3`, ... etc. +zeros. Like ``01``, ``02``, ... etc. Files inside the folders must be numbered with two +leading zeros, like ``001.mp3``, ``002.mp3``, ... etc. Folder numbers can range from 1 to 99 and file name from 1 to 255 or folder number from 1 to 10 and file number from 1 to 1000. @@ -178,7 +178,7 @@ Changes volume. Configuration options: - **volume** (**Required**, int, :ref:`templatable `): The volume value. - Valid values goes from 0 to 30. + Valid values goes from ``0`` to ``30``. ``dfplayer.set_eq`` Action -------------------------- diff --git a/components/display/ili9341.rst b/components/display/ili9341.rst index 536d6c96f..612a89b91 100644 --- a/components/display/ili9341.rst +++ b/components/display/ili9341.rst @@ -33,13 +33,13 @@ beyond the typical SPI connections, it is better suited for use with the ESP32. dc_pin: 27 led_pin: 32 ### see note below ### reset_pin: 33 - + lambda: |- it.fill(COLOR_BLACK); it.print(0, 0, id(my_font), id(my_red), TextAlign::TOP_LEFT, "Hello World!"); - -Configuration variables -*********************** + +Configuration variables: +************************ - **model** (**Required**): The model of the display. Options are: diff --git a/components/display/images/inkplate.jpg b/components/display/images/inkplate.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a373c8082cb9688984eb329fe6418df658792c3b GIT binary patch literal 33233 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 E08z>P0{{R3 literal 0 HcmV?d00001 diff --git a/components/display/index.rst b/components/display/index.rst index c8bec3c01..be60356ba 100644 --- a/components/display/index.rst +++ b/components/display/index.rst @@ -312,11 +312,41 @@ use any string you pass it, like ``"ON"`` or ``"OFF"``. Displaying Time *************** -With ESPHome you can also display the current time using the NTP protocol. Please see the example :ref:`here `. +You can display current time using a time component. Please see the example :ref:`here `. + + +.. _config-color: + +Color +***** + +When using RGB-capable displays in ESPHome you may wish to use custom colors. +A ``color`` component exists for just this purpose: + +.. code-block:: yaml + + color: + - id: my_light_red + red: 100% + green: 20% + blue: 25% + white: 0% + + +Configuration variables: + +- **red** (*Optional*, percentage): The percentage of the red component. Defaults to ``100%``. +- **green** (*Optional*, percentage): The percentage of the green component. Defaults to ``100%``. +- **blue** (*Optional*, percentage): The percentage of the blue component. Defaults to ``100%``. +- **white** (*Optional*, percentage): The percentage of the white component. Defaults to ``100%``. + +RGB displays use red, green, and blue, while grayscale displays may use white. Images ****** +Use this component to store graphical images on the device, you can then draw the images on compatible displays. + .. code-block:: yaml image: @@ -329,7 +359,7 @@ Configuration variables: - **file** (**Required**, string): The path (relative to where the .yaml file is) of the image file. - **id** (**Required**, :ref:`config-id`): The ID with which you will be able to reference the image later in your display code. -- **resize** (*Optional*, int): If set, this will resize the image to fit inside the given dimensions ``WIDTHxHEIGHT`` +- **resize** (*Optional*, string): If set, this will resize the image to fit inside the given dimensions ``WIDTHxHEIGHT`` and preserve the aspect ratio. - **type** (*Optional*): Specifies how to encode image internally. Defaults to ``BINARY``. @@ -379,8 +409,8 @@ as the additional parameters. Animation ********* -Animation inherits all options from the image component. -It adds an additional method to change the shown picture of a gif. +Allows to use animated images on displays. Animation inherits all options from the image component. +It adds an additional lambda method: ``next_frame()`` to change the shown picture of a gif. .. code-block:: yaml @@ -417,6 +447,30 @@ This can be combined with all Lambdas: lambda: |- id(my_animation).next_frame(); + +Configuration variables: +^^^^^^^^^^^^^^^^^^^^^^^^ + +- **file** (**Required**, string): The path (relative to where the .yaml file is) of the gif file. +- **id** (**Required**, :ref:`config-id`): The ID with which you will be able to reference the animation later + in your display code. +- **resize** (*Optional*, string): If set, this will resize all the frames to fit inside the given dimensions ``WIDTHxHEIGHT`` + and preserve the aspect ratio. +- **type** (*Optional*): Specifies how to encode each frame internally. Defaults to ``BINARY``. + + - ``BINARY``: Two colors, suitable for 1 color displays or 2 color image in color displays. Uses 1 bit + per pixel, 8 pixels per byte. + - ``GREYSCALE``: Full scale grey. Uses 8 bits per pixel, 1 pixel per byte. + - ``RGB24``: Full RGB color stored. Uses 3 bytes per pixel. + +- **dither** (*Optional*): Specifies which dither method used to process each frame, only used in GREYSCALE and BINARY type image. + Defaults to ``NONE``. You can read more about it `here `__ + and `here `__. + + - ``NONE``: Every pixel convert to its nearest color. + - ``FLOYDSTEINBERG``: Uses Floyd-Steinberg dither to approximate the original image luminosity levels. + + .. _display-pages: Display Pages @@ -486,6 +540,7 @@ You can then switch between these with three different actions: - display.page.show_next: my_display - component.update: my_display + See Also -------- diff --git a/components/display/Inkplate.rst b/components/display/inkplate6.rst similarity index 98% rename from components/display/Inkplate.rst rename to components/display/inkplate6.rst index 8158629c1..9c5f167c7 100644 --- a/components/display/Inkplate.rst +++ b/components/display/inkplate6.rst @@ -3,13 +3,13 @@ Inkplate 6 .. seo:: :description: Instructions for setting up Inkplate E-Paper displays in ESPHome. - :image: Inkplate.jpg + :image: inkplate.jpg All-in-one e-paper display ``Inkplate 6`` Inkplate 6 is a powerful, Wi-Fi enabled ESP32 based six-inch e-paper display – recycled from a Kindle e-reader. Its main feature is simplicity. Learn more at `Inkplate's website `__ -.. figure:: images/Inkplate.jpg +.. figure:: images/inkplate.jpg :align: center :width: 75.0% @@ -25,7 +25,7 @@ Learn more at `Inkplate's website `__ address: 0x20 display: - - platform: inkplate + - platform: inkplate6 id: inkplate_display greyscale: false partial_updating: false @@ -66,8 +66,8 @@ Learn more at `Inkplate's website `__ It just ignores the function call in that case. -Configuration variables -*********************** +Configuration variables: +************************ - **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation. - **greyscale** (*Optional*, boolean): Makes the screen display 3 bit colors. Defaults to ``False`` @@ -224,7 +224,7 @@ Wi-Fi, API, and OTA configuration. display: - - platform: inkplate + - platform: inkplate6 id: inkplate_display greyscale: false partial_updating: false diff --git a/components/display/lcd_display.rst b/components/display/lcd_display.rst index 87be3d261..7ad46b352 100644 --- a/components/display/lcd_display.rst +++ b/components/display/lcd_display.rst @@ -7,8 +7,8 @@ Character-Based LCD Display .. _lcd-pcf8574: -PCF8574 -------- +lcd_pcf8574 Component +--------------------- The ``lcd_pcf8574`` display platform allows you to use standard character-based LCD displays like `this one `__ @@ -56,8 +56,8 @@ Configuration variables: .. _lcd-gpio: -GPIO ----- +lcd_gpio Component +------------------ The ``lcd_gpio`` display platform allows you to use standard character-based LCD displays like `this one `__ with ESPHome. This integration is only for LCD displays that display individual characters on a screen (usually 16-20 columns diff --git a/components/display/nextion.rst b/components/display/nextion.rst index 5db6e15ec..4270e0e29 100644 --- a/components/display/nextion.rst +++ b/components/display/nextion.rst @@ -39,8 +39,7 @@ Configuration variables: - **uart_id** (*Optional*, :ref:`config-id`): The ID of the :ref:`UART bus ` you wish to use for this display. Use this if you want to use multiple UART buses at once. -- **brightness** (*Optional*, percentage): Set the screen brightness. Must be in range - ``0%`` to ``100%`` or ``0.0`` to ``1.0``. Defaults to ``100%``. +- **brightness** (*Optional*, percentage): Set display brightness in %. Defaults to ``100%`` - **lambda** (*Optional*, :ref:`lambda `): The lambda to use for rendering the content on the nextion display. See :ref:`display-nextion_lambda` for more information. - **update_interval** (*Optional*, :ref:`config-time`): The interval to call the lambda to update the display. diff --git a/components/display/pcd8544.rst b/components/display/pcd8544.rst index a8fda0a19..21812e19e 100644 --- a/components/display/pcd8544.rst +++ b/components/display/pcd8544.rst @@ -53,9 +53,9 @@ To use a backlight LIGHT pin needs to be connected to ground. If connected to GP Configuration variables: ************************ -- **reset_pin** (**Required**)(:ref:`Pin Schema `): The RESET pin. -- **cs_pin** (**Required**)(:ref:`Pin Schema `): The CS pin. -- **dc_pin** (**Required**)(:ref:`Pin Schema `): The DC pin. +- **reset_pin** (**Required**, :ref:`Pin Schema `): The RESET pin. +- **cs_pin** (**Required**, :ref:`Pin Schema `): The CS pin. +- **dc_pin** (**Required**, :ref:`Pin Schema `): The DC pin. - **lambda** (*Optional*, :ref:`lambda `): The lambda to use for rendering the content on the display. See :ref:`display-engine` for more information. - **update_interval** (*Optional*, :ref:`config-time`): The interval to re-draw the screen. Defaults to ``5s``. diff --git a/components/display/ssd1306.rst b/components/display/ssd1306.rst index dee36f434..a60b0f170 100644 --- a/components/display/ssd1306.rst +++ b/components/display/ssd1306.rst @@ -61,7 +61,7 @@ Configuration variables: - **address** (*Optional*, int): Manually specify the :ref:`I²C ` address of the display. Defaults to 0x3C. - **rotation** (*Optional*): Set the rotation of the display. Everything you draw in ``lambda:`` will be rotated by this option. One of ``0°`` (default), ``90°``, ``180°``, ``270°``. -- **brightness** (*Optional*): Set the screen brightness in percents 0.0-1.0. Defaults to `1.0` that corresponds to 100%. +- **brightness** (*Optional*, percentage): Set display brightness in %. Defaults to ``100%`` - **external_vcc** (*Optional*, boolean): Set this to true if you have the VCC pin connected to an external power supply. Defaults to ``false``. - **lambda** (*Optional*, :ref:`lambda `): The lambda to use for rendering the content on the display. @@ -69,7 +69,6 @@ Configuration variables: - **update_interval** (*Optional*, :ref:`config-time`): The interval to re-draw the screen. Defaults to ``5s``. - **pages** (*Optional*, list): Show pages instead of a single lambda. See :ref:`display-pages`. - **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation. -- **brightness** (*Optional*, float): Manually override display brightness in %. Defaults to ``100%`` .. note:: @@ -133,6 +132,7 @@ Configuration variables: - **reset_pin** (*Optional*, :ref:`Pin Schema `): The RESET pin. Defaults to not connected. - **rotation** (*Optional*): Set the rotation of the display. Everything you draw in ``lambda:`` will be rotated by this option. One of ``0°`` (default), ``90°``, ``180°``, ``270°``. +- **brightness** (*Optional*, percentage): Set display brightness in %. Defaults to ``100%`` - **external_vcc** (*Optional*, boolean): Set this to true if you have the VCC pin connected to an external power supply. Defaults to ``false``. - **lambda** (*Optional*, :ref:`lambda `): The lambda to use for rendering the content on the display. @@ -142,7 +142,6 @@ Configuration variables: - **spi_id** (*Optional*, :ref:`config-id`): Manually specify the ID of the :ref:`SPI Component ` if you want to use multiple SPI buses. - **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation. -- **brightness** (*Optional*, float): Manually override display brightness in %. Defaults to ``100%`` See Also -------- diff --git a/components/display/ssd1322.rst b/components/display/ssd1322.rst index d2a0dd249..35fcc545e 100644 --- a/components/display/ssd1322.rst +++ b/components/display/ssd1322.rst @@ -7,8 +7,8 @@ SSD1322 OLED Display .. _ssd1322-spi: -Usage ------ +``ssd1322_spi`` Component +------------------------- The ``ssd1322_spi`` display platform allows you to use SSD1322 (`datasheet `__, @@ -47,9 +47,9 @@ Configuration variables: - ``SSD1322 256x64`` -- **reset_pin** (:ref:`Pin Schema `): The RESET pin. -- **cs_pin** (:ref:`Pin Schema `): The CS pin. -- **dc_pin** (:ref:`Pin Schema `): The DC pin. +- **dc_pin** (**Required**, :ref:`Pin Schema `): The DC pin. +- **reset_pin** (*Optional*, :ref:`Pin Schema `): The RESET pin. +- **cs_pin** (*Optional*, :ref:`Pin Schema `): The CS pin. - **lambda** (*Optional*, :ref:`lambda `): The lambda to use for rendering the content on the display. See :ref:`display-engine` for more information. - **update_interval** (*Optional*, :ref:`config-time`): The interval to re-draw the screen. Defaults to ``5s``. diff --git a/components/display/ssd1325.rst b/components/display/ssd1325.rst index 778b7093a..45740b025 100644 --- a/components/display/ssd1325.rst +++ b/components/display/ssd1325.rst @@ -7,8 +7,8 @@ SSD1325/7 OLED Display .. _ssd1325-spi: -Usage ------ +``ssd1325_spi`` Component +------------------------- The ``ssd1325_spi`` display platform allows you to use SSD1325 (`datasheet `__, @@ -44,8 +44,8 @@ that explains how to do this, if necessary. lambda: |- it.print(0, 0, id(font), "Hello World!"); -Configuration Variables -*********************** +Configuration variables: +************************ - **model** (**Required**): The model of the display. Options are: @@ -54,10 +54,10 @@ Configuration Variables - ``SSD1325 96x16`` - ``SSD1325 64x48`` -- **reset_pin** (:ref:`Pin Schema `): The RESET pin. -- **cs_pin** (:ref:`Pin Schema `): The pin on the ESP that that the CS line is connected to. +- **dc_pin** (**Required**, :ref:`Pin Schema `): The DC pin. +- **reset_pin** (*Optional*, :ref:`Pin Schema `): The RESET pin. +- **cs_pin** (*Optional*, :ref:`Pin Schema `): The pin on the ESP that that the CS line is connected to. The CS line can be connected to GND if this is the only device on the SPI bus. -- **dc_pin** (:ref:`Pin Schema `): The DC pin. - **lambda** (*Optional*, :ref:`lambda `): The lambda to use for rendering the content on the display. See :ref:`display-engine` for more information. - **update_interval** (*Optional*, :ref:`config-time`): The interval to re-draw the screen. Defaults to ``5s``. diff --git a/components/display/ssd1327.rst b/components/display/ssd1327.rst index a958e15dc..3ba15b3f8 100644 --- a/components/display/ssd1327.rst +++ b/components/display/ssd1327.rst @@ -41,8 +41,8 @@ ESP; this is recommended as it improves reliability. lambda: |- it.print(0, 0, id(font), "Hello World!"); -Configuration variables -*********************** +Configuration variables: +************************ - **model** (**Required**): The model of the display. At present, only one option is available: @@ -52,13 +52,12 @@ Configuration variables - **address** (*Optional*, int): Manually specify the :ref:`I²C ` address of the display. Defaults to 0x3D. - **rotation** (*Optional*): Set the rotation of the display. Everything you draw in ``lambda:`` will be rotated by this option. One of ``0°`` (default), ``90°``, ``180°``, ``270°``. -- **brightness** (*Optional*): Set the screen brightness in percents 0.0-1.0. Defaults to `1.0` that corresponds to 100%. +- **brightness** (*Optional*, percentage): Set display brightness in %. Defaults to ``100%`` - **lambda** (*Optional*, :ref:`lambda `): The lambda to use for rendering the content on the display. See :ref:`display-engine` for more information. - **update_interval** (*Optional*, :ref:`config-time`): The interval to re-draw the screen. Defaults to ``5s``. - **pages** (*Optional*, list): Show pages instead of a single lambda. See :ref:`display-pages`. - **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation. -- **brightness** (*Optional*, float): Manually override display brightness in %. Defaults to ``100%`` .. note:: @@ -101,8 +100,8 @@ available pin on the ESP; this is recommended as it improves reliability. lambda: |- it.print(0, 0, id(font), "Hello World!"); -Configuration variables -*********************** +Configuration variables: +************************ - **model** (**Required**): The model of the display. At present, only one option is available: @@ -113,6 +112,7 @@ Configuration variables - **reset_pin** (*Optional*, :ref:`Pin Schema `): The RESET pin. Defaults to not connected. - **rotation** (*Optional*): Set the rotation of the display. Everything you draw in ``lambda:`` will be rotated by this option. One of ``0°`` (default), ``90°``, ``180°``, ``270°``. +- **brightness** (*Optional*, percentage): Set display brightness in %. Defaults to ``100%`` - **lambda** (*Optional*, :ref:`lambda `): The lambda to use for rendering the content on the display. See :ref:`display-engine` for more information. - **update_interval** (*Optional*, :ref:`config-time`): The interval to re-draw the screen. Defaults to ``5s``. @@ -120,7 +120,6 @@ Configuration variables - **spi_id** (*Optional*, :ref:`config-id`): Manually specify the ID of the :ref:`SPI Component ` if you want to use multiple SPI buses. - **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation. -- **brightness** (*Optional*, float): Manually override display brightness in %. Defaults to ``100%`` Configuration examples ********************** diff --git a/components/display/ssd1331.rst b/components/display/ssd1331.rst index effe29fb2..525571b04 100644 --- a/components/display/ssd1331.rst +++ b/components/display/ssd1331.rst @@ -39,13 +39,13 @@ require 5 volts connected to their ``+`` pin. Connect the GND or G pin to ground lambda: |- it.print(0, 0, id(font), "Hello World!"); -Configuration variables -*********************** +Configuration variables: +************************ -- **reset_pin** (:ref:`Pin Schema `): The RESET pin. +- **dc_pin** (**Required**, :ref:`Pin Schema `): The DC pin. +- **reset_pin** (*Optional*, :ref:`Pin Schema `): The RESET pin. - **cs_pin** (*Optional*, :ref:`Pin Schema `): The pin on the ESP that that the CS line is connected to. The CS line can be connected to GND if this is the only device on the SPI bus. -- **dc_pin** (:ref:`Pin Schema `): The DC pin. - **lambda** (*Optional*, :ref:`lambda `): The lambda to use for rendering the content on the display. See :ref:`display-engine` for more information. - **update_interval** (*Optional*, :ref:`config-time`): The interval to re-draw the screen. Defaults to ``5s``. diff --git a/components/display/ssd1351.rst b/components/display/ssd1351.rst index 728275a31..64d46c112 100644 --- a/components/display/ssd1351.rst +++ b/components/display/ssd1351.rst @@ -7,8 +7,8 @@ SSD1351 OLED Display .. _ssd1351-spi: -Usage ------ +``ssd1351_spi`` Component +------------------------- The ``ssd1351_spi`` display platform allows you to use SSD1351 (`datasheet `__, @@ -43,18 +43,17 @@ which should be connected to 3.3 volts only. Connect the GND or G pin to GND. lambda: |- it.print(0, 0, id(font), "Hello World!"); -Configuration variables -*********************** +Configuration variables: +************************ - **model** (**Required**): The model of the display. Options are: - ``SSD1351 128x128`` (SSD1351 with 128 columns and 128 rows) - ``SSD1351 128x96`` (SSD1351 with 128 columns and 96 rows) -- **reset_pin** (:ref:`Pin Schema `): The RESET pin. -- **cs_pin** (*Optional*, :ref:`Pin Schema `): The pin on the ESP that that the CS line is connected to. - The CS line can be connected to GND if this is the only device on the SPI bus. -- **dc_pin** (:ref:`Pin Schema `): The DC pin. +- **dc_pin** (**Required**, :ref:`Pin Schema `): The DC pin. +- **cs_pin** (**Required**, :ref:`Pin Schema `): The pin on the ESP that that the CS line is connected to. +- **reset_pin** (*Optional*, :ref:`Pin Schema `): The RESET pin. - **lambda** (*Optional*, :ref:`lambda `): The lambda to use for rendering the content on the display. See :ref:`display-engine` for more information. - **update_interval** (*Optional*, :ref:`config-time`): The interval to re-draw the screen. Defaults to ``5s``. diff --git a/components/display/st7735.rst b/components/display/st7735.rst index 1b0f7720f..c01dc0e12 100644 --- a/components/display/st7735.rst +++ b/components/display/st7735.rst @@ -6,7 +6,7 @@ ST7735 Display :keywords: ST7735 :image: ST7735.png -ST7735 Display Driver. +ST7735 Display Driver. Usage ----- @@ -32,7 +32,7 @@ There are numerous board types out there. Some initialize differently as well. T model: "INITR_18BLACKTAB" reset_pin: D4 cs_pin: D1 - dc_pin: D2 + dc_pin: D2 rotation: 0 device_width: 128 device_height: 160 @@ -45,21 +45,21 @@ Configuration variables: ~~~~~~~~~~~~~~~~~~~~~~~~ - **model** (**Required**, "See Models Below"): This the model to use. INITR_BLACKTAB is the default -- **reset_pin** (:ref:`Pin Schema `): The RESET pin. -- **cs_pin** (:ref:`Pin Schema `): The CS pin. -- **dc_pin** (:ref:`Pin Schema `): The DC pin. +- **cs_pin** (**Required**, :ref:`Pin Schema `): The CS pin. +- **dc_pin** (**Required**, :ref:`Pin Schema `): The DC pin. - **device_width** (**Required**, int): The device width. 128 is default - **device_height** (**Required**, int): The device height. 160 is default - **col_start** (**Required**, int): The device height. 160 is default - **row_start** (**Required**, int): The device height. 160 is default -- **eight_bit_color** (*Optional*, "True/False" ): 8bit mode. Default is False. This saves 50% of the buffer required for the display. +- **eight_bit_color** (*Optional*, "True/False" ): 8bit mode. Default is False. This saves 50% of the buffer required for the display. +- **reset_pin** (*Optional*, :ref:`Pin Schema `): The RESET pin. Memory notes: ~~~~~~~~~~~~~ - 8Bit color saves 50% of the buffer required. - eightbitcolor: True 160x128 = 20480 *Important for memory constrained devices* -- eightbitcolor: False 160x128x2 = 40960 +- eightbitcolor: False 160x128x2 = 40960 Models: diff --git a/components/display/st7789v.rst b/components/display/st7789v.rst index d595f5f3f..8bd55f2a0 100644 --- a/components/display/st7789v.rst +++ b/components/display/st7789v.rst @@ -50,13 +50,13 @@ hardwired programming. (OTA updates are of course possible after ESPHome is init When using the TTGO T-Display module, the GPIO pin numbers above *cannot be changed* as they are hardwired within the module/PCB. -Configuration variables -*********************** +Configuration variables: +************************ -- **backlight_pin** (:ref:`Pin Schema `): The display's backlight pin. -- **cs_pin** (:ref:`Pin Schema `): The CS pin. -- **dc_pin** (:ref:`Pin Schema `): The DC pin. -- **reset_pin** (:ref:`Pin Schema `): The RESET pin. +- **backlight_pin** (**Required**, :ref:`Pin Schema `): The display's backlight pin. +- **cs_pin** (**Required**, :ref:`Pin Schema `): The CS pin. +- **dc_pin** (**Required**, :ref:`Pin Schema `): The DC pin. +- **reset_pin** (**Required**, :ref:`Pin Schema `): The RESET pin. - **lambda** (*Optional*, :ref:`lambda `): The lambda to use for rendering the content on the display. See :ref:`display-engine` for more information. - **update_interval** (*Optional*, :ref:`config-time`): The interval to re-draw the screen. Defaults to ``5s``. diff --git a/components/display/waveshare_epaper.rst b/components/display/waveshare_epaper.rst index 31873ca61..695569b60 100644 --- a/components/display/waveshare_epaper.rst +++ b/components/display/waveshare_epaper.rst @@ -8,9 +8,8 @@ Waveshare E-Paper Display The ``waveshare_epaper`` display platform allows you to use some E-Paper displays sold by `Waveshare `__ with ESPHome. The 2.13" `TTGO module `__ with an ESP32 on the board is supported as well. -Depending on your specific revision of the board you might need to try out the `-b73` version (see below). -Similar modules sold by other vendors might also work but not have been tested yet. Currently only -single-color E-Ink displays are implemented and of those only a few modules. +Depending on your specific revision of the board you might need to try out the ``-b73`` version (see below). +Similar modules sold by other vendors might also work but not have been tested yet. .. figure:: images/waveshare_epaper-full.jpg :align: center diff --git a/components/esp32_ble_tracker.rst b/components/esp32_ble_tracker.rst index 7ae1f0323..c238c552b 100644 --- a/components/esp32_ble_tracker.rst +++ b/components/esp32_ble_tracker.rst @@ -154,13 +154,13 @@ variable ``x`` of type ``std::vector`` is passed to the automation for Configuration variables: - **mac_address** (*Optional*, MAC Address): The MAC address to filter for this automation. -- **manufacturer_id** (**Required**, string) 16 bit, 32 bit, or 128 bit BLE Manufacturer ID. +- **manufacturer_id** (**Required**, string): 16 bit, 32 bit, or 128 bit BLE Manufacturer ID. - See :ref:`Automation `. .. _esp32_ble_tracker-on_ble_service_data_advertise: -``on_ble_on_ble_service_data_advertise`` -**************************************** +``on_ble_service_data_advertise`` +********************************* This automation will be triggered when a Bluetooth advertising with service data is received. A variable ``x`` of type ``std::vector`` is passed to the automation for use in lambdas. @@ -182,7 +182,7 @@ variable ``x`` of type ``std::vector`` is passed to the automation for Configuration variables: - **mac_address** (*Optional*, MAC Address): The MAC address to filter for this automation. -- **service_uuid** (**Required**, string) 16 bit, 32 bit, or 128 bit BLE Service UUID. +- **service_uuid** (**Required**, string): 16 bit, 32 bit, or 128 bit BLE Service UUID. - See :ref:`Automation `. See Also diff --git a/components/gps.rst b/components/gps.rst index 4aeda2ee4..6207e3ac5 100644 --- a/components/gps.rst +++ b/components/gps.rst @@ -33,10 +33,7 @@ in your configuration - only the RX pin should be necessary. time: - platform: gps -Configuration variables: ------------------------- - -The component is split up in platforms. +The component is split up in platforms. No configuration variables. First you need to define a global GPS module hub (as seen above). diff --git a/components/i2c.rst b/components/i2c.rst index a8634ec33..05d4f510f 100644 --- a/components/i2c.rst +++ b/components/i2c.rst @@ -11,9 +11,9 @@ I²C Bus This component sets up the I²C bus for your ESP32 or ESP8266. In order for these components to work correctly, you need to define the I²C bus in your configuration. Please note the ESP will enable its internal 10kΩ pullup resistors for these pins, so you usually don't need to -put on external ones. You can use multiple devices on one I²C bus as each device is given a -unique address for communicating between between it and the ESP. You can do this by hopping -wires from the two lines (SDA and SCL) from each device board to the next device board or by +put on external ones. You can use multiple devices on one I²C bus as each device is given a +unique address for communicating between between it and the ESP. You can do this by hopping +wires from the two lines (SDA and SCL) from each device board to the next device board or by connecting the wires from each device back to the two I²C pins on the ESP. .. code-block:: yaml @@ -37,7 +37,7 @@ Configuration variables: Defaults to ``True``. - **frequency** (*Optional*, float): Set the frequency the I²C bus should operate on. Defaults to ``50kHz``. Values are ``50kHz``, ``100kHz``, ``200kHz``, ... ``800kHz`` -- **id** (*Optional*, :ref:`config-id`) Manually specify the ID for this I²C bus if you need multiple I²C buses. +- **id** (*Optional*, :ref:`config-id`): Manually specify the ID for this I²C bus if you need multiple I²C buses. .. note:: diff --git a/components/light/index.rst b/components/light/index.rst index 90c5e0f4f..9358ed4c4 100644 --- a/components/light/index.rst +++ b/components/light/index.rst @@ -77,7 +77,7 @@ This action toggles a light with the given ID when executed. # Shorthand: - light.toggle: light_1 -Configuration options: +Configuration variables: - **id** (**Required**, :ref:`config-id`): The ID of the light. - **transition_length** (*Optional*, :ref:`config-time`, :ref:`templatable `): The length of the transition @@ -121,7 +121,7 @@ This action turns a light with the given ID on when executed. # Shorthand - light.turn_on: light_1 -Configuration options: +Configuration variables: - **id** (**Required**, :ref:`config-id`): The ID of the light. - **transition_length** (*Optional*, :ref:`config-time`, :ref:`templatable `): The length of the transition @@ -180,7 +180,7 @@ This action turns a light with the given ID off when executed. # Shorthand - light.turn_off: light_1 -Configuration options: +Configuration variables: - **id** (**Required**, :ref:`config-id`): The ID of the light. - **transition_length** (*Optional*, :ref:`config-time`, :ref:`templatable `): The length of the transition @@ -214,7 +214,7 @@ is essentially just a combination of the turn_on and turn_off calls. id: light_1 state: on -Configuration options: +Configuration variables: - **id** (**Required**, :ref:`config-id`): The ID of the light. - **state** (*Optional*, :ref:`templatable `, boolean): Change the ON/OFF @@ -238,10 +238,10 @@ by a relative amount. id: light_1 relative_brightness: 5% -Configuration options: +Configuration variables: - **id** (**Required**, :ref:`config-id`): The ID of the light. -- **relative_brightness** (**Required***, :ref:`templatable `, percentage): +- **relative_brightness** (**Required**, :ref:`templatable `, percentage): The relative brightness to dim the light by. - **transition_length** (*Optional*, :ref:`config-time`, :ref:`templatable `): The length of the transition. @@ -817,8 +817,10 @@ Configuration variables: - **sequence** (*Optional*, :ref:`Action `): The actions to perform in sequence until the effect is stopped. -E1.31 -***** +.. _e131-light-effect: + +E1.31 Effect +************ This effect enables controlling addressable lights using UDP-based E1.31_ protocol. @@ -840,16 +842,15 @@ JINX_ can be used to control E1.31_ enabled ESPHome. Configuration variables: -- **method** (*Optional*): Listening method, one of ``multicast`` or ``unicast``. Defaults to ``multicast``. - **universe** (**Required**, integer): The value of universe, between 1 to 512. - **channels** (*Optional*): The type of data. This is used to specify if it is a ``MONO``, ``RGB`` or ``RGBW`` light and in which order the colors are. Defaults to ``RGB``. There are three modes of operation: -- `MONO`: this supports 1 channel per LED (luminance), up-to 512 LEDs per universe -- `RGB`: this supports 3 channels per LED (RGB), up-to 170 LEDs (3*170 = 510 bytes) per universe -- `RGBW`: this supports 4 channels per LED (RGBW), up-to 128 LEDs (4*128 = 512 bytes) per universe +- ``MONO``: this supports 1 channel per LED (luminance), up-to 512 LEDs per universe +- ``RGB``: this supports 3 channels per LED (RGB), up-to 170 LEDs (3*170 = 510 bytes) per universe +- ``RGBW``: this supports 4 channels per LED (RGBW), up-to 128 LEDs (4*128 = 512 bytes) per universe If there's more LEDs than allowed per-universe, additional universe will be used. In the above example of 189 LEDs, first 170 LEDs will be assigned to 1 universe, @@ -858,11 +859,21 @@ the rest of 19 LEDs will be automatically assigned to 2 universe. It is possible to enable multiple light platforms to listen to the same universe concurrently, allowing to replicate the behaviour on multiple strips. +E1.31 Component +^^^^^^^^^^^^^^^ + +The :ref:`e131-light-effect` requires a component hub for the ``e131`` light effect. + +Configuration variables: + +- **method** (*Optional*): Listening method, one of ``multicast`` or ``unicast``. Defaults to ``multicast``. + + .. _E1.31: https://www.doityourselfchristmas.com/wiki/index.php?title=E1.31_(Streaming-ACN)_Protocol .. _JINX: http://www.live-leds.de/jinx-v1-3-with-resizable-mainwindow-real-dmx-and-sacne1-31/ -Adalight -******** +Adalight Effect +*************** This effect enables controlling addressable lights using UART-based Adalight_ protocol, allowing to create realtime ambient lighting effects. @@ -899,8 +910,8 @@ Configuration variables: .. _Adalight: https://learn.adafruit.com/adalight-diy-ambient-tv-lighting .. _Prismatik: https://github.com/psieg/Lightpack -WLED -**** +WLED Effect +*********** This effect enables controlling addressable lights using UDP-based `UDP Realtime Control`_ protocol used by WLED_, allowing to create realtime ambient diff --git a/components/logger.rst b/components/logger.rst index 1f8691001..22bf5a956 100644 --- a/components/logger.rst +++ b/components/logger.rst @@ -37,6 +37,9 @@ Advanced settings: Defaults to ``UART0``. - **esp8266_store_log_strings_in_flash** (*Optional*, boolean): If set to false, disables storing log strings in the flash section of the device (uses more memory). Defaults to true. +- **on_message** (*Optional*, :ref:`Automation `): An action to be + performed when a message is to be looged. The vairables ``int level``, ``const char* tag`` and + ``const char* message`` are available for lambda processing. .. _logger-hardware_uarts: diff --git a/components/mcp230xx.rst b/components/mcp230xx.rst index 07a34c44e..15ff449a4 100644 --- a/components/mcp230xx.rst +++ b/components/mcp230xx.rst @@ -15,8 +15,8 @@ The Microchip MCP230xx series of general purpose, parallel I/O expansion for I² .. _mcp23008-label: -MCP23008 --------- +MCP23008 Component +------------------ The MCP23008 component (`datasheet `__, `Adafruit `__) has 8 GPIOs that can be configured independently. @@ -63,8 +63,8 @@ Configuration variables: .. _mcp23016-label: -MCP23016 --------- +MCP23016 Component +------------------ The MCP23016 component (`datasheet `__) has 16 GPIOs and can be configured the same way than the other variants. @@ -112,8 +112,8 @@ Configuration variables: .. _mcp23017-label: -MCP23017 --------- +MCP23017 Component +------------------ The MCP23017 component allows you to use MCP23017 I/O expanders (`datasheet `__, diff --git a/components/mcp23Sxx.rst b/components/mcp23Sxx.rst index 2a8f9f8d5..1d1f19188 100644 --- a/components/mcp23Sxx.rst +++ b/components/mcp23Sxx.rst @@ -15,8 +15,8 @@ This is exactly the same API as the MCP23SXX I/O Expander except talks on the SP .. _mcp23S08-label: -MCP23S08 --------- +MCP23S08 Component +------------------ The MCP23S08 component (`datasheet `__, `Digi-Key `__) has 8 GPIOs that can be configured independently. @@ -64,8 +64,8 @@ Configuration variables: .. _mcp23S17-label: -MCP23S17 --------- +MCP23S17 Component +------------------ The MCP23S17 component allows you to use MCP23S17 I/O expanders (`datasheet `__, diff --git a/components/mqtt.rst b/components/mqtt.rst index 740c51fb7..3f00b66e4 100644 --- a/components/mqtt.rst +++ b/components/mqtt.rst @@ -48,7 +48,7 @@ Configuration variables: - **topic_prefix** (*Optional*, string): The prefix used for all MQTT messages. Should not contain trailing slash. Defaults to ````. -- **log_topic** (*Optional*, :ref:`mqtt-message`) The topic to send MQTT log +- **log_topic** (*Optional*, :ref:`mqtt-message`): The topic to send MQTT log messages to. - **birth_message** (*Optional*, :ref:`mqtt-message`): The message to send when a connection to the broker is established. See :ref:`mqtt-last_will_birth` for more information. diff --git a/components/output/index.rst b/components/output/index.rst index 60c05b8db..5eb6e272a 100644 --- a/components/output/index.rst +++ b/components/output/index.rst @@ -39,12 +39,13 @@ Configuration variables: automatically be switched on too. - **inverted** (*Optional*, boolean): If the output should be treated as inverted. Defaults to ``False``. -- **min_power** (*Optional*, float): Only for float outputs. Sets the - minimum output value of this output platform. - Must be in range from 0 to max_power. Defaults to 0. -- **max_power** (*Optional*, float): Only for float outputs. Sets the - maximum output value of this output platform. - Must be in range from min_power to 1. Defaults to 1. + +Float outputs only: + +- **min_power** (*Optional*, float): Sets the minimum output value of this output platform. + Must be in range from 0 to max_power. Defaults to ``0``. +- **max_power** (*Optional*, float): Sets the maximum output value of this output platform. + Must be in range from min_power to 1. Defaults to ``1``. .. _output-turn_on_action: diff --git a/components/output/mcp4725.rst b/components/output/mcp4725.rst index bd316c84e..ea4ff9d48 100644 --- a/components/output/mcp4725.rst +++ b/components/output/mcp4725.rst @@ -10,11 +10,10 @@ The MCP4725 output component allows to use `12bit external DAC in order to have analog output(s) on any board by using I2C. Devices default address is ``0x60`` and configurable alternative is ``0x61``. -Example Usage with defaults -*************************** - .. code-block:: yaml + # Example configuration entry + # Set a global i2c connection i2c: sda: 21 @@ -32,34 +31,6 @@ Example Usage with defaults id: dac_output level: 100% -Example Usage with a custom configuration -***************************************** - -.. code-block:: yaml - - # Set a custom i2c connection - i2c: - - id: bus_a - sda: 21 - scl: 22 - scan: True - - id: bus_b - sda: 23 - scl: 25 - scan: True - - # Set the output - output: - - platform: mcp4725 - id: dac_output - address: 0x61 - i2c_id: bus_b - - on_...: - then: - - output.set_level: - id: dac_output - level: 100% Configuration variables: ------------------------ diff --git a/components/output/my9231.rst b/components/output/my9231.rst index e15b1b91e..568d572e4 100644 --- a/components/output/my9231.rst +++ b/components/output/my9231.rst @@ -8,8 +8,8 @@ MY9231/MY9291 LED driver .. _my9231-component: -Component ---------- +Component/Hub +------------- The MY9231/MY9291 component represents a MY9231/MY9291 LED diver chain (`MY9231 description `__, @@ -57,6 +57,40 @@ Configuration variables: this ``my9231`` component. Use this if you have multiple MY9231/MY9291 chains connected at the same time. + +.. _my9231-output: + +Output +------ + +The MY931/MY9291 output component exposes a MY931/MY9291 channel of a global +:ref:`my9231-component` as a float output. + +.. code-block:: yaml + + # Example configuration entry + my9231: + - data_pin: GPIO12 + clock_pin: GPIO14 + + # Individual outputs + output: + - platform: my9231 + id: 'my9231_output1' + channel: 0 + +Configuration variables: +************************ + +- **id** (**Required**, :ref:`config-id`): The id to use for this output component. +- **channel** (**Required**, int): Chose the channel of the MY9231/MY9291 chain of + this output component. Channel 0 is the most close channel. +- **my9231_id** (*Optional*, :ref:`config-id`): Manually specify the ID of the + :ref:`my9231-component`. + Use this if you have multiple MY9231/MY9291 chains you want to use at the same time. +- All other options from :ref:`Output `. + + Sonoff B1 configuration example ------------------------------- @@ -172,38 +206,6 @@ And here is a complete configuration for the AiThinker AiLight: white: output_cold_white -.. _my9231-output: - -Driver Output -------------- - -The MY931/MY9291 output component exposes a MY931/MY9291 channel of a global -:ref:`my9231-component` as a float output. - -.. code-block:: yaml - - # Example configuration entry - my9231: - - data_pin: GPIO12 - clock_pin: GPIO14 - - # Individual outputs - output: - - platform: my9231 - id: 'my9231_output1' - channel: 0 - -Configuration variables: -************************ - -- **id** (**Required**, :ref:`config-id`): The id to use for this output component. -- **channel** (**Required**, int): Chose the channel of the MY9231/MY9291 chain of - this output component. Channel 0 is the most close channel. -- **my9231_id** (*Optional*, :ref:`config-id`): Manually specify the ID of the - :ref:`my9231-component`. - Use this if you have multiple MY9231/MY9291 chains you want to use at the same time. -- All other options from :ref:`Output `. - See Also -------- diff --git a/components/output/sm16716.rst b/components/output/sm16716.rst index 4b2a2df22..88b2d22ff 100644 --- a/components/output/sm16716.rst +++ b/components/output/sm16716.rst @@ -8,8 +8,8 @@ SM16716 LED driver .. _sm16716-component: -Component ---------- +Component/Hub +------------- The SM16716 component represents a SM16716 LED diver chain (`SM16716 description `__, @@ -61,8 +61,8 @@ Configuration variables: .. _sm16716-output: -Driver Output -------------- +Output +------ The SM16716 output component exposes a SM16716 channel of a global :ref:`sm16716-component` as a float output. diff --git a/components/output/template.rst b/components/output/template.rst index 1ba6d20aa..5edda1d9c 100644 --- a/components/output/template.rst +++ b/components/output/template.rst @@ -38,8 +38,8 @@ Configuration variables: - **id** (**Required**, :ref:`config-id`): The id to use for this output component. - **type** (**Required**, string): The type of output. One of ``binary`` and ``float``. -- **on_write_action** (**Required**, :ref:`Action `): The action that should - be performed when the state of the output is updated. +- **write_action** (**Required**, :ref:`Automation `): An automation to perform + when the state of the output is updated. - All other options from :ref:`Output `. See :apiclass:`output::BinaryOutput` and :apiclass:`output::FloatOutput`. @@ -51,10 +51,10 @@ See :apiclass:`output::BinaryOutput` and :apiclass:`output::FloatOutput`. .. _output-template-on_write_action: -``output.template.on_write`` Action ------------------------------------ +``write_action`` Trigger +------------------------ -When the state for this output is updated, the on_write action is executed. +When the state for this output is updated, the ``write_action`` is triggered. It is possible to access the state value inside Lambdas: .. code-block:: yaml diff --git a/components/remote_receiver.rst b/components/remote_receiver.rst index fb77427ce..4fb6b93f1 100644 --- a/components/remote_receiver.rst +++ b/components/remote_receiver.rst @@ -211,10 +211,10 @@ Remote code selection (exactly one of these has to be included): remote_transmitter: pin: 5 carrier_duty_percent: 100% - + .. note:: - To caputure the codes more effectively with directly connected receiver like tsop38238 you can try to use `INPUT_PULLUP`: + To caputure the codes more effectively with directly connected receiver like tsop38238 you can try to use ``INPUT_PULLUP``: .. code-block:: yaml diff --git a/components/sensor/apds9960.rst b/components/sensor/apds9960.rst index dd0885858..0a2004a2a 100644 --- a/components/sensor/apds9960.rst +++ b/components/sensor/apds9960.rst @@ -5,6 +5,12 @@ APDS9960 Sensor :description: Instructions for setting up APDS9960 sensors. :image: apds9960.jpg + +.. _apds9960-component: + +Component/Hub +------------- + The ``apds9960`` sensor platform allows you to use your APDS9960 RGB and gesture sensors (`datasheet `__, `SparkFun`_) with ESPHome. @@ -49,7 +55,13 @@ Base Configuration: - **update_interval** (*Optional*, :ref:`config-time`): The interval to check the sensor. Defaults to ``60s``. -Sensor Configuration: +Sensor +------ + +The ``apds9960`` sensor allows you to use your :doc:`apds9960` to perform different +measurements. + +Configuration variables: - **name** (**Required**, string): The name for the sensor. - **type** (**Required**, string): The type of sensor measurement. One of @@ -63,7 +75,13 @@ Sensor Configuration: - **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. - All other options from :ref:`Sensor `. -Binary Sensor Configuration: +Binary Sensor +------------- + +The ``apds9960`` binary sensor allows you to use your :doc:`apds9960` to perform different +measurements. + +Configuration variables: - **name** (**Required**, string): The name for the binary sensor. - **direction** (**Required**, string): The direction to measure. One of: diff --git a/components/sensor/as3935.rst b/components/sensor/as3935.rst index f8ccb4fe5..0c1a7fc87 100644 --- a/components/sensor/as3935.rst +++ b/components/sensor/as3935.rst @@ -6,7 +6,7 @@ AMS AS3935 Franklin Lightning Sensor :image: images/as3935.jpg :keywords: as3935 -The ``as3935`` sensor platform allows you to use your AS3935 sensor +The **AS3935** sensor platform allows you to use your AS3935 sensor (`AliExpress`_, `AMS_AS3935`_) in order to get notified when a thunderstorm is getting close. @@ -14,6 +14,9 @@ The AS3935 can detect the presence of lightning activity and provide an estimati on the distance to the head of the storm. The chip issues a notification through an interrupt pin. +Component/Hub +------------- + The AS3935 can be configured to use either the SPI **or** I²C protocol for data communication. First choose which communication method you want to use for the sensor, set the SI pin for the appropriate level and set up the ESPhome integration for the chosen communication method. @@ -46,17 +49,20 @@ A1 I²C address selection MSB .. _AliExpress: https://de.aliexpress.com/af/as3935.html?SearchText=as3935 .. _AMS_AS3935: https://ams.com/as3935 +Over SPI +-------- + +The ``as3935_spi`` sensor platform allows you to use your AS3935 sensor +(`AliExpress`_, `AMS_AS3935`_) in order to get notified when a thunderstorm is getting close. + + .. code-block:: yaml # Example configuration for SPI (decide for one!) as3935_spi: cs_pin: GPIO12 irq_pin: GPIO13 - # Example configuration for I²C (decide for one!) - as3935_i2c: - irq_pin: GPIO12 - - # Example configuration for creating sensors + # Example lightning and energy sensor sensor: - platform: as3935 lightning_energy: @@ -68,9 +74,10 @@ A1 I²C address selection MSB name: "Storm Alert" -Configuration variables (shared): ---------------------------------- +Configuration variables: +************************ +- **cs_pin** (**Required**, :ref:`Pin Schema `): The chip select pin. - **irq_pin** (**Required**, :ref:`config-pin`): The IRQ pin, which indicates if a lightning strike has been detected. - **indoor** (*Optional*, boolean): Indicates if the sensor is used indoor. Defaults to ``true``. - **noise_level** (*Optional*, integer): Noise floor level is compared to known reference voltage. @@ -90,34 +97,16 @@ Configuration variables (shared): - **capacitance** (*Optional*, integer): This setting will add capacitance to the series RLC antenna on the product to help tune its resonance. The datasheet specifies being within 3.5 percent of 500kHz to get optimal lightning detection and distance sensing. It's possible to add up to 120pF in steps of 8pF to the antenna. Defaults to ``0``. - - **watchdog_threshold** (*Optional*, integer): Determines the threshold for events that trigger the IRQ pin. Defaults to ``2``. -Sensor entries: -- **lightning_energy** (*Optional*): Lightning energy value. According to the datasheet this is only a pure value that doesn't have any physical meaning. +Over I²C +-------- - - **name** (**Required**, string): The name for the lightning energy sensor. - - **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. - - All other options from :ref:`Sensor `. -- **distance** (*Optional*): Distance in km to the front of the storm and not the distance to a lightning strike. +The ``as3935_i2c`` sensor platform allows you to use your AS3935 sensor +(`AliExpress`_, `AMS_AS3935`_) in order to get notified when a thunderstorm is getting close. - - **name** (**Required**, string): The name for the distance sensor. - - **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. - - All other options from :ref:`Sensor `. -- **binary sensor** (*Optional*): Binary sensor that indicates if a lightning strike was detected. - - - **name** (**Required**, string): The name of the binary sensor. - - **id** (*Optional*, - :ref:`config-id`): Manually specify - the ID used for code generation. - - All other options from :ref:`Binary Sensor `. - -Configuration variables (I²C): -------------------------------- - -Use this if you want to use your AS3935 in I²C mode. .. code-block:: yaml @@ -135,33 +124,67 @@ Use this if you want to use your AS3935 in I²C mode. - platform: as3935 name: "Storm Alert" +Configuration variables: +************************ + + - **address** (*Optional*, int): Manually specify the I²C address of the sensor. Defaults to ``0x03`` (``A0` and ``A1`` pins pulled low). Another address can be ``0x02``. +- **irq_pin** (**Required**, :ref:`config-pin`): The IRQ pin, which indicates if a lightning strike has been detected. +- **indoor** (*Optional*, boolean): Indicates if the sensor is used indoor. Defaults to ``true``. +- **noise_level** (*Optional*, integer): Noise floor level is compared to known reference voltage. + If this level is exceeded the chip will issue an interrupt to the IRQ pin, broadcasting that it can not + operate properly due to noise (INT_NH). Defaults to ``2``. +- **spike_rejection** (*Optional*, integer): Helps to differentiate between real events and actual lightning. + Increasing this value increases robustness at the cost of sensitivity to distant events. Defaults to ``2``. +- **lightning_threshold** (*Optional*, integer): The number of lightnings that must appear in a 15-minute time + window before a lightning storm is detected. + 15 minutes is the window of time before the number of detected lightning events is reset. + The number of lightning strikes can be set to 1,5,9, or 16. Defaults to ``1``. +- **mask_disturber** (*Optional*, boolean): This setting will return whether or not disturbers trigger + the IRQ Pin. Defaults to ``false``. +- **div_ratio** (*Optional*, integer): The antenna is designed to resonate at 500kHz and so can be tuned + with the following setting. The accuracy of the antenna must be within 3.5 percent of that value for + proper signal validation and distance estimation. Defaults to ``0``. +- **capacitance** (*Optional*, integer): This setting will add capacitance to the series RLC antenna on the product + to help tune its resonance. The datasheet specifies being within 3.5 percent of 500kHz to get optimal lightning + detection and distance sensing. It's possible to add up to 120pF in steps of 8pF to the antenna. Defaults to ``0``. +- **watchdog_threshold** (*Optional*, integer): Determines the threshold for events that trigger the IRQ pin. + Defaults to ``2``. -Configuration variables (SPI): ------------------------------- -Use this if you want to use your AS3935 in SPI mode. +Sensor +------ -.. code-block:: yaml +A sensor platform to read lightning data - # Example configuration for SPI (decide for one!) - as3935_spi: - cs_pin: GPIO12 - irq_pin: GPIO13 - # Example lightning and energy sensor - sensor: - - platform: as3935 - lightning_energy: - name: "Lightning Energy" - distance: - name: "Distance Storm" - binary_sensor: - - platform: as3935 - name: "Storm Alert" +Configuration variables: + +- **lightning_energy** (*Optional*): Lightning energy value. According to the datasheet this is only a pure value that doesn't have any physical meaning. + + - **name** (**Required**, string): The name for the lightning energy sensor. + - **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. + - All other options from :ref:`Sensor `. + +- **distance** (*Optional*): Distance in km to the front of the storm and not the distance to a lightning strike. + + - **name** (**Required**, string): The name for the distance sensor. + - **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. + - All other options from :ref:`Sensor `. + + +Binary Sensor +------------- + +Binary sensor that indicates if a lightning strike was detected. + +Configuration variables: + +- **name** (**Required**, string): The name of the binary sensor. +- **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation. +- All other options from :ref:`Binary Sensor `. -- **cs_pin** (**Required**, :ref:`Pin Schema `): The chip select pin. See Also -------- diff --git a/components/sensor/custom.rst b/components/sensor/custom.rst index c22899205..1f9dd6990 100644 --- a/components/sensor/custom.rst +++ b/components/sensor/custom.rst @@ -76,7 +76,7 @@ Let's now also take a closer look at this line, which you might not be too used .. code-block:: cpp - class MyCustomSensor : public Component, public Sensor { + class MyCustomSensor : public Component, public Sensor { What this line is essentially saying is that we're defining our own class that's called ``MyCustomSensor`` which is also a subclass of :apiclass:`Component` and :apiclass:`Sensor `. @@ -137,7 +137,7 @@ One last thing. Some sensors, such as the BMP180 were are going to explain later .. code-block:: cpp float get_setup_priority() const override { return esphome::setup_priority::HARDWARE; } - + Where HARDWARE can be any of: .. code-block:: cpp @@ -161,7 +161,7 @@ Where HARDWARE can be any of: extern const float AFTER_CONNECTION; /// For components that should be initialized at the very end of the setup process. extern const float LATE; - + Now don't let the wording confuse you. The ``get_setup_priority()`` method is an override. Instead of fetching the setup priority setup for us, it instead fetches the setup priority for esphome, while being defined by us. The BMP180 would for instance need to be setup with a priority of IO or lower. A serial streaming (TCP) server would require a working WIFI setup and therefore get AFTER_WIFI. This finalizes our example as: @@ -172,9 +172,9 @@ This finalizes our example as: public: // constructor MyCustomSensor() : PollingComponent(15000) {} - + float get_setup_priority() const override { return esphome::setup_priority::XXXX; } - + void setup() override { // This will be called by App.setup() } @@ -182,7 +182,7 @@ This finalizes our example as: // This will be called every "update_interval" milliseconds. } }; - + Step 2: Registering the custom sensor ------------------------------------- @@ -403,6 +403,7 @@ Note that the number of arguments you put in the curly braces *must* match the n ``sensors:`` block - *and* they must be in the same order. Configuration variables: +************************ - **lambda** (**Required**, :ref:`lambda `): The lambda to run for instantiating the sensor(s). diff --git a/components/sensor/dallas.rst b/components/sensor/dallas.rst index b3225bb3c..312948201 100644 --- a/components/sensor/dallas.rst +++ b/components/sensor/dallas.rst @@ -45,8 +45,8 @@ Configuration variables: .. _dallas-sensor: -Sensors -------- +Sensor +------ The ``dallas`` sensor allows you to use DS18B20 and similar sensors. First, you need to define a :ref:`dallas sensor component `. diff --git a/components/sensor/mcp3008.rst b/components/sensor/mcp3008.rst index 173f878e6..771b3a25f 100644 --- a/components/sensor/mcp3008.rst +++ b/components/sensor/mcp3008.rst @@ -8,15 +8,17 @@ MCP3008 I/O Expander The Microchip Technology Inc. MCP3008 devices are successive approximation 10-bit Analogto-Digital (A/D) converters with on-board sample and -hold circuitry. +hold circuitry. .. figure:: images/mcp3008.jpg :align: center :width: 50.0% -MCP3008 -------- +.. _mcp3008-component: + +Component/Hub +------------- The MCP3008 component allows you to use MCP3008 8-Channel 10-Bit A/D Converter (`datasheet `__, @@ -65,14 +67,20 @@ If you want just the scaled value you can use the read_data function name: Freezer Temperature Configuration variables: -~~~~~~~~~~~~~~~~~~~~~~~~ -MCP3008 Component -***************** + - **id** (**Required**, :ref:`config-id`): The id to use for this MCP3008 component. - **cs_pin** (**Required**, int): The SPI cable select pin to use -MCP3008 Sensor Component -************************ + +Sensor +------ + +The ``mcp3008`` sensor allows you to use your MCP3008 10-Bit A/D Converter sensors with ESPHome. +First, setup a :ref:`MCP3008 Hub ` for your MCP3008 sensor and then use this +sensor platform to create individual sensors that will report the voltage to Home Assistant. + +Configuration variables: + - **id** (**Required**, :ref:`config-id`): The id of the parent MCP3008 component. - **number** (**Required**, int): The pin number of the MCP3008 - **reference_voltage** (*Optional*, float): The reference voltage. Defaults to ``3.3V``. diff --git a/components/sensor/mcp9808.rst b/components/sensor/mcp9808.rst index d04ee776c..6bd23f940 100644 --- a/components/sensor/mcp9808.rst +++ b/components/sensor/mcp9808.rst @@ -32,15 +32,11 @@ required to be set up in your configuration for this sensor to work. Configuration variables: ------------------------ -- **temperature** (**Required**): The information for the temperature sensor. - - - **name** (**Required**, string): The name for the temperature sensor. - - **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. - - All other options from :ref:`Sensor `. - +- **name** (**Required**, string): The name for the temperature sensor. +- **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. - **address** (*Optional*, int): Manually specify the I²C address of the sensor. Defaults to ``0x18``. - **update_interval** (*Optional*, :ref:`config-time`): The interval to check the sensor. Defaults to ``60s``. - +- All other options from :ref:`Sensor `. See Also -------- diff --git a/components/sensor/ruuvitag.rst b/components/sensor/ruuvitag.rst index 792d38f61..9b98a9462 100644 --- a/components/sensor/ruuvitag.rst +++ b/components/sensor/ruuvitag.rst @@ -129,7 +129,7 @@ Configuration variables: - All other options from :ref:`Sensor `. - Only available if RAWv2 protocol is used. -- **movement_count** (*Optional*): The information for the movement count +- **movement_counter** (*Optional*): The information for the movement count sensor - **name** (**Required**, string): The name for the movement count sensor. diff --git a/components/sensor/tmp117.rst b/components/sensor/tmp117.rst index 52adc9ee6..c4ec98d18 100644 --- a/components/sensor/tmp117.rst +++ b/components/sensor/tmp117.rst @@ -34,8 +34,8 @@ If accuracy is a must, see section 8.2.2.2 of the `datasheet `__) are This component will not show up in the Home Assistant front-end automatically because Home Assistant doesn't have support for steppers. Please see :ref:`stepper-ha-config`. -A4988 Configuration -------------------- +.. _base_stepper_config: + +Base Stepper Configuration +-------------------------- + +All stepper configuration schemas inherit these options. + +Configuration variables: + +- **max_speed** (**Required**, float): The maximum speed in ``steps/s`` (steps per seconds) to drive the + stepper at. Note most steppers can't step properly with speeds higher than 250 steps/s. +- **acceleration** (*Optional*, float): The acceleration in ``steps/s^2`` (steps per seconds squared) + to use when starting to move. The default is ``inf`` which means infinite acceleration, so the + stepper will try to drive with the full speed immediately. This value is helpful if that first motion of + the motor is too jerky for what it's moving. If you make this a small number, it will take the motor a + moment to get up to speed. +- **deceleration** (*Optional*, float): The same as ``acceleration``, but for when the motor is decelerating + shortly before reaching the set position. Defaults to ``inf`` (immediate deceleration). + +A4988 Component +--------------- Put this code into the configuration file on ESPhome for this device. @@ -43,16 +62,11 @@ Configuration variables: stepper driver. - **dir_pin** (**Required**, :ref:`Pin Schema `): The ``DIRECTION`` pin of the A4988 stepper driver. -- **max_speed** (**Required**, float): The maximum speed in ``steps/s`` (steps per seconds) to drive the - stepper at. Note most steppers can't step properly with speeds higher than 250 steps/s. - **sleep_pin** (*Optional*, :ref:`Pin Schema `): Optionally also use the ``SLEEP`` pin of the A4988 stepper driver. If specified, the driver will be put into sleep mode as soon as the stepper reaches the target steps. -- **acceleration** (*Optional*, float): The acceleration in ``steps/s^2`` (steps per seconds squared) - to use when starting to move. The default is ``inf`` which means infinite acceleration, so the - stepper will try to drive with the full speed immediately. -- **deceleration** (*Optional*, float): The same as ``acceleration``, but for when the motor is decelerating - shortly before reaching the set position. Defaults to ``inf`` (immediate deceleration). + +- All other from :ref:`base_stepper_config`. .. note:: @@ -67,8 +81,8 @@ Configuration variables: number: D1 inverted: True -ULN2003 Configuration ---------------------- +ULN2003 Component +----------------- Put this code into the configuration file on ESPHome for this device. @@ -92,8 +106,10 @@ Put this code into the configuration file on ESPHome for this device. Configuration variables: - **id** (**Required**, :ref:`config-id`): Specify the ID of the stepper so that you can control it. -- **pin_a**, **pin_b**, **pin_c**, **pin_d** (**Required**, :ref:`Pin Schema `): - The four pins of the stepper control board. +- **pin_a** (**Required**, :ref:`Pin Schema `): The pin **a** of the stepper control board. +- **pin_b** (**Required**, :ref:`Pin Schema `): The pin **b** of the stepper control board. +- **pin_c** (**Required**, :ref:`Pin Schema `): The pin **c** of the stepper control board. +- **pin_d** (**Required**, :ref:`Pin Schema `): The pin **d** of the stepper control board. - **sleep_when_done** (*Optional*, boolean): Whether to turn off all coils when the stepper has reached the target position - **step_mode** (*Optional*, string): The step mode to operate the motor with. One of: @@ -102,15 +118,7 @@ Configuration variables: - ``HALF_STEP`` - ``WAVE_DRIVE`` -- **max_speed** (**Required**, float): The maximum speed in ``steps/s`` (steps per seconds) to drive the - stepper at. Note most steppers can't step properly with speeds higher than 250 steps/s. -- **acceleration** (*Optional*, float): The acceleration in ``steps/s^2`` (steps per seconds squared) - to use when starting to move. The default is ``inf`` which means infinite acceleration, so the - stepper will try to drive with the full speed immediately. This value is helpful if that first motion of - the motor is too jerky for what it's moving. If you make this a small number, it will take the motor a - moment to get up to speed. -- **deceleration** (*Optional*, float): The same as ``acceleration``, but for when the motor is decelerating - shortly before reaching the set position. Defaults to ``inf`` (immediate deceleration). +- All other from :ref:`base_stepper_config`. .. _stepper-set_target_action: @@ -141,7 +149,7 @@ position (in steps). The stepper will always run towards the target position and Configuration options: - **id** (**Required**, :ref:`config-id`): The ID of the stepper. -- **target** (*Optional*, int, :ref:`templatable `): The target position in steps. +- **target** (**Required**, int, :ref:`templatable `): The target position in steps. .. warning:: @@ -195,10 +203,10 @@ the target again. return -1000; } -Configuration options: +Configuration variables: - **id** (**Required**, :ref:`config-id`): The ID of the stepper. -- **target** (*Optional*, int, :ref:`templatable `): The target position in steps. +- **position** (**Required**, int, :ref:`templatable `): The position to report in steps. .. _stepper-set_speed_action: @@ -225,11 +233,11 @@ Configuration variables: Home Assistant Configuration ---------------------------- -This component will not show up in the Home Assistant front-end (Overview) automatically because +This component will not show up in the Home Assistant front-end (Overview) automatically because Home Assistant does not support steppers natively. You can add the stepper component code below to your Home Assistant configuration (``configuration.yaml``) to -be able to control the stepper from the front-end. +be able to control the stepper from the front-end. .. code-block:: yaml @@ -242,7 +250,7 @@ be able to control the stepper from the front-end. max: 1000 step: 1 mode: slider - + # Do something when the slider changes automation: - alias: Write Stepper Value to ESP @@ -255,18 +263,18 @@ be able to control the stepper from the front-end. data_template: target: '{{ trigger.to_state.state | int }}' -In the above code, "stepper_control" is the ID of a numeric input field. It must be unique and it is -used in the automation section as a reference name. The display name for this field is in -stepper_control's ``name`` key. +In the above code, "stepper_control" is the ID of a numeric input field. It must be unique and it is +used in the automation section as a reference name. The display name for this field is in +stepper_control's ``name`` key. -If you want your user interface to give you more control over your stepper controller, such as +If you want your user interface to give you more control over your stepper controller, such as setting the acceleration, deceleration, etc, then you can add more input fields after ``stepper_control`` but before ``automation``. They can be a simple number-entry field (mode: box) or a slider like this. Each of these extra input fields needs an associated input parameter defined on the ESPHome device's API service. The automation section tells Home Assistant what to do when the slider changes. It needs a trigger -(state of the ``stepper_control`` slider) and an action. In the trigger section, ``entity_id`` must refer +(state of the ``stepper_control`` slider) and an action. In the trigger section, ``entity_id`` must refer back to the configuration ID that triggers the automation. For us, that is the ``stepper_control`` field in the ``input_number`` item. That's why the value is ``input_number.stepper_control``. @@ -276,7 +284,7 @@ the correct syntax is to join the device ID to the API service ID with an unders as in ``esphome.livingroom_control_stepper`` where "Livingroom" is a device in ESPHome and "control_stepper" is an API service for that device. -The template string is used to get the "state" value from the ``target`` field (defined in the target section) on the +The template string is used to get the "state" value from the ``target`` field (defined in the target section) on the ``input_number`` component of the Home Assistant front-end. This value is then passed to the API service as defined in the ESPHome device's configuration. The ``data_template`` section lists one value for each of the input parameters on the service being called by the automation. In our case, the ESPHome device has an API service with a single parameter, @@ -285,7 +293,7 @@ Getting this linkage right is very important. The following code needs to go in the ESPHome configuration file for this device. Above, we mention "API service" a lot. This code is where that is defined. You may have already added it (or something similar). Note -that the input variable for the ``control_stepper`` service is called ``target``. That's what matches with the +that the input variable for the ``control_stepper`` service is called ``target``. That's what matches with the automation configuration above. Also note that the variable ``target`` is defined as an integer. That means it must be an integer number, not a string. diff --git a/components/sun.rst b/components/sun.rst index 345063255..dda62a5a3 100644 --- a/components/sun.rst +++ b/components/sun.rst @@ -57,8 +57,8 @@ Automation: - **elevation** (*Optional*, float): The elevation to cross. Defaults to 0° (horizon). -Sensor Platform ---------------- +``sun`` Sensor +-------------- Additionally, the sun component exposes its values over a sensor platform. @@ -85,8 +85,8 @@ Configuration variables: - **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation. - All other options from :ref:`Sensor `. -Text Sensor Platform --------------------- +``sun`` Text Sensor +------------------- Other properties like the next sunset time can be read out with the sun text_sensor platform. diff --git a/components/sx1509.rst b/components/sx1509.rst index 0340af738..32b563376 100644 --- a/components/sx1509.rst +++ b/components/sx1509.rst @@ -41,8 +41,8 @@ complicated components that use the pin schema will not work. For example the I scan_time: 2 debounce_time: 1 -Configuration variables for the SX1509 device: ----------------------------------------------- +Configuration variables: +------------------------ - **id** (**Required**, :ref:`config-id`): The id to use for this SX1509 component. - **address** (*Optional*, int): The I²C address of the driver. @@ -53,7 +53,7 @@ up to 8x8 matrix (i.e. 64 keys). - **keypad** (*Optional*): Add this to enable the keypad. - - **key_row** (**Required**, int): The number of keypad rows to use. This enables any number of the first 7 pins. + - **key_rows** (**Required**, int): The number of keypad rows to use. This enables any number of the first 7 pins. So a value of 3 enables pins 0,1,2 to be used as the rows for the keypad matrix. This value must be between 1 and 8. - **key_columns** (**Required**, int): The number of keypad columns to use. This enables any number of the last 7 pins. So a value of 4 enables pins 8,9,10,11 to be used as the columns for the keypad matrix. This value must be between 1 and 8. @@ -108,6 +108,9 @@ Attention should be paid to the capabilities of the I/O pins. | 15 | ✓ | | ✓ | +-----+------------------+-----+--------+ +Binary Sensor +------------- + To use the individual keys on the keypad you need to add individual binary_sensor entries in the config. .. code-block:: yaml @@ -125,8 +128,8 @@ To use the individual keys on the keypad you need to add individual binary_senso row: 0 col: 1 -Configuration variables for the SX1509 keypad keys: ---------------------------------------------------- +Configuration variables: +------------------------ - **row** (**Required**, int): The row number for this key on the keypad. - **col** (**Required**, int): The column number for this key on the keypad. diff --git a/components/time.rst b/components/time.rst index 263787efc..9d61eb48a 100644 --- a/components/time.rst +++ b/components/time.rst @@ -215,8 +215,8 @@ Configuration variables: - All other from :ref:`base_time_config`. -SNTP Configuration ------------------- +SNTP Time Source +---------------- .. code-block:: yaml @@ -234,7 +234,7 @@ Configuration variables: .. note:: If your are using :ref:`wifi-manual_ip` make sure to configure a DNS Server (dns1, dns2) or use only IP addresses for the NTP servers. - + .. warning:: Due to limitations of the SNTP implementation, this component will trigger ``on_time_sync`` only once when it detects that the diff --git a/components/wifi.rst b/components/wifi.rst index 90c71b5c1..4a3a9b083 100644 --- a/components/wifi.rst +++ b/components/wifi.rst @@ -38,7 +38,7 @@ Configuration variables: that is reachable will be connected to. See :ref:`wifi-networks`. - **manual_ip** (*Optional*): Manually configure the static IP of the node. - - **static_ip** (**Required***, IPv4 address): The static IP of your node. + - **static_ip** (**Required**, IPv4 address): The static IP of your node. - **gateway** (**Required**, IPv4 address): The gateway of the local network. - **subnet** (**Required**, IPv4 address): The subnet of the local network. - **dns1** (*Optional*, IPv4 address): The main DNS server to use. diff --git a/components/text_sensor/uart.rst b/cookbook/uart_text_sensor.rst similarity index 100% rename from components/text_sensor/uart.rst rename to cookbook/uart_text_sensor.rst diff --git a/custom/custom_component.rst b/custom/custom_component.rst index 3c83c50c0..926e54c34 100644 --- a/custom/custom_component.rst +++ b/custom/custom_component.rst @@ -54,6 +54,9 @@ Configuration variables: - **lambda** (**Required**, :ref:`lambda `): The lambda to run for instantiating the binary sensor(s). +- **components** (*Optional*, list): A list of components to initialize. The length here + must equal the number of items in the ``return`` statement of the ``lambda``. This is useful + if you need to give an ``id`` to the component you created. See also :apiclass:`Component`. diff --git a/guides/automations.rst b/guides/automations.rst index 31c6a649f..ac6159624 100644 --- a/guides/automations.rst +++ b/guides/automations.rst @@ -256,8 +256,8 @@ all of the usual lambda syntax. .. _config-globals: -Bonus 2: Global Variables -************************* +Global Variables +---------------- In some cases you might require to share a global variable across multiple lambdas. For example, global variables can be used to store the state of a garage door. @@ -284,7 +284,7 @@ global variables can be used to store the state of a garage door. ESP_LOGD(TAG, "Global value is: %d", id(my_global_int)); -Configuration options: +Configuration variables: - **id** (**Required**, :ref:`config-id`): Give the global variable an ID so that you can refer to it later in :ref:`lambdas `. @@ -300,7 +300,7 @@ Configuration options: .. _automation-networkless: Do Automations Work Without a Network Connection -************************************************ +------------------------------------------------ YES! All automations you define in ESPHome are execute on the ESP itself and will continue to work even if the WiFi network is down or the MQTT server is not reachable. @@ -517,7 +517,7 @@ turns on a light for 5 seconds. Otherwise, the light is turned off immediately. - light.turn_off: my_light -Configuration options: +Configuration variables: - **condition** (**Required**, :ref:`config-condition`): The condition to check which branch to take. See :ref:`Conditions `. - **then** (*Optional*, :ref:`config-action`): The action to perform if the condition evaluates to true. @@ -545,7 +545,7 @@ a block until a given condition evaluates to false. - light.toggle: some_light - delay: 5s -Configuration options: +Configuration variables: - **condition** (**Required**): The condition to check whether to execute. See :ref:`Conditions `. - **then** (**Required**, :ref:`config-action`): The action to perform until the condition evaluates to false. @@ -610,8 +610,8 @@ Configuration variables: variable to. -``script`` ----------- +``script`` Component +-------------------- With the ``script:`` component you can define a list of steps in a central place, and then execute the script with a single call. @@ -627,7 +627,7 @@ execute the script with a single call. - switch.turn_off: my_switch -Configuration options: +Configuration variables: - **id** (**Required**, :ref:`config-id`): The :ref:`config-id` of the script. Use this to interact with the script using the script actions. @@ -759,8 +759,8 @@ Configuration variables: .. _interval: -``interval`` ------------- +``interval`` Component +---------------------- This component allows you to run actions at fixed time intervals. For example if you want to toggle a switch every minute, you can use this component. @@ -775,7 +775,7 @@ trigger, but this technique is more light-weight and user-friendly. then: - switch.toggle: relay_1 -Configuration options: +Configuration variables: - **interval** (**Required**, :ref:`config-time`): The interval to execute the action with. - **then** (**Required**, :ref:`config-action`): The action to perform. diff --git a/guides/configuration-types.rst b/guides/configuration-types.rst index 8a87494bd..4c4f0e21c 100644 --- a/guides/configuration-types.rst +++ b/guides/configuration-types.rst @@ -108,25 +108,6 @@ More exotic Pin Modes are also supported, but rarely used: - ``FUNCTION_5`` (only on ESP32) - ``FUNCTION_6`` (only on ESP32) -.. _config-color: - -Color ------ - -When using RGB-capable displays or LEDs/lighting in ESPHome you may wish to use custom colors. -A ``color`` component exists for just this purpose: - -.. code-block:: yaml - - color: - - id: my_light_red - red: 100% - green: 20% - blue: 25% - white: 0% - -RGB displays use red, green, and blue, while grayscale displays may use white. LEDs or LED-based light bulbs -may use all four color elements depending on their capabilities. .. _config-time: diff --git a/images/inkplate.jpg b/images/inkplate.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a373c8082cb9688984eb329fe6418df658792c3b GIT binary patch literal 33233 zcmdSAWmH^I)FoIz2$10JlEQ*J!66AAAh<)YV8LB0xO;%$5L^p)cXxMpsX_}VVEDRw zX4aZt)3bVgU(c;|-k*B)-re=qJ9qDM_I+7=*#uzANy$n95D)+Wgx3$?Wd-mBfQ>*iRFv0&_5M8?It~^tE)EtB4jv&n5gtA%0S*o^4KXPN1r-$)9?=Kd z50tdzlvI@eaS?>qpQ5})!9+#Hq{PR;r~IEDFP#7!RD^uQGbDr$07M)FBpig7UI5kW zJdqLp+W`EJfq;ng=5>~+Xz$*?o=}GkKtw=7LVTV7D}dLteO|u@yum@nrQwu#i>GXa z^1%V0%P%em75KTTi$G-xLd$LJ=#Tb}kcgOsl#ZT(@goxtFCYIW0l_a{C8eZgWaU)V z)HO79&SXwzbySTc!dw2!}1_g(NhK0u`{7Fno{+p8eFE=m0ps=X8q`IcI zuD+qMskytSx37O-aA!+Vi;iWl@uzK;kX+df^j4OZM_gQZ>?LrM<7J7NiYR31 z+ihTd(9{Dh4`(s75!Uuh$N06P54zEd2FD%6w-vhE8-1*r{SB*A*%6KdE1BXEu`*L|#J|^ruuX!nUjV<{s6sEI z-_`2Ncv(oTEgZLY0Np1NFZn#%@RjwXawPG;BmDm&2=+RNec6uIv1Ogh83%kSaQst7 zUDq#;K}&F`j!M2@^`3tVy{fXNxjd9%V41=1dP3}b!gy;eRn1cWM(dx47eICU!3{XR z6|`gH)bH8UF;{_-ly}c}6i3c{n0ucvROVx@F?;i5EPp1o?X_|evYTGRc?zJ4MQlUa za_edPqBTbVj3RX(r5~Nnl(p7g%<0~5Llz5Jsb2KkGtx0vv z0B_Eg9p;e%;mq@x5s62hP(jAHX-Z2C>DuQ$1f$>!14ST_Mmtz?@uX0W<3<1!=8HBB zci6g{0soP9pfs4@(_}|_i23dn{Q^kz22~uTZUhLc-17gF7m@4#4jmx@#tjdKG>S;T zna^y@HG{kP5Ek6YnU=t%Aa=DNE-MuK7W9#@73||1yFPUfSJxm=pLpcJ2~93h+y z7bf{>?<$4$ZKqh|kE54n2b>P3(Le}YJJz^dIXeB~!G*5i5*Uv<8tDLzO5oG0- zt&2v@C03Jo$Wqm$t_@!w)mdTmBXBJef4h;L?@#A1GTvE9#qCV6tyaoZeUR27WP(g! z5rMAj>n4N>Y$g4_)`V+|ql6BOz5q6vg9Ry`TO5D3 zcf?NzjoxQmb~Kp`66~!rKw0MtU8i}{nlA+zCnR40q(_P) zUrQy(-fX&AhN53cL5IKaY}MLEQE7dto2 z9~Tcnm>EL$jX_wBp!aaGO`K1L>P^QR?}a@IUqjWIEe@wS9SKyi8Ny$#<9->EqxwxLrZs&DYr#_T)ISLFO#U5DjE@pPf<`TGU}^)uUc*Vdm_c9oo-_V2`k znelp>$sfw9TF`LU(u{xUPb+S$MtNnaPI_fxX8E^Lfyy>?`{z~k6!=Kr^U~=^Jl$hK zr0)sO{KkAFAs3ybpg@}imD%0s6E()-{a*;w6!CNvDAO$tpAL<7PAynL$S;65{TV3A zSF;@Lgx)L-GpuJf?AW@!F+>w~#+WLIps=CGi(@4i!f}1V08mhxMBN}N8bcxsoR0T* z6Q$5egCX@jBiEuboJlajfCcQjd%m>TT2GhsHJqC^l0aI;I&&7B-{ypGNGpEz0$6wf zybHfP_PXa%92^iA@)3DD!e?RwbP{|I(ZEft#r-tR)AiYU6mahZ54`JrnfbF}oVC z4Ol$`GY^#I8&dM^K6#{&tmpY=$%PnH5iX$deC4ehu8qr5vKudw$0c%)#Z3E)*%E-0 zwWlj+0Nj(TTf0?mWeF>v|IAO;+oUeUwyv zOmP}DpL|V}@Dj0*xKb^B2A>gFR2^Z}k9jv@B&Oat1q+%EyjJ3Nruqc!>1?f=Ln3~@ zV-B`itk#Y*zx(TJFdKv@g4Yfi7A&HwXiTCwwCNp`!adCK+$I4wnsm|B1_te2?tOU- zlRbJK@zS8`V@IxNL4O8Lp0&0qV(ThbON_QxXW!gVJhyp48iVZ2RJVSrQ$I7F`ygzB z@Q)1GCu!!ciyfmbNARdJiOwTMKv_C#;IL;>_Z3x$Mr(6a1PQe_>sr+>mZ2wNSCRG< za3%cXHU@X^14VmP-YQyo0hN^0d6^K$bp^UD#@3z-q~>3gy0S-Vt+J$j+W%flpPHr{ zwvMi>(<@o-!cF=gWSJp58_l|3l-Jv`8nWwT(N3Ji+-8`V6FwdQk7J z|HRs(aMtNH#igem`~%EdwD42>TeCp#nqwgu))R7)UCh4!ww@XG=)6tKwye@Rnjb<} zjs{RD72og@w~l1pIXmmWau@h;e(>I1VTaunS1ZL<2C!?{cF`~Ca&zB0MIip?$!9iKe%Xg@dB7X zGN2<0;?)%+9w=Dl7O&z+saT-Vpmu7dT;sec-$J(ecEDFJa-X8^1rVb#@Y#tWmBww$ z%;1}J1b@0XCVEKigZb@r?WV~~8zB%AfAVN=kARw3WF<>3L3zfs!BBvs z%S4kU#9z=f2!H=&0+KNJT(`zG(^%&5T=;W78Chm6`dn+z7?vFT$t@^{D~SFiC=y-|P>bnp*U zD-^v00aw(vJicbKfbTQsz^1xJaj0Af&7Xzj$ZmNoA!je{lEl~Ck!0~Ne3$nfp)M!4ABr%<;#D}-=!?m{+$hwz> zn=2YTlj^6gCs@vw)Ledw`nOBLdZ2ci(6JtEans5v9a8Bpk>Gv$+YBJ?i0 zu7k`PtLTKEu2RMyc`%yb`50^mR$VW4camtD+Yj4~c4<^}@A)i^ej-=87e*OTpm*$8Bh}699(q+lj$3t*ee?5`PWy!LUh{Wj1^S;) z3$1Ca>xz7=+(y~9?iRrKNI^6ujdUX-)@>I=`0$Ny85~+}gxAe&{iC(d`rPR*{f8l8Kg1LB#^5&6y)!)1fXL*+J)#%rmLZMveYQoq$P~13Uya|4sSFMeMoVo;>Lr z5(XB})SL=yLQjQUJ$>1j^PRF0qU4H7n@0V)K0rn`@=3w$-eOEKJYu z=DM)5L2}Jb$y#>1rDh@t8bagI@A-^Bgu~{#iirPPz1kC3Y^WkoZ)tVO@{Z3-zt@W) zLO57O$aRq6L~G%;T1$y#3h48p4V7}i+Pa!SFXM&#pl_Yue~f0Yh)C@!ENT<<8+X-zziqbj^WsmU)ggW|IkrC zR8;SjOP$1BeEwl3YfXu|$mN-Ny`md-W=ksmPuh%`<(sH(;6>cisSCvmKyWfnphT1N zErrYhb#(Sacn+lkRI_vHNd5(Y#vT$o^iOf4E!6SX>aEzRC*_(5(?l0m*cD9ZJE`x# zONAUgu?xK7hF3Diitp(e{p7h&ptDM5Nsrr|(8ZP5++a5REu<6yK5%`svq9jE>dh~B z;>mV@O;&JER;nxT0!XqsdzBq+J}e>@3o(`Dm!JhzlD@91&PU4O{q@^v<`&s_3wm+r zU*0X@cS<cB1FG*v_Di>Eze{}#I zr}b)Z#Uu*9hEwGCx%HeVjyM0Tw|togsduagg#W=HPdxrTrH7WZ?CbhueNJ5QOsJFI5emfZ8!}L4;-l|@en5M%W8dKKT$sBpVaDUS4|RgLD2wnKno-C zJV=S@4SA57LYNVw^Dqw{=06HpMA%4cIO}wT#$TyLC}=KDnsI7Sd4tFDUC5If+l zH7SovOB}Pqg9R^0){lmaW`vw?qa>XBAiIl22^+eV7!1`rjztow{?2_YKD$`YYnfls zTo8^J;F5MMBh{cK6wT~euKqFgFKbjXHn(?AmOS7P#MD;LFxzt;spxRBoH+Z#6kX#w zlc?2VY1{b+%4be(yZrV1l2tMfQU<*coJsOz}_(tQ*6R8x!`lbOIRRIU9;{s@2v zD$jFov~uY;mU((yWnLXqS+)Wq%56_rp5M%^MiK{$^u1=EcfzIhE}5iMV}F(or;yLh z8(IY|gy(gRWwQL1VCqQ(7V%=VLI()?^7l&g7WHW4TQo>CRN-=B<5-(k@Q8FjwS$OH zOs>tBg;WRO#=@%GAb(m&`L?0u`JE2N&d=qY;>Z`k1pf=b!d2wCsbc3A1gmrwFoq0- zR-jGi+0-{+f_CO&APG<1po^?R#Uhc0CAQi##W~yBw4D0O#j6?-TE*x4lYydxez^H& zBb;tq-mXDO_?f)b*ybV|Q1w}mawUX>V&Fp?lZ#PU-jT*eVHTWfw6AX_nFp(GE`ZUD z+Mf&cLf%jSjsUAj;_lm`!d|OcOy;yqzCvsSY?(NEQF4F+A@2R6kzgX6kVLf0!PCIm zxk+V70zaewqNIp245}vz7glm`Tqln?BNS9`+7Ky$*yWzlZ{7X*0nZTeAlTbLfRkB6 ziTdtRCFgTk+v@7FmP2BtQ$Cm?;$u5XdA@t(-|qPB+(89%xIXE*^%|_cb+c-+pn51i zZ+p%rh3RTmK|$S0p|1(8!F>8AN>E`*qKWnkT-@1x(S^z&(BW{i$}y7e^KJXYM9mXP zh80d?iKM{_cn%X9i0!V~d-rjxO&c7PzK=U2MJSUV@HY=>&tB7>*4}iEBne!P(!5h^zEf)cUV~ z&3sC!`&%-7xe?Xox+z{1ELtveYjYThmYJuK>8GEAU{9z^;{u$WvTCce%gLO7yo*ez zg+SyIwI9nNz>xEE9n-WGZd=OnY_3YYqP0^N)I2<|B}wM2fR>UrZDGj=*$l?7AQ)YE zFy7SAz)bu51%T)B^#!mr0e@S$6Rmwf2<_Dmp~E7%6%7zk`hg+V>&sd{&Et@N)POQf za&^8C+!%YgB7z|D#DVN7T+9p%YhWmzb3f>ZSWd~B7Y-Mg-J4~V^!uQcYDQY=q%Q~c za9Z+l4xu}0JtUlHYc5AF2Tk9H{Ic@ZnuT;cfjnz$JNP)|o+>* z0bywc8}?pTBAimoyW1=I%WMQcZ}d&ir;k_f2J&H|%cE9jg{wXIRjj?Sr_OI|;@rT; zsO5(E?%Yz33W4*JPl=S9Ul=2y!6I#asz%Oqm%N|$jfpvpjJh^*ikb`*loeHLNYnK6-NDSR~L ztm#ggxzzw{a=ZY%+GM;zxk|;7ES0O$M5$$uvwUy6%Ws~k24|<-bHyzxb4~J!_ zA*h4!q>RqJRGDcbx`D2^R=S_1LjNQt&#K0u9sZ>#pVti<05gQvv0DcowjTw&d)N@OmT+*dV`p5{+}2& zqOHw42nOH+u|p2tX^7Q*c>G`ug2lMhb;(@NvQ5t@uxvfCNL;%(RT#C3xHBy9%rZyAwbtx`Tw(O8r8MKJ z$vr7MeO+wEGhFiZEOlB9Eha0XmnO;U(lauYj53{GYoP>VeLg;{oie-OjN2M+s|dzo zls9!AB})=!w}by8g|gjnziH>G&dKfIdm`+K@1HA;W44=N7=X2_kv6wv6HB6lwN7>r{+!fCq{TN_?v6_QDZKX#u5iw{BX zE(%A&Lu#`6p1juE7F7Ax_($uXYekR$wesJ3z-oCLb0FX_HqPSg6>}Gw7eGv`m|qP1 znhJKe0B+KZF$g?V=r-4*FR1VjXDpNZFH!xQ?c8vl>GlsW(CO8$`Z*gvYqGT_&W1bP zIV=ZQv~}A*zk==an2ATRKuQ)6zQN(81YsJ6AA9kte)}LxtfLwGWDfan!P|@Ij$6;F z$y!57E6=nE*7NAIJuSV}mC*eZ{1-s^GTI872nt;^_mQEowWmf#xuvF#MzJNqT*m58 zfvs3GeI*k^4!9wtA|G~+x@XY)5fB{}jpPcZg9PVScr(qJ zHD{7Nf-&_+ac}1j_EX4myq&KANSX0|Pn+E4o1jqJR(=as-p67ceoA9$pnoj8E6PUk zgwlMQZm*|7*7nm!^E&q|?;knNYp-2lj|ljeMwE6eD_CR)cP3#=6on0xEoRK)1z=z| z*SocJa-J0l4=`fE89`R?foNKC%OHgG|8Pq)}B2mec$jV_ooO;i*qX`S&yZ}N(ovSL_ zoXCfexcHemZ{BFC=EJ;H|1zT{esQL2R!gl&xka4=Hu2q>T~?b2iAW6G4*=V&4;PyC z%M;3)^T$Rg`KY@nHy1pkqUlE(1bNTX@*}o^%N5x{qBlgpZ%W^H;H@7Wa1`VsXh!vO zGVS^bpj=n{d!Hr?7jv*NFVtTn5hv3X&K!7v8W?Ufr_}nml07mDd3mT^VC#_n5(3F*J%z8TT8XYD^6c&YmGfO zO+Ugzd5HpRN3c#u^YgSUrpBR-=OmgWVrL)WhZfkWU+e3ee`Yuc!?nNNR?9|npo#mY zv+6;SjuslA9tb}z&&)z&TTP7?icY%9o)q`{$6VwE3j9}*<^T3nDqqC(iRt8)!cKZB z2W*%OBAPy==;blW4p2Wj^K_=3E*r486&t@xQ}K2Gy{B!6B)U>kcNVBbJJ|f~-T2BS zG@I#nsnbah)o@cibT*mL+Nj_NcU7>3i5qu=88O?)C#GE9jw+g0JIBK;LLpqM*UDjh z6=%})c3|(DvAdNH-#@)}-VB^Wa&qs1KUaCFJzdK4jX8v>>XPlnmgRCvSm`yXo=A}sLu@bOj56-KF^FR9Ev(T z%sZ~;SA|M){w_8pro{vgF`%2e=bd?2<`RmBTH4e1nb zcZZW-G+i@e<88w<>!u|zMfvU02LTnUIF?Z&YYW@2e@$qS@q>?2%N>d&MJl!F*go@E z<+mS02ac4->`?A=7&P;;I9j1Tt&h%Px#H|y?f=37PV^ zAKgp{oav}`<-r2J#`Nf1_v;HfWiY60ww3*Tj0Ami20{itE$dS7YuPibN|4sAU$=OL&x|!WWT;^kf`ks0@o1^vrj!vy}Uj zZtBu6CwIvBFMKrnUpOP+KRZgAE3(W>v_{N8wh1f49D_SzF;$dxR^bZtW&LRp&7#_{ zrp+~_uHwn!9?xeEVu0sQ>+V0FF&O#~g<>$Rn3LT7R$e&@c~P4L zN(%7oZXxm@8a7w#J`ckFl6`WSC+M3&s$gS!UQYW{@>$q1-lQZmg=D`GpUMQQnLlY* z3WG;E15Ae1!eS27_o6BiCVl)BK%dS9lgqPF1!rBCc_;DX=W0(!g5UT|?10d9eg0Z4 zD@R|+wMtNPR+^asY5b`4c71%TM}Bg-{}eZ_4Y%gEOZv>Ay7&Ufnr`|J9kYYvF10O& z=3a4R+sf(wenlVfSsZO&lBzr9@o1iJ*E?@#RoH7w<}BB`MO`<8YtPL)J(5xarO>zi zIk-jD@^Zu}Q~5YrQwA#1v;JWby|{B(HOoQU5dZp~PTRJxtP;`tT9yM73u9)z?2zgQ zWUqfICV8KarV&VurDRuVwFK3wX|CcgcsRduJ6{s6sZxX3i+7gR4K{Uoi$GNl7ryK2 zcRUE{p=eAzv_^qp*iJCb0xL0GIJfnm;BD)LqX_pfs+3MJsu#%%pjM~tL% zZv`WL)nm*n+-o$OEO<^L7A*B+k}X;^*_MDJO<hD@+LliS$MzEO{qkqDw6I%ElQXp?jl)yE%uG6{1`^s5Sv+dra)S@t>)fE0_Yxlz6(@)2j zblP;D9Wx@gL|0oE=eDKj9xZG03tUlJLxlOg;X(!b`8m%MYJ7OV?77KV*Kpy%!g32J zgpvz#mRKgpuoV0k7|N$#vo8kq+PyhA`eM6`M(ar*SEzH8guSHQT_u5gCP{UWaG|Lr zXVyBUC!WxGLhHzAW+w24@`lb-JFR%>{`Uwa62jn3nFeu1QTXueX~-Cl2@=VNRAYfN znV{;wH8zNRL%>g)R|eKW;Y-_!Y;WUP-yxD{$MoZUDfk%{^+n^aK%Y=!UHbA1vJpf54})@|w5 zU)sNpqI#l%#PBCn%8h`epEGETE!%bk=Xszy@-3o|LLUYNwMm={9;`a?<-bdd7>eFJmPa-Uh_SO}PGR^Z z#3nD56Cll$X>77e1=g`rWR(8aa(7cf~#ZQrcW;&Kgh_K#EEN)XW8%ioC{KJ zx0k}`pn?+vI)+Q^q@Q?4OrPLDKSrv{DU`yZQ=cjWrD81|_?HCi?lp}EVDMa z=NSo(zB8t%xyF62!|V^^hf?+oG&77m*sXbtz`k7WiwM3IvFE>)MM0BpVGtXQMX#TM9m9lpI5J5y4I+mVQXQ7 z`pPpx!Y6&P5N$H0B=J$;3qaeBo`WuC)ft$JiDfM6_mtMo!4_x?A&N4O*2i>t+YiZ# zM>Ywf&Wugy$KvEugLk;~fOFQ~ghfK(rMye5!i{@uEM~@shb@`YDxwdV$I|E_!Q?K0 z`M+=?kv)ph%A4}s#YfOUJ07W*P?@i57XRqG$g^u8{L#6Dl)fm;NHn?llhIyfn2IQ! zo_`HS_!{jS9h^lUc>EK{1|gBYcBDiLU`^!c3F&_3CqNXrS1*(QO7Tog$Y^xg~nx`9g*!HkCKw`EFZ+>ALB{6=^fr-rc6K` z7B%U%!0%6<`Da<{#IOw%lN9-AWA0YjA+NSo)RQspt>=ubF|KtAO*NNUUPLE~dQo{t zH1g|$L{;BC;iVf3F>o&kh|dBw+1a8-M&d+9-cmMQ=q_kt_cvKgp54pbT|ZzI?&$T6RK}Xyk1LT^_|}MpG7!yVs)*9x4r+8e!Da z6IPv@se}4ngLJHz6vc5uWvZyvym52gta*J)P~h;Eww{UQgq?D@&0GtM-0i8O)Mva2 zMSHI&=4Iax?t)aIxT!#Vq+jl7d@x41`o7(fA4x9Le9u=7wM)M5yZ-41f4@jPAF62w3s#qN5 zDRtC;m`d)D`}%mzD;CkpquOkZ=!URqi=KlDrxPam`FJLX^m+^4&+7hN#CD5jvYe5h z`ypoD=H-FHj7Kr7bXCFIZm7H=T8DZ2nMAMnB-YZ2VAy4fb*+?^=$Famic8z5xu~k^ z>kIK@Csz-PEA+r);mhQ#jKC3~rn@%zmvD0E}OBa7u-oJ%e-I1HQ%dr0So=gq_kQ(!bkH85~+R z5y3=w^Qx}E<-WLZi5YLN?56^3);eNq9Gdug+)q=j!LF8K}{Y zKCgtc)Y9#oa@QLWQ4UY-x!9Fg2XDM(y335IgL3 z$sy^ch~3vyn+zB2SUX!B<5#!`8HU~25Da^BLdO$#IGQj8)gS zINBT)$voO#BlW6sJiKnm55)MFUjW7(A>h=#b3AqQ0zhluhjgUOp2+kk(ZuUd-+Gn@ z;tTs4z*!^Ub^C=L#&!#vd-ASOZJOHV*a*5mwRnN+^JQzYRDER5rWdo00uKSVF0dxT z+&3UhZy&DvY!)4#-D*1&`+Fdp?`7p<4E)QU7zfGyTsH1c618oa`buEqt4RMbufwd9 z_kDsf8X>Djuae>PREcrZ(b#0x1!bQ+AUUGTOL78ZC|@^uE$%iX3eL@zXg?|2xFSIR zF}Z}w@M__h`8RYT;$}=t`SR@hvaCpKedbOuUWL=;17)L#y;8od?*xeO2h_$NE()DZ z)10N$py!!eo~$&?91DzjC?{Tf zrOENlLW!5XjuvZL2>13JWyMr=CZ!1?C-1rHDP&xY;9p{`qRR>9QVR+mms~d;(E7;QP=Nv zRi|31a=LQ0gQ5t|8`#qyBe@Z!KM4nmOUtzhie+m3a&^=v5dA`PzDboBq8x5Ewo0UN zpb(%I#r92lPrY+m>t4~NA-^Dh3&xR2E>x98tv$Nb)Z z>!P0#yWSFny#Smu^LA*IrmIasHOs9v)VSQ~=CqM6Cldw&<=Q5Hs67$`*^thc8~9FT z?h$~0KJ9=B#;v)r#RV1%t>PWI1cYyLs{X0kn$M`LO2c zb!Et-bz!5k&f}{rU%eA|4KDI#qBX>_JYi>JO%S^qEK2GFs$G7>!mkakVYK844&I#p z`5Pz5QIsE&SW$zXj8iaDo#uwML*ZA^_!w@DDNvB%KQQ5TYesTvyVdi7fTof5$%``m z*=1;{$^Yau->GSsgCY2USS-p1WhV=rzT9?!uc*{Dw?Y(l&Aa{39$&mKRixtHWV}NR zqzyRrq8hKbn~jPjd*YCbp^NtJeS}oqhs?}s5Oh*!Y<%VnKV&s$rjd`~G?hrS4RRWj z1)13uvl-$jrL$yvg9khn2nZd`aFXj++?dFnWr zyq!qG7$j)yA|d9TcQ-L;B(j%B9$31O2ireXs=;>!3=(x?jTC!yj|Cek{{GZ(7*lze#(EjeP z&dC5JcCC;=vT9|J?}ZbOm5`emT-x)&-=B-avR{$y#NnR%s)=^a+of!!Kf;7!tu3=} z;Jmk_P(Z}j?(fwkmV_QGj4oVDAK|mo8_$JF!`hCnkg459Xkj4h(l6o^_R}r$6})+^ z&SxxTxQM4Sq=Wy9!rS>z&(plQ0#|qBz0l1a@*65P08)p+hD5RnermvDJRCI9kkb>E zWA-0iD}l9YZ6$QB@eh~dEETJ?NQ`)g~&d`nin$6dQ; z>`GpN#rOi~1T6_${{11);i2TnsM*j0JiZ8B$9P9OeS=RUz@hXsvyydna?IRQ$1GG1 z{OP_~}!B!6#)?E)=fWvhIg-S1H@H5aBJ^wL*P%DUknXdLu? z*QVUEYd+#dZ>^giC zF%nBYSBAm|NxoNJ3Fu}1&Rp7$`YNOl*HO1Ngk*t=U=*FQv)o=eW%6nq2v=J3LwEtS zOL~Lya+>C{!wA$AoPL+W1%5D}N;}vTCiQ<+J~;7H{Sap&kWG4p@qT+h#m9?QQ-gb1 zHwQ4R#W%A7tPo8+)N#!<2iZ0dx^e1#UZdn2%$pqPMP#DiPA4WcJ*(%Vy~h9j5lg3M zO8B+W<;JCb&UaT;rP+`iywi9pX|o@p^~NZ5Ti9pIwIk}{`V!cT`URtDmGfw0)vaP~ z5uo5m^ejAC=B>mQ;KLvHfhkKMX6Tg>pk1F$C|YP9(z{D8YTr9TH zz`#^Nk`&#n@!eX4KbMD2Ce{g#HwcCC2y4urs`3Hm68lu_@zQt66h3|K0juS$W7Zxd z!CzHO90n)svd=Vt##`TR3+?e%2&p+AN5-6%gEMGphX@V0CmPF(Dq^)mV}lYa8!5;s zU+rZz$PFu`QbF~h&}QygO4xtM`DktjgAhm#Z4Y8zDWEV!$~r<;p^S+@_!swNi2ky|uGJ*gpM&@IxiH-g_!GPP>mIoz(T_8QP;lTG zq0r*^lcBuw)!XNf*qA^|=~qyLk;CzAI?uLk_li*0G@8sRcpC^UG>`ga_ZaiKM^3b*(ydiZ85pm~J0} z6o&G2;2pX?jK?@K)MYqg{rBB2=ghkklrY5sgP8(oM?el5CE6U%92IZNU7YwcmGVl_ z4z&i%1p3Yp!9C)PRD720S|B&_n6SosMM>&M=MQX$;7{YOnR819k(@lUM{xOvnkOpN zPqH(K`Bk@31X){a<_gfaQFf(A{2!ex?bG5GZr->8b0|tbxBg6ZHP?FG1^4^4?Ev`C z4rxheQy26y4hfPsngbiP16`Vs*%|kS?)p<_X`efdsmL@!vEGjB(X7YaN9V_PDZx>(s4hK50hr)%BIzkG)TdjvG9X+WYeky%g$vMl)v~69aU4&C9Z>+b25u&wzDM2TS=lCY^Qv1$Win^q-DLbE8T zDGqXvP%LV5|H4FJN)9EGZ7|mA;&IOUnx;zqVAzuTALoIE7r?BSW_)UL@#IWc7L;9W ziYM#cio1ynPF~sX!OvTX(swb%yaVniUlVkpB6a^_C;Nq$!j5WPUhN=GI(1{C4|QF$ zj>%~ge+wICR;F9PA$-+Gp2*J)ZAsFGY}kbfXRuU$<0V32{afZ3Jl--p!7&5`0_kD# zQ`FK&(v8m@Z9z%rb79e5#=fTCJD49f@$}ZCTtwz(7x?Fk$zw4FTqQvH*02H_CPOqS z8|_nG8N@Cpw4F1Aw4{ML%@lgg->RUfT6u?r=6%kG{q|C*&E=v65ng)w7QSZ^HP(S4 z8ypyOW{6ko-knkE^qSy0CB&xN|3Yh(74miSva5Y6C{ZeoCrWq@y;qzPTiX|N-IigW zCbpU8!(7TNoO~L-%u&vZ=Q=BH03ZCZZpz>5nx&~VlY#bfeHnOtYCr18qFdx)ZQbl# z^X7*(t-`Rj}OxldM=DB?b0GFWPL_~+D13S7RlwEEQP_ z(9#l(c*SW#D}zroFe-Qb=0>DMadEMkPCg-^DXrNB4zgaPC z`-Fa;2e`Xh#O`1vMajK33&MTaInkRY5~B40Ix#MPz8n?tY46a9^tk1h7iO8tYJHb( zvR?ep*72uxl<2Omp1*g^fLIaloCVSM5kx$`A#pl0iV1sAce2j(&fKrjN9okJXFF6h z6JkLQ%1RCe`XaS^xtd!8#v;$b0yvE#UEt3Uu?X8TcE#etAWMgc6W|>i zUK7#+{NX@Hor2%x&W&EV$z+SYS5}nV>UQL*fR~l~7zKWPX86IqN20c_8bt2S^xmtS@R%X|c3i7B%b1O$ zv-mLO0?x1)p0x??6_MULz5RZy+T*qLq~s)v&XpWL_vehY_L3|In2Y70|0x`&S9)1> zqa<}9skkfS84H~L@B{eok`w*_LB8~-Y@ue ze*JdbTBs42xo*lif*($zFVppgGCLd=bNdIz&hHO4)STM(Xccf`IA2M!<`=sho48Yg zG;DgD+!1KZIX|*$Dm2d2ky%ufvzc&?p+_XTh)588PtT!aY~kUVOE;}ZxmW)nQrpi@ z{NeA8{g_wG83n}lqBFH{g+)U?1M&DXD;pLo5~X(v7C6`K)jbqE7=!nB_YIDrw%>p> z!Fv(f2E*dLZI1KEih3^!{=inrlB0*c_L@9>`TwK2w+w1C?%I86p#_Q;w*;q!;;t#B zc!A;$r9dfO+@U}V#jUuz6I_Bjh2rjn;F_Sp(w%poIWv3C>@)kr{_wn?GLy;7on(@G z{nxdw>$jY$ms{cl&3yJSX}|AVt@LR1SM=Prf-I1v1L>556WHG2+eTh7^9&2bjL;#O zH{RQM%yj33+UK0m=eLTMEWBb^bj1F4Rd7&*yFaCASU(N@=<<|W*VZE;3YQlgzaV_$VuU50OXexV4HPjwX{hvyi^=ZEg54o(Ae7OL6W%4nSk z4Gs)hK3K^;|G=#{WCj*GK~XGR5=BcB(q!lC7#_`+7N5=;u`1Dt1Gl1Ud#-!>o^p<~ zJ3&WxAjwAW92)gq=t%mHHV}92M+*$M;boi!2J94{7ljMliw$|rgs%^3N=u*n&Pt0f zRJ!NcFfaS(==@xAtl_Q1coLW*J6(2wPT4)XGqpibt0iQ+wZt+~7VG=CE+ERK`4+g` zPu_9Kug@B`Hp`{r`%UBTbf6m6yPG9IOIth*4{G%;xaaxFW_c^IM`rTKdEGFzMk|x0 zjv)0KuBe5HuDTm(5c)?RNi7EK8@U1pAZDJ;97BlR@xHmD9@RB2B|&oL=)<<$vZEM3 zY1H+q-J}DTg;QsH`~>;#ygHqXz6D+V(raGW#dt75Qz2=V;6dHumh<5n6m)W}m`8k58XBq_zstajK)LQMAG zRX(9!?hBUU2qZx|u9!BHcK2w<#^3jDtT98n2dTah>#fG7^|ujRvYOr* z)Ybkn$QM0(GN~t-Aa+GWcvxq&st{aaAD;t(%?3uhg_p_tFew@o*URjRU-2b&V|ikN z8{Gp0r`)Ps#tJR2eWNgN$34KG69}Dev=uA~ z*Ky3vO!RboyBg(_L_gHLW8{-`f&9|bh-Y!VMjpDE*ZDQJR;qsR^}%N~(*EU_w_DWf zqPq;Kjx`Ed$FTaqY`cWSlRKev!3g+=R7YP7`%+Qiv*_cM|GrW@0y5 z1FIdBbIaC^-ZH@*NW6{j#lutWYL8qnKROyx&M^C&Xy?-P{lQE)(c>;F_)X2Q@S%^Z zOI_Y!x7$I^KMY-4Cjin+X=Zw3h~{|~MI+Q8Ltv?m*nuj_!D5zMePrk~o9MGww3hO0 zyM#;gwd0H-CPd-~oyF9U#feEQI#5hS&u!pX1y#us-X@z9TzC@yJBk7W5#@nS6D#Xj zsdh;{^lGTm=3sQbvNgpEo)ao{r0q3~I-}F9#}+<+eVdBm0$SD->oFg9y_(A!>)0vO z^GH;XBxUg0j&9~GqsBtd+DVY{n;AU#8~R>t@(KSiKEj{vjQnvXsN7ciG8966d8rF4 zo_3A8%BkNNbcNz|9cNjcS;0-_R{E^{B^4-QGlSalsF+=1!dN`35TfoTzJ|W20Mo8C z!9$l$gFrJlQSE-Q(HMC@$plvT8_id4ZuS+gsj*0AwT_0xgZ~p+8v2?q#8L6ZN6SL< z@fFJoo)+%ZF<&jI@j-c~INJcb&9h}vC}G|vy%S$p>(puLV=z2MA&^5|0kg|__!N8N zDh1t697wZIIyR^}PH|UOYuW!=Qz*b(3fd-_oSP}*(9{a4mz}CMu%8&Y(T$D}?V*<` z=4{ujtd(HS!>=rPrnoP2Y&YL2<;Ol307QOY8KK!z&rCG;ZGLJ6>|Xm3(sDNIJo6_@ zIiZqQ!NSbo$Dk}ZUe)~3-M+W`zBvE6uRs$r5XNQHXLu~lI>{|PT56ccI{TtkiTLpb zNBW#D;GA#f49oyK=Hk?xl;-o2w7Ub0I(%M3Lzg_CBE-<&{Y^Y1lwJW{g5iRiqfU~p zJ4 zxHAFM*=wq$b6UoAQuC+l{uE~#>6}!k8Oe9F!`J8gw5%x$QQMy53O)!`+e6%|wk587 z;&(Gm!`}ycvQtmY^!uFi{B+?F$dbPIGNrOXp0TBjX!iJK<(vrauuK?gbYC*T@yRBr#2yX)N$WL>2PACo0}$`G>)1+J~Tc zmrUbGC{S)h^x)IJa;@BOeo0_^WPP{N@OE*~BX9VcAzRJ|*uVP^X z+knaSp`ViF+0qW*F=mu=ul7JF$W;fcfw}2pI5|vUG>3k$2tA2VO`~#{pp7l^rv2}@+C?3{Y=plIOu+!A8ST)YvYKrGVR9l|hTtSGm zj*9bQaDU!t)sb>f^P16Yz2Mu6y>F+Sq(*qx*U8cpAAwZ+irXIr4V9n?6JciJ0!dh# z@!50J#yE{tjFL@bz5PI{K{HX5PH(|?dA%Yx@n>U$IsTo1Pnnq1&Pmv{cQJCfKjMWG zU1kiWQ>1$Y-#6gHa;_5*hf;^Mb}%Pz`hFL(uYX>-xMr`T=0FjZ)6|KYGdJE`(PuL+ z1Fw$Q6pSJ@I1;QT{yxK3(VBJBbqEk_Gs%7X-dTp!4?4UZzxrglYHe}N=BBJ{C4{v> zE%`&oOgwA!AX52RYhwquJ%LLh%3JMB~{4%cZV!k=Gy6^^LH zwkt|e`RK5_&>0FjT2nqZ_#1LO@vE8NuTtHfa3k%&cp~Oa`fg9>0&$iM@JnlS5Fg;s zc~&p~5Mmx*RoQ^-566A&Som#XZK9@9WCk`39*>$_QT-|_c_Hnh56hN5m4aLq&-G`; zQZ~2Dx)CT@zJ;r`u<$}>?>))ETN{*Fw$pejUfT`7pr;l@ziqJPF&|J#%?L_)$Rdl4 z^c<%2y>C{}NEy&Aez|@98u!GScU2zo=li!lYV17nj2T%g>r$8mU7l;RBtBxmX!=T` zO8kJEi;Zu%17{!Yt+v`ru<74?jzxDpAtdtZ`s^8URCWG%XXXkkRH8MAu(H6u3wBva zM21w}Q|P2A2}`<;F$EN?@|0eK`IHQW38Qqv7(#*xe29KXGpRZeH_VYKV=S{sZu`(Q zvfKzb+iAN2o*?{uzP7~p>azVa6zk?M9xr7FYX2hwZk*$ ze3d6%59|?U&m`lmWX`oOa?NTphXfQPRAto& z!cA*BNG~j~Gr}AulweaMx>1+nJpNj!WMRPU?)Ht^Kurca?|GMKr{IHNVvpy?Bk?z5 zrAR#u`^9z4mVR~V4~2om^hAg!hd6+|dk#MzajfKZTtw26xNJ>K?;RRq7yHgfeh=lH zJ%kL%5*hde(*-QYfWbKr0H|_B1~H>343Q$U1; zaW~Mr%%Z6vJW~bcHzq`1=wmOz-vdPbc;+QBw?t;nK91q1`Em{zv(8%Fio!S_afI&p zjL-VjpYL~y!T;V-G(SgL-sUF-&dV_D@B5P6MTPWKy_(OWF6%iADjkumTYP{pQ)7L) zpQ++zuSfT_%eoQzE9itH_QUm=X%He7I@q{rMmkn>sNv{nx(=lzSsPed*r+wlMPc2- z@M-S;a&u6Xdm3FSq!>n(j!Za)75cqFT$gNS`G82hyysud;FapvlMugK4f%)hK}izu z;X@$A`)=B5DuCJRGY_?w+(TO`vb9gfO@q$Xx~7g zE3YtLlSc;FfvKPuYG%N!p8k-8SuaL#q)?oIhv5U|o8^>{GWD zDP8Jf`M8SZPw~y!wcCiCw&BZaRvX(0&zLBfBRl&R0VL&xo_73OV4L|xrr#RpvgA&4 zqqpVf3`%F79#Oh;@r4O#o>|Kp1le-B%(nwT{yB%5r~C%rsgyqlsun?M*alylYHkdk zp8tq|4}@c5VgOQycdNJR#pvZdX5FJ@bzNSJxlFWVYd=R5zxGT&tO{U07|`uStjk;n z;(jnfOuM^wLD!M5 zJ;ceyIDGeJm@2(|4j6^2A8MsdaW-SxQSOuLf0(@D-O`eQ^|rhY3Z_&q#b1hFs4bKF z3QUYcgSCkqE{vl1L?3OlW?l8yRIvKEFmLTaKtm(nA2B=h`NLWx z*)AL!_NSY#-9In;uU665GX|!*0KvC+dh~dIEc_6PID1&Y$@%2OH&Z55mb$*ew_9(P zUWiB0RBcJ!h&Z@1;S>(bo1#Y~#eWRH>UKnNR$DH&3=c62uHcn%Ra4x()O`O*W6Pm3 zdNG1|+kAzY&N?wYSThv*J`PG|9`P-p%TNyZ(T@i~-W)EtL{3}`cA_bq;)gl<5c}hf zIU>XQ;@6i5xN*YLw;P)Ad9^RurM|hE@gms=MAqr%3TH1LWk(ZUUBA&P$sz(Ti(eIQCFJX_rg?T*JllpZjq$l893u_)n0TV71W>222<(CcpRpQAc2;1l? zF#~5DG4dd~zO`U~U7IC>gY()0H`A_2g&V1Cioavxvo?iZ-RXTlOm@Lb<5^nT)f0`5 z9qZZ4d5aD;9_8gm){acj%8$`TSHAvLN9Il9QWiZlBUDtDRy~DZ*65KH78T=7{b)y( zKqxTwWvb5ejrzBXrduPf?*cKs`79xcciJq_))GgoZ{CH>u5S?p*C`BqVxJ0j{@gc~ zfub7iYOz;XNpT{{N220vl(>6r?rCW6giX{&%K?mr(Ju+wAbwDQuV42;Zw7>QW*mtU z3yuJe$ha8Eu)x#H9*`%4TMtnEDb6r>d?Nxx=GFy3S~jkyl^PyhNCI4j_%rB=JryGY zK85!H#7kpaOYJKjAjE6_y@~r*R3_V3z_qhx`darZAE}3%doNQm+Xs!9iej{*r*S@c+hB0dmP;$5hrr~p_aF!icW5LN+pXlnDj2wDd znXf5sMjWA7k<9w=*k6v9Rl1Ws-i|JZ?S;R56vH4n7sE^~gXC9UesYpJ(pDD=DZ0N) zNB&;LhJZ+gfMJkjbbiD)iw2rZdyi{5zTPX$-YKv%>=PRgc`BVZe=L|o{*~8jr6-Yf zu4n`(%+(blf9OLp8G?4|ZdOR7*%x2r;Xr>E)(-P0-E3|e_Ex)|-MhL}*{H)?j?asw& zZ6_Q@eRA{C+%c5_71kv?ycaX&I8P`I>g*Fng*LMb>)nh~kd&?;YFICyR|-8G&wfa!_-a4vQfZ(LSV4pmf32!v`KJK)=uDGx0e@%`}mL;q}K_0x)elL^4-GH zKNOlwezD+Wd;95#X|II*sF__!9d890qE#a>WO<0$9q9dp{mcU<3MQ#b8EtuQ|MQd1 zcj-nnZWsS##sr>Rkgs;glKnh(HsLuYP|aEA=@;iN^5Z-Q(-q^!QG>(lQGQ|J9SA_m zhX&?RPSRQ*KQ8C9@vEJ-($J4Rp-=1FvUPe_U`3n{)CTentnwxcXC^mKc(MIy54)v^ zMYMxJbSM5YA#Mz!BEM1Vy#@>%NioJST3&sp?HzuxnUi`AN;%}Hj&^$^B;i}!^LE7& z%bLSyzNsy|k+w~YD?dD5a#6CALQXQ|>Odv;F3owE{`pJ;j1F)G%&aAD(;t2^ddlH_ zqCN1(6r<0xY?NgfXQyp?)#}$nS%SpZZ7Wuk$q1G8QO^VCB#H)^Y=&=FD^%Hq;BL`T z8O}@PRT79^H~Iu_Ia+w$-rbL1ZqjdjzBp!F+t#K7X;=AGP3x4xuk1;w$(QMgN$=~d zDuG*YeB|IVqg}s7&~N{=)QS!r9R%YclXBOQo?3}|Z9zp1t-l*wpFJc019Q2?^0<27 z>qR;Z=&b{rf*e2p9^m<#fW7)6Mid+JsE`L%nfH?^M`rZ0jmw4THnl|4knM^kUGx#G z^-yhR?v{B|cM1F{naR+c4gB^&SPscOWP5k#8xWYxR`29sCz9wSnpwseaXD_MqBmO& zll=_;gRi`CSOny6k=%PgSIH4bl((4;evv_qM|RFn6(KoFM*XK^mxbJUF_Z5SyC;<6 z=hB5NqC1{U9O(2W+`rw+1r!%r{URIX$em!X8T0k*;d!Ry=}Nc2*}?48P8lk8a)}C5 z-t44Cn(pb$O_?&sb#r=RwmyF2Jfw|$B!yb{Rm74UD(7((;5p%l+U!Vj@W3_>ZIk9# z;?|b_227igFeBYJ8{vcDyz0bIh`PJRTSZ0n57%qvVk z<8NDgTpQtVS8wEgIqx$$Xces{g0Rgh--cq$HPD~G4@>3YgTFtGp+6bW_K`UFRqjv5P{Ej2vm8wL z9N&2{=)YHkHYdIdZiJ$+>ft9bOKcju>#IQ_&SIFZj}lK7pO|EMiLPq(YeSaoJ*Gg-fTt^48EL)KbrINKytq))CT2kdt&=Z zGkJMm^r7fjsb*tYx}dRR^_m8&f2=wA2NMREZe3;ASJNcQP@iICFk(Oi#HAeV_k&Ji+}fiFzq}2F|%PaMt&z@lr2G z3*K3H&&{>5`)zSACfFU2`m%KR_NPC|)(NKitXt}X7Brl3_R>L~;keY3rPOT4q_(~xE6l0^TawR1}g$>iAe>Z+g}vJy;(O;qzI7ciqX7ul)D7Vr5c`uGs+xD zS{{=CM&#c25w>5!YrSmDcgBD}v%aOH@AFJ(H=&m79MfEt&dxLo+WShwc3Oq+?H$whH|^v z$epxFji+!1oLpZJ4{<1bmWUn7tM;Fp_;5Cdt@Mv?c~U=y#BMXAk#s&nziQ{z5v3vaSdBE`uNFc9wqJaElOqlI$uoz1S+Ao{8^ zZu7K0X8xS^u<{%Yy#}r?D*mQp)g?r>wYMKiqD$48SGC!q>5sJ#^!Yt*Gw%*qG+&PF z-~WCj_#(%sOD!~i)Wk3AS!N^9O+1KluXxqVPZA#sMlMi1h+#`=+V(|41PkKLf&+fX zl5yfG&S2S}{{SeImh%nk9n4p~iDde;Jxy&-P4lX1Y~)w$cq@q8dDTOx-lE$0;Ma9R zMgPZLHr;NmRgzTzPPLEX$=H7Ax?jxGwkUwl9->G)Y0oPzEz|Nz8v|?xUgAq?Ihwv( z!Cl7K(&Ea}zmt`bcw#`nCY`pM-hDRYEF%xdz5AT_`lSN%vp9J@JD$IV)n8AFuW{Txz^s6~@h10901kmhZwiumRjZkNAfX`7=4~H2^T3I`pL=NZ`^& zeIfVyZlMA-4|-`aDJTO!>sw$jU6ZHPN*4&BQz*2UY(|A#fq#FbxrB=bSf8+-^HxZ3 zYfH)b*WQyqu%f!B6#5A~RvgPp2b$F)&(v%p>aO{2|6#=I`*_}@q5;NU z)}Q_x0LP!~x6nQdprQF`B-BA*9kJTjw)GV3<>bl-ln6 z>9mnS)i&P*R%GbUp^yF@1Odehaj3}+94I#4bHj2NKfH=Q8)8x#R+R*JRN`taC0yAV2yU;@}B}Rk@HZ;hu5X9 z7XIU-ewmKc_hs4CfkE{vLYtqzo%gA$rY%vISNw&d7`)^I3Cz4F6S-5w*l@q!=N#v# z`Fh+D+u^CU{1&XBCHp4Ah`v!nkV%^vzP{cDpN-Zi;EuPvZ-=1^P4WR*5SrVtfle|A zytRY4>ucqg#Xpg0sMO=@y*KdJ~Pk5(L?$8-Uj=IUWX zSpZB(or`l#n#mIqbQWFU9gWpEtFI#j-E^Nm z(do&;)&#$ra?A<-c~ijW-3H@~|0!8UcL$tqJ+KTPNrpr7aLpUqvFwk zUYf3A(z1lR$tQNd8mw2tFfUipM-n$dDsj^9<&bAIdk35TWo_Q}T zLG9=7k02U!J)EiM`u%>$is&nB!q_LfE6EMI?`v~@X_TgHT>hx0r!&hV4tR+%oGg<(87E~$8 zSF|&|rlKxJWwYyODtjd*g@M`VuB~Cl`C3eP{rFO|t_~d_j{8rE%}@V7A~zA~V*!ew z52ixxCzES52zk)h(yw{C!2opohtY&ByODRS(3{OL%|7F3VkkzUGr|vvo2uEYz?_VD z)B`_%ERx0>*vc@9CG&EeQmZM;7?q=<9KlAfg;9Nr_JTv)2i&22E`4f8+Baqk8rmf^ zQ#;9z)Nmt04kPb8VyWmu!DP**UA!BppT%Ewzi$fibbx-71;IaV_rWh}qY|DlKT~&S zt|d>E^A|eUvN5qu+iB#`tX~7lq5f{r5C*XT@llK>tb^e$7}M^;_La6?I;(--v!8(6 zcGR0I{XW12iH*h_oQam*B6HFVo_~0M>5eMsQkOL&fynM;38VCP>%P^o#L@3AEy=v; z5LguV94dX@nednYaI-=v0an7__kwuS}l7n6Im}nm6@vr^|M}>^aaxO$t-`HjD)xZwdcw4~_STacvdn z+Y2%6LGbjHeKDOz7&P4KH&Ej6f3jHh1^n>5+iK_8k}ui%)!#`!|8(?gk0B-&2T8Y> zCJyyU&)LRbb(=}v4ENoOO}1aok*`h6{qBbD`;FN*P}cV0AV-r^6F+y;e@8~Q); z;>azBWgm6LPdyrGIH$`_bQyK6eJ652q2ADS2^M#7li_+->ms(-Wc(dC zBoxcnNh2?*ipFNjVm8GDO;9z>^)|xbYVM#0VS@aJk*wIdWduR9moEdz3DF9PIz_r4+GHdgx%-# zgn&ogoo2U)TJbk9okdFj{-!+2$d=Osefk|r3YZIg`46L!=N|?XXYv%ZW$<<5K&|A_ z^$vJ(VEX(SXWJ;}C}&FiVm+T2OLlRSA1Sm-Z(#lP%!62d&z_mt2j(abjk&B2a(N{* z5k2@P)nv(SW@2K7l=`(QQZsC@b^|DpJj!tFVD#S_--a`_Dv^Igp2l09huJsr7N2l#W?>x0$3vp|NHOHj;TPZh z5#8p-{YTr}|6OZ+yK$X~UYFFo&I=q#|HLG!nU>8;*^c5+Wakzmsa@ zj)g;2L*)khoBe+nvRerpUzeA+{@UDZS4u?6e&aV>iuLn+7XW`yU{1SokT$}Lj`EaW z9b(w;d$27u)l1LzxS)V`nbS7yWm-qUr0fpZX}r?WXo)f7*%Ipl>9WUk6mN0kQ$G%5 z3V#MXUy2{4i_fhcn}p}~g_+g}In-sExTP1Yn%*udom$J%LN_~o z%5Kr6py*qJPAnRIl@f!T?K2`{axK7A=+-rFGqzsj8qhp|Cibfck#nr`27d2Z{S$YY!`(EL7X)505g92`*Gx<;f1X`h>V2jnw$ zTx}gB0>#?ifj4hL=BL*j9d$kibu7k^(&cmqf^zdYmTMCCqu1D^n4xGJd$rJ-mi3Ukbj{Y$Xif#I3AILB+-K7=_$gdA?)Ke_>!Hh^ zKDm&jx{ykSqA*V~B{b@C)FEHLXk_QYLIL?@kZnu%voq62LpKE38N@n^S~;_FqPFvi zpKcwpApZ~iXzS$=QAAY%UtuCf{_WdsG{aP8HfZ6D@G1wkfxo)Ha8ziUVDD%#BSig{ zc^Ow-7Bz}?-t4rTS$DPv?{NPN1v@Zx{M^^qpIMqC$bMVcl6`lPPavI@qdXN!uLM)gru{>>K*{ zN%0Ds;>&(^?Ukst&=bl`kgpuv$(L1ou~zZy&d_|6HB^1`$vK7+%VDpi$rcozjSp$a zYT(jT2!+az320aZZ@PtQ%`hYNABnJIMd3G*4=T_=;=nJ5nm|^d)j&tDqYgbD*f|E) zD6yDaZLsjhoj^dVab|r*E%=&YXgr35_5&?a5tEJ(hNv|0VJ5%-z;%MBocG@ER9*__ zru-iUNu$5!*#Q3^p?ejY%@slK7sQtXZe6&3V*XqHO72`rg$eVk_%Fp=)Tyqx&?3w1 z`f1;i@o50Q7vow%XKUqXgf1XX2{GqLy>YhR?!D~Ad+ zJUJ605P|Lmowlo#d)sWYpIQL>k-g>jgc#rm_bM$N#718gq1_|eN0%P32z zLQQp)6sxB31oZu%C8G+lzb}>8S+bSROtAaTa1T3$5CJ*RECAPyXWb8cd0m#nX_0%5 zR`&BV6SF}lOr&RT{8yTs&_<)tHu}$N+r;bnm2iIY@y)_b`abGChK0Gn+MC`$UJwK1iJtl7!A|4sMmt%N z&*4gsDdnQ7${Ue*)52-rH|6*4yFWb*2&)CKLLC(PiH|gnAoR!AcY|4V`g^e<+=P=< z*?5^hsi8f~-pn8?KM+DX9I*hsRasi30pzvyQQnw^6EehJ~SK0HB_$XEs!{{{J>^Hs@!tnF)VFVQRn$=$la8>Ym>PZ3^~F^7xhSq!icytU!Oxj@<019U6?}g{hU;Kb@?Y0i+)YOG4SE01JSlbZe|OmZ@AMo;XOWdn znZCMtpcDOARWH>}gxm-uJ2#?M4#N+0ukb*b(wmZFU#pk#K5MwXRkE=jcx%CUDn;8h z>v~bO*51@ifVHptUX-az@2ZNw&tSURtwVEOqCz6|ud6J>NL|jwLM=E9^c5W9X-YEt zFf1}wG(L1p`NO3IocJ0AKlY7La5hcGq}!K9qkvN$FvTzZ>mbN35R!eOkAA?j3;#jR zzr<@s1wqibv+X%A5Y8U41Yekf5&e{;Zil`kz>Tx%8WDQeS#^El;6%aLor>i9)(P2hDTRO}xJbVl zi7ko^5mQ@sxDf1Z4RPqD#{I$ZvXpf0?Y{rTdfi#0s`9m%Iiw4c{`$+swi4@`DmK3M zkOzI3P|Y1%yz8dre8bxNX!&UkiUM=KC%-;>sFIv^JfWAV7N^n)OA%Z<%d0$et-^Uw zE#JTEj4v8}o|;V4(Hv^Zm3S3h?$Fp$~$ z;L&`;f=SSD5lmDqrFAWX)It}D3H0&|D8oEgGcr&v-ehiQ)YW;8=|-bZFbA`4u>I4)EQ9pxa5CQx5z=OGIwZozY53I_xK#Rc(FAO zhHVh8eieW07#l;y(>y81V&!I*d=+>7I}p}wT`F`oH|oa+CkhRq_i_;A!C#E@a-p%w zJWYloqR&NK?+Cl~v`hug|I2at-?!HMuQkvB#WLl#LA>8AE)BL#(e->?r?_&-aLsUz zvrRLZ|6LmUF*ktN7CVud?xQR7Ho35&0wO0_*h|trke*r!^{?>Rq(^Luv68I6qo4^Q)k$WwV z%mdAaM0w^HDaFFQ*wp)kxL26;oCg{MWFJe|pHW;I5!$$ltfI>SE?PMLzuN2v`nU8y E08z>P0{{R3 literal 0 HcmV?d00001 diff --git a/index.rst b/index.rst index 68e6f7097..8b7fd52bb 100644 --- a/index.rst +++ b/index.rst @@ -293,7 +293,7 @@ Display Components ST7789V, components/display/st7789v, st7789v.jpg ILI9341, components/display/ili9341, ili9341.jpg Waveshare E-Paper, components/display/waveshare_epaper, waveshare_epaper.jpg - Inkplate 6, components/display/Inkplate, Inkplate.jpg + Inkplate 6, components/display/inkplate, inkplate.jpg PCD8544 (Nokia 5110/ 3310), components/display/pcd8544, pcd8544.jpg Cover Components @@ -320,7 +320,6 @@ Text Sensor Components BLE Scanner, components/text_sensor/ble_scanner, bluetooth.svg Template Text Sensor, components/text_sensor/template, description.svg Custom Text Sensor, components/text_sensor/custom, language-cpp.svg - Custom UART Text Sensor, components/text_sensor/uart, language-cpp.svg Climate Components ------------------ @@ -412,6 +411,7 @@ Cookbook Sonoff light switch options, cookbook/sonoff-light-switch, light_switch.png ESP32 Water Leak Detector, cookbook/leak-detector-m5stickC, leak-detector-m5stickC_main_index.jpg IAQ (Indoor Air Quality) Board, cookbook/iaq_board, iaq_board2.jpg + Custom UART Text Sensor, cookbook/uart_text_sensor, language-cpp.svg Do you have other awesome automations or cool setups? Please feel free to add them to the documentation for others to copy. See :doc:`Contributing `.