From db5b1de530fa5536601e7f7c82c42d4da03a58b5 Mon Sep 17 00:00:00 2001 From: eagleco <39813792+eagleco@users.noreply.github.com> Date: Wed, 17 Apr 2024 22:04:42 -0700 Subject: [PATCH 01/34] Update status_led.rst (#3768) Include note about status led blinking slowly when native API is included in configuration but no api client is connected. --- components/status_led.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/components/status_led.rst b/components/status_led.rst index 28af3bd75..26d9e2fdc 100644 --- a/components/status_led.rst +++ b/components/status_led.rst @@ -9,7 +9,8 @@ The ``status_led`` hooks into all ESPHome components and can indicate the status the device. Specifically, it will: - Blink slowly (about every second) when a **warning** is active. Warnings are active when for - example reading a sensor value fails temporarily or the WiFi/MQTT connections are disrupted. + example reading a sensor value fails temporarily, the WiFi/MQTT connections are disrupted, or + if the native API component is included but no client is connected. - Blink quickly (multiple times per second) when an **error** is active. Errors indicate that ESPHome has found an error while setting up. In most cases, ESPHome will still try to recover from the error and continue with all other operations. From 960d40a559ce63066ea545afeb4d0b8406f93b03 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 23 Apr 2024 10:50:42 +1200 Subject: [PATCH 02/34] Bump version to 2024.4.1 --- Doxygen | 2 +- Makefile | 2 +- _static/version | 2 +- conf.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Doxygen b/Doxygen index 5919da5be..3179fed5c 100644 --- a/Doxygen +++ b/Doxygen @@ -38,7 +38,7 @@ PROJECT_NAME = "ESPHome" # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = 2024.4.0 +PROJECT_NUMBER = 2024.4.1 # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a diff --git a/Makefile b/Makefile index a9de01bb5..fd31de088 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ ESPHOME_PATH = ../esphome -ESPHOME_REF = 2024.4.0 +ESPHOME_REF = 2024.4.1 .PHONY: html html-strict cleanhtml deploy help live-html Makefile netlify netlify-api api netlify-dependencies svg2png copy-svg2png minify diff --git a/_static/version b/_static/version index d6d6d28db..f38c6ceaf 100644 --- a/_static/version +++ b/_static/version @@ -1 +1 @@ -2024.4.0 \ No newline at end of file +2024.4.1 \ No newline at end of file diff --git a/conf.py b/conf.py index d469d628a..66d1ff697 100644 --- a/conf.py +++ b/conf.py @@ -69,7 +69,7 @@ author = "ESPHome" # The short X.Y version. version = "2024.4" # The full version, including alpha/beta/rc tags. -release = "2024.4.0" +release = "2024.4.1" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 3fb31e4d2d946e6bb3c5c3267178cc0790b43bc1 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 23 Apr 2024 10:51:48 +1200 Subject: [PATCH 03/34] Update changelog for 2024.4.1 --- changelog/2024.4.0.rst | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/changelog/2024.4.0.rst b/changelog/2024.4.0.rst index 81da40897..89284d8cb 100644 --- a/changelog/2024.4.0.rst +++ b/changelog/2024.4.0.rst @@ -38,6 +38,18 @@ use that route instead. This is more reliable because the ESPHome API uses a TCP your audio will also be encrypted in transit. +Release 2024.4.1 - April 23 +--------------------------- + +- [Tuya Climate] Fix compilation error caused by codegen :esphomepr:`6568` by :ghuser:`zry98` +- wifi: fix reconnect issue due to enablement of fast connect :esphomepr:`6598` by :ghuser:`jpeletier` +- Calibrate Beken internal temperature :esphomepr:`6599` by :ghuser:`Mat931` +- fix streaming logs from MQTT for ESP32 devices using TLS :esphomepr:`6605` by :ghuser:`ccutrer` +- Disallow variant/family override for known boards :esphomepr:`6512` by :ghuser:`clydebarrow` +- esp32_ble: Consider ESP_BT_STATUS_DONE a successful state :esphomepr:`6493` by :ghuser:`polyfloyd` +- Fix or filter :esphomepr:`6574` by :ghuser:`swoboda1337` + + Full list of changes -------------------- From 31234fada177f6c119e13038a7075ce401f86713 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 23 Apr 2024 10:52:22 +1200 Subject: [PATCH 04/34] Update supporters for 2024.4.1 --- guides/supporters.rst | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/guides/supporters.rst b/guides/supporters.rst index 0027f01fe..9b6111b73 100644 --- a/guides/supporters.rst +++ b/guides/supporters.rst @@ -484,10 +484,8 @@ Contributors - `f0rdprefect (@f0rdprefect) `__ - `Fabian Affolter (@fabaff) `__ - `Fabian (@Fabian-Schmidt) `__ -- `Fabian Muehlberger (@fabianmuehlberger) `__ - `C W (@fake-name) `__ - `Fabian Bläse (@fblaese) `__ -- `Fabian Berthold (@fbrthld) `__ - `F.D.Castel (@fdcastel) `__ - `Sun Xiangyu (@feizi) `__ - `felixlungu (@felixlungu) `__ @@ -584,6 +582,7 @@ Contributors - `Ha Thach (@hathach) `__ - `Cong Hoang Nguyen (@HcNguyen111) `__ - `hcoohb (@hcoohb) `__ +- `helgek (@helgek) `__ - `hellotomtom (@hellotomtom) `__ - `Jimmy Hedman (@HeMan) `__ - `Hemi03 (@Hemi03) `__ @@ -852,6 +851,7 @@ Contributors - `Merlin Schumacher (@merlinschumacher) `__ - `Martin Flasskamp (@MFlasskamp) `__ - `Michael Hoffmann (@mghoffmann) `__ +- `Michaël Guay-Lambert (@mguaylam) `__ - `Marcel Hetzendorfer (@mhetzi) `__ - `M Hightower (@mhightower83) `__ - `Michael Muré (@MichaelMure) `__ @@ -943,6 +943,7 @@ Contributors - `nldroid (@nldroid) `__ - `Niccolò Maggioni (@nmaggioni) `__ - `nmeachen (@nmeachen) `__ +- `David Friedland (@nohat) `__ - `Álvaro Fernández Rojas (@Noltari) `__ - `Łukasz Śliwiński (@nonameplum) `__ - `JJ (@notjj) `__ @@ -1003,6 +1004,7 @@ Contributors - `Peter Galantha (@peterg79) `__ - `Peter Polacek (@PeterPolacek) `__ - `Peter Kieser (@pfak) `__ +- `Lee (@phatone007) `__ - `Philippe Delodder (@phdelodder) `__ - `Philipp Helo Rehs (@Phhere) `__ - `philbowers (@philbowers) `__ @@ -1091,12 +1093,14 @@ Contributors - `Jérôme W. (@RomRider) `__ - `roscoegray (@roscoegray) `__ - `rotarykite (@rotarykite) `__ +- `Roving Ronin (@Roving-Ronin) `__ - `Robert Paskowitz (@rpaskowitz) `__ - `Rajan Patel (@rpatel3001) `__ - `Bob Perciaccante (@rperciaccante) `__ - `rradar (@rradar) `__ - `rspaargaren (@rspaargaren) `__ - `rsumner (@rsumner) `__ +- `Romain TORRENTE (@rtorrente) `__ - `@RubenKelevra (@RubenKelevra) `__ - `Ruben van Dijk (@RubenNL) `__ - `RubyBailey (@RubyBailey) `__ @@ -1302,6 +1306,7 @@ Contributors - `WallyCZ (@WallyCZ) `__ - `walzing (@walzing) `__ - `warpzone (@warpzone) `__ +- `Warwick Bruce Chapman (@warwickchapman) `__ - `Wauter (@Wauter) `__ - `WeekendWarrior1 (@WeekendWarrior1) `__ - `Thomas Aldrian (@Weissnix4711) `__ @@ -1345,4 +1350,4 @@ Contributors - `Christian Zufferey (@zuzu59) `__ - `Zynth-dev (@Zynth-dev) `__ -*This page was last updated April 17, 2024.* +*This page was last updated April 23, 2024.* From e10a485ef522a3b310d072bf04b78fca6c334e24 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 23 Apr 2024 14:32:37 +1200 Subject: [PATCH 05/34] Update Dockerfile (#3785) --- Dockerfile | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 78290dcf3..cd58e282f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.8-slim +FROM python:3.12-slim RUN apt-get update && apt-get install -y --no-install-recommends \ curl \ @@ -9,10 +9,24 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ software-properties-common \ && apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* -COPY requirements.txt . +RUN useradd -ms /bin/bash esphome + +USER esphome + +WORKDIR /workspaces/esphome-docs + +COPY requirements.txt ./ RUN pip3 install --no-cache-dir --no-binary :all: -r requirements.txt EXPOSE 8000 -WORKDIR /data/esphomedocs CMD ["make", "live-html"] + +LABEL \ + org.opencontainers.image.title="esphome-docs" \ + org.opencontainers.image.description="An image to help with ESPHomes documentation development" \ + org.opencontainers.image.vendor="ESPHome" \ + org.opencontainers.image.licenses="CC BY-NC-SA 4.0" \ + org.opencontainers.image.url="https://esphome.io" \ + org.opencontainers.image.source="https://github.com/esphome/esphome-docs" \ + org.opencontainers.image.documentation="https://github.com/esphome/esphome-docs/blob/current/README.md" From 6f0e2c6b191c42f7b70ba34bb609a2db1715c2d8 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 23 Apr 2024 15:12:01 +1200 Subject: [PATCH 06/34] Add fosstodon verification tag (#3786) --- _templates/layout.html | 1 + 1 file changed, 1 insertion(+) diff --git a/_templates/layout.html b/_templates/layout.html index c2d52b8ff..b11da1a47 100644 --- a/_templates/layout.html +++ b/_templates/layout.html @@ -16,6 +16,7 @@ + From b8523b89fbf3a29c32ecbec928f8d41ef402ba27 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 23 Apr 2024 16:46:47 +1200 Subject: [PATCH 07/34] Remove "Required Home Assistant XXXX.X" messages for older versions (#3788) --- components/binary_sensor/homeassistant.rst | 1 - components/binary_sensor/index.rst | 4 ++-- components/bluetooth_proxy.rst | 8 ++------ components/climate/index.rst | 4 ++-- components/cover/index.rst | 4 ++-- components/datetime/index.rst | 4 ++-- components/esp32_camera.rst | 6 +++--- components/fan/index.rst | 4 ++-- components/light/index.rst | 4 ++-- components/lock/index.rst | 4 ---- components/number/index.rst | 8 ++++---- components/select/index.rst | 4 ++-- components/sensor/homeassistant.rst | 7 +++---- components/sensor/index.rst | 4 ++-- components/switch/index.rst | 6 +++--- components/text_sensor/index.rst | 4 ++-- 16 files changed, 33 insertions(+), 43 deletions(-) diff --git a/components/binary_sensor/homeassistant.rst b/components/binary_sensor/homeassistant.rst index f98924abd..2628c5d58 100644 --- a/components/binary_sensor/homeassistant.rst +++ b/components/binary_sensor/homeassistant.rst @@ -34,7 +34,6 @@ Configuration variables: - **entity_id** (**Required**, string): The entity ID to import from Home Assistant. - **attribute** (*Optional*, string): The name of the state attribute to import from the specified entity. The entity state is used when this option is omitted. - Requires Home Assistant 2021.6 or newer. - **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation. - All other options from :ref:`Binary Sensor `. diff --git a/components/binary_sensor/index.rst b/components/binary_sensor/index.rst index 0573e2f42..7cab5120d 100644 --- a/components/binary_sensor/index.rst +++ b/components/binary_sensor/index.rst @@ -66,12 +66,12 @@ Advanced options: a ``name`` will implicitly set this to true. - **disabled_by_default** (*Optional*, boolean): If true, then this entity should not be added to any client's frontend, (usually Home Assistant) without the user manually enabling it (via the Home Assistant UI). - Requires Home Assistant 2021.9 or newer. Defaults to ``false``. + Defaults to ``false``. - **publish_initial_state** (*Optional*, boolean): If true, then the sensor will publish its initial state at boot or when HA first connects, depending on the platform. This means that any applicable triggers will be run. Defaults to ``false``. - **entity_category** (*Optional*, string): The category of the entity. See https://developers.home-assistant.io/docs/core/entity/#generic-properties - for a list of available options. Requires Home Assistant 2021.11 or newer. + for a list of available options. Set to ``""`` to remove the default entity category. - If MQTT enabled, all other options from :ref:`MQTT Component `. diff --git a/components/bluetooth_proxy.rst b/components/bluetooth_proxy.rst index b976d10be..10c38bb32 100644 --- a/components/bluetooth_proxy.rst +++ b/components/bluetooth_proxy.rst @@ -32,7 +32,7 @@ our `Bluetooth Proxy installer `__ The :doc:`web_server` component should be disabled as the device is likely to run out of memory and will malfunction when both components are enabled simultaneously. - + Not all devices are supported and ESPHome does not decode or keep a list. To find out if your device is supported, please search for it in the `Home Assistant Integrations `__ list. @@ -43,15 +43,11 @@ Configuration: bluetooth_proxy: -- **active** (*Optional*, boolean): Enables proxying active connections. Defaults to ``false``. Requires Home Assistant 2022.10 or later. +- **active** (*Optional*, boolean): Enables proxying active connections. Defaults to ``false``. - **cache_services** (*Optional*, boolean): Enables caching GATT services in NVS flash storage which significantly speeds up active connections. Defaults to ``true`` when using the ESP-IDF framework. The Bluetooth proxy depends on :doc:`esp32_ble_tracker` so make sure to add that to your configuration. -.. note:: - - Bluetooth proxy requires Home Assistant 2022.9 or later. ESPHome 2022.12.0 and Home Assistant 2022.12.6 or later is recommended. - Improving reception performance ------------------------------- diff --git a/components/climate/index.rst b/components/climate/index.rst index dde76b23b..263913e73 100644 --- a/components/climate/index.rst +++ b/components/climate/index.rst @@ -80,10 +80,10 @@ Advanced options: a ``name`` will implicitly set this to true. - **disabled_by_default** (*Optional*, boolean): If true, then this entity should not be added to any client's frontend, (usually Home Assistant) without the user manually enabling it (via the Home Assistant UI). - Requires Home Assistant 2021.9 or newer. Defaults to ``false``. + Defaults to ``false``. - **entity_category** (*Optional*, string): The category of the entity. See https://developers.home-assistant.io/docs/core/entity/#generic-properties - for a list of available options. Requires Home Assistant 2021.11 or newer. + for a list of available options. Set to ``""`` to remove the default entity category. MQTT options: diff --git a/components/cover/index.rst b/components/cover/index.rst index abc95bec2..146f4db9e 100644 --- a/components/cover/index.rst +++ b/components/cover/index.rst @@ -46,10 +46,10 @@ Advanced options: a ``name`` will implicitly set this to true. - **disabled_by_default** (*Optional*, boolean): If true, then this entity should not be added to any client's frontend, (usually Home Assistant) without the user manually enabling it (via the Home Assistant UI). - Requires Home Assistant 2021.9 or newer. Defaults to ``false``. + Defaults to ``false``. - **entity_category** (*Optional*, string): The category of the entity. See https://developers.home-assistant.io/docs/core/entity/#generic-properties - for a list of available options. Requires Home Assistant 2021.11 or newer. + for a list of available options. Set to ``""`` to remove the default entity category. MQTT options: diff --git a/components/datetime/index.rst b/components/datetime/index.rst index 26ff54eea..57636918e 100644 --- a/components/datetime/index.rst +++ b/components/datetime/index.rst @@ -42,10 +42,10 @@ Configuration variables: a ``name`` will implicitly set this to true. - **disabled_by_default** (*Optional*, boolean): If true, then this entity should not be added to any client's frontend, (usually Home Assistant) without the user manually enabling it (via the Home Assistant UI). - Requires Home Assistant 2021.9 or newer. Defaults to ``false``. + Defaults to ``false``. - **entity_category** (*Optional*, string): The category of the entity. See https://developers.home-assistant.io/docs/core/entity/#generic-properties - for a list of available options. Requires Home Assistant 2021.11 or newer. + for a list of available options. Set to ``""`` to remove the default entity category. MQTT Options: diff --git a/components/esp32_camera.rst b/components/esp32_camera.rst index 793e08887..0981c25fc 100644 --- a/components/esp32_camera.rst +++ b/components/esp32_camera.rst @@ -37,10 +37,10 @@ Configuration variables: a ``name`` will implicitly set this to true. - **disabled_by_default** (*Optional*, boolean): If true, then this entity should not be added to any client's frontend, (usually Home Assistant) without the user manually enabling it (via the Home Assistant UI). - Requires Home Assistant 2021.9 or newer. Defaults to ``false``. + Defaults to ``false``. - **entity_category** (*Optional*, string): The category of the entity. See https://developers.home-assistant.io/docs/core/entity/#generic-properties - for a list of available options. Requires Home Assistant 2021.11 or newer. + for a list of available options. Set to ``""`` to remove the default entity category. Connection Options: @@ -179,7 +179,7 @@ Configuration for Ai-Thinker Camera .. warning:: - GPIO16 on this board (and possibly other boards below) is connected to onboard PSRAM. + GPIO16 on this board (and possibly other boards below) is connected to onboard PSRAM. Using this GPIO for other purposes (eg as a button) will trigger the watchdog. Further information on pin notes can be found here: https://github.com/raphaelbs/esp32-cam-ai-thinker/blob/master/docs/esp32cam-pin-notes.md diff --git a/components/fan/index.rst b/components/fan/index.rst index 415e3d562..08039308a 100644 --- a/components/fan/index.rst +++ b/components/fan/index.rst @@ -49,10 +49,10 @@ Configuration variables: a ``name`` will implicitly set this to true. - **disabled_by_default** (*Optional*, boolean): If true, then this entity should not be added to any client's frontend (usually Home Assistant) without the user manually enabling it (via the Home Assistant UI). - Requires Home Assistant 2021.9 or newer. Defaults to ``false``. + Defaults to ``false``. - **entity_category** (*Optional*, string): The category of the entity. See https://developers.home-assistant.io/docs/core/entity/#generic-properties - for a list of available options. Requires Home Assistant 2021.11 or newer. + for a list of available options. Set to ``""`` to remove the default entity category. MQTT options: diff --git a/components/light/index.rst b/components/light/index.rst index c57c9470a..ee9a31d9f 100644 --- a/components/light/index.rst +++ b/components/light/index.rst @@ -77,10 +77,10 @@ Advanced options: a ``name`` will implicitly set this to true. - **disabled_by_default** (*Optional*, boolean): If true, then this entity should not be added to any client's frontend, (usually Home Assistant) without the user manually enabling it (via the Home Assistant UI). - Requires Home Assistant 2021.9 or newer. Defaults to ``false``. + Defaults to ``false``. - **entity_category** (*Optional*, string): The category of the entity. See https://developers.home-assistant.io/docs/core/entity/#generic-properties - for a list of available options. Requires Home Assistant 2021.11 or newer. + for a list of available options. Set to ``""`` to remove the default entity category. - If MQTT enabled, all other options from :ref:`MQTT Component `. diff --git a/components/lock/index.rst b/components/lock/index.rst index 0428510cb..ac15894c3 100644 --- a/components/lock/index.rst +++ b/components/lock/index.rst @@ -8,10 +8,6 @@ Lock Component The ``lock`` domain includes all platforms that should function like a lock with lock/unlock actions. -.. note:: - - ESPHome lock components requires Home Assistant 2022.3 or newer - .. _config-lock: Base Lock Configuration diff --git a/components/number/index.rst b/components/number/index.rst index d32079576..9cdb03526 100644 --- a/components/number/index.rst +++ b/components/number/index.rst @@ -43,16 +43,16 @@ Configuration variables: a ``name`` will implicitly set this to true. - **disabled_by_default** (*Optional*, boolean): If true, then this entity should not be added to any client's frontend, (usually Home Assistant) without the user manually enabling it (via the Home Assistant UI). - Requires Home Assistant 2021.9 or newer. Defaults to ``false``. + Defaults to ``false``. - **entity_category** (*Optional*, string): The category of the entity. See https://developers.home-assistant.io/docs/core/entity/#generic-properties - for a list of available options. Requires Home Assistant 2021.11 or newer. + for a list of available options. Set to ``""`` to remove the default entity category. - **unit_of_measurement** (*Optional*, string): Manually set the unit - of measurement for the number. Requires Home Assistant Core 2021.12 or newer. + of measurement for the number. - **mode** (*Optional*, string): Defines how the number should be displayed in the frontend. See https://developers.home-assistant.io/docs/core/entity/number/#properties - for a list of available options. Requires Home Assistant Core 2021.12 or newer. + for a list of available options. Defaults to ``"auto"``. - **device_class** (*Optional*, string): The device class for the number. See https://www.home-assistant.io/integrations/number/#device-class diff --git a/components/select/index.rst b/components/select/index.rst index a79c4d926..77fc53891 100644 --- a/components/select/index.rst +++ b/components/select/index.rst @@ -43,10 +43,10 @@ Configuration variables: a ``name`` will implicitly set this to true. - **disabled_by_default** (*Optional*, boolean): If true, then this entity should not be added to any client's frontend, (usually Home Assistant) without the user manually enabling it (via the Home Assistant UI). - Requires Home Assistant 2021.9 or newer. Defaults to ``false``. + Defaults to ``false``. - **entity_category** (*Optional*, string): The category of the entity. See https://developers.home-assistant.io/docs/core/entity/#generic-properties - for a list of available options. Requires Home Assistant 2021.11 or newer. + for a list of available options. Set to ``""`` to remove the default entity category. Automations: diff --git a/components/sensor/homeassistant.rst b/components/sensor/homeassistant.rst index fd2096fa1..b8d0ea0e9 100644 --- a/components/sensor/homeassistant.rst +++ b/components/sensor/homeassistant.rst @@ -31,7 +31,7 @@ Entity state attributes can also be imported: This component is only for numeral states. If you want to import arbitrary text states from Home Assistant, use the :doc:`Home Assistant Text Sensor `. - + Although you might not plan to *export* states from the node and you do not need an entity of the node in Home Assistant, this component still requires you to register the node under Home Assistant. See: :doc:`Getting started with Home Assistant ` @@ -43,16 +43,15 @@ Configuration variables: - **entity_id** (**Required**, string): The entity ID to import from Home Assistant. - **attribute** (*Optional*, string): The name of the state attribute to import from the specified entity. The entity state is used when this option is omitted. - Requires Home Assistant 2021.6 or newer. - **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation. - All other options from :ref:`Sensor `. .. note:: - The sensors implemented by this component are by default ``internal``, to avoid exporting them back to + The sensors implemented by this component are by default ``internal``, to avoid exporting them back to Home Assistant. Should you still want to do that (eg. because you use ESPHome's very efficient filters - on them) you need to specifically configure ``internal: false``. Also, ``state_class``, ``unit_of_measurement`` + on them) you need to specifically configure ``internal: false``. Also, ``state_class``, ``unit_of_measurement`` are not inherited from the imported sensor so you need to set them manually. diff --git a/components/sensor/index.rst b/components/sensor/index.rst index 9be1a5869..05df0921d 100644 --- a/components/sensor/index.rst +++ b/components/sensor/index.rst @@ -68,10 +68,10 @@ Configuration variables: significantly increase the database size. Defaults to ``false``. - **disabled_by_default** (*Optional*, boolean): If true, then this entity should not be added to any client's frontend, (usually Home Assistant) without the user manually enabling it (via the Home Assistant UI). - Requires Home Assistant 2021.9 or newer. Defaults to ``false``. + Defaults to ``false``. - **entity_category** (*Optional*, string): The category of the entity. See https://developers.home-assistant.io/docs/core/entity/#generic-properties - for a list of available options. Requires Home Assistant 2021.11 or newer. + for a list of available options. Set to ``""`` to remove the default entity category. Automations: diff --git a/components/switch/index.rst b/components/switch/index.rst index 88c739be6..eca9a1bed 100644 --- a/components/switch/index.rst +++ b/components/switch/index.rst @@ -59,14 +59,14 @@ Configuration variables: when the switch is turned off. See :ref:`switch-on_turn_on_off_trigger`. - **disabled_by_default** (*Optional*, boolean): If true, then this entity should not be added to any client's frontend, (usually Home Assistant) without the user manually enabling it (via the Home Assistant UI). - Requires Home Assistant 2021.9 or newer. Defaults to ``false``. + Defaults to ``false``. - **entity_category** (*Optional*, string): The category of the entity. See https://developers.home-assistant.io/docs/core/entity/#generic-properties - for a list of available options. Requires Home Assistant 2021.11 or newer. + for a list of available options. Set to ``""`` to remove the default entity category. - **device_class** (*Optional*, string): The device class for the switch. See https://www.home-assistant.io/integrations/switch/#device-class - for a list of available options. Requires Home Assistant 2022.3 or newer. + for a list of available options. - If MQTT enabled, All other options from :ref:`MQTT Component `. .. _switch-toggle_action: diff --git a/components/text_sensor/index.rst b/components/text_sensor/index.rst index 9638ced99..ad909ecb2 100644 --- a/components/text_sensor/index.rst +++ b/components/text_sensor/index.rst @@ -41,10 +41,10 @@ Configuration variables: a ``name`` will implicitly set this to true. - **disabled_by_default** (*Optional*, boolean): If true, then this entity should not be added to any client's frontend, (usually Home Assistant) without the user manually enabling it (via the Home Assistant UI). - Requires Home Assistant 2021.9 or newer. Defaults to ``false``. + Defaults to ``false``. - **entity_category** (*Optional*, string): The category of the entity. See https://developers.home-assistant.io/docs/core/entity/#generic-properties - for a list of available options. Requires Home Assistant 2021.11 or newer. + for a list of available options. Set to ``""`` to remove the default entity category. - If MQTT enabled, All other options from :ref:`MQTT Component `. From f1b31e85b7ac51699a262fe864ec852e2985b82e Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Mon, 22 Apr 2024 23:47:09 -0500 Subject: [PATCH 08/34] Add documentation for valve component (#3763) Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> --- components/index.rst | 1 + components/valve/images/valve-ui.png | Bin 0 -> 15963 bytes components/valve/index.rst | 262 +++++++++++++++++++++++++++ components/valve/template.rst | 118 ++++++++++++ index.rst | 8 + 5 files changed, 389 insertions(+) create mode 100644 components/valve/images/valve-ui.png create mode 100644 components/valve/index.rst create mode 100644 components/valve/template.rst diff --git a/components/index.rst b/components/index.rst index b9aba9769..a3e62fc17 100644 --- a/components/index.rst +++ b/components/index.rst @@ -29,4 +29,5 @@ Components time/index alarm_control_panel/index text/index + valve/index * diff --git a/components/valve/images/valve-ui.png b/components/valve/images/valve-ui.png new file mode 100644 index 0000000000000000000000000000000000000000..33c91f984527c25d11531c2f2d4514c853ab5b26 GIT binary patch literal 15963 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 set for your device and you want the valve + to use that name, you can set ``name: None``. + +- **device_class** (*Optional*, string): The device class for the sensor. See + https://www.home-assistant.io/components/valve/ for a list of available options. +- **icon** (*Optional*, icon): Manually set the icon to use for the valve in the frontend. + +Advanced options: + +- **internal** (*Optional*, boolean): Mark this component as internal. Internal components will not be exposed to the + frontend (like Home Assistant). Only specifying an ``id`` without a ``name`` will implicitly set this to true. +- **disabled_by_default** (*Optional*, boolean): If true, this entity should not be added to any client's frontend, + (usually Home Assistant) without the user manually enabling it (via the Home Assistant UI). Defaults to ``false``. +- **entity_category** (*Optional*, string): The category of the entity. See + https://developers.home-assistant.io/docs/core/entity/#generic-properties for a list of available options. Set to ``""`` to remove the default entity category. + +MQTT options: + +- **position_state_topic** (*Optional*, string): The topic to publish valve position changes to. +- **position_command_topic** (*Optional*, string): The topic to receive valve position commands on. +- All other options from :ref:`MQTT Component `. + + +.. _valve-open_action: + +``valve.open`` Action +--------------------- + +This :ref:`action ` opens the valve with the given ID when executed. + +.. code-block:: yaml + + on_...: + then: + - valve.open: valve_1 + +.. note:: + + This action can also be expressed in :ref:`lambdas `: + + .. code-block:: cpp + + auto call = id(valve_1).make_call(); + call.set_command_open(); + call.perform(); + +.. _valve-close_action: + +``valve.close`` Action +---------------------- + +This :ref:`action ` closes the valve with the given ID when executed. + +.. code-block:: yaml + + on_...: + then: + - valve.close: valve_1 + +.. note:: + + This action can also be expressed in :ref:`lambdas `: + + .. code-block:: cpp + + auto call = id(valve_1).make_call(); + call.set_command_close(); + call.perform(); + +.. _valve-stop_action: + +``valve.stop`` Action +--------------------- + +This :ref:`action ` stops the valve with the given ID when executed. + +.. code-block:: yaml + + on_...: + then: + - valve.stop: valve_1 + +.. note:: + + This action can also be expressed in :ref:`lambdas `: + + .. code-block:: cpp + + auto call = id(valve_1).make_call(); + call.set_command_stop(); + call.perform(); + +.. _valve-toggle_action: + +``valve.toggle`` Action +----------------------- + +This :ref:`action ` toggles the valve with the given ID when executed, cycling through the states +close/stop/open/stop... This allows the valve to be controlled by a single push button. + +.. code-block:: yaml + + on_...: + then: + - valve.toggle: valve_1 + +.. note:: + + This action can also be expressed in :ref:`lambdas `: + + .. code-block:: cpp + + auto call = id(valve_1).make_call(); + call.set_command_toggle(); + call.perform(); + +.. _valve-control_action: + +``valve.control`` Action +------------------------ + +This :ref:`action ` is a more generic version of the other valve actions and allows all valve attributes +to be set. + +.. code-block:: yaml + + on_...: + then: + - valve.control: + id: valve_1 + position: 50% + +Configuration variables: + +- **id** (**Required**, :ref:`config-id`): The valve to control. +- **stop** (*Optional*, boolean): Whether to stop the valve. +- **state** (*Optional*, string): The state to set the valve to - one of ``OPEN`` or ``CLOSE``. +- **position** (*Optional*, float): The valve position to set. + + - ``0.0`` = ``0%`` = ``CLOSED`` + - ``1.0`` = ``100%`` = ``OPEN`` + +.. note:: + + This action can also be expressed in :ref:`lambdas `: + + .. code-block:: cpp + + auto call = id(valve_1).make_call(); + // set attributes + call.set_position(0.5); + call.perform(); + +.. _valve-lambda_calls: + +Lambdas +------- + +From :ref:`lambdas `, you can access the current state of the valve (note that these fields are +read-only, if you want to act on the valve, use the ``make_call()`` method as shown above). + +- ``position``: Retrieve the current position of the valve, as a value between ``0.0`` (closed) and ``1.0`` (open). + + .. code-block:: cpp + + if (id(my_valve).position == VALVE_OPEN) { + // Valve is open + } else if (id(my_valve).position == VALVE_CLOSED) { + // Valve is closed + } else { + // Valve is in-between open and closed + } + +- ``current_operation``: The operation the valve is currently performing: + + .. code-block:: cpp + + if (id(my_valve).current_operation == ValveOperation::VALVE_OPERATION_IDLE) { + // Valve is idle + } else if (id(my_valve).current_operation == ValveOperation::VALVE_OPERATION_OPENING) { + // Valve is currently opening + } else if (id(my_valve).current_operation == ValveOperation::VALVE_OPERATION_CLOSING) { + // Valve is currently closing + } + +.. _valve-on_open_trigger: + +``valve.on_open`` Trigger +************************* + +This trigger is activated each time the valve reaches a fully open state. + +.. code-block:: yaml + + valve: + - platform: template # or any other platform + # ... + on_open: + - logger.log: "Valve is Open!" + +.. _valve-on_closed_trigger: + +``valve.on_closed`` Trigger +*************************** + +This trigger is activated each time the valve reaches a fully closed state. + +.. code-block:: yaml + + valve: + - platform: template # or any other platform + # ... + on_closed: + - logger.log: "Valve is Closed!" + +See Also +-------- + +- :apiref:`valve/valve.h` +- :ghedit:`Edit` + +.. toctree:: + :maxdepth: 1 + :glob: + + * diff --git a/components/valve/template.rst b/components/valve/template.rst new file mode 100644 index 000000000..f3d3ffb5c --- /dev/null +++ b/components/valve/template.rst @@ -0,0 +1,118 @@ +Template Valve +============== + +.. seo:: + :description: Instructions for setting up template valves in ESPHome. + :image: description.svg + +The ``template`` valve platform allows you to create simple valves out of just a few actions and a value lambda. Once +defined, it will automatically appear in Home Assistant as a valve and can be controlled through the frontend. + +.. figure:: images/valve-ui.png + :align: center + +.. code-block:: yaml + + # Example configuration entry + valve: + - platform: template + name: "Template Valve" + lambda: |- + if (id(top_end_stop).state) { + return VALVE_OPEN; + } else { + return VALVE_CLOSED; + } + open_action: + - switch.turn_on: open_valve_switch + close_action: + - switch.turn_on: close_valve_switch + stop_action: + - switch.turn_on: stop_valve_switch + optimistic: true + + +Possible return values for the optional lambda: + + - ``return VALVE_OPEN;`` if the valve should be reported as OPEN. + - ``return VALVE_CLOSED;`` if the valve should be reported as CLOSED. + - ``return {};`` if the last state should be repeated. + +Configuration variables: +------------------------ + +- **name** (**Required**, string): The name of the valve. +- **lambda** (*Optional*, :ref:`lambda `): + Lambda to be evaluated repeatedly to get the current state of the valve. +- **open_action** (*Optional*, :ref:`Action `): The action that should be performed when the remote + (like Home Assistant's frontend) requests the valve to be opened. +- **close_action** (*Optional*, :ref:`Action `): The action that should be performed when the remote + requests the valve to be closed. +- **stop_action** (*Optional*, :ref:`Action `): The action that should be performed when the remote + requests the valve to be stopped. +- **optimistic** (*Optional*, boolean): Whether to operate in optimistic mode - when in this mode, any command sent to + the template valve will immediately update the reported state and no lambda needs to be used. Defaults to ``false``. +- **assumed_state** (*Optional*, boolean): Whether the true state of the valve is not known. This will make the Home + Assistant frontend show buttons for both OPEN and CLOSE actions, instead of hiding one of them. Defaults to ``false``. +- **has_position** (*Optional*, boolean): Whether this valve will publish its position as a floating point number. + By default (``false``), the valve only publishes OPEN/CLOSED position. +- **position_action** (*Optional*, :ref:`Action `): The action that should be performed when the remote + (like Home Assistant's frontend) requests the valve be set to a specific position. The desired position is available + in the lambda in the ``pos`` variable. Requires ``has_position`` (above) to be set to ``true``. +- **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation. +- All other options from :ref:`Valve `. + +.. _valve-template-publish_action: + +``valve.template.publish`` Action +--------------------------------- + +You can also publish a state to a template valve from elsewhere in your YAML filewith the ``valve.template.publish`` action. + +.. code-block:: yaml + + # Example configuration entry + valve: + - platform: template + name: "Template Valve" + id: my_template_valve + + # in some trigger + on_...: + - valve.template.publish: + id: my_template_valve + state: OPEN + + # Templated + - valve.template.publish: + id: my_template_valve + state: !lambda 'return VALVE_OPEN;' + +Configuration options: + +- **id** (**Required**, :ref:`config-id`): The ID of the template valve. +- **state** (*Optional*, :ref:`templatable `): + The state to publish. One of ``OPEN``, ``CLOSED``. If using a lambda, use ``VALVE_OPEN`` or ``VALVE_CLOSED``. +- **position** (*Optional*, :ref:`templatable `, float): + The position to publish, from 0 (CLOSED) to 1.0 (OPEN) +- **current_operation** (*Optional*, :ref:`templatable `, string): + The current operation mode to publish. One of ``IDLE``, ``OPENING`` and ``CLOSING``. If using a lambda, use + ``VALVE_OPERATION_IDLE``, ``VALVE_OPERATION_OPENING``, and ``VALVE_OPERATION_CLOSING``. + +.. note:: + + This action can also be written in lambdas: + + .. code-block:: cpp + + id(my_template_valve).position = VALVE_OPEN; + id(my_template_valve).publish_state(); + +See Also +-------- + +- :doc:`/components/valve/index` +- :ref:`automation` +- :doc:`/cookbook/garage-door` +- :apiref:`template/valve/template_valve.h` +- :ghedit:`Edit` diff --git a/index.rst b/index.rst index 3c8d4b96d..c89beaad8 100644 --- a/index.rst +++ b/index.rst @@ -733,6 +733,14 @@ Cover Components Tuya Cover, components/cover/tuya, tuya.png HE60R Cover, components/cover/he60r, he60r.jpg +Valve Components +---------------- + +.. imgtable:: + + Valve Core, components/valve/index, folder-open.svg, dark-invert + Template Valve, components/valve/template, description.svg, dark-invert + Text Sensor Components ---------------------- From cda94f58d35f49276d456e3119fba2a786496821 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 23 Apr 2024 17:22:17 +1200 Subject: [PATCH 09/34] [sn74hc595] Update documentation for type and spi_id (#3787) --- components/sn74hc595.rst | 39 ++++++++++++++++++--------------------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/components/sn74hc595.rst b/components/sn74hc595.rst index 7d48a6192..f33a044c7 100644 --- a/components/sn74hc595.rst +++ b/components/sn74hc595.rst @@ -58,28 +58,36 @@ Configuration variables: - **oe_pin** (*Optional*, :ref:`Pin Schema `): Pin connected to SN74HC595 OE pin - **sr_count** (*Optional*, int): Number of daisy-chained shift registers, up-to 256. Defaults to ``1``. - -Pin configuration variables: -**************************** - -- **sn74hc595** (**Required**, :ref:`config-id`): The id of the SN74HC595 component the pin belongs to. -- **number** (**Required**, int): The pin number. -- **inverted** (*Optional*, boolean): If all written values should be treated as inverted. - Defaults to ``false``. - Over SPI -------- .. code-block:: yaml # Example configuration entry - spi: sn74hc595: - id: 'sn74hc595_hub' + type: spi latch_pin: D7 oe_pin: D6 sr_count: 2 + +Configuration variables: +************************ + +- **id** (**Required**, :ref:`config-id`): The id to use for this SN74HC595 component. +- **spi_id** (**Required**, :ref:`SPI Bus Schema `): The SPI bus to use. This will automatically be set to the ID of the SPI bus if there is only one. +- **type** (**Required**, string): Must be ``spi``. +- **latch_pin** (**Required**, :ref:`Pin Schema `): Pin connected to SN74HC595 RCLK (ST_CP) pin +- **oe_pin** (*Optional*, :ref:`Pin Schema `): Pin connected to SN74HC595 OE pin +- **sr_count** (*Optional*, int): Number of daisy-chained shift registers, up to 256. Defaults to ``1``. + + +Pin configuration +----------------- + +.. code-block:: yaml + # Individual outputs switch: - platform: gpio @@ -90,17 +98,6 @@ Over SPI number: 0 inverted: false -Configuration variables: -************************ - -- **id** (**Required**, :ref:`config-id`): The id to use for this SN74HC595 component. -- **latch_pin** (**Required**, :ref:`Pin Schema `): Pin connected to SN74HC595 RCLK (ST_CP) pin -- **oe_pin** (*Optional*, :ref:`Pin Schema `): Pin connected to SN74HC595 OE pin -- **sr_count** (*Optional*, int): Number of daisy-chained shift registers, up to 256. Defaults to ``1``. - - -Pin configuration variables: -**************************** - **sn74hc595** (**Required**, :ref:`config-id`): The id of the SN74HC595 component of the pin. - **number** (**Required**, int): The pin number. From c20f304142965a0ea3b399a1115ca8c3479545e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=2E=20=C3=81rkosi=20R=C3=B3bert?= Date: Tue, 23 Apr 2024 21:52:39 +0200 Subject: [PATCH 10/34] Graphical menu screenshot (#3791) --- changelog/2023.12.0.rst | 2 +- .../display_menu/graphical_display_menu.rst | 2 +- .../images/graphical_display_menu.jpg | Bin 103805 -> 0 bytes .../images/graphical_display_menu.png | Bin 0 -> 4040 bytes images/graphical_display_menu.jpg | Bin 13999 -> 0 bytes images/graphical_display_menu.png | Bin 0 -> 10769 bytes index.rst | 2 +- 7 files changed, 3 insertions(+), 3 deletions(-) delete mode 100644 components/display_menu/images/graphical_display_menu.jpg create mode 100644 components/display_menu/images/graphical_display_menu.png delete mode 100644 images/graphical_display_menu.jpg create mode 100644 images/graphical_display_menu.png diff --git a/changelog/2023.12.0.rst b/changelog/2023.12.0.rst index 58ff62091..499288e89 100644 --- a/changelog/2023.12.0.rst +++ b/changelog/2023.12.0.rst @@ -14,7 +14,7 @@ ESPHome 2023.12.0 - 20th December 2023 GT911, components/touchscreen/gt911, esp32_s3_box_3.png Pylontech Batteries, components/pylontech, pylontech.jpg HE60R Cover, components/cover/he60r, he60r.jpg - Graphical Display Menu, components/display_menu/graphical_display_menu, graphical_display_menu.jpg + Graphical Display Menu, components/display_menu/graphical_display_menu, graphical_display_menu.png FT63X6, components/touchscreen/ft63x6, wt32-sc01.png A02YYUW, components/sensor/a02yyuw, a02yyuw.jpg PN7150, components/binary_sensor/pn7150, pn7150.jpg diff --git a/components/display_menu/graphical_display_menu.rst b/components/display_menu/graphical_display_menu.rst index fc1fb52ae..751769d8f 100644 --- a/components/display_menu/graphical_display_menu.rst +++ b/components/display_menu/graphical_display_menu.rst @@ -12,7 +12,7 @@ on graphical displays. This offers the user an interactive method to display labels, control entities like ``switch``, ``select``, ``number`` available locally on the ESPHome node, without the requirement of a network connection. -.. figure:: images/graphical_display_menu.jpg +.. figure:: images/graphical_display_menu.png :align: center :width: 60.0% diff --git a/components/display_menu/images/graphical_display_menu.jpg b/components/display_menu/images/graphical_display_menu.jpg deleted file mode 100644 index eaed932d3fe75c3ebeb2f46bf55f3a11d29f9ec3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 103805 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 Date: Tue, 23 Apr 2024 19:51:00 -0500 Subject: [PATCH 11/34] Organize main page better (#3789) --- index.rst | 524 +++++++++++++++++++++++++++++++----------------------- 1 file changed, 299 insertions(+), 225 deletions(-) diff --git a/index.rst b/index.rst index 51b52e469..9cc42dae9 100644 --- a/index.rst +++ b/index.rst @@ -121,41 +121,112 @@ ESPHome is a system to control your microcontrollers by simple yet powerful conf .. _devices: -Platforms ---------- +Supported Microcontrollers +-------------------------- .. imgtable:: - ESP8266, components/esp8266, esp8266.svg ESP32, components/esp32, esp32.svg + ESP8266, components/esp8266, esp8266.svg RP2040, components/rp2040, rp2040.svg BK72xx, components/libretiny, bk72xx.svg RTL87xx, components/libretiny, rtl87xx.svg -Core Components ---------------- +Microcontroller Peripherals +--------------------------- + +Peripherals which directly support the operation of the microcontroller's processor(s). + +.. imgtable:: + + PSRAM, components/psram, psram.svg + Deep Sleep, components/deep_sleep, hotel.svg, dark-invert + +ESPHome Components +------------------ + +ESPHome-specific components or components supporting ESPHome device provisioning post-installation. .. imgtable:: Core, components/esphome, cloud-circle.svg, dark-invert - PSRAM, components/psram, psram.svg - WiFi, components/wifi, network-wifi.svg, dark-invert - Network, components/network, network-wifi.svg, dark-invert - - I²C Bus, components/i2c, i2c.svg - SPI Bus, components/spi, spi.svg - UART Bus, components/uart, uart.svg - CAN Bus, components/canbus, canbus.svg - - MQTT, components/mqtt, mqtt.png - OTA Updates, components/ota, system-update.svg, dark-invert - Logger, components/logger, file-document-box.svg, dark-invert - Web Server, components/web_server, http.svg, dark-invert - - Native API, components/api, server-network.svg, dark-invert - Power Supply, components/power_supply, power.svg, dark-invert - Deep Sleep, components/deep_sleep, hotel.svg, dark-invert + Captive Portal, components/captive_portal, wifi-strength-alert-outline.svg, dark-invert + Copy, components/copy, content-copy.svg, dark-invert + Demo, components/demo, description.svg, dark-invert External Components, components/external_components, external_components.svg, dark-invert + Improv via BLE, components/esp32_improv, improv.svg, dark-invert + Improv via Serial, components/improv_serial, improv.svg, dark-invert + +Network Hardware +---------------- + +.. imgtable:: + + WiFi, components/wifi, network-wifi.svg, dark-invert + ESP32 Ethernet, components/ethernet, ethernet.svg, dark-invert + +Network Protocols +----------------- + +.. imgtable:: + + Network Core, components/network, server-network.svg, dark-invert + Native API, components/api, server-network.svg, dark-invert + MQTT, components/mqtt, mqtt.png + HTTP Request, components/http_request, connection.svg, dark-invert + mDNS, components/mdns, radio-tower.svg, dark-invert + WireGuard, components/wireguard, wireguard_custom_logo.svg + +Bluetooth/BLE +------------- + +.. imgtable:: + + ESP32 BLE Beacon, components/esp32_ble_beacon, bluetooth.svg, dark-invert + ESP32 BLE Client, components/ble_client, bluetooth.svg, dark-invert + ESP32 BLE Tracker, components/esp32_ble_tracker, bluetooth.svg, dark-invert + Bluetooth Proxy, components/bluetooth_proxy, bluetooth.svg, dark-invert + Improv via BLE, components/esp32_improv, improv.svg, dark-invert + +Management and Monitoring +------------------------- + +.. imgtable:: + + Debug, components/debug, bug-report.svg, dark-invert + Logger, components/logger, file-document-box.svg, dark-invert + OTA Updates, components/ota, system-update.svg, dark-invert + Prometheus, components/prometheus, prometheus.svg + Web Server, components/web_server, http.svg, dark-invert + ESP32 Camera Web Server, components/esp32_camera_web_server, camera.svg, dark-invert + +Hardware Peripheral Interfaces/Busses +------------------------------------- + +.. imgtable:: + + CAN Bus, components/canbus, canbus.svg + I²C Bus, components/i2c, i2c.svg + I²S Audio, components/i2s_audio, i2s_audio.svg + SPI Bus, components/spi, spi.svg + UART, components/uart, uart.svg + +I/O Expanders/Multiplexers +-------------------------- + +.. imgtable:: + + MAX6956 - I²C Bus, components/max6956, max6956.jpg + MCP230XX - I²C Bus, components/mcp230xx, mcp230xx.svg + MCP23SXX - SPI Bus, components/mcp23Sxx, mcp230xx.svg + PCA6416A, components/pca6416a, pca6416a.svg + PCA9554, components/pca9554, pca9554a.jpg + PCF8574, components/pcf8574, pcf8574.jpg + SN74HC165, components/sn74hc165, sn74hc595.jpg + SN74HC595, components/sn74hc595, sn74hc595.jpg + SX1509, components/sx1509, sx1509.jpg + TCA9548A I²C Multiplexer, components/tca9548a, tca9548a.jpg + XL9535, components/xl9535, xl9535.svg Sensor Components ----------------- @@ -164,19 +235,19 @@ Sensors are split into categories. If a sensor fits into more than one category, Core **** + .. imgtable:: Sensor Core, components/sensor/index, folder-open.svg, dark-invert + Template Sensor, components/sensor/template, description.svg, dark-invert Home Assistant, components/sensor/homeassistant, home-assistant.svg, dark-invert MQTT Subscribe, components/sensor/mqtt_subscribe, mqtt.png Uptime Sensor, components/sensor/uptime, timer.svg, dark-invert WiFi Signal Strength, components/sensor/wifi_signal, network-wifi.svg, dark-invert - Template Sensor, components/sensor/template, description.svg, dark-invert - Custom Sensor, components/sensor/custom, language-cpp.svg, dark-invert - Air Quality *********** + .. imgtable:: AGS10, components/sensor/ags10, ags10.jpg, Volatile Organic Compound Sensor @@ -186,18 +257,19 @@ Air Quality ENS160, components/sensor/ens160, ens160.jpg, CO2 & Air Quality GCJA5, components/sensor/gcja5, gcja5.svg, Particulate HM3301, components/sensor/hm3301, hm3301.jpg, Particulate + iAQ-Core, components/sensor/iaqcore, iaqcore.jpg, CO2 & Volatile organics MH-Z19, components/sensor/mhz19, mhz19.jpg, CO2 & Temperature MiCS-4514, components/sensor/mics_4514, mics_4514.jpg, Gas concentration PM1006 Sensor, components/sensor/pm1006, pm1006.jpg, Particulate PMSA003I, components/sensor/pmsa003i, pmsa003i.jpg, Particulate PMSX003, components/sensor/pmsx003, pmsx003.svg, Particulate RadonEye BLE, components/sensor/radon_eye_ble, radon_eye_logo.png, Radon + SCD30, components/sensor/scd30, scd30.jpg, CO2 & Temperature & Humidity + SCD4X, components/sensor/scd4x, scd4x.jpg, CO2 & Temperature & Humidity SDS011 Sensor, components/sensor/sds011, sds011.jpg, Particulate SEN0321, components/sensor/sen0321, sen0321.jpg, Ozone SEN5x, components/sensor/sen5x, sen54.jpg, Temperature & Humidity, Volatile organics and NOx SenseAir, components/sensor/senseair, senseair_s8.jpg, CO2 - SCD30, components/sensor/scd30, scd30.jpg, CO2 & Temperature & Humidity - SCD4X, components/sensor/scd4x, scd4x.jpg, CO2 & Temperature & Humidity SFA30, components/sensor/sfa30, sfa30.jpg, Formaldehyde SGP30, components/sensor/sgp30, sgp30.jpg, CO2 & Volatile organics SGP4x, components/sensor/sgp4x, sgp40.jpg, Volatile organics and NOx @@ -205,11 +277,10 @@ Air Quality SPS30, components/sensor/sps30, sps30.jpg, Particulate T6613/15, components/sensor/t6615, t6615.jpg, CO2 ZyAura, components/sensor/zyaura, zgm053.jpg, CO2 & Temperature & Humidity - iAQ-Core, components/sensor/iaqcore, iaqcore.jpg, CO2 & Volatile organics - Analogue ******** + .. imgtable:: ADC, components/sensor/adc, flash.svg, ESP internal, dark-invert @@ -221,25 +292,25 @@ Analogue MCP3204 / MCP3208, components/sensor/mcp3204, mcp3204.jpg, 4-channel ADC Resistance, components/sensor/resistance, omega.svg, dark-invert - Bluetooth Low Energy (BLE) ************************** + .. imgtable:: + Alpha3, components/sensor/alpha3, alpha3.jpg AM43, components/sensor/am43, am43.jpg, Lux & Battery level BLE Client Sensor, components/sensor/ble_client, bluetooth.svg, dark-invert BLE RSSI, components/sensor/ble_rssi, bluetooth.svg, dark-invert + HHCCJCY10 (MiFlora Pink), components/sensor/xiaomi_hhccjcy10, xiaomi_hhccjcy10.jpg, Soil moisture & Temperature & Light Inkbird IBS-TH1 Mini, components/sensor/inkbird_ibsth1_mini, inkbird_isbth1_mini.jpg, Temperature & Humidity Mopeka Pro Check LP, components/sensor/mopeka_pro_check, mopeka_pro_check.jpg, tank level Mopeka Standard Check LP, components/sensor/mopeka_std_check, mopeka_std_check.jpg, tank level RuuviTag, components/sensor/ruuvitag, ruuvitag.jpg, Temperature & Humidity & Accelerometer Xiaomi BLE, components/sensor/xiaomi_ble, xiaomi_mijia_logo.jpg, Various - HHCCJCY10 (MiFlora Pink), components/sensor/xiaomi_hhccjcy10, xiaomi_hhccjcy10.jpg, Soil moisture & Temperature & Light - Alpha3, components/sensor/alpha3, alpha3.jpg - Digital Signals *************** + .. imgtable:: Duty Cycle, components/sensor/duty_cycle, percent.svg, dark-invert @@ -247,22 +318,23 @@ Digital Signals Pulse Meter, components/sensor/pulse_meter, pulse.svg, dark-invert Pulse Width, components/sensor/pulse_width, pulse.svg, dark-invert - Distance ******** + .. imgtable:: A01NYUB, components/sensor/a01nyub, a01nyub.jpg, Acoustic distance A02YYUW, components/sensor/a02yyuw, a02yyuw.jpg, Acoustic distance HRXL MaxSonar WR, components/sensor/hrxl_maxsonar_wr, hrxl_maxsonar_wr.jpg, Acoustic distance + JSN-SR04T, components/sensor/jsn_sr04t, jsn-sr04t-v3.jpg, Acoustic distance TOF10120, components/sensor/tof10120, tof10120.jpg, IR optical distance Ultrasonic Sensor, components/sensor/ultrasonic, ultrasonic.jpg, Acoustic distance VL53L0x, components/sensor/vl53l0x, vl53l0x.jpg, IR optical distance Zio Ultrasonic Sensor, components/sensor/zio_ultrasonic, zio_ultrasonic.jpg, Acoustic distance - JSN-SR04T, components/sensor/jsn_sr04t, jsn-sr04t-v3.jpg, Acoustic distance Electricity *********** + .. imgtable:: ADE7880, components/sensor/ade7880, ade7880.svg, Voltage & Current & Power @@ -293,7 +365,6 @@ Electricity Teleinfo, components/sensor/teleinfo, teleinfo.jpg, Electrical counter Total Daily Energy, components/sensor/total_daily_energy, sigma.svg, dark-invert - Environmental ************* @@ -304,14 +375,14 @@ Environmental AirThings BLE, components/sensor/airthings_ble, airthings_logo.png, Temperature & Humidity & Pressure AM2315C, components/sensor/am2315c, am2315c.jpg, Temperature & Humidity AM2320, components/sensor/am2320, am2320.jpg, Temperature & Humidity + b-parasite, components/sensor/b_parasite, b_parasite.jpg, Moisture & Temperature & Humidity & Light BME280, components/sensor/bme280, bme280.jpg, Temperature & Humidity & Pressure - BME680, components/sensor/bme680, bme680.jpg, Temperature & Humidity & Pressure & Gas BME680 via BSEC, components/sensor/bme680_bsec, bme680.jpg, Temperature & Humidity & Pressure & Gas + BME680, components/sensor/bme680, bme680.jpg, Temperature & Humidity & Pressure & Gas BMP085, components/sensor/bmp085, bmp180.jpg, Temperature & Pressure BMP280, components/sensor/bmp280, bmp280.jpg, Temperature & Pressure BMP388 and BMP390, components/sensor/bmp3xx, bmp388.jpg, Temperature & Pressure BMP581, components/sensor/bmp581, bmp581.jpg, Temperature & Pressure - b-parasite, components/sensor/b_parasite, b_parasite.jpg, Moisture & Temperature & Humidity & Light Dallas DS18B20, components/sensor/dallas, dallas.jpg, Temperature DHT, components/sensor/dht, dht.jpg, Temperature & Humidity DHT12, components/sensor/dht12, dht12.jpg, Temperature & Humidity @@ -321,13 +392,14 @@ Environmental ENS210, components/sensor/ens210, ens210.jpg, Temperature & Humidity HDC1080, components/sensor/hdc1080, hdc1080.jpg, Temperature & Humidity HHCCJCY10 (MiFlora Pink), components/sensor/xiaomi_hhccjcy10, xiaomi_hhccjcy10.jpg, Soil moisture & Temperature & Light - HTE501, components/sensor/hte501, HTE501.png, Temperature & Humidity Honeywell ABP, components/sensor/honeywellabp, honeywellabp.jpg, Pressure & Temperature Honeywell ABP2 I2C, components/sensor/honeywellabp2_i2c, honeywellabp.jpg, Pressure & Temperature Honeywell HIH I2C, components/sensor/honeywell_hih_i2c, honeywellhih.jpg, Temperature & Humidity + HTE501, components/sensor/hte501, HTE501.png, Temperature & Humidity HTU21D / Si7021 / SHT21, components/sensor/htu21d, htu21d.jpg, Temperature & Humidity HTU31D, components/sensor/htu31d, htu31d.jpg, Temperature & Humidity Hydreon Rain Sensor, components/sensor/hydreon_rgxx, hydreon_rg9.jpg, Rain + HYT271, components/sensor/hyt271, hyt271.jpg, Temperature & Humidity Inkbird IBS-TH1 Mini, components/sensor/inkbird_ibsth1_mini, inkbird_isbth1_mini.jpg, Temperature & Humidity Internal Temperature, components/sensor/internal_temperature, thermometer.svg, Temperature, dark-invert MCP9808, components/sensor/mcp9808, mcp9808.jpg, Temperature @@ -352,14 +424,13 @@ Environmental STS3X, components/sensor/sts3x, sts3x.jpg, Temperature TEE501, components/sensor/tee501, TEE501.png, Temperature TMP102, components/sensor/tmp102, tmp102.jpg, Temperature - TMP117, components/sensor/tmp117, tmp117.jpg, Temperature TMP1075, components/sensor/tmp1075, tmp1075.jpg, Temperature - HYT271, components/sensor/hyt271, hyt271.jpg, Temperature & Humidity + TMP117, components/sensor/tmp117, tmp117.jpg, Temperature XGZP68xx Series, components/sensor/xgzp68xx, 6897d.jpg, Differential Pressure - Light ***** + .. imgtable:: AM43, components/sensor/am43, am43.jpg, Lux @@ -375,65 +446,65 @@ Light VEML6030, components/sensor/veml7700, veml6030.jpg, Lux VEML7700, components/sensor/veml7700, veml7700.jpg, Lux - Magnetic ******** + .. imgtable:: - ESP32 Hall Sensor, components/sensor/esp32_hall, magnet.svg, ESP internal, dark-invert AS5600, components/sensor/as5600, as5600.jpg, 12-Bit Magnetic Position Sensor + ESP32 Hall Sensor, components/sensor/esp32_hall, magnet.svg, ESP internal, dark-invert HMC5883L, components/sensor/hmc5883l, hmc5883l.jpg, 3-Axis magnetometer + MLX90393, components/sensor/mlx90393, mlx90393.jpg, 3-Axis magnetometer MMC5603, components/sensor/mmc5603, mmc5603.jpg, 3-Axis magnetometer MMC5983, components/sensor/mmc5983, mmc5983.jpg, 3-Axis magnetometer - MLX90393, components/sensor/mlx90393, mlx90393.jpg, 3-Axis magnetometer QMC5883L, components/sensor/qmc5883l, qmc5883l.jpg, 3-Axis magnetometer - Miscellaneous ************* + .. imgtable:: AS3935, components/sensor/as3935, as3935.jpg, Storm lightning - Binary Sensor Map, components/sensor/binary_sensor_map, binary_sensor_map.jpg, Map binary to value b-parasite, components/sensor/b_parasite, b_parasite.jpg, Moisture & Temperature & Humidity & Light + Binary Sensor Map, components/sensor/binary_sensor_map, binary_sensor_map.jpg, Map binary to value Combination, components/sensor/combination, function.svg, dark-invert Duty Time, components/sensor/duty_time, timer-play-outline.svg, dark-invert EZO sensor circuits, components/sensor/ezo, ezo-ph-circuit.png, (pH) FS3000, components/sensor/fs3000, fs3000.jpg, Air velocity + Growatt Solar, components/sensor/growatt_solar, growatt.jpg, Solar rooftop Havells Solar, components/sensor/havells_solar, havellsgti5000d_s.jpg, Solar rooftop Integration, components/sensor/integration, sigma.svg, dark-invert - Growatt Solar, components/sensor/growatt_solar, growatt.jpg, Solar rooftop + Kuntze pool sensor, components/sensor/kuntze, kuntze.jpg + MicroNova pellet stove, components/micronova, pellet.svg Modbus Sensor, components/sensor/modbus_controller, modbus.png Nextion, components/sensor/nextion, nextion.jpg, Sensors from display + Person Sensor (SEN21231), components/sensor/sen21231, sen21231.png + Resol VBus, components/vbus, resol_deltasol_bs_plus.jpg Rotary Encoder, components/sensor/rotary_encoder, rotary_encoder.jpg SMT100, components/sensor/smt100, smt100.jpg, Moisture & Temperature Tuya Sensor, components/sensor/tuya, tuya.png TX20, components/sensor/tx20, tx20.jpg, Wind speed & Wind direction uFire EC sensor, components/sensor/ufire_ec, ufire_ec.png, EC & Temperature uFire ISE sensor, components/sensor/ufire_ise, ufire_ise.png, pH & Temperature - Resol VBus, components/vbus, resol_deltasol_bs_plus.jpg - Person Sensor (SEN21231), components/sensor/sen21231, sen21231.png - Kuntze pool sensor, components/sensor/kuntze, kuntze.jpg WireGuard, components/wireguard, wireguard_custom_logo.svg - MicroNova pellet stove, components/micronova, pellet.svg - Motion ****** + .. imgtable:: APDS9960, components/sensor/apds9960, apds9960.jpg, Colour & Gesture BMI160, components/sensor/bmi160, bmi160.jpg, Accelerometer & Gyroscope LD2410, components/sensor/ld2410, ld2410.jpg, Motion & Presence LD2420, components/sensor/ld2420, ld2420.jpg, Motion & Presence - Seeed Studio MR24HPC1 mmWave, components/seeed_mr24hpc1, seeed-mr24hpc1.jpg, Motion & Presence MPU6050, components/sensor/mpu6050, mpu6050.jpg, Accelerometer & Gyroscope MPU6886, components/sensor/mpu6886, mpu6886.jpg, Accelerometer & Gyroscope RuuviTag, components/sensor/ruuvitag, ruuvitag.jpg, Temperature & Humidity & Accelerometer - + Seeed Studio MR24HPC1 mmWave, components/seeed_mr24hpc1, seeed-mr24hpc1.jpg, Motion & Presence Thermocouple ************ + .. imgtable:: KMeterISO, components/sensor/kmeteriso, kmeteriso.jpg, K-Type, @@ -443,9 +514,9 @@ Thermocouple MAX6675, components/sensor/max6675, max6675.jpg, K-Type, MCP9600, components/sensor/mcp9600, mcp9600.jpg, All types - Weight ****** + .. imgtable:: HX711, components/sensor/hx711, hx711.jpg, Load cell amplifier @@ -464,17 +535,18 @@ Binary Sensors are split into categories. If a sensor fits into more than one ca Core **** + .. imgtable:: Binary Sensor Core, components/binary_sensor/index, folder-open.svg, dark-invert - Custom Binary Sensor, components/binary_sensor/custom, language-cpp.svg, dark-invert + Template Binary Sensor, components/binary_sensor/template, description.svg, dark-invert GPIO, components/binary_sensor/gpio, pin.svg, dark-invert Home Assistant, components/binary_sensor/homeassistant, home-assistant.svg, dark-invert Status, components/binary_sensor/status, server-network.svg, dark-invert - Template Binary Sensor, components/binary_sensor/template, description.svg, dark-invert Capacitive Touch **************** + .. imgtable:: CAP1188 Capacitive Touch Sensor, components/binary_sensor/cap1188, cap1188.jpg @@ -484,14 +556,15 @@ Capacitive Touch Mechanical ********** + .. imgtable:: Matrix Keypad, components/matrix_keypad, matrix_keypad.jpg TM1637, components/display/tm1637, tm1637.jpg TM1638, components/display/tm1638, tm1638.jpg -NFC/RFID Components -******************* +NFC/RFID +******** Often known as "tag" or "card" readers within the community. @@ -503,29 +576,33 @@ Often known as "tag" or "card" readers within the community. PN716X, components/pn7160, pn716x.jpg RC522, components/binary_sensor/rc522, rc522.jpg RDM6300, components/binary_sensor/rdm6300, rdm6300.jpg + Wiegand Reader, components/wiegand, wiegand.jpg Touchscreen *********** + .. imgtable:: - Nextion Binary Sensor, components/binary_sensor/nextion, nextion.jpg - Touchscreen, components/touchscreen/index, touch.svg, dark-invert - TT21100, components/touchscreen/tt21100, esp32-s3-korvo-2-lcd.png + Touchscreen Core, components/touchscreen/index, touch.svg, dark-invert FT5X06, components/touchscreen/ft5x06, indicator.jpg GT911, components/touchscreen/gt911, esp32_s3_box_3.png + Nextion Binary Sensor, components/binary_sensor/nextion, nextion.jpg + TT21100, components/touchscreen/tt21100, esp32-s3-korvo-2-lcd.png Presence Detection ****************** + .. imgtable:: - DFRobot mmWave Radar, components/dfrobot_sen0395, dfrobot_sen0395.jpg AT581X, components/at581x, at581x.png + DFRobot mmWave Radar, components/dfrobot_sen0395, dfrobot_sen0395.jpg LD2410, components/sensor/ld2410, ld2410.jpg LD2420, components/sensor/ld2420, ld2420.jpg Seeed Studio MR24HPC1 mmWave, components/seeed_mr24hpc1, seeed-mr24hpc1.jpg Miscellaneous ************* + .. imgtable:: Analog Threshold, components/binary_sensor/analog_threshold, analog_threshold.svg, dark-invert @@ -546,36 +623,35 @@ Output Components .. imgtable:: Output Core, components/output/index, folder-open.svg, dark-invert - ESP8266 Software PWM, components/output/esp8266_pwm, pwm.png - Slow PWM, components/output/slow_pwm, pwm.png - GPIO Output, components/output/gpio, pin.svg, dark-invert + Template Output, components/output/template, description.svg, dark-invert + AC Dimmer, components/output/ac_dimmer, ac_dimmer.svg, dark-invert + BLE Binary Output, components/output/ble_client, bluetooth.svg, dark-invert + BP1658CJ, components/output/bp1658cj, bp1658cj.svg + BP5758D, components/output/bp5758d, bp5758d.svg + DAC7678, components/output/dac7678, dac7678.svg + EMC2101, components/emc2101, emc2101.jpg ESP32 DAC, components/output/esp32_dac, dac.svg ESP32 LEDC, components/output/ledc, pwm.png + ESP8266 Software PWM, components/output/esp8266_pwm, pwm.png + GP8403, components/output/gp8403, gp8403.svg + GPIO Output, components/output/gpio, pin.svg, dark-invert LibreTiny PWM, components/output/libretiny_pwm, pwm.png - AC Dimmer, components/output/ac_dimmer, ac_dimmer.svg, dark-invert - PCA9685, components/output/pca9685, pca9685.jpg - TLC59208F, components/output/tlc59208f, tlc59208f.jpg - TLC5947, components/output/tlc5947, tlc5947.jpg - TLC5971, components/output/tlc5971, tlc5971.jpg + MCP4725, components/output/mcp4725, mcp4725.jpg + MCP4728, components/output/mcp4728, mcp4728.jpg + MCP47A1, components/output/mcp47a1, mcp47a1.svg + Modbus Output, components/output/modbus_controller, modbus.png MY9231/MY9291, components/output/my9231, my9231.svg + PCA9685, components/output/pca9685, pca9685.jpg + Sigma-Delta Output, components/output/sigma_delta_output, sigma-delta.svg, dark-invert + Slow PWM, components/output/slow_pwm, pwm.png SM16716, components/output/sm16716, sm16716.svg SM2135, components/output/sm2135, sm2135.svg SM2235, components/output/sm2235, sm2235.svg SM2335, components/output/sm2335, sm2335.svg - MCP4725, components/output/mcp4725, mcp4725.jpg - MCP4728, components/output/mcp4728, mcp4728.jpg - MCP47A1, components/output/mcp47a1, mcp47a1.svg - DAC7678, components/output/dac7678, dac7678.svg - BLE Binary Output, components/output/ble_client, bluetooth.svg, dark-invert - Modbus Output, components/output/modbus_controller, modbus.png - Custom Output, components/output/custom, language-cpp.svg, dark-invert - Sigma-Delta Output, components/output/sigma_delta_output, sigma-delta.svg, dark-invert - Template Output, components/output/template, description.svg, dark-invert - BP1658CJ, components/output/bp1658cj, bp1658cj.svg - BP5758D, components/output/bp5758d, bp5758d.svg + TLC59208F, components/output/tlc59208f, tlc59208f.jpg + TLC5947, components/output/tlc5947, tlc5947.jpg + TLC5971, components/output/tlc5971, tlc5971.jpg X9C Potentiometer, components/output/x9c, x9c.jpg - GP8403, components/output/gp8403, gp8403.svg - EMC2101, components/emc2101, emc2101.jpg Light Components ---------------- @@ -584,33 +660,29 @@ Light Components Light Core, components/light/index, folder-open.svg, dark-invert Binary Light, components/light/binary, lightbulb.svg, dark-invert - Status Led, components/light/status_led, led-on.svg, dark-invert - Monochromatic Light, components/light/monochromatic, brightness-medium.svg, dark-invert - Cold+Warm White Light, components/light/cwww, brightness-medium.svg, dark-invert Color Temperature Light, components/light/color_temperature, brightness-medium.svg, dark-invert + ESP32 RMT, components/light/esp32_rmt_led_strip, color_lens.svg, dark-invert + FastLED Light, components/light/fastled, color_lens.svg, dark-invert + H-bridge Light, components/light/hbridge, brightness-medium.svg, dark-invert + Light Partition, components/light/partition, color_lens.svg, dark-invert + LightWaveRF, components/lightwaverf, brightness-medium.svg + Monochromatic Light, components/light/monochromatic, brightness-medium.svg, dark-invert + NeoPixelBus Light, components/light/neopixelbus, color_lens.svg, dark-invert RGB Light, components/light/rgb, rgb.png + RGBCT Light, components/light/rgbct, rgbw.png RGBW Light, components/light/rgbw, rgbw.png RGBWW Light, components/light/rgbww, rgbw.png - RGBCT Light, components/light/rgbct, rgbw.png - - ESP32 RMT, components/light/esp32_rmt_led_strip, color_lens.svg, dark-invert RP2040 PIO, components/light/rp2040_pio_led_strip, color_lens.svg, dark-invert - FastLED Light, components/light/fastled, color_lens.svg, dark-invert - NeoPixelBus Light, components/light/neopixelbus, color_lens.svg, dark-invert - Light Partition, components/light/partition, color_lens.svg, dark-invert - SPI LED Strips, components/light/spi_led_strip, apa102.jpg - - Tuya Dimmer, components/light/tuya, tuya.png Shelly Dimmer, components/light/shelly_dimmer, shellydimmer2.jpg - Custom Light, components/light/custom, language-cpp.svg, dark-invert - LightWaveRF, components/lightwaverf, brightness-medium.svg - - H-bridge Light, components/light/hbridge, brightness-medium.svg, dark-invert Sonoff D1 Dimmer, components/light/sonoff_d1, sonoff_d1.jpg + SPI LED Strips, components/light/spi_led_strip, apa102.jpg + Status Led, components/light/status_led, led-on.svg, dark-invert + Tuya Dimmer, components/light/tuya, tuya.png -Looking for WS2811 and similar individually addressable lights? Have a look at the -:doc:`FastLED Light `. +**Looking for WS2811 and similar individually addressable lights?** For the ESP32 and its variants, we +recommend the :doc:`components/light/esp32_rmt_led_strip` or :doc:`components/light/spi_led_strip`; for +other processors, have a look at the :doc:`FastLED Light `. Switch Components ----------------- @@ -618,19 +690,18 @@ Switch Components .. imgtable:: Switch Core, components/switch/index, folder-open.svg, dark-invert + Template Switch, components/switch/template, description.svg, dark-invert + BLE Client Switch, components/switch/ble_client, bluetooth.svg, dark-invert + Factory Reset Switch, components/switch/factory_reset, restart-alert.svg, dark-invert + Generic Output Switch, components/switch/output, upload.svg, dark-invert GPIO Switch, components/switch/gpio, pin.svg, dark-invert + Modbus Switch, components/switch/modbus_controller, modbus.png + Nextion Switch, components/switch/nextion, nextion.jpg Restart Switch, components/switch/restart, restart.svg, dark-invert Safe Mode Switch, components/switch/safe_mode, restart-alert.svg, dark-invert Shutdown Switch, components/switch/shutdown, power_settings.svg, dark-invert - Factory Reset Switch, components/switch/factory_reset, restart-alert.svg, dark-invert - Generic Output Switch, components/switch/output, upload.svg, dark-invert - Template Switch, components/switch/template, description.svg, dark-invert - UART Switch, components/switch/uart, uart.svg - Custom Switch, components/switch/custom, language-cpp.svg, dark-invert Tuya Switch, components/switch/tuya, tuya.png - Modbus Switch, components/switch/modbus_controller, modbus.png - BLE Client Switch, components/switch/ble_client, bluetooth.svg, dark-invert - Nextion Switch, components/switch/nextion, nextion.jpg + UART Switch, components/switch/uart, uart.svg Button Components ----------------- @@ -639,14 +710,13 @@ Button Components Button Core, components/button/index, folder-open.svg, dark-invert Template Button, components/button/template, description.svg, dark-invert + Factory Reset Button, components/button/factory_reset, restart-alert.svg, dark-invert Generic Output Button, components/button/output, upload.svg, dark-invert Restart Button, components/button/restart, restart.svg, dark-invert Safe Mode Button, components/button/safe_mode, restart-alert.svg, dark-invert Shutdown Button, components/button/shutdown, power_settings.svg, dark-invert - Factory Reset Button, components/button/factory_reset, restart-alert.svg, dark-invert - Wake-on-LAN, components/button/wake_on_lan, power_settings.svg, dark-invert UART Button, components/button/uart, uart.svg - + Wake-on-LAN, components/button/wake_on_lan, power_settings.svg, dark-invert Fan Components -------------- @@ -654,11 +724,11 @@ Fan Components .. imgtable:: Fan Core, components/fan/index, folder-open.svg, dark-invert + Template Fan, components/fan/template, description.svg, dark-invert Binary Fan, components/fan/binary, fan.svg, dark-invert H-bridge Fan, components/fan/hbridge, fan.svg, dark-invert Speed Fan, components/fan/speed, fan.svg, dark-invert Tuya Fan, components/fan/tuya, tuya.png - Template Fan, components/fan/template, description.svg, dark-invert Display Components ------------------ @@ -666,7 +736,17 @@ Display Components .. imgtable:: Display Core, components/display/index, folder-open.svg, dark-invert + Display Menu Core, components/display_menu/index, folder-open.svg, dark-invert Font Renderer, components/display/fonts, format-font.svg, dark-invert + + Graphical Display Menu, components/display_menu/graphical_display_menu, graphical_display_menu.png + LCD Menu, components/display_menu/lcd_menu, lcd_menu.png + +Display Hardware Platforms +-------------------------- + +.. imgtable:: + Addressable Light, components/display/addressable_light, addressable_light.jpg ILI9xxx, components/display/ili9xxx, ili9341.jpg ILI9341, components/display/ili9xxx, ili9341.svg @@ -675,15 +755,14 @@ Display Components ILI9486, components/display/ili9xxx, ili9341.jpg ILI9488, components/display/ili9xxx, ili9488.svg WSPICOLCD, components/display/ili9xxx, ili9488.svg - Inkplate, components/display/inkplate6, inkplate6.jpg LCD Display, components/display/lcd_display, lcd.jpg - MAX7219, components/display/max7219, max7219.jpg MAX7219 Dot Matrix, components/display/max7219digit, max7219digit.jpg + MAX7219, components/display/max7219, max7219.jpg Nextion, components/display/nextion, nextion.jpg PCD8544 (Nokia 5110/ 3310), components/display/pcd8544, pcd8544.jpg - Quad SPI AMOLED, components/display/qspi_amoled, t4-s3.jpg PVVX MiThermometer, components/display/pvvx_mithermometer, ../components/sensor/images/xiaomi_lywsd03mmc.jpg + Quad SPI AMOLED, components/display/qspi_amoled, t4-s3.jpg RPI_DPI_RGB, components/display/rpi_dpi_rgb, waveshare_touch-s3.jpg SSD1306, components/display/ssd1306, ssd1306.jpg SSD1322, components/display/ssd1322, ssd1322.jpg @@ -692,14 +771,15 @@ Display Components SSD1331, components/display/ssd1331, ssd1331.jpg SSD1351, components/display/ssd1351, ssd1351.jpg ST7567, components/display/st7567, st7567.jpg - ST7735, components/display/st7735, st7735.jpg ST7701S, components/display/st7701s, indicator.jpg + ST7735, components/display/st7735, st7735.jpg ST7789V, components/display/st7789v, st7789v.jpg ST7796, components/display/ili9xxx, st7796.svg ST7920, components/display/st7920, st7920.jpg TM1621, components/display/tm1621, tm1621.jpg TM1637, components/display/tm1637, tm1637.jpg TM1638, components/display/tm1638, tm1638.jpg + TM1651 Battery Display, components/tm1651, tm1651_battery_display.jpg Waveshare E-Paper, components/display/waveshare_epaper, waveshare_epaper.jpg Touchscreen Components @@ -708,14 +788,14 @@ Touchscreen Components .. imgtable:: Touchscreen Core, components/touchscreen/index, folder-open.svg, dark-invert + CST226, components/touchscreen/cst226, t4-s3.jpg CST816, components/touchscreen/cst816, cst816.jpg EKTF2232, components/touchscreen/ektf2232, ektf2232.svg, Inkplate 6 Plus + FT63X6, components/touchscreen/ft63x6, wt32-sc01.png + GT911, components/touchscreen/gt911, esp32_s3_box_3.png Lilygo T5 4.7", components/touchscreen/lilygo_t5_47, lilygo_t5_47_touch.jpg TT21100, components/touchscreen/tt21100, esp32-s3-korvo-2-lcd.png XPT2046, components/touchscreen/xpt2046, xpt2046.jpg - CST226, components/touchscreen/cst226, t4-s3.jpg - GT911, components/touchscreen/gt911, esp32_s3_box_3.png - FT63X6, components/touchscreen/ft63x6, wt32-sc01.png Cover Components ---------------- @@ -724,14 +804,21 @@ Cover Components Cover Core, components/cover/index, folder-open.svg, dark-invert Template Cover, components/cover/template, description.svg, dark-invert - Feedback Cover, components/cover/feedback, feedback_cover.svg, dark-invert - Endstop Cover, components/cover/endstop, electric-switch.svg, dark-invert - Current-Based Cover, components/cover/current_based, flash.svg, dark-invert - Time-Based Cover, components/cover/time_based, timer.svg, dark-invert - Custom Cover, components/cover/custom, language-cpp.svg, dark-invert AM43 Cover, components/cover/am43, am43.jpg - Tuya Cover, components/cover/tuya, tuya.png + Current-Based Cover, components/cover/current_based, flash.svg, dark-invert + Endstop Cover, components/cover/endstop, electric-switch.svg, dark-invert + Feedback Cover, components/cover/feedback, feedback_cover.svg, dark-invert HE60R Cover, components/cover/he60r, he60r.jpg + Time-Based Cover, components/cover/time_based, timer.svg, dark-invert + Tuya Cover, components/cover/tuya, tuya.png + +Text Components +--------------- + +.. imgtable:: + + Text Core, components/text/index, folder-open.svg, dark-invert + Template Text, components/text/template, description.svg, dark-invert Text Sensor Components ---------------------- @@ -739,20 +826,19 @@ Text Sensor Components .. imgtable:: Text Sensor Core, components/text_sensor/index, folder-open.svg, dark-invert - Home Assistant, components/text_sensor/homeassistant, home-assistant.svg, dark-invert - MQTT Subscribe Text, components/text_sensor/mqtt_subscribe, mqtt.png - Version, components/text_sensor/version, new-box.svg, dark-invert - WiFi Info, components/text_sensor/wifi_info, network-wifi.svg, dark-invert - Ethernet Info, components/text_sensor/ethernet_info, ethernet.svg, dark-invert - BLE Scanner, components/text_sensor/ble_scanner, bluetooth.svg, dark-invert - Modbus Text Sensor, components/text_sensor/modbus_controller, modbus.png Template Text Sensor, components/text_sensor/template, description.svg, dark-invert - Custom Text Sensor, components/text_sensor/custom, language-cpp.svg, dark-invert + BLE Scanner, components/text_sensor/ble_scanner, bluetooth.svg, dark-invert + Ethernet Info, components/text_sensor/ethernet_info, ethernet.svg, dark-invert + Home Assistant, components/text_sensor/homeassistant, home-assistant.svg, dark-invert + LibreTiny, components/text_sensor/libretiny, libretiny.svg + Modbus Text Sensor, components/text_sensor/modbus_controller, modbus.png + MQTT Subscribe Text, components/text_sensor/mqtt_subscribe, mqtt.png Nextion Text Sensor, components/text_sensor/nextion, nextion.jpg Tuya Text Sensor, components/text_sensor/tuya, tuya.png - WL-134 Pet Tag Sensor , components/text_sensor/wl_134, fingerprint.svg, dark-invert - LibreTiny, components/text_sensor/libretiny, libretiny.svg + Version, components/text_sensor/version, new-box.svg, dark-invert + WiFi Info, components/text_sensor/wifi_info, network-wifi.svg, dark-invert WireGuard, components/wireguard, wireguard_custom_logo.svg + WL-134 Pet Tag Sensor , components/text_sensor/wl_134, fingerprint.svg, dark-invert Climate Components ------------------ @@ -760,16 +846,15 @@ Climate Components .. imgtable:: Climate Core, components/climate/index, folder-open.svg, dark-invert - Bang Bang Controller, components/climate/bang_bang, air-conditioner.svg, dark-invert - Thermostat Controller, components/climate/thermostat, air-conditioner.svg, dark-invert - Custom Climate, components/climate/custom, language-cpp.svg, dark-invert - PID Controller, components/climate/pid, function.svg, dark-invert - IR Remote Climate, components/climate/climate_ir, air-conditioner-ir.svg, dark-invert - Tuya Climate, components/climate/tuya, tuya.png - Midea, components/climate/midea, midea.svg Anova Cooker, components/climate/anova, anova.png + Bang Bang Controller, components/climate/bang_bang, air-conditioner.svg, dark-invert BedJet Climate System, components/climate/bedjet, bedjet.png Haier Climate, components/climate/haier, haier.svg + IR Remote Climate, components/climate/climate_ir, air-conditioner-ir.svg, dark-invert + Midea, components/climate/midea, midea.svg + PID Controller, components/climate/pid, function.svg, dark-invert + Thermostat Controller, components/climate/thermostat, air-conditioner.svg, dark-invert + Tuya Climate, components/climate/tuya, tuya.png Uponor Smatrix Base Pulse Underfloor Heating, components/uponor_smatrix, uponor.svg Number Components @@ -778,8 +863,8 @@ Number Components .. imgtable:: Number Core, components/number/index, folder-open.svg, dark-invert - Modbus Number, components/number/modbus_controller, modbus.png Template Number, components/number/template, description.svg, dark-invert + Modbus Number, components/number/modbus_controller, modbus.png Tuya Number, components/number/tuya, tuya.png Select Components @@ -798,16 +883,8 @@ Lock Components .. imgtable:: Lock Core, components/lock/index, folder-open.svg, dark-invert - Generic Output Lock, components/lock/output, upload.svg, dark-invert Template Lock, components/lock/template, description.svg, dark-invert - -Text Components ---------------- - -.. imgtable:: - - Text Core, components/text/index, folder-open.svg, dark-invert - Template Text, components/text/template, description.svg, dark-invert + Generic Output Lock, components/lock/output, upload.svg, dark-invert Media Player Components ----------------------- @@ -815,6 +892,7 @@ Media Player Components .. imgtable:: Media Player Core, components/media_player/index, folder-open.svg, dark-invert + DFPlayer, components/dfplayer, dfplayer.svg, dark-invert I2S Audio, components/media_player/i2s_audio, i2s_audio.svg Microphone Components @@ -839,24 +917,26 @@ Time Components .. imgtable:: Time Core, components/time/index, clock-outline.svg, dark-invert - Home Assistant Time, components/time/homeassistant, home-assistant.svg, dark-invert - SNTP, components/time/sntp, clock-outline.svg, dark-invert - GPS Time, components/time/gps, crosshairs-gps.svg, dark-invert DS1307 RTC, components/time/ds1307, clock-outline.svg, dark-invert - PCF8563 RTC, components/time/pcf8563, clock-outline.svg, dark-invert + GPS Time, components/time/gps, crosshairs-gps.svg, dark-invert + Home Assistant Time, components/time/homeassistant, home-assistant.svg, dark-invert PCF85063 RTC, components/time/pcf85063, clock-outline.svg, dark-invert + PCF8563 RTC, components/time/pcf8563, clock-outline.svg, dark-invert + SNTP, components/time/sntp, clock-outline.svg, dark-invert -Home Assistant Companion Components ------------------------------------ +Home Assistant Components +------------------------- + +Components specifically for interacting with Home Assistant. .. imgtable:: + Binary Sensor, components/binary_sensor/homeassistant, home-assistant.svg, dark-invert Bluetooth Proxy, components/bluetooth_proxy, bluetooth.svg, dark-invert - Voice Assistant, components/voice_assistant, voice-assistant.svg, dark-invert micro Wake Word, components/micro_wake_word, voice-assistant.svg, dark-invert Sensor, components/sensor/homeassistant, home-assistant.svg, dark-invert Text Sensor, components/text_sensor/homeassistant, home-assistant.svg, dark-invert - Binary Sensor, components/binary_sensor/homeassistant, home-assistant.svg, dark-invert + Voice Assistant, components/voice_assistant, voice-assistant.svg, dark-invert Alarm Control Panel Components @@ -875,81 +955,75 @@ Datetime Components Datetime Core, components/datetime/index, clock-outline.svg, dark-invert Template Datetime, components/datetime/template, description.svg, dark-invert +Energy/Solar Management +----------------------- + +.. imgtable:: + + PipSolar-compatible PV Inverter, components/pipsolar, pipsolar.jpg + Power Supply, components/power_supply, power.svg, dark-invert + Resol VBus, components/vbus, resol_deltasol_bs_plus.jpg + SML, components/sml, sml.svg + SUN-GTIL2 inverter, components/sun_gtil2, sun_1000g2.png + +Electromechanical +----------------- + +.. imgtable:: + + Atlas Scientific Peristaltic Pump, components/ezo_pmp, ezo-pmp.jpg + Grove TB6612FNG, components/grove_tb6612fng, motor.png + Matrix Keypad, components/matrix_keypad, matrix_keypad.jpg + RTTTL Buzzer, components/rtttl, buzzer.jpg + Servo, components/servo, servo.svg + Stepper, components/stepper/index, stepper.svg + +Wireless Communication +---------------------- + +Wireless communication that is **not Wi-Fi.** + +.. imgtable:: + + IR Remote Climate, components/climate/climate_ir, air-conditioner-ir.svg, dark-invert + Remote Receiver, components/remote_receiver, remote.svg, dark-invert + Remote Transmitter, components/remote_transmitter, remote.svg, dark-invert + RF Bridge, components/rf_bridge, rf_bridge.jpg + SIM800L, components/sim800l, sim800l.jpg + Miscellaneous Components ------------------------ .. imgtable:: - Remote Receiver, components/remote_receiver, remote.svg, dark-invert - Remote Transmitter, components/remote_transmitter, remote.svg, dark-invert - Status LED, components/status_led, led-on.svg, dark-invert - Display Menu Core, components/display_menu/index, folder-open.svg, dark-invert - LCD Menu, components/display_menu/lcd_menu, lcd_menu.png - Graphical Display Menu, components/display_menu/graphical_display_menu, graphical_display_menu.png - Matrix Keypad, components/matrix_keypad, matrix_keypad.jpg - Wiegand Reader, components/wiegand, wiegand.jpg - HTTP Request, components/http_request, connection.svg, dark-invert - mDNS, components/mdns, radio-tower.svg, dark-invert - - Sun, components/sun, weather-sunny.svg, dark-invert - GPS, components/gps, crosshairs-gps.svg, dark-invert - - Bluetooth Proxy, components/bluetooth_proxy, bluetooth.svg, dark-invert - ESP32 BLE Client, components/ble_client, bluetooth.svg, dark-invert - ESP32 BLE Tracker, components/esp32_ble_tracker, bluetooth.svg, dark-invert - ESP32 BLE Beacon, components/esp32_ble_beacon, bluetooth.svg, dark-invert - - ESP32 Ethernet, components/ethernet, ethernet.svg, dark-invert ESP32 Camera, components/esp32_camera, camera.svg, dark-invert - ESP32 Camera Web Server, components/esp32_camera_web_server, camera.svg, dark-invert - - I²S Audio, components/i2s_audio, i2s_audio.svg - - Stepper, components/stepper/index, stepper.svg - Servo, components/servo, servo.svg - Sprinkler, components/sprinkler, sprinkler-variant.svg, dark-invert - Grove TB6612FNG, components/grove_tb6612fng, motor.png - - PCA6416A I/O Expander, components/pca6416a, pca6416a.svg - PCA9554 I/O Expander, components/pca9554, pca9554a.jpg - PCF8574 I/O Expander, components/pcf8574, pcf8574.jpg - MAX6956 I/O expander - I²C Bus, components/max6956, max6956.jpg - MCP230XX I/O Expander - I²C Bus, components/mcp230xx, mcp230xx.svg - TCA9548A I²C Multiplexer, components/tca9548a, tca9548a.jpg - MCP23SXX I/O Expander - SPI Bus, components/mcp23Sxx, mcp230xx.svg - SX1509 I/O Expander, components/sx1509, sx1509.jpg - SN74HC165 I/O Expander, components/sn74hc165, sn74hc595.jpg - SN74HC595 I/O Expander, components/sn74hc595, sn74hc595.jpg - XL9535 I/O Expander, components/xl9535, xl9535.svg - SIM800L, components/sim800l, sim800l.jpg - DFPlayer, components/dfplayer, dfplayer.svg, dark-invert - Captive Portal, components/captive_portal, wifi-strength-alert-outline.svg, dark-invert - Improv via BLE, components/esp32_improv, improv.svg, dark-invert - Improv via Serial, components/improv_serial, improv.svg, dark-invert - Debug Component, components/debug, bug-report.svg, dark-invert - TM1651 Battery Display, components/tm1651, tm1651_battery_display.jpg - RF Bridge, components/rf_bridge, rf_bridge.jpg - Tuya MCU, components/tuya, tuya.png - Modbus Controller, components/modbus_controller, modbus.png Exposure Notifications, components/exposure_notifications, exposure_notifications.png - RTTTL Buzzer, components/rtttl, buzzer.jpg - Prometheus, components/prometheus, prometheus.svg - PipSolar - compatible PV Inverter, components/pipsolar, pipsolar.jpg + GPS, components/gps, crosshairs-gps.svg, dark-invert Grow Fingerprint Reader, components/fingerprint_grow, fingerprint.svg, dark-invert - SML, components/sml, sml.svg - SUN-GTIL2 inverter, components/sun_gtil2, sun_1000g2.png - Atlas Scientific Peristaltic Pump, components/ezo_pmp, ezo-pmp.jpg - Resol VBus, components/vbus, resol_deltasol_bs_plus.jpg - WireGuard, components/wireguard, wireguard_custom_logo.svg - Demo, components/demo, description.svg, dark-invert - Copy, components/copy, content-copy.svg, dark-invert + Modbus Controller, components/modbus_controller, modbus.png + Sprinkler, components/sprinkler, sprinkler-variant.svg, dark-invert + Status LED, components/status_led, led-on.svg, dark-invert + Sun, components/sun, weather-sunny.svg, dark-invert + Tuya MCU, components/tuya, tuya.png -Additional Custom Components ----------------------------- +Custom Components +----------------- + +**Note: Custom Components are deprecated in favor of** :doc:`components/external_components`! .. imgtable:: Generic Custom Component, custom/custom_component, language-cpp.svg, dark-invert + + Custom Binary Sensor, components/binary_sensor/custom, language-cpp.svg, dark-invert + Custom Climate, components/climate/custom, language-cpp.svg, dark-invert + Custom Cover, components/cover/custom, language-cpp.svg, dark-invert + Custom Light, components/light/custom, language-cpp.svg, dark-invert + Custom Output, components/output/custom, language-cpp.svg, dark-invert + Custom Sensor, components/sensor/custom, language-cpp.svg, dark-invert + Custom Switch, components/switch/custom, language-cpp.svg, dark-invert + Custom Text Sensor, components/text_sensor/custom, language-cpp.svg, dark-invert + Custom I²C Component, custom/i2c, language-cpp.svg, dark-invert Custom SPI Component, custom/spi, language-cpp.svg, dark-invert Custom UART Component, custom/uart, language-cpp.svg, dark-invert From 0559ef14fbd526706989b2c5e9ba86e889f00ef5 Mon Sep 17 00:00:00 2001 From: Jean Louis-Guerin Date: Wed, 24 Apr 2024 03:21:48 +0200 Subject: [PATCH 12/34] Add WeiKai component documentation (#3113) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Keith Burzinski Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Co-authored-by: H. Árkosi Róbert --- components/images/DFR0627.jpg | Bin 0 -> 112830 bytes components/weikai.rst | 340 ++++++++++++++++++++++++++++++++++ images/wk2168.jpg | Bin 0 -> 18827 bytes index.rst | 1 + 4 files changed, 341 insertions(+) create mode 100644 components/images/DFR0627.jpg create mode 100644 components/weikai.rst create mode 100644 images/wk2168.jpg diff --git a/components/images/DFR0627.jpg b/components/images/DFR0627.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5a112ccc9568a2ae02dd82f6b7a83f2d8c9b7bef GIT binary patch literal 112830 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 literal 0 HcmV?d00001 diff --git a/components/weikai.rst b/components/weikai.rst new file mode 100644 index 000000000..eec22c4e6 --- /dev/null +++ b/components/weikai.rst @@ -0,0 +1,340 @@ +WeiKai SPI/I²C UART/IO Expander +=============================== + +.. seo:: + :description: Instructions for setting up WeiKai SPI/I²C to UART Expanders in ESPHome. + :image: wk2168.jpg + :keywords: UART, SPI, I²C, WK2132, WK2168, WK2204, WK2212, wk2124 + +**WeiKai Microelectronics** provides a family of UART & GPIO expansion chips +that interfaces to a micro-controller through SPI or I²C bus. + +The ESPHome ``WeiKai`` component supports the following WeiKai chips: + +- `WK2168-IQPG `__ +- `WK2132-ISSG `__ +- `WK2124-ISSG `__ +- `WK2204-IQNG `__ +- `WK2212-IQNG `__ + +It can also be used with evaluation board equipped with these chips, such as: + +- `WK2168 Chip Development Board `__ +- `WK2132 Chip Development Board `__ +- `DFROBOT Gravity: I²C to Dual UART Module `__ + +.. figure:: images/DFR0627.jpg + :align: center + +The features provided by the different WeiKai chips are described in the following table: + +.. list-table:: WeiKai chip's features + :header-rows: 1 + :width: 450px + :align: center + + * - Chip + - Bus + - UART + - GPIO + * - WK2132-ISSG + - S/I + - 2 + - + * - WK2212-IQNG + - S/I + - 2 + - 8 + * - WK2124-ISSG + - S + - 4 + - + * - WK2204-IQNG + - S/I + - 4 + - + * - WK2168-IQPG + - S/I + - 4 + - 8 + +As you can see most of the components can interface either through an I²C bus or a SPI bus, +they provide either 2 or 4 serial channels, and some provide 8 input/output pins. + +Each UART channel has two independent 256-byte FIFO hardware buffers to transmit and +receive and support data transmission rates up to 1 Mbps. +The baud rate and parity format of each UART channel can be configured independently. +However, the data bit length is fixed at 8. + +Utilizing the UART channels enables you to connect your UART devices, with each channel functioning +as a virtual UART bus for the connected component. + +The I/O pins of the WeiKai chips can be use as any of the other GPIO pins. +Any option accepting a :ref:`Pin Schema ` can theoretically +be used, but some more complicated components that do communication through +this I/O expander might not work. + +Connecting via an SPI bus +------------------------- + +The ``wk2132_spi``, ``wk2212_spi``, ``wk2204_spi``, ``wk2168_spi`` components allows +you to connect the WeiKai chip with ESPHome via a :ref:`SPI ` bus. + +You can connect several of these modules to a single SPI controller circuit effectively expanding +the number of hardware serial ports available. Each WeiKai chip needs to be selected +with a individual CS. + +Here is an example of configuration entry for a wk2168_spi component. For the other components +in the list just replace the name of the component and make sure you do not use more channels that the chip +can support (an error message will be generated otherwise). Note that for the ``WK2124-ISSG`` chip +you need to use ``wk2204_spi`` as the two chips are similar. + +.. code-block:: yaml + + wk2168_spi: + - id: wk2168_bridge_spi + cs_pin: 5 + uart: + - id: spi_uart_0 + channel: 0 + baud_rate: 128200 + parity: even + - id: spi_uart_1 + channel: 1 + baud_rate: 19200 + - id: spi_uart_2 + channel: 2 + baud_rate: 9600 + - id: spi_uart_3 + channel: 3 + baud_rate: 19200 + +Configuration variables: +************************ + +- **id** (**Required**, :ref:`config-id`): The id to use for this WeiKai component. +- **spi_id** (*Optional*, :ref:`config-id`): Manually specify the ID of the :ref:`SPI Component ` if you want + to use multiple SPI buses. +- **cs_pin** (**Required**, :ref:`Pin Schema `): The pin on the ESP that the chip select line + of the chip is connected to. +- **data_rate** (*Optional*): Set the data rate of the controller. One of ``80MHz``, ``40MHz``, ``20MHz``, ``10MHz``, + ``5MHz``, ``4MHz``, ``2MHz``, ``1MHz`` (default), ``200kHz``, ``75kHz`` or ``1kHz``. A numeric value in Hz can + alternatively be specified. +- **crystal** (*Optional*): The frequency in Hz of the crystal connected to the chip. + The default value is 14745600 Hz. +- **uart** (**Required**): The UART channels. + + - **id** (**Required**, :ref:`config-id`): The id to use for this UART channel. + - **channel** (**Required**): Unique channel number of this virtual UART. + Options: ``0`` to ``1`` or ``0`` to ``3`` depending on the model. + - **baud_rate** (**Required**): The baud rate of the UART channel. + - **parity** (*Optional*): The parity used on the UART channel. Options: ``NONE``, ``EVEN``, + ``ODD``. Defaults to ``NONE``. + - **stop_bits** (*Optional*): The number of stop bits to send. Options: ``1``, ``2``. + Defaults to ``1``. + +Connecting via an I²C bus +------------------------- + +The ``wk2132_i2c`` ``wk2212_i2c`` ``wk2204_i2c`` ``wk2168_i2c`` components allows you +to connect the WeiKai chip with ESPHome via an :ref:`I²C ` bus. +Up to four WeiKai chips can be connected to an I²C controller board, effectively expanding the +available hardware serial ports. The base addresses of these boards are defined by the +positions of two switches, A0 and A1, on the board. + +.. list-table:: WeiKai address selection + :header-rows: 1 + :width: 350px + :align: center + + * - I²C address + - A1 + - A0 + * - 0x10 - 0x17 + - 0 + - 0 + * - 0x30 - 0x37 + - 0 + - 1 + * - 0x50 - 0x57 + - 1 + - 0 + * - 0x70 - 0x77 + - 1 + - 1 + +.. important:: + + Note that the address is given as a **range** a not a number as you usually find on other I²C component. + Indeed due to a peculiar way of addressing the different internal registers each component actually occupy + 8 consecutive addresses. For example if the component base address is 0x10, it will occupy the addresses ranging from + 0x10 to 0x17 on the I²C bus. + + This is important to know if you want to connect other devices on the same I²C bus. + +Here is an example of configuration entry for a ``wk2168_i2c`` component. For the other components +just replace the name of the component and do not use more channels that the chip can +support (an error message will be generated in this case). + +.. code-block:: yaml + + wk2168_i2c: + - address: 0x70 + id: wk2168_bridge_i2c + uart: + - id: i2c_uart_0 + channel: 0 + baud_rate: 9600 + parity: even + - id: i2c_uart_1 + channel: 1 + baud_rate: 19200 + - id: i2c_uart_2 + channel: 2 + baud_rate: 9600 + - id: i2c_uart_3 + channel: 3 + baud_rate: 19200 + +Configuration variables: +************************ + +- **id** (**Required**, :ref:`config-id`): The id to use for this WeiKai component. +- **address** (*Optional*): The I²C address of this component. Defaults to ``0x10``. +- **i2c_id** (*Optional*): The I²C Bus ID. Defaults to the default i²c bus. +- **crystal** (*Optional*): The frequency in Hz of the crystal connected to the chip. + The default value is 14745600 Hz. +- **uart** (*Required*): The UART channels. + + - **id** (**Required**, :ref:`config-id`): The id to use for this UART channel. + - **channel** (**Required**): Unique channel number of this virtual UART. + Options: ``0`` to ``1`` or ``0`` to ``3`` depending on the model. + - **baud_rate** (**Required**): The baud rate of the UART channel. + - **parity** (*Optional*): The parity used on the UART channel. Options: ``NONE``, ``EVEN``, + ``ODD``. Defaults to ``NONE``. + - **stop_bits** (*Optional*): The number of stop bits to send. Options: ``1``, ``2``. + Defaults to ``1``. + +Using the GPIO pins +------------------- + +For the ``WK2212``, and ``WK2168`` it is possible to use the chip I/O pins as any of the other GPIO pins. +For example for a wk2168_spi chip: + +.. code-block:: yaml + + # individual binary_sensor inputs + binary_sensor: + - platform: gpio + name: "pin_0" + pin: + wk2168_spi: wk2168_bridge_spi + number: 0 + mode: + input: true + - platform: gpio + name: "pin_1" + pin: + wk2168_spi: wk2168_bridge_spi + number: 1 + mode: + input: true + inverted: true + + # Individual binary outputs + switch: + - platform: gpio + name: "pin_2" + pin: + wk2168_spi: wk2168_bridge_spi + number: 2 + mode: + output: true + - platform: gpio + name: "pin_3" + pin: + wk2168_spi: wk2168_bridge_spi + number: 3 + mode: + output: true + inverted: true + +Pin configuration variables: +**************************** + +- **wkxxxx_xxx** (**Required**, :ref:`config-id`): The id of the ``wkxxxx_xxx`` component for the pin. For + example ``wk2212_i2c: wk2168_bridge_spi`` +- **number** (**Required**): The pin number (``0`` to ``7``) +- **inverted** (*Optional*): If all read and written values should be treated as inverted. Defaults to ``false``. +- **mode** (*Optional*): A pin mode to set for the pin at. One of ``INPUT`` or ``OUTPUT``. Default to ``INPUT`` + +Performance considerations: +--------------------------- + +Bus speed +********* + +Please be aware that the communication between the WeiKai chips and the processor occurs on an external bus, +with a relatively low operating frequency. Therefore tasks such as checking the status of the chip's +registers or transferring bytes from the internal FIFOs to the processor may take time. + +To improve this situation, it is strongly recommended to increase the default bus frequency. + +- With a SPI bus this can be done on the WeiKai component by specifying ``data_rate``. For example: + +.. code-block:: yaml + + wk2168_spi: + - id: wk2168_bridge_spi + spi_id: spi_bus_id + cs_pin: 5 + data_rate: 4MHz + +- With an I²C bus this needs to be done on the ``i2c`` declaration and therefore this frequency will + apply to all components connected to this bus. + +.. code-block:: yaml + + i2c: + sda: 21 + scl: 22 + scan: true + id: bus_i2c + frequency: 800kHz + +Maximum Baud rate +***************** + +The maximum baud_rate is proportional to the crystal frequency. The following table +gives the maximum baud_rate at usual system clock: + +.. list-table:: maximum baud rate + :header-rows: 1 + :width: 300px + :align: center + + * - Clock + - Max Bd + * - 14,745,600 Hz + - 921,600 Bd + * - 11,059,200 Hz + - 691,200 Bd + * - 7,372,800 Hz + - 460,800 Bd + * - 3,686,400 Hz + - 230,400 Bd + * - 1,843,200 Hz + - 115,200 Bd + +If you try to use a baud rate superior to the maximum baud_rate an error will be displayed in the +log file and the baud rate will automatically be decreased. + +See Also +-------- + +- :ref:`i2c` +- :ref:`spi` +- :doc:`switch/gpio` +- :doc:`binary_sensor/gpio` +- :apiref:`weika/weika.h` +- :ghedit:`Edit` diff --git a/images/wk2168.jpg b/images/wk2168.jpg new file mode 100644 index 0000000000000000000000000000000000000000..284699c938f5016c21ed1cc85ae30cd1305e2fb4 GIT binary patch literal 18827 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 Q0B+%&QAhD+iU* Date: Tue, 23 Apr 2024 19:35:29 -0700 Subject: [PATCH 13/34] Event components (#3722) Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> --- components/event/index.rst | 147 ++++++++++++++++++++++++++++++++++ components/event/template.rst | 31 +++++++ components/index.rst | 1 + index.rst | 8 ++ schema_doc.py | 1 + 5 files changed, 188 insertions(+) create mode 100644 components/event/index.rst create mode 100644 components/event/template.rst diff --git a/components/event/index.rst b/components/event/index.rst new file mode 100644 index 000000000..85004ac46 --- /dev/null +++ b/components/event/index.rst @@ -0,0 +1,147 @@ +Event Component +=============== + +.. seo:: + :description: Instructions for setting up event components in ESPHome. + :image: folder-open.svg + +ESPHome supports the creation of event entities in Home Assistant. +These entities allow for the triggering of custom events within the Home Assistant ecosystem, +enabling complex automations and integrations. An event entity is represented as a stateless +entity associated with a device that has a pre-defined set of event types which can be +triggered in Home Assistant via automations. + +.. note:: + + Events in ESPHome are designed to trigger an action in Home Assistant, and have a unidirectional flow from ESPHome to Home Assistant. + Home Assistant event entities are different from events on event bus. If you just want to trigger an event on the + Home Assistant event bus, you should use a :ref:`Home Assistant event ` instead. + + +.. note:: + + Home Assistant Core 2024.5 or higher is required for ESPHome event entities to work. + +.. _config-event: + +Base Event Configuration +------------------------ + +Each event in ESPHome needs to be configured with a list of event types it can trigger and an optional device class. + +.. code-block:: yaml + + # Example event configuration + event: + - platform: ... + name: Motion Detected Event + id: my_event + + # Optional variables: + icon: "mdi:motion-sensor" + device_class: "motion" + on_event: + then: + - logger.log: "Event triggered" + +Configuration variables: + +One of ``id`` or ``name`` is required. + +- **id** (**Required**, :ref:`config-id`): Manually specify the ID used for code generation, allowing for further customization or interaction with this event within ESPHome scripts or lambda functions. +- **name** (**Required**, string): The name for the event. + + .. note:: + + If you have a :ref:`friendly_name ` set for your device and + you want the event to use that name, you can set ``name: None``. + +- **icon** (*Optional*, icon): Manually set the icon to use for the event in the frontend. +- **internal** (*Optional*, boolean): Mark this component as internal. Internal components will + not be exposed to the frontend (like Home Assistant). Only specifying an ``id`` without + a ``name`` will implicitly set this to true. +- **disabled_by_default** (*Optional*, boolean): If true, then this entity should not be added to any client's frontend, + (usually Home Assistant) without the user manually enabling it (via the Home Assistant UI). +- **entity_category** (*Optional*, string): The category of the entity. + See https://developers.home-assistant.io/docs/core/entity/#generic-properties + for a list of available options. Set to ``""`` to remove the default entity category. +- **device_class** (*Optional*, string): The device class for the event. The following device classes are supported by event entities: + + - None: Generic event. This is the default and doesn't need to be set. + - ``button``: For remote control buttons. + - ``doorbell``: Specifically for buttons that are used as a doorbell. + - ``motion``: For motion events detected by a motion sensor. + + See https://www.home-assistant.io/integrations/event/#device-class + for a list of available options. + +Automations: + +- **on_event** (*Optional*, :ref:`Automation `): An automation to perform when an event is triggered. + +MQTT options: + +- All other options from :ref:`MQTT Component `. + +Event Automation +---------------- + +.. _event-on_event: + +``on_event`` +************ + +This automation will be triggered when an event of the specified types is triggered. + +.. code-block:: yaml + + event: + - platform: template + # ... + on_event: + then: + - logger.log: "Event Triggered" + +Configuration variables: see :ref:`Automation `. + +``event.trigger`` Action +************************ + +This action allows for the triggering of an event from within an automation. + +.. code-block:: yaml + + - event.trigger: + id: my_event + event_type: "custom_event" + +Configuration variables: + +- **id** (**Required**, :ref:`config-id`): The ID of the event. +- **event_type** (**Required**, string): The type of event to trigger. + +.. _event-lambda_calls: + +lambda Calls +************ + +From :ref:`lambdas `, you can trigger an event. + +- ``trigger(std::string event_type)``: Trigger an event with the specified type. + + .. code-block:: cpp + + // Within lambda, trigger the event. + id(my_event).trigger("custom_event"); + +See Also +-------- + +- :apiref:`event/event.h` +- :ghedit:`Edit` + +.. toctree:: + :maxdepth: 1 + :glob: + + * diff --git a/components/event/template.rst b/components/event/template.rst new file mode 100644 index 000000000..d0a8d5533 --- /dev/null +++ b/components/event/template.rst @@ -0,0 +1,31 @@ +Template Event +============== + +.. seo:: + :description: Instructions for setting up template events that can trigger arbitrary automations when an event occurs. + :image: description.svg + +The ``template`` event platform enables you to define events that trigger specific automations or actions within Home Assistant. These custom events can be utilized to orchestrate complex behaviors across your smart home ecosystem based on conditions or sequences defined in your ESPHome configuration. + +.. code-block:: yaml + + # Example configuration entry + event: + - platform: template + name: "Template Event" + event_types: + - "custom_event_1" + - "custom_event_2" + +Configuration variables: +------------------------ + +- **event_types** (**Required**, list): A list of custom event identifiers that this template event is capable of triggering. These identifiers can be used in Home Assistant automations or ESPHome scripts to perform actions when the event occurs. +- All other options from :ref:`Event `. + +See Also +-------- + +- :doc:`/guides/automations` +- :doc:`/components/event/index` +- :ghedit:`Edit` diff --git a/components/index.rst b/components/index.rst index a3e62fc17..b1f4c8739 100644 --- a/components/index.rst +++ b/components/index.rst @@ -17,6 +17,7 @@ Components sensor/index switch/index button/index + event/index display/index text_sensor/index stepper/index diff --git a/index.rst b/index.rst index 2c6f87d22..3f6bdf1b8 100644 --- a/index.rst +++ b/index.rst @@ -719,6 +719,14 @@ Button Components UART Button, components/button/uart, uart.svg Wake-on-LAN, components/button/wake_on_lan, power_settings.svg, dark-invert +Event Components +----------------- + +.. imgtable:: + + Event Core, components/event/index, folder-open.svg, dark-invert + Template Event, components/event/template, description.svg, dark-invert + Fan Components -------------- diff --git a/schema_doc.py b/schema_doc.py index 36655981a..21042f584 100644 --- a/schema_doc.py +++ b/schema_doc.py @@ -85,6 +85,7 @@ PLATFORMS_TITLES = { "Microphone": "microphone", "Speaker": "speaker", "Alarm Control Panel": "alarm_control_panel", + "Event": "event", } CUSTOM_DOCS = { From ab21cada9386c16715ed5d7f54b2b4bfb6138436 Mon Sep 17 00:00:00 2001 From: rforro Date: Wed, 24 Apr 2024 05:21:12 +0200 Subject: [PATCH 14/34] Include roomba ir in docs (#2767) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Richard Forro Co-authored-by: H. Árkosi Róbert Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> --- components/remote_receiver.rst | 8 ++++++++ components/remote_transmitter.rst | 23 +++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/components/remote_receiver.rst b/components/remote_receiver.rst index d3eb1f6f5..eda32b68c 100644 --- a/components/remote_receiver.rst +++ b/components/remote_receiver.rst @@ -54,6 +54,7 @@ Configuration variables: - **rc5**: Decode and dump RC5 IR codes. - **rc6**: Decode and dump RC6 IR codes. - **rc_switch**: Decode and dump RCSwitch RF codes. + - **roomba**: Decode and dump Roomba infrared codes. - **samsung**: Decode and dump Samsung infrared codes. - **samsung36**: Decode and dump Samsung36 infrared codes. - **sony**: Decode and dump Sony infrared codes. @@ -165,6 +166,9 @@ Automations: - **on_rc_switch** (*Optional*, :ref:`Automation `): An automation to perform when a RCSwitch RF code has been decoded. A variable ``x`` of type :apistruct:`remote_base::RCSwitchData` is passed to the automation for use in lambdas. +- **on_roomba** (*Optional*, :ref:`Automation `): An automation to perform when a + Roomba remote code has been decoded. A variable ``x`` of type :apistruct:`remote_base::RoombaData` + is passed to the automation for use in lambdas. - **on_samsung** (*Optional*, :ref:`Automation `): An automation to perform when a Samsung remote code has been decoded. A variable ``x`` of type :apistruct:`remote_base::SamsungData` is passed to the automation for use in lambdas. @@ -398,6 +402,10 @@ Remote code selection (exactly one of these has to be included): - **state** (**Required**, boolean): The on/off state to trigger on. - **protocol** (*Optional*): The RC Switch protocol to use, see :ref:`remote_transmitter-rc_switch-protocol` for more info. +- **roomba**: Trigger on a decoded Roomba remote code with the given data. + + - **data** (**Required**, int): The Roomba code to trigger on, see dumper output for more info. + - **samsung**: Trigger on a decoded Samsung remote code with the given data. - **data** (**Required**, int): The data to trigger on, see dumper output for more info. diff --git a/components/remote_transmitter.rst b/components/remote_transmitter.rst index 5d34b30b3..5bafd4972 100644 --- a/components/remote_transmitter.rst +++ b/components/remote_transmitter.rst @@ -781,6 +781,29 @@ Configuration variables: for more information. - All other options from :ref:`remote_transmitter-transmit_action`. +.. _remote_transmitter-transmit_roomba: + +``remote_transmitter.transmit_roomba`` Action +********************************************* + +This :ref:`action ` sends a Roomba infrared remote code to a remote transmitter. + +.. code-block:: yaml + + on_...: + - remote_transmitter.transmit_roomba: + data: 0x88 # clean + repeat: + times: 3 + wait_time: 17ms + +Configuration variables: + +- **data** (**Required**, int): The Roomba code to send, see dumper output for more info. +- Note that ``repeat`` is still optional, however **Roomba vacuums require that a given code is received at least three times before they will act on it.** If your Roomba still does not respond to sent command increase this value. +- Note that ``wait_time`` is still optional; it will even work without this parameter, but Roomba Remote uses this 17 ms wait time between sent commands. +- All other options from :ref:`remote_transmitter-transmit_action`. + .. _remote_transmitter-transmit_samsung: ``remote_transmitter.transmit_samsung`` Action From 03807510dc54d3f732ebd67dc76c531c4b27b8df Mon Sep 17 00:00:00 2001 From: Alex Boyd Date: Thu, 25 Apr 2024 05:23:40 -0600 Subject: [PATCH 15/34] Fix Docker build (#3798) --- Dockerfile | 1 + guides/contributing.rst | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index cd58e282f..a99ffa478 100644 --- a/Dockerfile +++ b/Dockerfile @@ -14,6 +14,7 @@ RUN useradd -ms /bin/bash esphome USER esphome WORKDIR /workspaces/esphome-docs +ENV PATH="${PATH}:/home/esphome/.local/bin" COPY requirements.txt ./ RUN pip3 install --no-cache-dir --no-binary :all: -r requirements.txt diff --git a/guides/contributing.rst b/guides/contributing.rst index e1b37be32..fc38f75b1 100644 --- a/guides/contributing.rst +++ b/guides/contributing.rst @@ -98,7 +98,7 @@ Build .. code-block:: bash - docker run --rm -v "${PWD}/":/data/esphomedocs -p 8000:8000 -it ghcr.io/esphome/esphome-docs + docker run --rm -v "${PWD}/":/workspaces/esphome-docs -p 8000:8000 -it ghcr.io/esphome/esphome-docs With ``PWD`` referring to the root of the ``esphome-docs`` git repository. Then go to ``:8000`` in your browser. From 57c9493b1b5c692b36577f0002e3b8837b573a92 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Fri, 26 Apr 2024 09:19:56 +1200 Subject: [PATCH 16/34] Add DateTime datetime type entities to docs (#3784) Co-authored-by: Keith Burzinski --- components/datetime/index.rst | 97 ++++++++++++++++++++++++++++++-- components/datetime/template.rst | 24 ++++++++ 2 files changed, 115 insertions(+), 6 deletions(-) diff --git a/components/datetime/index.rst b/components/datetime/index.rst index 57636918e..c13c979a5 100644 --- a/components/datetime/index.rst +++ b/components/datetime/index.rst @@ -47,17 +47,22 @@ Configuration variables: See https://developers.home-assistant.io/docs/core/entity/#generic-properties for a list of available options. Set to ``""`` to remove the default entity category. +- **time_id** (**Required**, :ref:`config-id`): The ID of the time entity. Automatically set + to the ID of a time component if only a single one is defined. MQTT Options: - All other options from :ref:`MQTT Component `. -Datetime Automation -------------------- +Time and DateTime Options: -You can access the most recent state as a string of the datetime in :ref:`lambdas ` using -``id(datetime_id).state``. -You can also access it as a ``ESPTime`` object by ``id(datetime_id).state_as_time`` +- **on_time** (*Optional*, :ref:`automation`): Automation to run when the current datetime or time matches the current state. + Only valid on ``time`` or ``datetime`` types. + +Automation +---------- + +You can access the most recent state as a ``ESPTime`` object by ``id(datetime_id).state_as_esptime()`` .. _datetime-on_value: @@ -225,14 +230,94 @@ advanced stuff (see the full API Reference for more info). ESP_LOGI("main", "Value of my datetime: %0d:%02d:%02d", id(my_time).hour, id(my_time).minute, id(my_time).second); +DateTime Automation +------------------- + +.. _datetime-datetime_set_action: + +``datetime.datetime.set`` Action +******************************** + +This is an :ref:`Action ` for setting a datetime datetime state. +The ``datetime`` provided can be in one of 3 formats: + +.. code-block:: yaml + + # String datetime + - datetime.time.set: + id: my_datetime + datetime: "2024-12-31 12:34:56" + + # Individual datetime parts + - datetime.datetime.set: + id: my_datetime + datetime: + year: 2024 + month: 12 + day: 31 + hour: 12 + minute: 34 + second: 56 + + # Using a lambda + - datetime.datetime.set: + id: my_datetime + datetime: !lambda |- + // Return an ESPTime struct + return {.second: 56, .minute: 34, .hour: 12, .day_of_month: 31, .month: 12, .year: 2024}; + +Configuration variables: + +- **id** (**Required**, :ref:`config-id`): The ID of the datetime to set. +- **datetime** (**Required**, string, datetime parts, :ref:`templatable `): + The value to set the datetime to. + + +.. _datetime-datetime-lambda_calls: + +Lambda calls +************ + +For more complex use cases, several methods are available for use on datetimes from within :ref:`lambdas `. See the full API Reference for more information. + +- ``.make_call()``: Make a call for updating the datetime value. + + .. code-block:: cpp + + // Within lambda, set the datetime to 2024-12-31 12:34:56 + auto call = id(my_datetime).make_call(); + call.set_date("2024-12-31 12:34:56"); + call.perform(); + + Check the API reference for information on the methods that are available for + the ``DateTimeCall`` object. + +- ``.year``: Retrieve the current year of the ``datetime``. It will be ``0`` if no value has been set. +- ``.month``: Retrieve the current month of the ``datetime``. It will be ``0`` if no value has been set. +- ``.day``: Retrieve the current day of the ``datetime``. It will be ``0`` if no value has been set. +- ``.hour``: Retrieve the current hour of the ``datetime``. It will be ``0`` if no value has been set. +- ``.minute``: Retrieve the current minute of the ``datetime``. It will be ``0`` if no value has been set. +- ``.second``: Retrieve the current second of the ``datetime``. It will be ``0`` if no value has been set. +- ``.state_as_esptime()``: Retrieve the current value of the datetime as a :apistruct:`ESPTime` object. + + .. code-block:: cpp + + // For example, create a custom log message when a value is received: + ESP_LOGI("main", "Value of my datetime: %04d-%02d-%02d %0d:%02d:%02d", + id(my_datetime).year, id(my_datetime).month, id(my_datetime).day, + id(my_datetime).hour, id(my_datetime).minute, id(my_datetime).second); + + See Also -------- - :apiref:`DateTimeBase ` - :apiref:`DateEntity ` - :apiref:`DateCall ` -- :apiref:`TimeeEntity ` +- :apiref:`TimeEntity ` - :apiref:`TimeCall ` +- :apiref:`DateTimeEntity ` +- :apiref:`DateTimeCall ` - :ghedit:`Edit` .. toctree:: diff --git a/components/datetime/template.rst b/components/datetime/template.rst index 3619db27e..e99161908 100644 --- a/components/datetime/template.rst +++ b/components/datetime/template.rst @@ -29,6 +29,15 @@ using :ref:`lambdas `. initial_value: "12:34:56" restore_value: true + # Example DateTime + - platform: template + id: my_datetime + type: datetime + name: Pick a DateTime + optimistic: yes + initial_value: "2024-12-31 12:34:56" + restore_value: true + Configuration variables: ------------------------ @@ -72,6 +81,21 @@ Configuration variables: minute: 34 second: 56 + - For ``type: datetime``: + + - A string in the format ``%Y-%m-%d %H:%M:%S`` , eg: ``"2023-12-04 12:34:56"``. + - An object including ``year``, ``month``, ``day``, ``hour``, ``minute``, ``second``. + + .. code-block:: yaml + + initial_value: + year: 2023 + month: 12 + day: 4 + hour: 12 + minute: 34 + second: 56 + - All other options from :ref:`Datetime `. See Also From e242b5102e79fe123de7c9fadc549162b8b14037 Mon Sep 17 00:00:00 2001 From: NP v/d Spek Date: Fri, 26 Apr 2024 05:23:03 +0200 Subject: [PATCH 17/34] Update description about showing the Color Test Card. (#3796) Co-authored-by: Clyde Stubbs <2366188+clydebarrow@users.noreply.github.com> --- components/display/images/test_card.jpg | Bin 0 -> 20883 bytes components/display/index.rst | 57 ++++++++---------------- 2 files changed, 19 insertions(+), 38 deletions(-) create mode 100644 components/display/images/test_card.jpg diff --git a/components/display/images/test_card.jpg b/components/display/images/test_card.jpg new file mode 100644 index 0000000000000000000000000000000000000000..49ba2cf8a7dd842bf98033fc5c531f3447f82c1d GIT binary patch literal 20883 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 literal 0 HcmV?d00001 diff --git a/components/display/index.rst b/components/display/index.rst index d6f443eba..3082043f2 100644 --- a/components/display/index.rst +++ b/components/display/index.rst @@ -935,49 +935,30 @@ Additionally the old page will be given as the variable ``from`` and the new one Troubleshooting --------------- -Color Test Pattern ------------------- +Using the Color Test Card +------------------------- -If you're experiencing issues with your color display, the script below can help you to identify what might be wrong. -It will show 3 color bars in **RED**, **GREEN** and **BLUE**. To help the graphics display team determine -the best way to help you, **a picture of the result of this script is very helpful.** +If you're experiencing issues with your color display, the ``show_test_card: true`` option can help you to identify what might be wrong. + +- It will show bars for Red, Green and Blue, graduating to black and white. +- Together with that it will show the letters "**R**", "**G**" and "**B**" to validate the display geometry. +- There will be a rectangle around the corners of the display with a marker at the 0,0 corner which should be at the top left of the screen. + +.. figure:: images/test_card.jpg + :align: center + :width: 50.0% + + + +When all points above are shown correctly then the display is working as expected. +To help the graphics display team determine the best way to help you, **a picture of the result of this option is very helpful.** Should you `create an issue `__ in GitHub regarding your display, please -be sure to **include a link to where you purchased it** so that we can validate the configuration you've used. +be sure to **include a link to where you purchased the display** so that we can validate the configuration you've used. -.. code-block:: yaml +.. note:: - display: - - platform: ... - ... - lambda: |- - int shift_x = (it.get_width()-310)/2; - int shift_y = (it.get_height()-256)/2; - for(auto i = 0; i<256; i++) { - it.horizontal_line(shift_x+ 0,i+shift_y,50, my_red.fade_to_white(i)); - it.horizontal_line(shift_x+ 50,i+shift_y,50, my_red.fade_to_black(i)); - - it.horizontal_line(shift_x+105,i+shift_y,50, my_green.fade_to_white(i)); - it.horizontal_line(shift_x+155,i+shift_y,50, my_green.fade_to_black(i)); - - it.horizontal_line(shift_x+210,i+shift_y,50, my_blue.fade_to_white(i)); - it.horizontal_line(shift_x+260,i+shift_y,50, my_blue.fade_to_black(i)); - } - it.rectangle(shift_x+ 0, 0+shift_y, shift_x+ 310, 256+shift_y, my_yellow); - - color: - - id: my_blue - blue: 100% - - id: my_red - red: 100% - - id: my_green - green: 100% - - id: my_white - red: 100% - blue: 100% - green: 100% - - id: my_yellow - hex: ffff00 + For displays in 8 bit mode you will see distinct color blocks rather than a smooth gradient. See Also -------- From 1f272092d6611f545007a83035795e0a40998640 Mon Sep 17 00:00:00 2001 From: polyfloyd Date: Fri, 26 Apr 2024 10:44:04 +0200 Subject: [PATCH 18/34] waveshare_epaper: Add 2.90in-dke (#3780) --- components/display/waveshare_epaper.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/components/display/waveshare_epaper.rst b/components/display/waveshare_epaper.rst index 44a194a81..d1a5cf8ff 100644 --- a/components/display/waveshare_epaper.rst +++ b/components/display/waveshare_epaper.rst @@ -96,6 +96,7 @@ Configuration variables: - ``2.70in-b`` - Black/White/Red - ``2.70in-bv2`` - Black/White/Red - ``2.90in`` + - ``2.90in-dke`` - ``2.90inv2`` - ``2.90inv2-r2`` - 2.9in V2 display, but with different initialization and full/partial display refresh management than ``2.90inv2`` - ``2.90in-b`` - B/W rendering only From 051ed8736d20d16141002971de855a4b1088f357 Mon Sep 17 00:00:00 2001 From: Alex Boyd Date: Fri, 26 Apr 2024 05:52:15 -0600 Subject: [PATCH 19/34] Redo the homeassistant service call API setup instructions (#3631) Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> --- _static/custom.css | 5 +++++ components/api.rst | 37 +++++++++++++++++++++++++++++++------ 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/_static/custom.css b/_static/custom.css index 451d5cb4b..182ffa4ab 100644 --- a/_static/custom.css +++ b/_static/custom.css @@ -240,6 +240,11 @@ a:hover code { background: none; } +/* don't underline links that contain an image and nothing else */ +a:has(> img:only-child) { + border-bottom: none; +} + div.body p, div.body dd, div.body li, div.body blockquote { hyphens: none; } diff --git a/components/api.rst b/components/api.rst index cb1a48116..a6386a845 100644 --- a/components/api.rst +++ b/components/api.rst @@ -75,20 +75,35 @@ Configuration variables: .. _api-actions: -.. note:: - - Before a newly added ESPHome device can interact with the Home Assistant API it needs to be allowed to communicate - with it. This setting can be found in the ESPHome integration (NOT in the Add-On) by clicking "CONFIGURE" for - that device and enabling the "Allow device to make service calls" option. - Actions ------- +Before using any of the actions below, you'll need to tell Home Assistant to allow your device to +make service calls. + +Open the ESPHome integration page on your Home Assistant instance: + +.. raw:: html + + Open your Home Assistant instance and show an integration. + +Then: + +#. Fnd your device in the device list +#. Click the "configure" button next to it +#. Check the "Allow the device to make Home Assistant service calls" box +#. Then click "submit". + .. _api-homeassistant_event_action: ``homeassistant.event`` Action ****************************** +.. note:: + + Be sure to :ref:`follow the instructions above ` to tell Home Assistant to allow + your device to make service calls. + When using the native API with Home Assistant, you can create events in the Home Assistant event bus straight from ESPHome :ref:`Automations `. @@ -117,6 +132,11 @@ Configuration variables: ``homeassistant.service`` Action ******************************** +.. note:: + + Be sure to :ref:`follow the instructions above ` to tell Home Assistant to allow + your device to make service calls. + When using the native API with Home Assistant, you can create Home Assistant service calls straight from ESPHome :ref:`Automations `. @@ -189,6 +209,11 @@ Then, in ESPHome: ``homeassistant.tag_scanned`` Action ************************************ +.. note:: + + Be sure to :ref:`follow the instructions above ` to tell Home Assistant to allow + your device to make service calls. + When using the native API with Home Assistant, you can push tag_scanned to Home Assistant straight from ESPHome :ref:`Automations `. From 98b7c74e96e8c168479a9cb2356d6521c9ab4cc0 Mon Sep 17 00:00:00 2001 From: Lucas Hartmann Date: Sun, 28 Apr 2024 16:47:17 -0300 Subject: [PATCH 20/34] Add transition_length to strobe effect. (#3775) --- components/light/index.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/components/light/index.rst b/components/light/index.rst index ee9a31d9f..2f3550a14 100644 --- a/components/light/index.rst +++ b/components/light/index.rst @@ -583,6 +583,7 @@ Configuration variables: - **cold_white** (*Optional*, percentage): The cold white channel of the light, if applicable. Defaults to ``100%``. - **warm_white** (*Optional*, percentage): The warm white channel of the light, if applicable. Defaults to ``100%``. - **duration** (**Required**, :ref:`config-time`): The duration this color should be active. + - **transition_length** (*Optional*, :ref:`config-time`): The duration of each transition. Defaults to ``0s``. See `light.turn_on ` for more information on the various color fields. From 7a11619a8b462d84ae2730786d3094b3805f3194 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 30 Apr 2024 15:47:41 +1200 Subject: [PATCH 21/34] Bump version to 2024.4.2 --- Doxygen | 2 +- Makefile | 2 +- _static/version | 2 +- conf.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Doxygen b/Doxygen index 3179fed5c..149e4876c 100644 --- a/Doxygen +++ b/Doxygen @@ -38,7 +38,7 @@ PROJECT_NAME = "ESPHome" # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = 2024.4.1 +PROJECT_NUMBER = 2024.4.2 # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a diff --git a/Makefile b/Makefile index fd31de088..5251aa29e 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ ESPHOME_PATH = ../esphome -ESPHOME_REF = 2024.4.1 +ESPHOME_REF = 2024.4.2 .PHONY: html html-strict cleanhtml deploy help live-html Makefile netlify netlify-api api netlify-dependencies svg2png copy-svg2png minify diff --git a/_static/version b/_static/version index f38c6ceaf..af96240eb 100644 --- a/_static/version +++ b/_static/version @@ -1 +1 @@ -2024.4.1 \ No newline at end of file +2024.4.2 \ No newline at end of file diff --git a/conf.py b/conf.py index 66d1ff697..469f336c3 100644 --- a/conf.py +++ b/conf.py @@ -69,7 +69,7 @@ author = "ESPHome" # The short X.Y version. version = "2024.4" # The full version, including alpha/beta/rc tags. -release = "2024.4.1" +release = "2024.4.2" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From fe89003adfbb70144dac64c04ba32312be4a98db Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 30 Apr 2024 15:49:32 +1200 Subject: [PATCH 22/34] Update changelog for 2024.4.2 --- changelog/2024.4.0.rst | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/changelog/2024.4.0.rst b/changelog/2024.4.0.rst index 89284d8cb..ed0b3af4c 100644 --- a/changelog/2024.4.0.rst +++ b/changelog/2024.4.0.rst @@ -50,6 +50,15 @@ Release 2024.4.1 - April 23 - Fix or filter :esphomepr:`6574` by :ghuser:`swoboda1337` +Release 2024.4.2 - April 30 +--------------------------- + +- Fix SHT3xd fails sometimes in 2024.4.0 :esphomepr:`6592` by :ghuser:`mrtoy-me` +- allow defaults with no include vars :esphomepr:`6613` by :ghuser:`ssieb` +- Revert #6458 :esphomepr:`6650` by :ghuser:`tronikos` +- [i2s_audio.microphone] Fixing adc bug :esphomepr:`6654` by :ghuser:`jesserockz` + + Full list of changes -------------------- From 9955fcb151b59c0895f6df18a3d3a16b2a102954 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 30 Apr 2024 15:50:06 +1200 Subject: [PATCH 23/34] Update supporters for 2024.4.2 --- guides/supporters.rst | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/guides/supporters.rst b/guides/supporters.rst index 9b6111b73..1c9098e51 100644 --- a/guides/supporters.rst +++ b/guides/supporters.rst @@ -122,6 +122,7 @@ Contributors - `arunderwood (@arunderwood) `__ - `Arya (@Arya11111) `__ - `aschmitz (@aschmitz) `__ +- `Anton Sergunov (@asergunov) `__ - `Borys Pierov (@ashald) `__ - `Ash McKenzie (@ashmckenzie) `__ - `ashp8i (@ashp8i) `__ @@ -259,6 +260,7 @@ Contributors - `cg089 (@cg089) `__ - `Audric Schiltknecht (@chemicalstorm) `__ - `Charles Johnson (@ChemicalXandco) `__ +- `chiahsing (@chiahsing) `__ - `chris-jennings (@chris-jennings) `__ - `Chris (@chrismaki) `__ - `Christoph Wagner (@Christoph-Wagner) `__ @@ -319,6 +321,7 @@ Contributors - `Daniel Bjørnbakk (@danibjor) `__ - `Daniel Baulig (@DanielBaulig) `__ - `danielionutmuresan (@danielionutmuresan) `__ +- `Daniel Kent (@danielkent-net) `__ - `Daniel Kucera (@danielkucera) `__ - `Daniel O'Connor (@DanielO) `__ - `Daniel Rheinbay (@danielrheinbay) `__ @@ -350,7 +353,6 @@ Contributors - `Davy Landman (@DavyLandman) `__ - `Dawid Cieszyński (@dawidcieszynski) `__ - `Darren Tucker (@daztucker) `__ -- `Donovan Baarda (@dbaarda) `__ - `David Buezas (@dbuezas) `__ - `dckiller51 (@dckiller51) `__ - `Daniel Correa Lobato (@dclobato) `__ @@ -392,7 +394,6 @@ Contributors - `Dan Mannock (@dmannock) `__ - `Dmitriy Lopatko (@dmitriy5181) `__ - `Tristan Rowley (@doctea) `__ -- `DrZoid (@docteurzoidberg) `__ - `DominikBitzer (@DominikBitzer) `__ - `Dominik (@DomiStyle) `__ - `Don Burch (@donburch888) `__ @@ -452,8 +453,8 @@ Contributors - `Elkropac (@Elkropac) `__ - `Elliot Wood (@elliot-wood) `__ - `Eduard Llull (@ellull) `__ +- `Joakim Plate (@elupus) `__ - `Andrew Elwell (@Elwell) `__ -- `EmbeddedDevver (@EmbeddedDevver) `__ - `EmmanuelLM (@EmmanuelLM) `__ - `Emory Dunn (@emorydunn) `__ - `Eric van Blokland (@Emrvb) `__ @@ -727,7 +728,6 @@ Contributors - `AngeloGioacchino Del Regno (@kholk) `__ - `Kilowatt (@Kilowatt-W) `__ - `Kip (@kipwittchen) `__ -- `Ed (@kixtarter) `__ - `Klaas Schoute (@klaasnicolaas) `__ - `Klarstein (@Klarstein) `__ - `Marcus Klein (@kleini) `__ @@ -752,7 +752,6 @@ Contributors - `Ludovic BOUÉ (@lboue) `__ - `lcavalli (@lcavalli) `__ - `Craig Fletcher (@leakypixel) `__ -- `Dominik Wagenknecht (@LeDominik) `__ - `Benny de Leeuw (@leeuwte) `__ - `Thayne (@Legot) `__ - `Leonardo La Rocca (@leoli51) `__ @@ -1023,6 +1022,7 @@ Contributors - `Jan Pluskal (@pluskal) `__ - `DK (@poldim) `__ - `poloswiss (@poloswiss) `__ +- `polyfloyd (@polyfloyd) `__ - `Pontus Oldberg (@PontusO) `__ - `poptix (@poptix) `__ - `Peter Provost (@PProvost) `__ @@ -1159,6 +1159,7 @@ Contributors - `Niklas Wagner (@Skaronator) `__ - `Brian Slesinsky (@skybrian) `__ - `Jordan W. Cobb (@skykingjwc) `__ +- `slimeinacloak (@slimeinacloak) `__ - `Sebastian Lövdahl (@slovdahl) `__ - `smischny (@smischny) `__ - `John Mueller (@softplus) `__ @@ -1345,9 +1346,10 @@ Contributors - `Brynley McDonald (@ZephireNZ) `__ - `Stefan Goethals (@zipkid) `__ - `zivillian (@zivillian) `__ +- `zry98 (@zry98) `__ - `Zack Barett (@zsarnett) `__ - `Zsolt Zsiros (@ZsZs73) `__ - `Christian Zufferey (@zuzu59) `__ - `Zynth-dev (@Zynth-dev) `__ -*This page was last updated April 23, 2024.* +*This page was last updated April 30, 2024.* From 74686fadb2ac9e1a1a4b9beac7ef3b2636295632 Mon Sep 17 00:00:00 2001 From: Mat931 <49403702+Mat931@users.noreply.github.com> Date: Thu, 2 May 2024 01:22:30 +0000 Subject: [PATCH 24/34] Remote receiver improvements (#2797) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Keith Burzinski Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Co-authored-by: H. Árkosi Róbert --- components/remote_receiver.rst | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/components/remote_receiver.rst b/components/remote_receiver.rst index eda32b68c..86affc35a 100644 --- a/components/remote_receiver.rst +++ b/components/remote_receiver.rst @@ -60,8 +60,13 @@ Configuration variables: - **sony**: Decode and dump Sony infrared codes. - **toshiba_ac**: Decode and dump Toshiba AC infrared codes. -- **tolerance** (*Optional*, int): The percentage that the remote signal lengths can deviate in the - decoding process. Defaults to ``25%``. +- **tolerance** (*Optional*, int, :ref:`config-time` or mapping): The percentage or time that the remote signal lengths can + deviate in the decoding process. Defaults to ``25%``. + + - **type** (**Required**, enum): Set the type of the tolerance. Can be ``percentage`` or ``time``. + - **value** (**Required**, int or :ref:`config-time`): The percentage or time value. Allowed values are in range ``0`` to + ``100%`` or ``0`` to ``4294967295us``. + - **buffer_size** (*Optional*, int): The size of the internal buffer for storing the remote codes. Defaults to ``10kB`` on the ESP32 and ``1kB`` on the ESP8266. - **rmt_channel** (*Optional*, int): The RMT channel to use. Only on **esp32**. @@ -75,14 +80,17 @@ Configuration variables: "ESP32-S3", "4, 5, 6, 7" "ESP32-C3", "2, 3" -- **memory_blocks** (*Optional*, int): The number of RMT memory blocks used. Only used on ESP32 platform. Defaults to - ``3``. +- **memory_blocks** (*Optional*, int): The number of RMT memory blocks used. Only used on ESP32 platform. The maximum + number of blocks shared by all receivers and transmitters depends on the ESP32 variant. Defaults to ``3``. - **filter** (*Optional*, :ref:`config-time`): Filter any pulses that are shorter than this. Useful for removing - glitches from noisy signals. Defaults to ``50us``. + glitches from noisy signals. Allowed values are in range ``0`` to ``4294967295us``. Defaults to ``50us``. - **idle** (*Optional*, :ref:`config-time`): The amount of time that a signal should remain stable (i.e. not - change) for it to be considered complete. Defaults to ``10ms``. + change) for it to be considered complete. Allowed values are in range ``0`` to ``4294967295us``. Defaults to ``10ms``. - **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation. Use this if you have multiple remote receivers. +- **clock_divider** (*Optional*, int): The clock divider used by the RMT peripheral. A clock divider of ``80`` leads to + a resolution of 1 µs per tick, ``160`` leads to 2 µs. Allowed values are in range ``1`` to ``255``. Only used on ESP32 + platform. Defaults to ``80``. .. note:: From 4217ab9c308d947acd99b444e93eca4224d0ee91 Mon Sep 17 00:00:00 2001 From: Anton Viktorov Date: Thu, 2 May 2024 03:49:06 +0200 Subject: [PATCH 25/34] bmp3xx SPI support added (#3801) Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> --- components/sensor/bmp3xx.rst | 71 +++++++++++++++++++++++++++++------- 1 file changed, 57 insertions(+), 14 deletions(-) diff --git a/components/sensor/bmp3xx.rst b/components/sensor/bmp3xx.rst index 28ebee1db..af4f4d99e 100644 --- a/components/sensor/bmp3xx.rst +++ b/components/sensor/bmp3xx.rst @@ -7,8 +7,8 @@ BMP388 / BMP390 Temperature+Pressure Sensor :keywords: BMP388 BMP390 The ``bmp3xx`` sensor platform allows you to use your BMP388 or BMP390 -(`datasheet `__, `BMP390 product page `__) temperature and pressure sensors with ESPHome. The :ref:`I²C ` bus is -required to be set up in your configuration for this sensor to work. +(`datasheet `__, `BMP390 product page `__) temperature and pressure sensors with ESPHome. +Either :ref:`I²C ` bus or :ref:`SPI ` bus is required to be set up in your configuration for this sensor to work. .. figure:: images/bmp388.jpg :align: center @@ -16,11 +16,16 @@ required to be set up in your configuration for this sensor to work. BMP388/BMP390 Temperature and Pressure Sensor. + +Over I²C +-------- +The ``bmp3xx_i2c`` component allows you to use the device over :ref:`I²C ` interface. + .. code-block:: yaml - # Example configuration entry + # Example configuration entry for I2C connection sensor: - - platform: bmp3xx + - platform: bmp3xx_i2c temperature: name: "Outside Temperature" oversampling: 16x @@ -29,34 +34,72 @@ required to be set up in your configuration for this sensor to work. address: 0x77 update_interval: 60s -Configuration variables: ------------------------- +Configuration variables: +************************ + +- **address** (*Optional*, int): Manually specify the I²C address of the sensor. Defaults to ``0x77``. + Another address can be ``0x76``. - **temperature** (*Optional*): The information for the temperature sensor. - - **name** (**Required**, string): The name for the temperature - sensor. - **oversampling** (*Optional*): The oversampling parameter for the temperature sensor. See :ref:`Oversampling Options `. - - **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. - All other options from :ref:`Sensor `. - **pressure** (*Optional*): The information for the pressure sensor. - - **name** (**Required**, string): The name for the pressure sensor. - **oversampling** (*Optional*): The oversampling parameter for the temperature sensor. See :ref:`Oversampling Options `. - - **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. - All other options from :ref:`Sensor `. -- **address** (*Optional*, int): Manually specify the I²C address of - the sensor. Defaults to ``0x77``. Another address can be ``0x76``. - **iir_filter** (*Optional*): Set up an Infinite Impulse Response filter to increase accuracy. One of ``OFF``, ``2x``, ``4x``, ``16x``, ``32``, ``64x``, ``128x``. Defaults to ``OFF``. - **update_interval** (*Optional*, :ref:`config-time`): The interval to check the sensor. Defaults to ``60s``. +Over SPI +-------- +The ``bmp3xx_spi`` component allows you to use the device over :ref:`SPI ` interface. + +.. code-block:: yaml + + # Example configuration entry for SPI connection + sensor: + - platform: bmp3xx_spi + temperature: + name: "Outside Temperature" + oversampling: 16x + pressure: + name: "Outside Pressure" + cs_pin: 13 + update_interval: 60s + + +Configuration variables: +************************ + +- **cs_pin** (**Required**, :ref:`Pin Schema `): The Chip Select (CS) pin. +- **temperature** (*Optional*): The information for the temperature sensor. + + - **oversampling** (*Optional*): The oversampling parameter for the temperature sensor. + See :ref:`Oversampling Options `. + - All other options from :ref:`Sensor `. + +- **pressure** (*Optional*): The information for the pressure sensor. + + - **oversampling** (*Optional*): The oversampling parameter for the temperature sensor. + See :ref:`Oversampling Options `. + - All other options from :ref:`Sensor `. + +- **iir_filter** (*Optional*): Set up an Infinite Impulse Response filter to increase accuracy. One of + ``OFF``, ``2x``, ``4x``, ``16x``, ``32``, ``64x``, ``128x``. Defaults to ``OFF``. +- **address** (*Optional*, int): *I2C* only. Manually specify the I²C address of + the sensor. Defaults to ``0x77``. Another address can be ``0x76``. +- **update_interval** (*Optional*, :ref:`config-time`): The interval to check the + sensor. Defaults to ``60s``. + + .. _bmp3xx-oversampling: Oversampling Options @@ -80,7 +123,7 @@ See Also - :doc:`bmp280` - :doc:`bme680` - :doc:`bmp085` -- :apiref:`bmp3xx/bmp3xx.h` +- :apiref:`bmp3xx_base/bmp3xx_base.h` - `BMP3 sensor API `__ - `BMP388/BMP390 Library `__ by Martin Lindupp - :ghedit:`Edit` From bf72d1bba0f6a0c21fb4bf6d4163921db726133d Mon Sep 17 00:00:00 2001 From: Nico Peter Date: Fri, 3 May 2024 21:15:41 +0200 Subject: [PATCH 26/34] Update time_based.rst (#3532) added docs for feature_time_based_cover_last_operation --- components/cover/time_based.rst | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/components/cover/time_based.rst b/components/cover/time_based.rst index 0f5e542dd..e5a5150e9 100644 --- a/components/cover/time_based.rst +++ b/components/cover/time_based.rst @@ -77,7 +77,22 @@ Configuration variables: ``esp8266_restore_from_flash: true`` option set. See :doc:`esp8266_restore_from_flash ` for details. +Handle stop_action: +------------------------ +For some cover controllers, separate switches for UP and DOWN action are used while a stop is issued when sending a counter command. +This can be handled at the **stop_action** by using the folling lamda function: +.. code-block:: yaml + + stop_action: + - lambda: !lambda |- + if (id(cover).last_operation() == CoverOperation::COVER_OPERATION_OPENING) { + // Cover is currently opening + id(cover_button_down).press(); + } else if (id(cover).last_operation() == CoverOperation::COVER_OPERATION_CLOSING) { + // Cover is currently closing + id(cover_button_up).press(); + } See Also -------- From 5d69b7c7dfa31746cf020658ca06db10f75d2e4e Mon Sep 17 00:00:00 2001 From: Daniel Baulig Date: Fri, 3 May 2024 22:55:06 -0700 Subject: [PATCH 27/34] web_server: Update documentation for changes in PR #6269 (#3626) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * web_server: Update documentation for changes in PR #6269 Also fixed a small formatting bug in the color_temp documentation * Remove linebreaks --------- Co-authored-by: H. Árkosi Róbert --- web-api/index.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/web-api/index.rst b/web-api/index.rst index 026c7bda6..96e6f793a 100644 --- a/web-api/index.rst +++ b/web-api/index.rst @@ -182,7 +182,7 @@ creating a POST request at ``/light//turn_on?brightness=128&transition=2`` w - **flash**: Flash the color provided by the other properties for a duration in seconds. - **transition**: Transition to the specified color values in this duration in seconds. - **effect**: Set an effect for the light. -- ***color_temp***: Set the color temperature of the light, in mireds. +- **color_temp**: Set the color temperature of the light, in mireds. ``turn_off`` optional URL parameters: @@ -239,9 +239,10 @@ stopped midway. An example GET request for ``/cover/front_window_blinds`` might - **id**: The ID of the cover, prefixed with ``cover-``. - **state**: ``OPEN`` or ``CLOSED``. Any position other than 0.0 is considered open. -- **value**: Current cover position as a float number. +- **value**: Current cover position as a float number. If the cover component does not support cover position reporting, then this will either be 1.0 when open or 0.0 when closed. - **current_operation**: ``OPENING``, ``CLOSING`` or ``IDLE``. - **tilt**: (only if supported by this cover component) tilt angle from 0.0 to 1.0. +- **position**: (only if supported by this cover component) Current cover position as a float number. POST requests on the other hand allow performing actions on the cover, the available methods being ``open``, ``close``, ``stop``, ``toggle`` and ``set``. The following parameters From 5266732e8873f20dea64c4a7d53e1c2da4cfd992 Mon Sep 17 00:00:00 2001 From: Carsten Grohmann Date: Sat, 4 May 2024 12:27:48 +0200 Subject: [PATCH 28/34] Order of esphome parameters corrected (#3813) --- guides/getting_started_command_line.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/getting_started_command_line.rst b/guides/getting_started_command_line.rst index 3f088e99f..21617f353 100644 --- a/guides/getting_started_command_line.rst +++ b/guides/getting_started_command_line.rst @@ -191,7 +191,7 @@ for docker you need to supply an additional parameter: .. code-block:: bash - esphome livingroom.yaml run + esphome run livingroom.yaml # On docker docker run --rm -v "${PWD}":/config -it ghcr.io/esphome/esphome run livingroom.yaml From cb230f57d484d45dd55c8c50a217bd0350020635 Mon Sep 17 00:00:00 2001 From: Carsten Grohmann Date: Sun, 5 May 2024 18:07:49 +0200 Subject: [PATCH 29/34] Order of esphome parameters corrected II (#3816) --- components/mqtt.rst | 2 +- guides/migrate_espeasy.rst | 2 +- guides/migrate_espurna.rst | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/components/mqtt.rst b/components/mqtt.rst index a62bdd94d..154a492bd 100644 --- a/components/mqtt.rst +++ b/components/mqtt.rst @@ -266,7 +266,7 @@ then run the ``mqtt-fingerprint`` script of ESPHome to get the certificate: .. code-block:: bash - esphome livingroom.yaml mqtt-fingerprint + esphome mqtt-fingerprint livingroom.yaml > SHA1 Fingerprint: a502ff13999f8b398ef1834f1123650b3236fc07 > Copy above string into mqtt.ssl_fingerprints section of livingroom.yaml diff --git a/guides/migrate_espeasy.rst b/guides/migrate_espeasy.rst index b0f954d63..1524da252 100644 --- a/guides/migrate_espeasy.rst +++ b/guides/migrate_espeasy.rst @@ -19,7 +19,7 @@ file. Then, generate and download the binary: .. figure:: images/download_binary.png -- **Using the command line**: run ``esphome livingroom.yaml compile`` (replacing +- **Using the command line**: run ``esphome compile livingroom.yaml`` (replacing ``livingroom.yaml`` with your configuration file of course) and navigate to the ``/.pioenvs//`` folder. There you will find a ``firmware.bin`` file, this is the binary you will upload. diff --git a/guides/migrate_espurna.rst b/guides/migrate_espurna.rst index 09505a24e..ef7dc8f12 100644 --- a/guides/migrate_espurna.rst +++ b/guides/migrate_espurna.rst @@ -20,7 +20,7 @@ file. Then, generate and download the binary: .. figure:: images/download_binary.png -- **Using the command line**: run ``esphome livingroom.yaml compile`` (replacing +- **Using the command line**: run ``esphome compile livingroom.yaml`` (replacing ``livingroom.yaml`` with your configuration file of course) and navigate to the ``/.pioenvs//`` folder. There you will find a ``firmware.bin`` file, this is the binary you will upload. From 81431583993e5062c2380f3bc5b36f2188f80066 Mon Sep 17 00:00:00 2001 From: Tomek Wasilczyk Date: Sun, 5 May 2024 20:19:19 -0700 Subject: [PATCH 30/34] External components: add documentation about path for git source (#3815) --- components/external_components.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/components/external_components.rst b/components/external_components.rst index 32a89747b..d24482171 100644 --- a/components/external_components.rst +++ b/components/external_components.rst @@ -46,6 +46,7 @@ Configuration variables: - **ref** (*Optional*, string): Git ref (branch or tag). If not specified the default branch is used. - **username** (*Optional*, string): Username for the Git server, if one is required - **password** (*Optional*, string): Password for the Git server, if one is required + - **path** (*Optional*, string): Path inside the repo, if different from ``components`` or ``esphome/components`` local options: From 567fa6a76a7d76cfc3caab527b041c83dd00d15f Mon Sep 17 00:00:00 2001 From: IreuN Date: Tue, 7 May 2024 03:04:42 +0200 Subject: [PATCH 31/34] Update bme680_bsec licence url (#3818) --- components/sensor/bme680_bsec.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/sensor/bme680_bsec.rst b/components/sensor/bme680_bsec.rst index a182b1ec1..2b3e0780b 100644 --- a/components/sensor/bme680_bsec.rst +++ b/components/sensor/bme680_bsec.rst @@ -30,7 +30,7 @@ The :ref:`I²C ` is required to be set up in your configuration for this se BME680 Temperature, Pressure, Humidity & Gas Sensor. -.. _BSEC license agreement: https://www.bosch-sensortec.com/media/boschsensortec/downloads/bsec/2017-07-17_clickthrough_license_terms_environmentalib_sw_clean.pdf +.. _BSEC license agreement: https://www.bosch-sensortec.com/media/boschsensortec/downloads/software/bme688_development_software/2023_04/license_terms_bme688_bme680_bsec.pdf .. _Adafruit: https://www.adafruit.com/product/3660 From 435ac134882f53840e0f37a1efbc4efe24114137 Mon Sep 17 00:00:00 2001 From: joukepouke-personal <73423163+joukepouke-personal@users.noreply.github.com> Date: Tue, 7 May 2024 03:07:27 +0200 Subject: [PATCH 32/34] Update getting_started_command_line.rst (#3814) * Update getting_started_command_line.rst * add space --- guides/getting_started_command_line.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/guides/getting_started_command_line.rst b/guides/getting_started_command_line.rst index 21617f353..5746fad08 100644 --- a/guides/getting_started_command_line.rst +++ b/guides/getting_started_command_line.rst @@ -224,8 +224,8 @@ To start the ESPHome dashboard, simply start ESPHome with the following command .. code-block:: bash # Install dashboard dependencies - pip install tornado esptool - esphome dashboard config/ + pip install tornado esptool\ + esphome dashboard config # On Docker, host networking mode is required for online status indicators docker run --rm --net=host -v "${PWD}":/config -it ghcr.io/esphome/esphome From ca96dd49e192c40b37e4829cdf56c3eaef7d8bcc Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Tue, 7 May 2024 00:16:56 -0500 Subject: [PATCH 33/34] Change "integration" -> "component", minor copy fixes (#3790) --- components/binary_sensor/custom.rst | 28 +++--- components/climate/custom.rst | 26 ++++-- components/copy.rst | 8 +- components/cover/custom.rst | 29 +++--- components/cover/tuya.rst | 2 +- components/demo.rst | 12 +-- components/dfplayer.rst | 5 +- components/display/index.rst | 2 +- components/display/lcd_display.rst | 8 +- components/display/max7219.rst | 4 +- components/display/max7219digit.rst | 4 +- components/display/waveshare_epaper.rst | 2 +- .../display_menu/graphical_display_menu.rst | 2 +- components/display_menu/index.rst | 6 +- components/display_menu/lcd_menu.rst | 2 +- components/fingerprint_grow.rst | 2 +- components/gps.rst | 4 +- components/light/custom.rst | 26 ++++-- components/light/neopixelbus.rst | 2 +- components/micronova.rst | 2 +- components/mqtt.rst | 5 +- components/output/ac_dimmer.rst | 7 +- components/output/custom.rst | 22 +++-- components/output/sigma_delta_output.rst | 2 +- components/sensor/ads1115.rst | 2 +- components/sensor/airthings_ble.rst | 3 +- components/sensor/as3935.rst | 2 +- components/sensor/bl0940.rst | 4 +- components/sensor/bl0942.rst | 4 +- components/sensor/ccs811.rst | 2 +- components/sensor/cse7766.rst | 2 +- components/sensor/custom.rst | 25 +++-- components/sensor/dsmr.rst | 2 +- components/sensor/growatt_solar.rst | 2 +- components/sensor/havells_solar.rst | 2 +- components/sensor/hlw8012.rst | 8 +- components/sensor/inkbird_ibsth1_mini.rst | 2 +- components/sensor/mcp3204.rst | 7 +- components/sensor/mmc5983.rst | 3 +- components/sensor/mopeka_pro_check.rst | 2 +- components/sensor/mopeka_std_check.rst | 2 +- components/sensor/mqtt_subscribe.rst | 2 +- components/sensor/pulse_meter.rst | 2 +- components/sensor/pzem004t.rst | 2 +- components/sensor/pzemac.rst | 2 +- components/sensor/pzemdc.rst | 2 +- components/sensor/ruuvitag.rst | 2 +- components/sensor/sdm_meter.rst | 2 +- components/sensor/selec_meter.rst | 2 +- components/sensor/smt100.rst | 6 +- components/servo.rst | 2 +- components/switch/custom.rst | 26 ++++-- components/text_sensor/custom.rst | 28 +++--- components/text_sensor/mqtt_subscribe.rst | 2 +- components/tm1651.rst | 6 +- custom/custom_component.rst | 27 ++++-- custom/i2c.rst | 20 ++-- custom/spi.rst | 20 ++-- custom/uart.rst | 20 ++-- guides/contributing.rst | 28 +++--- guides/faq.rst | 93 +++++++++++++------ 61 files changed, 343 insertions(+), 237 deletions(-) diff --git a/components/binary_sensor/custom.rst b/components/binary_sensor/custom.rst index d2ee55fdc..f983584cb 100644 --- a/components/binary_sensor/custom.rst +++ b/components/binary_sensor/custom.rst @@ -1,22 +1,28 @@ Custom Binary Sensor ==================== +.. seo:: + :description: Instructions for setting up Custom C++ binary sensors with ESPHome. + :image: language-cpp.svg + :keywords: C++, Custom + .. warning:: - Custom components are deprecated, not recommended for new configurations - and will be removed from ESPHome in a future release. - Please look at creating a real ESPHome component and "importing" it into your - configuration with :doc:`/components/external_components`. + Custom components are deprecated, not recommended for new configurations and will be removed from ESPHome in a + future release. Please look at creating a real ESPHome component and "importing" it into your configuration with + :doc:`/components/external_components`. - You can find some basic documentation on creating your own components - at :ref:`contributing_to_esphome`. + You can find some basic documentation on creating your own components at :ref:`contributing_to_esphome`. -This integration can be used to create custom binary sensors in ESPHome -using the C++ (Arduino) API. +.. warning:: -Please first read :doc:`/components/sensor/custom` guide, -the same principles apply here and binary sensors are very similar -to sensors internally. + While we try to keep the ESPHome YAML configuration options as stable as possible, the ESPHome API is less + stable. If something in the APIs needs to be changed in order for something else to work, we will do so. + +This component can be used to create custom binary sensors in ESPHome using the C++ (Arduino) API. + +Please first read :doc:`/components/sensor/custom` guide, the same principles apply here and binary +sensors are very similar to sensors internally. The example below is an example of a custom binary sensor; this custom sensor is essentially the same as the gpio binary sensor. diff --git a/components/climate/custom.rst b/components/climate/custom.rst index e4d86f19e..1544fa9f1 100644 --- a/components/climate/custom.rst +++ b/components/climate/custom.rst @@ -1,21 +1,27 @@ Custom Climate ============== +.. seo:: + :description: Instructions for setting up Custom C++ climate components with ESPHome. + :image: language-cpp.svg + :keywords: C++, Custom + .. warning:: - Custom components are deprecated, not recommended for new configurations - and will be removed from ESPHome in a future release. - Please look at creating a real ESPHome component and "importing" it into your - configuration with :doc:`/components/external_components`. + Custom components are deprecated, not recommended for new configurations and will be removed from ESPHome in a + future release. Please look at creating a real ESPHome component and "importing" it into your configuration with + :doc:`/components/external_components`. - You can find some basic documentation on creating your own components - at :ref:`contributing_to_esphome`. + You can find some basic documentation on creating your own components at :ref:`contributing_to_esphome`. -This integration can be used to create custom climate devices in ESPHome -using the C++ (Arduino) API. +.. warning:: -Please first read :doc:`/components/sensor/custom` guide, -the same principles apply here. + While we try to keep the ESPHome YAML configuration options as stable as possible, the ESPHome API is less + stable. If something in the APIs needs to be changed in order for something else to work, we will do so. + +This component can be used to create custom climate devices in ESPHome using the C++ (Arduino) API. + +Please first read :doc:`/components/sensor/custom` guide, the same principles apply here. The example below is an example of a custom climate device - all climate devices must override two methods (:apiclass:`Climate `): diff --git a/components/copy.rst b/components/copy.rst index 93f21c6d4..5cc7191c8 100644 --- a/components/copy.rst +++ b/components/copy.rst @@ -1,11 +1,11 @@ -Copy Integration -================ +Copy Component +============== .. seo:: - :description: Instructions for setting up the copy integration in ESPHome + :description: Instructions for setting up the copy component in ESPHome :image: content-copy.svg -The ``copy`` integration can be used to copy an existing component (like a sensor, switch, etc.) +The ``copy`` component can be used to copy an existing component (like a sensor, switch, etc.) and create a duplicate mirroring the source's state and forwarding actions such as turning on to the source. For each of the supported platforms, the configuration consists of the required configuration diff --git a/components/cover/custom.rst b/components/cover/custom.rst index 4b49dbc5c..c623a54f9 100644 --- a/components/cover/custom.rst +++ b/components/cover/custom.rst @@ -1,24 +1,29 @@ Custom Cover ============ +.. seo:: + :description: Instructions for setting up Custom C++ covers with ESPHome. + :image: language-cpp.svg + :keywords: C++, Custom + .. warning:: - Custom components are deprecated, not recommended for new configurations - and will be removed from ESPHome in a future release. - Please look at creating a real ESPHome component and "importing" it into your - configuration with :doc:`/components/external_components`. + Custom components are deprecated, not recommended for new configurations and will be removed from ESPHome in a + future release. Please look at creating a real ESPHome component and "importing" it into your configuration with + :doc:`/components/external_components`. - You can find some basic documentation on creating your own components - at :ref:`contributing_to_esphome`. + You can find some basic documentation on creating your own components at :ref:`contributing_to_esphome`. -This integration can be used to create custom covers in ESPHome -using the C++ (Arduino) API. +.. warning:: -Please first read :doc:`/components/sensor/custom` guide, -the same principles apply here. + While we try to keep the ESPHome YAML configuration options as stable as possible, the ESPHome API is less + stable. If something in the APIs needs to be changed in order for something else to work, we will do so. -The example below is an example of a custom cover - all covers must override -two methods: +This component can be used to create custom covers in ESPHome using the C++ (Arduino) API. + +Please first read :doc:`/components/sensor/custom` guide, the same principles apply here. + +The example below is an example of a custom cover - all covers must override two methods: - ``get_traits``: This should return a :apiclass:`CoverTraits ` object representing the capabilities of the cover. diff --git a/components/cover/tuya.rst b/components/cover/tuya.rst index 2293cdd63..917b87545 100644 --- a/components/cover/tuya.rst +++ b/components/cover/tuya.rst @@ -45,7 +45,7 @@ Configuration variables: Supported devices ----------------- -Tuya cover devices known to be supported by this integration: +Tuya cover devices known to be supported by this component: - Tuya ``M515EGWT`` (motor for bead chain roller blinds) diff --git a/components/demo.rst b/components/demo.rst index faccce99f..65eef4b51 100644 --- a/components/demo.rst +++ b/components/demo.rst @@ -1,12 +1,12 @@ -Demo Integration -================ +Demo Component +============== .. seo:: - :description: Instructions for setting up the demo integration in ESPHome + :description: Instructions for setting up the demo component in ESPHome :image: description.svg -The ``demo`` integration can be used for testing to generate sample instances of many -different integrations (sensors, lights, ...) +The ``demo`` component can be used for testing to generate sample instances of many +different components (sensors, lights, ...) .. figure:: images/demo-ui.png :align: center @@ -20,7 +20,7 @@ different integrations (sensors, lights, ...) Configuration variables: ------------------------ -This integration has no configuration variables +This component has no configuration variables See Also -------- diff --git a/components/dfplayer.rst b/components/dfplayer.rst index 9b2f5e655..fadc1c232 100644 --- a/components/dfplayer.rst +++ b/components/dfplayer.rst @@ -2,7 +2,7 @@ DF-Player mini ============== .. seo:: - :description: Instructions for setting up DF Player Mini integration in ESPHome. + :description: Instructions for setting up DF Player Mini component in ESPHome. :image: dfplayer.svg The ``dfplayer`` (`datasheet `__), component @@ -14,8 +14,7 @@ allows you to play sound and music stored in an SD card or USB flash drive. DF-Player mini Module. -For this integration to work you need to have set up a :ref:`UART bus ` -in your configuration. +For this component to work you need to have set up a :ref:`UART bus ` in your configuration. Overview -------- diff --git a/components/display/index.rst b/components/display/index.rst index d6f443eba..c9b39e072 100644 --- a/components/display/index.rst +++ b/components/display/index.rst @@ -2,7 +2,7 @@ Display Component ================= .. seo:: - :description: Instructions for setting up the display integration. + :description: Instructions for setting up the display component. :image: folder-open.svg The ``display`` component houses ESPHome's powerful rendering and display diff --git a/components/display/lcd_display.rst b/components/display/lcd_display.rst index 005de6c4c..530b13b23 100644 --- a/components/display/lcd_display.rst +++ b/components/display/lcd_display.rst @@ -2,12 +2,12 @@ Character-Based LCD Display =========================== .. seo:: - :description: Instructions for setting up character-based HD44780 LCD displays. + :description: Instructions for setting up character-based HD44780 LCDs. :image: lcd.jpg -The ``lcd_pcf8574`` and ``lcd_gpio`` display components allow you to use HD44780-compatible, character-based LCD displays -with ESPHome. This integration is only for LCD displays that display individual characters on a screen -(usually 8-40 columns and 2-4 rows), and not for LCD displays that can control each pixel individually. +The ``lcd_pcf8574`` and ``lcd_gpio`` display components allow you to use HD44780-compatible, character-based LCDs +with ESPHome. This component is only for LCDs that display individual characters on a screen +(usually 8-40 columns and 2-4 rows), and not for LCDs that can control each pixel individually. .. figure:: images/lcd-hello_world.jpg :align: center diff --git a/components/display/max7219.rst b/components/display/max7219.rst index ad1b1c6c5..11e069f1c 100644 --- a/components/display/max7219.rst +++ b/components/display/max7219.rst @@ -8,7 +8,7 @@ MAX7219 7-Segment Display The ``max7219`` display platform allows you to use MAX7219 7-segment display drivers ( `datasheet `__, `hobbycomponents `__) -with ESPHome. Please note that this integration is *only* for 7-segment display, not matrix configurations. +with ESPHome. Please note that this component is *only* for 7-segment display, not matrix configurations. .. figure:: images/max7219-full.jpg :align: center @@ -16,7 +16,7 @@ with ESPHome. Please note that this integration is *only* for 7-segment display, MAX7219 7-Segment Display. -As the communication with the MAX7219 is done using SPI for this integration, you need +As the communication with the MAX7219 is done using SPI for this component, you need to have an :ref:`SPI bus ` in your configuration with both the **mosi_pin** set (miso_pin is not required). Connect VCC to 3.3V (the manufacturer recommends 4+ V, but 3.3V seems to work fine), DIN to your ``mosi_pin`` and CS to your set ``cs_pin`` and finally GND to GND. diff --git a/components/display/max7219digit.rst b/components/display/max7219digit.rst index 2c7923c43..650ef878e 100644 --- a/components/display/max7219digit.rst +++ b/components/display/max7219digit.rst @@ -5,7 +5,7 @@ MAX7219 Digit Display :description: Instructions for setting up MAX7219 Digit displays. :image: max7219digit.jpg -The ``max7219`` display platform allows you to use MAX7219 digit with ESPHome. Please note that this integration +The ``max7219`` display platform allows you to use MAX7219 digit with ESPHome. Please note that this component is *only* for the digit "matrix" display, for the 7 segment display see :doc:`max7219`. .. figure:: images/max7219digit.png @@ -14,7 +14,7 @@ is *only* for the digit "matrix" display, for the 7 segment display see :doc:`ma MAX7219 Digit Display. -As the communication with the MAX7219 Digit is done using SPI for this integration, you need +As the communication with the MAX7219 Digit is done using SPI for this component, you need to have an :ref:`SPI bus ` in your configuration with both the **mosi_pin** set (miso_pin is not required). Connect VCC to 3.3V (the manufacturer recommends 4+ V, but 3.3V seems to work fine), DIN to your ``mosi_pin`` and CS to your set ``cs_pin`` and finally GND to GND. diff --git a/components/display/waveshare_epaper.rst b/components/display/waveshare_epaper.rst index 44a194a81..ca58e9fd2 100644 --- a/components/display/waveshare_epaper.rst +++ b/components/display/waveshare_epaper.rst @@ -23,7 +23,7 @@ single-color E-Ink displays are implemented and of those only a few modules. Waveshare E-Paper 2.9 Inch E-Paper Display. -The communication ESPHome has chosen to use for this integration is 4-wire :ref:`SPI `, as it's the most stable +The communication ESPHome has chosen to use for this component is 4-wire :ref:`SPI `, as it's the most stable and high-speed. So you need to make sure your board is set to the 4-wire SPI mode and have an ``spi:`` section in your configuration. diff --git a/components/display_menu/graphical_display_menu.rst b/components/display_menu/graphical_display_menu.rst index 751769d8f..9949b8b4e 100644 --- a/components/display_menu/graphical_display_menu.rst +++ b/components/display_menu/graphical_display_menu.rst @@ -19,7 +19,7 @@ ESPHome node, without the requirement of a network connection. Overview -------- -The integration implements the :ref:`Display Menu ` integration providing +The component implements the :ref:`Display Menu ` component providing a hierarchical menu primarily intended to be controlled either by a rotary encoder with a button or a five-button joystick controller. diff --git a/components/display_menu/index.rst b/components/display_menu/index.rst index 752c2ae94..9a38ecbf8 100644 --- a/components/display_menu/index.rst +++ b/components/display_menu/index.rst @@ -7,7 +7,7 @@ Display Menu .. _display_menu: -The integration provides a menu primarily intended to be controlled either by a rotary encoder +The component provides a menu primarily intended to be controlled either by a rotary encoder with a button or a five-button joystick controller. It allows to navigate a hierarchy of items and submenus with the ability to change the values and execute commands. The menu can be activated and deactivated on demand, allowing alternating between using the screen for @@ -17,8 +17,8 @@ Overview -------- This document describes the configuration and automations common for the components implementing -this integration. At the moment the character based LCD displays are supported using -the :ref:`lcd_menu ` integration and an instance of this is used in the configuration +this component. At the moment the character based LCD displays are supported using +the :ref:`lcd_menu ` component and an instance of this is used in the configuration examples. diff --git a/components/display_menu/lcd_menu.rst b/components/display_menu/lcd_menu.rst index 676c6d474..9645ece37 100644 --- a/components/display_menu/lcd_menu.rst +++ b/components/display_menu/lcd_menu.rst @@ -19,7 +19,7 @@ ESPHome node, without the requirement of a network connection. Overview -------- -The integration implements the :ref:`Display Menu ` integration providing +The component implements the :ref:`Display Menu ` component providing a hierarchical menu primarily intended to be controlled either by a rotary encoder with a button or a five-button joystick controller. diff --git a/components/fingerprint_grow.rst b/components/fingerprint_grow.rst index c36a2e2c1..56435d509 100644 --- a/components/fingerprint_grow.rst +++ b/components/fingerprint_grow.rst @@ -2,7 +2,7 @@ Grow Fingerprint Reader ======================= .. seo:: - :description: Instructions for setting up Grow Fingerprint Reader integration in ESPHome. + :description: Instructions for setting up Grow Fingerprint Reader component in ESPHome. :image: fingerprint.svg The ``fingerprint_grow`` component allows you to use your R307, R503, R503-RGB, ZFM-20, ... fingerprint sensors with ESPHome. diff --git a/components/gps.rst b/components/gps.rst index a391a2c46..0f6834a71 100644 --- a/components/gps.rst +++ b/components/gps.rst @@ -2,7 +2,7 @@ GPS Component ============= .. seo:: - :description: Instructions for setting up GPS integration in ESPHome. + :description: Instructions for setting up GPS component in ESPHome. :image: crosshairs-gps.svg The ``gps`` component allows you to connect GPS modules to your ESPHome project. @@ -16,7 +16,7 @@ Any GPS module that uses the standardized NMEA communication protocol will work. .. _Adafruit: https://www.adafruit.com/product/746 -For this integration to work you need to have set up a :ref:`UART bus ` +For this component to work you need to have set up a :ref:`UART bus ` in your configuration - only the RX pin should be necessary. .. code-block:: yaml diff --git a/components/light/custom.rst b/components/light/custom.rst index 03353f6f1..0ebf96564 100644 --- a/components/light/custom.rst +++ b/components/light/custom.rst @@ -1,21 +1,27 @@ Custom Light Output =================== +.. seo:: + :description: Instructions for setting up Custom C++ lights with ESPHome. + :image: language-cpp.svg + :keywords: C++, Custom + .. warning:: - Custom components are deprecated, not recommended for new configurations - and will be removed from ESPHome in a future release. - Please look at creating a real ESPHome component and "importing" it into your - configuration with :doc:`/components/external_components`. + Custom components are deprecated, not recommended for new configurations and will be removed from ESPHome in a + future release. Please look at creating a real ESPHome component and "importing" it into your configuration with + :doc:`/components/external_components`. - You can find some basic documentation on creating your own components - at :ref:`contributing_to_esphome`. + You can find some basic documentation on creating your own components at :ref:`contributing_to_esphome`. -This integration can be used to create custom lights in ESPHome -using the C++ (Arduino) API. +.. warning:: -Please first read :doc:`/components/sensor/custom` guide, -the same principles apply here. + While we try to keep the ESPHome YAML configuration options as stable as possible, the ESPHome API is less + stable. If something in the APIs needs to be changed in order for something else to work, we will do so. + +This component can be used to create custom lights in ESPHome using the C++ (Arduino) API. + +Please first read :doc:`/components/sensor/custom` guide, the same principles apply here. All internal stuff (like effects, transitions etc) is handled by the light core and cannot be overridden. Light outputs are only responsible for displaying some state diff --git a/components/light/neopixelbus.rst b/components/light/neopixelbus.rst index 271af0c6e..701fa7337 100644 --- a/components/light/neopixelbus.rst +++ b/components/light/neopixelbus.rst @@ -18,7 +18,7 @@ in ESPHome for individually addressable lights like NeoPixel or WS2812. It is very similar to the :doc:`fastled` platform. In fact, most addressable lights are supported through both light platforms. The difference is that they use different libraries: while the fastled platform uses -the `FastLED `__ library, this integration uses +the `FastLED `__ library, this component uses the `NeoPixelBus `__ library internally. .. code-block:: yaml diff --git a/components/micronova.rst b/components/micronova.rst index 8ccda83bd..f350588c2 100644 --- a/components/micronova.rst +++ b/components/micronova.rst @@ -18,7 +18,7 @@ The :ref:`UART ` must be configured with a baud rate 1200, 8 data bits, 2 Also, switching your stove on or off can behave different on the various MicroNova flavours. - Use this integration at your own risk. + Use this component at your own risk. Connecting your stove --------------------- diff --git a/components/mqtt.rst b/components/mqtt.rst index 154a492bd..c255d8ef2 100644 --- a/components/mqtt.rst +++ b/components/mqtt.rst @@ -184,13 +184,12 @@ Home Assistant generates entity names for all discovered devices based on entity entity name (e.g. ``sensor.uptime``). Numeric suffixes are appended to entity names when multiple devices use the same name for a sensor, making it harder to distinguish between similar sensors on different devices. Home Assistant 2021.12 allows MQTT devices to change -this behaviour by specifying ``object_id`` discovery attribute which replaces the sensor +this behaviour by specifying the ``object_id`` discovery attribute which replaces the sensor name part of the generated entity name. Setting ``discovery_object_id_generator: device_name`` -in ESPHome MQTT integration configuration will cause Home Assistant to include device name +in the ESPHome MQTT component configuration will cause Home Assistant to include device name in the generated entity names (e.g. ``sensor.uptime`` becomes ``sensor._uptime``), making it easier to distinguish the entities in various entity lists. - .. _mqtt-defaults: Defaults diff --git a/components/output/ac_dimmer.rst b/components/output/ac_dimmer.rst index b70474852..1a7c2b1a3 100644 --- a/components/output/ac_dimmer.rst +++ b/components/output/ac_dimmer.rst @@ -2,7 +2,7 @@ AC Dimmer Component =================== .. seo:: - :description: Instructions for setting up AC Dimmer integration in ESPHome. + :description: Instructions for setting up AC Dimmer component in ESPHome. :image: ac_dimmer.svg .. warning:: @@ -16,9 +16,8 @@ AC Dimmer Component The ``ac_dimmer`` component allows you to connect a dimmable light or other load which supports phase control dimming to your ESPHome project. -There are several already made boards which are compatible with this integration, -for example the `RobotDyn dimmer -`__. +There are several already made boards which are compatible with this component, such as the +`RobotDyn dimmer `__. .. figure:: images/robotdyn_dimmer.jpg :align: center diff --git a/components/output/custom.rst b/components/output/custom.rst index 501d46725..ad37e1bf0 100644 --- a/components/output/custom.rst +++ b/components/output/custom.rst @@ -1,17 +1,25 @@ Custom Output ============= +.. seo:: + :description: Instructions for setting up Custom C++ outputs with ESPHome. + :image: language-cpp.svg + :keywords: C++, Custom + .. warning:: - Custom components are deprecated, not recommended for new configurations - and will be removed from ESPHome in a future release. - Please look at creating a real ESPHome component and "importing" it into your - configuration with :doc:`/components/external_components`. + Custom components are deprecated, not recommended for new configurations and will be removed from ESPHome in a + future release. Please look at creating a real ESPHome component and "importing" it into your configuration with + :doc:`/components/external_components`. - You can find some basic documentation on creating your own components - at :ref:`contributing_to_esphome`. + You can find some basic documentation on creating your own components at :ref:`contributing_to_esphome`. -This integration can be used to create custom binary and float :doc:`outputs ` +.. warning:: + + While we try to keep the ESPHome YAML configuration options as stable as possible, the ESPHome API is less + stable. If something in the APIs needs to be changed in order for something else to work, we will do so. + +This component can be used to create custom binary and float :doc:`outputs ` in ESPHome using the C++ (Arduino) API. Please first read :doc:`/components/sensor/custom` guide, the same principles apply here. diff --git a/components/output/sigma_delta_output.rst b/components/output/sigma_delta_output.rst index 9884f00b9..1201f981c 100644 --- a/components/output/sigma_delta_output.rst +++ b/components/output/sigma_delta_output.rst @@ -1,7 +1,7 @@ Sigma-Delta Output ================== -This integration uses `sigma-delta modulation `__ +This component uses `sigma-delta modulation `__ to output a floating-point value on a binary output. Unlike with :doc:`/components/output/slow_pwm`, it is possible to update the output value with each update cycle, not just at the end of a longer period. diff --git a/components/sensor/ads1115.rst b/components/sensor/ads1115.rst index cc1640bcc..3e2eb83c4 100644 --- a/components/sensor/ads1115.rst +++ b/components/sensor/ads1115.rst @@ -36,7 +36,7 @@ Configuration variables: - **address** (**Required**, int): The i²c address of the sensor. See :ref:`I²C Addresses ` for more information. - **continuous_mode** (*Optional*, boolean): Set if the ADS1115 should continuously measure voltages or - only measure them when an update is called. Please enable this for the :doc:`ct_clamp` integration. + only measure them when an update is called. Please enable this for the :doc:`ct_clamp` component. Defaults to ``off``. - **id** (*Optional*, :ref:`config-id`): Manually specify the ID for this ADS1115 Hub. Use this if you want to use multiple ADS1115 hubs at once. diff --git a/components/sensor/airthings_ble.rst b/components/sensor/airthings_ble.rst index c29f966b4..e6fad15e7 100644 --- a/components/sensor/airthings_ble.rst +++ b/components/sensor/airthings_ble.rst @@ -135,8 +135,7 @@ Battery Level Reporting *********************** If you wish to have the 'percentage of battery life remaining' -reported as a sensor, you can make use of the :ref:`copy-sensor` -integration. +reported as a sensor, you can make use of the :ref:`copy-sensor` component. The examples below are based on standard alkaline-chemistry batteries; if you use other types of batteries you may need to adjust the diff --git a/components/sensor/as3935.rst b/components/sensor/as3935.rst index 7bc0aa4f0..d38520faa 100644 --- a/components/sensor/as3935.rst +++ b/components/sensor/as3935.rst @@ -19,7 +19,7 @@ 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. +level and set up the ESPHome component for the chosen communication method. Module Pins ----------- diff --git a/components/sensor/bl0940.rst b/components/sensor/bl0940.rst index 9ee4eed3d..6053fddf1 100644 --- a/components/sensor/bl0940.rst +++ b/components/sensor/bl0940.rst @@ -1,5 +1,5 @@ Belling BL0940 Energy Monitor -================================== +============================= .. seo:: :description: Instructions for setting up BL0940 power monitors. @@ -16,7 +16,7 @@ Belling BL0940 Energy Monitor The ``bl0940`` sensor platform allows you to use BL0940 energy monitors sensors with ESPHome. These are used in some Tuya-devices (e.g. the power metering BW-SHP10) -The communication with this integration is done over a :ref:`UART bus `. +The communication with this component is done via a :ref:`UART `. You must therefore have a ``uart:`` entry in your configuration with both the TX and RX pins set to some pins on your board and the baud rate set to 4800 with 1 stop bit. diff --git a/components/sensor/bl0942.rst b/components/sensor/bl0942.rst index 47220333c..b2757725e 100644 --- a/components/sensor/bl0942.rst +++ b/components/sensor/bl0942.rst @@ -1,5 +1,5 @@ Belling BL0942 Energy Monitor -================================== +============================= .. seo:: :description: Instructions for setting up BL0942 power monitors. @@ -9,7 +9,7 @@ Belling BL0942 Energy Monitor The ``bl0942`` sensor platform allows you to use BL0942 energy monitors sensors with ESPHome. These are used in some Tuya-devices (e.g. Aubess Tuya WiFi Mini Smart Switch With Energy Monitor) -The communication with this integration is done over a :ref:`UART bus `. +The communication with this component is done via a :ref:`UART `. You must therefore have a ``uart:`` entry in your configuration with both the TX and RX pins set to some pins on your board and the baud rate set to 4800 with 1 stop bit. diff --git a/components/sensor/ccs811.rst b/components/sensor/ccs811.rst index 831d95ea8..95b4bde42 100644 --- a/components/sensor/ccs811.rst +++ b/components/sensor/ccs811.rst @@ -23,7 +23,7 @@ The ``ccs811`` sensor platform allows you to use CCS811 eCO_2 and volatile organ .. _Adafruit: https://www.adafruit.com/product/3566 The communication with this sensor is done via :ref:`I²C Bus `, so you need to have -an ``i2c:`` section in your config for this integration to work. +an ``i2c:`` section in your config for this component to work. .. code-block:: yaml diff --git a/components/sensor/cse7766.rst b/components/sensor/cse7766.rst index dcf6acd73..5b820555d 100644 --- a/components/sensor/cse7766.rst +++ b/components/sensor/cse7766.rst @@ -9,7 +9,7 @@ CSE7766 Power Sensor The ``cse7766`` sensor platform allows you to use your CSE7766 voltage/current and power sensors (`datasheet `__) sensors with ESPHome. This sensor is commonly found in Sonoff POW R2. CSE7759B is similar to CSE7766 -and works with this integration. +and works with this component. .. note:: diff --git a/components/sensor/custom.rst b/components/sensor/custom.rst index 76caada78..ad52cbeb5 100644 --- a/components/sensor/custom.rst +++ b/components/sensor/custom.rst @@ -1,16 +1,6 @@ Custom Sensor Component ======================= -.. warning:: - - Custom components are deprecated, not recommended for new configurations - and will be removed from ESPHome in a future release. - Please look at creating a real ESPHome component and "importing" it into your - configuration with :doc:`/components/external_components`. - - You can find some basic documentation on creating your own components - at :ref:`contributing_to_esphome`. - .. seo:: :description: Instructions for setting up Custom C++ sensors with ESPHome. :image: language-cpp.svg @@ -18,11 +8,18 @@ Custom Sensor Component .. warning:: - While I do try to keep the ESPHome configuration options as stable as possible - and back-port them, the ESPHome API is less stable. If something in the APIs needs - to be changed in order for something else to work, I will do so. + Custom components are deprecated, not recommended for new configurations and will be removed from ESPHome in a + future release. Please look at creating a real ESPHome component and "importing" it into your configuration with + :doc:`/components/external_components`. -So, you just set up ESPHome for your ESP32/ESP8266, but sadly ESPHome is missing a sensor integration + You can find some basic documentation on creating your own components at :ref:`contributing_to_esphome`. + +.. warning:: + + While we try to keep the ESPHome YAML configuration options as stable as possible, the ESPHome API is less + stable. If something in the APIs needs to be changed in order for something else to work, we will do so. + +So, you just set up ESPHome for your ESP32/ESP8266, but sadly ESPHome is missing a sensor component you'd really like to have 😕. It's pretty much impossible to support every single sensor, as there are simply too many. That's why ESPHome has a really simple API for you to create your own **custom sensors** 🎉 diff --git a/components/sensor/dsmr.rst b/components/sensor/dsmr.rst index 0f664b0e7..0181270e0 100644 --- a/components/sensor/dsmr.rst +++ b/components/sensor/dsmr.rst @@ -11,7 +11,7 @@ Component/Hub The DSMR component connects to Dutch Smart Meters which comply to DSMR (Dutch Smart Meter Requirements), also known as ‘Slimme meter’ or ‘P1 port’. -This integration supports plain non encrypted telegrams and also encrypted as used in Luxembourg. +This component supports plain non encrypted telegrams and also encrypted as used in Luxembourg. In case your equipment has encryption you must get a 32 character long encryption key from your energy company. This component is passive, it does not transmit any data to your equipment, the equipment always transmits diff --git a/components/sensor/growatt_solar.rst b/components/sensor/growatt_solar.rst index b44244688..5aefa3623 100644 --- a/components/sensor/growatt_solar.rst +++ b/components/sensor/growatt_solar.rst @@ -14,7 +14,7 @@ The ``Growatt Inverter`` sensor platform allows you to use growatt inverter data Growatt Logo -The communication with this integration is done over a :ref:`UART bus ` using :ref:`Modbus `. +The communication with this component is done over a :ref:`UART bus ` using :ref:`Modbus `. You must therefore have a ``uart:`` entry in your configuration with both the TX and RX pins set to some pins on your board and the baud rate set to 9600. diff --git a/components/sensor/havells_solar.rst b/components/sensor/havells_solar.rst index 5338e6f5e..dec07ff51 100644 --- a/components/sensor/havells_solar.rst +++ b/components/sensor/havells_solar.rst @@ -16,7 +16,7 @@ with ESPHome. Havells On Grid Solar Inverter. -The communication with this integration is done over a :ref:`UART bus ` using :ref:`Modbus `. +The communication with this component is done via a :ref:`UART ` using :ref:`Modbus `. You must therefore have a ``uart:`` entry in your configuration with both the TX and RX pins set to some pins on your board and the baud rate set to 9600. diff --git a/components/sensor/hlw8012.rst b/components/sensor/hlw8012.rst index eb1dcf0f7..4a635e7f7 100644 --- a/components/sensor/hlw8012.rst +++ b/components/sensor/hlw8012.rst @@ -9,12 +9,14 @@ HLW8012 Power Sensor The ``hlw8012`` sensor platform allows you to use your HLW8012 voltage/current and power sensors (`datasheet `__) sensors with ESPHome. This sensor is commonly found in Sonoff POWs. CSE7759 and BL0937 are similar to HLW8012 -and work with this integration. Beware that CSE7759B is different and should be used -with the :doc:`CSE7766 ` integration. +and work with this component. Beware that CSE7759B is different and should be used with the +:doc:`CSE7766 ` component. .. note:: - SAFETY HAZARD: Some devices such as Sonoff POWs/Shelly/etc, have the digital GND connected directly to mains voltage so **the GPIOs become LIVE during normal operation**. Our advice is to mark these boards to prevent any use of the dangerous digital pins. + SAFETY HAZARD: Some devices such as Sonoff POWs/Shelly/etc, have the digital GND connected directly to mains + voltage so **the GPIOs become LIVE during normal operation**. Our advice is to mark these boards to prevent + any use of the dangerous digital pins. This sensor has two data outputs which both encode values using the frequency of a modulated signal: CF and CF1. CF's frequency is proportional to the (active) power measured and CF1 is proportional to the current/voltage. Using diff --git a/components/sensor/inkbird_ibsth1_mini.rst b/components/sensor/inkbird_ibsth1_mini.rst index 4b641aab5..530fc4e5a 100644 --- a/components/sensor/inkbird_ibsth1_mini.rst +++ b/components/sensor/inkbird_ibsth1_mini.rst @@ -107,7 +107,7 @@ entry like in the configuration example at the top. .. note:: - The ESPHome Inkbird IBS-TH1/TH2 integration listens passively to packets the device sends by itself. + The ESPHome Inkbird IBS-TH1/TH2 component listens passively to packets the device sends by itself. ESPHome therefore has no impact on the battery life of the device. See Also diff --git a/components/sensor/mcp3204.rst b/components/sensor/mcp3204.rst index b8239a977..117b9359f 100644 --- a/components/sensor/mcp3204.rst +++ b/components/sensor/mcp3204.rst @@ -6,10 +6,9 @@ MCP3204 & MCP3208 12-Bit A/D Converters :keywords: MCP3204 MCP3208 :image: mcp3204.jpg -The Microchip Technology Inc. MCP3204 & MCP3208 -devices are successive approximation 12-bit Analog-to-Digital (A/D) converters with on-board sample and -hold circuitry. This integration is common for both device types. -configure both devices as MCP3204 and observe the maximum number of channels as per variant used. +The Microchip Technology Inc. MCP3204 & MCP3208 devices are successive approximation 12-bit Analog-to-Digital (A/D) +converters with on-board sample and hold circuitry. This component is common for both device types. +Configure both devices as MCP3204 and observe the maximum number of channels as per variant used. .. figure:: images/mcp3204.jpg :align: center diff --git a/components/sensor/mmc5983.rst b/components/sensor/mmc5983.rst index c29a5b37a..b061354d0 100644 --- a/components/sensor/mmc5983.rst +++ b/components/sensor/mmc5983.rst @@ -8,8 +8,7 @@ MMC5983 Magnetometer :image: mmc5983.jpg :keywords: MMC5983 -The ``mmc5983`` integration allows you to use your MMC5983 triple-axis magnetometer -(`datasheet`_, `SparkFun`_) with ESPHome. +The ``mmc5983`` component allows you to use your MMC5983 triple-axis magnetometer (`datasheet`_, `SparkFun`_) with ESPHome. The :ref:`I²C Bus ` is required to be set up for this sensor to work. The device supports 400kHz operation, so you may specify up to ``frequency: 400kHz`` in your ``i2c`` configuration. diff --git a/components/sensor/mopeka_pro_check.rst b/components/sensor/mopeka_pro_check.rst index d5b8b8406..ec003a832 100644 --- a/components/sensor/mopeka_pro_check.rst +++ b/components/sensor/mopeka_pro_check.rst @@ -144,7 +144,7 @@ Then just copy the address (``D3:75:F2:DC:16:91``) into a new .. note:: - The ESPHome Mopeka Pro Check BLE integration listens passively to packets the Mopeka/Lippert device sends by itself. + The ESPHome Mopeka Pro Check BLE component listens passively to packets the Mopeka/Lippert device sends by itself. ESPHome therefore has no impact on the battery life of the device. See Also diff --git a/components/sensor/mopeka_std_check.rst b/components/sensor/mopeka_std_check.rst index 43911030e..e9f7f6f6d 100644 --- a/components/sensor/mopeka_std_check.rst +++ b/components/sensor/mopeka_std_check.rst @@ -138,7 +138,7 @@ Then just copy the address (``D3:75:F2:DC:16:91``) into a new .. note:: - The ESPHome Mopeka Standard Check BLE integration listens passively to packets the Mopeka device sends by itself. + The ESPHome Mopeka Standard Check BLE component listens passively to packets the Mopeka device sends by itself. ESPHome therefore has no impact on the battery life of the device. See Also diff --git a/components/sensor/mqtt_subscribe.rst b/components/sensor/mqtt_subscribe.rst index c004949fb..ae8e723e0 100644 --- a/components/sensor/mqtt_subscribe.rst +++ b/components/sensor/mqtt_subscribe.rst @@ -10,7 +10,7 @@ The ``mqtt_subscribe`` sensor platform allows you to get external data into ESPH The sensor will subscribe to messages on the given MQTT topic and parse each message into a floating point number. -Please note this integration only works with MQTT topics that have numeric data! Each time +Please note this component only works with MQTT topics that have numeric data! Each time a message that is not a number is published a warning will be shown. Please use the MQTT subscribe text sensor for importing arbitrary text into the ESPHome ecosystem. diff --git a/components/sensor/pulse_meter.rst b/components/sensor/pulse_meter.rst index 102a20163..5941c377b 100644 --- a/components/sensor/pulse_meter.rst +++ b/components/sensor/pulse_meter.rst @@ -6,7 +6,7 @@ Pulse Meter Sensor :image: pulse.svg The pulse meter sensor allows you to count the number and frequency of pulses on any pin. It is intended to be a drop-in replacement -for the :doc:`pulse counter integration `. +for the :doc:`pulse counter component `. Rather than counting pulses over a fixed time interval, the pulse meter sensor measures the time between pulses. The precise manner in which this is done depends on the ``internal_filter_mode`` option. This leads to a higher resolution, especially for low pulse rates, as the pulse counter sensor is limited by the number of pulses within a time interval. Here's a comparison of the two sensors. The pulse meter is the smoother line. Both are set to an update interval of 10 seconds (using the ``update_interval`` and the ``throttle_average`` option respectively): diff --git a/components/sensor/pzem004t.rst b/components/sensor/pzem004t.rst index 2e339e37a..b35d2c6ae 100644 --- a/components/sensor/pzem004t.rst +++ b/components/sensor/pzem004t.rst @@ -24,7 +24,7 @@ ESPHome. The PZEM-004, however, is still working (and selling) with this protocol and does not use modbus. For using the newer V3 variant of this sensor please see :doc:`pzemac `. -The communication with this integration is done over a :ref:`UART bus `. +The communication with this component is done via a :ref:`UART `. You must therefore have a ``uart:`` entry in your configuration with both the TX and RX pins set to some pins on your board and the baud rate set to 9600. diff --git a/components/sensor/pzemac.rst b/components/sensor/pzemac.rst index cebb686a1..cd3ee42dc 100644 --- a/components/sensor/pzemac.rst +++ b/components/sensor/pzemac.rst @@ -37,7 +37,7 @@ for more information. This page refers to version V3 of the PZEM004T. For using the older V1 variant of this sensor please see :doc:`pzem004t `. -The communication with this integration is done over a :ref:`UART bus ` using :ref:`Modbus `. +The communication with this component is done via a :ref:`UART ` using :ref:`Modbus `. You must therefore have a ``uart:`` entry in your configuration with both the TX and RX pins set to some pins on your board and the baud rate set to 9600. diff --git a/components/sensor/pzemdc.rst b/components/sensor/pzemdc.rst index 6a7d29091..c2a9edc0e 100644 --- a/components/sensor/pzemdc.rst +++ b/components/sensor/pzemdc.rst @@ -15,7 +15,7 @@ Peacefair PZEM-00X DC Energy Monitor The ``pzemdc`` sensor platform allows you to use various DC Peacefair PZEM energy monitors with ESPHome. The supported models are: PZEM-003, PZEM-014, PZEM-016 and PZEM-017. -The communication with this integration is done over a :ref:`UART bus `. +The communication with this component is via a :ref:`UART `. You must therefore have a ``uart:`` entry in your configuration with both the TX and RX pins set to some pins on your board and the baud rate set to 9600. diff --git a/components/sensor/ruuvitag.rst b/components/sensor/ruuvitag.rst index 92a3ae9d7..b38f80740 100644 --- a/components/sensor/ruuvitag.rst +++ b/components/sensor/ruuvitag.rst @@ -176,7 +176,7 @@ Then just copy the address (``FF:56:D3:2F:7D:E8``) into a new .. note:: - The ESPHome Ruuvi BLE integration listens passively to packets the RuuviTag device sends by itself. + The ESPHome Ruuvi BLE component listens passively to packets the RuuviTag device sends by itself. ESPHome therefore has no impact on the battery life of the device. See Also diff --git a/components/sensor/sdm_meter.rst b/components/sensor/sdm_meter.rst index 44067ca03..fa3192694 100644 --- a/components/sensor/sdm_meter.rst +++ b/components/sensor/sdm_meter.rst @@ -16,7 +16,7 @@ with ESPHome. SDM230M Energy Monitor. -The communication with this integration is done over a :ref:`UART bus ` using the :ref:`Modbus protocol ` +The communication with this component is done via a :ref:`UART ` using the :ref:`Modbus protocol ` over RS485 wiring. You will need an RS485 to UART converter for communication. You must therefore have a ``uart:`` entry in your configuration with both the TX and RX pins set to some pins on your board and the baud rate set to 9600bps. diff --git a/components/sensor/selec_meter.rst b/components/sensor/selec_meter.rst index 392583905..fb268dffa 100644 --- a/components/sensor/selec_meter.rst +++ b/components/sensor/selec_meter.rst @@ -16,7 +16,7 @@ with ESPHome. Selec EM2M Energy Monitor. -The communication with this integration is done over a :ref:`UART bus ` using :ref:`Modbus `. +The communication with this component is done via a :ref:`UART ` using :ref:`Modbus `. You must therefore have a ``uart:`` entry in your configuration with both the TX and RX pins set to some pins on your board and the baud rate set to 9600. diff --git a/components/sensor/smt100.rst b/components/sensor/smt100.rst index 93e7567fc..cfabbd757 100644 --- a/components/sensor/smt100.rst +++ b/components/sensor/smt100.rst @@ -1,5 +1,5 @@ SMT100 Soil Moisture Sensor -================================ +=========================== .. seo:: :description: Instructions for setting up SMT100 soil moisture and temperature sensor @@ -14,7 +14,9 @@ The SMT100 sensor platform allows you to use the SMT100 soil moisture and temper :width: 50.0% -The communication with this integration is done over a UART bus using a simple ASCII protocol. You must therefore have a ``uart:`` entry in your configuration with both the TX and RX pins set to some pins on your board and the baud rate set to 9600. +The communication with this component is done via a :ref:`UART ` using a simple ASCII protocol. You must +therefore have a ``uart:`` entry in your configuration with both the TX and RX pins set to some pins on your +board and the baud rate set to 9600. .. code-block:: yaml diff --git a/components/servo.rst b/components/servo.rst index 89939fba4..271a78d95 100644 --- a/components/servo.rst +++ b/components/servo.rst @@ -9,7 +9,7 @@ The ``servo`` component allows you to use servo motors with ESPHome. Servos are motor controllers that contain all the electronics necessary for driving the motor and provide a simple PWM interface to control the motor. -This integration works with both continuous-rotation and absolute servos and has a similar +This component works with both continuous-rotation and absolute servos and has a similar interface to the Arduino Servo library. First, create an :ref:`output component ` (here ``esp8266_pwm``) for the pin the diff --git a/components/switch/custom.rst b/components/switch/custom.rst index 1f9344980..5e0823171 100644 --- a/components/switch/custom.rst +++ b/components/switch/custom.rst @@ -1,21 +1,27 @@ Custom Switch ============= +.. seo:: + :description: Instructions for setting up Custom C++ switches with ESPHome. + :image: language-cpp.svg + :keywords: C++, Custom + .. warning:: - Custom components are deprecated, not recommended for new configurations - and will be removed from ESPHome in a future release. - Please look at creating a real ESPHome component and "importing" it into your - configuration with :doc:`/components/external_components`. + Custom components are deprecated, not recommended for new configurations and will be removed from ESPHome in a + future release. Please look at creating a real ESPHome component and "importing" it into your configuration with + :doc:`/components/external_components`. - You can find some basic documentation on creating your own components - at :ref:`contributing_to_esphome`. + You can find some basic documentation on creating your own components at :ref:`contributing_to_esphome`. -This integration can be used to create custom switches in ESPHome -using the C++ (Arduino) API. +.. warning:: -Please first read :doc:`/components/sensor/custom` guide, -the same principles apply here. + While we try to keep the ESPHome YAML configuration options as stable as possible, the ESPHome API is less + stable. If something in the APIs needs to be changed in order for something else to work, we will do so. + +This component can be used to create custom switches in ESPHome using the C++ (Arduino) API. + +Please first read :doc:`/components/sensor/custom` guide, the same principles apply here. The example below is an example of a custom switch; this custom switch is essentially the same as the gpio switch implementation. diff --git a/components/text_sensor/custom.rst b/components/text_sensor/custom.rst index e43e31f7d..f0606e19d 100644 --- a/components/text_sensor/custom.rst +++ b/components/text_sensor/custom.rst @@ -1,22 +1,28 @@ Custom Text Sensor ================== +.. seo:: + :description: Instructions for setting up Custom C++ text sensors with ESPHome. + :image: language-cpp.svg + :keywords: C++, Custom + .. warning:: - Custom components are deprecated, not recommended for new configurations - and will be removed from ESPHome in a future release. - Please look at creating a real ESPHome component and "importing" it into your - configuration with :doc:`/components/external_components`. + Custom components are deprecated, not recommended for new configurations and will be removed from ESPHome in a + future release. Please look at creating a real ESPHome component and "importing" it into your configuration with + :doc:`/components/external_components`. - You can find some basic documentation on creating your own components - at :ref:`contributing_to_esphome`. + You can find some basic documentation on creating your own components at :ref:`contributing_to_esphome`. -This integration can be used to create custom text sensors in ESPHome -using the C++ (Arduino) API. +.. warning:: -Please first read :doc:`/components/sensor/custom` guide, -the same principles apply here and text sensors are very similar -to sensors internally. + While we try to keep the ESPHome YAML configuration options as stable as possible, the ESPHome API is less + stable. If something in the APIs needs to be changed in order for something else to work, we will do so. + +This component can be used to create custom text sensors in ESPHome using the C++ (Arduino) API. + +Please first read :doc:`/components/sensor/custom` guide, the same principles apply here and text +sensors are very similar to sensors internally. The example below is an example of a custom text sensor which constantly publishes the message "Hello World!". diff --git a/components/text_sensor/mqtt_subscribe.rst b/components/text_sensor/mqtt_subscribe.rst index 306955c70..17a6d5966 100644 --- a/components/text_sensor/mqtt_subscribe.rst +++ b/components/text_sensor/mqtt_subscribe.rst @@ -31,7 +31,7 @@ Configuration variables: Example Usage for Displays -------------------------- -This integration is especially useful for displays, to show external data on the display. +This component is especially useful for displays, to show external data on the display. Please note you have to use the ``.c_str()`` method on the ``.state`` object together with the ``%s`` format to use it in ``printf`` expressions. diff --git a/components/tm1651.rst b/components/tm1651.rst index adc334661..8ace6218d 100644 --- a/components/tm1651.rst +++ b/components/tm1651.rst @@ -10,9 +10,9 @@ TM1651 Battery Display Battery Display --------------- -The ``tm1651`` display platform allows you to use battery display units based on TM1651 chip, like -`this one `__ -with ESPHome. Currently integration supports level and brightness setting. All updates can be made via lambda expressions. +The ``tm1651`` display platform allows you to use battery display units based on the TM1651 chip such as +`this one `__ with ESPHome. This component supports the level +and brightness settings. All updates can be made via lambda expressions. .. figure:: images/tm1651-battery-display.jpg :align: center diff --git a/custom/custom_component.rst b/custom/custom_component.rst index 5544f3aac..72e23baf9 100644 --- a/custom/custom_component.rst +++ b/custom/custom_component.rst @@ -1,20 +1,29 @@ Generic Custom Component ======================== +.. seo:: + :description: Instructions for setting up Custom C++ components with ESPHome. + :image: language-cpp.svg + :keywords: C++, Custom + .. warning:: - Custom components are deprecated, not recommended for new configurations - and will be removed from ESPHome in a future release. - Please look at creating a real ESPHome component and "importing" it into your - configuration with :doc:`/components/external_components`. + Custom components are deprecated, not recommended for new configurations and will be removed from ESPHome in a + future release. Please look at creating a real ESPHome component and "importing" it into your configuration with + :doc:`/components/external_components`. - You can find some basic documentation on creating your own components - at :ref:`contributing_to_esphome`. + You can find some basic documentation on creating your own components at :ref:`contributing_to_esphome`. -This integration can be used to create generic custom components in ESPHome -using the C++ (Arduino) API. This integration should be used in cases where +.. warning:: + + While we try to keep the ESPHome YAML configuration options as stable as possible, the ESPHome API is less + stable. If something in the APIs needs to be changed in order for something else to work, we will do so. + + +This component can be used to create generic custom components in ESPHome +using the C++ (Arduino) API. This component should be used in cases where none of ESPHome's abstraction layers (for example the "sensor", "binary sensor", -"switch", etc concepts) work well for your integration. +"switch", etc concepts) work well for your component. Please first read :doc:`/components/sensor/custom` guide, the same principles apply here. diff --git a/custom/i2c.rst b/custom/i2c.rst index 7b556a9ba..87940b8be 100644 --- a/custom/i2c.rst +++ b/custom/i2c.rst @@ -1,15 +1,23 @@ Custom I²C Device ================= +.. seo:: + :description: Instructions for setting up Custom C++ I2C devices with ESPHome. + :image: language-cpp.svg + :keywords: C++, Custom + .. warning:: - Custom components are deprecated, not recommended for new configurations - and will be removed from ESPHome in a future release. - Please look at creating a real ESPHome component and "importing" it into your - configuration with :doc:`/components/external_components`. + Custom components are deprecated, not recommended for new configurations and will be removed from ESPHome in a + future release. Please look at creating a real ESPHome component and "importing" it into your configuration with + :doc:`/components/external_components`. - You can find some basic documentation on creating your own components - at :ref:`contributing_to_esphome`. + You can find some basic documentation on creating your own components at :ref:`contributing_to_esphome`. + +.. warning:: + + While we try to keep the ESPHome YAML configuration options as stable as possible, the ESPHome API is less + stable. If something in the APIs needs to be changed in order for something else to work, we will do so. Lots of devices communicate using the I²C protocol. If you want to integrate a device into ESPHome that uses this protocol you can pretty much use almost diff --git a/custom/spi.rst b/custom/spi.rst index 1653a282c..6407d1d58 100644 --- a/custom/spi.rst +++ b/custom/spi.rst @@ -1,15 +1,23 @@ Custom SPI Device ================= +.. seo:: + :description: Instructions for setting up Custom C++ SPI devices with ESPHome. + :image: language-cpp.svg + :keywords: C++, Custom + .. warning:: - Custom components are deprecated, not recommended for new configurations - and will be removed from ESPHome in a future release. - Please look at creating a real ESPHome component and "importing" it into your - configuration with :doc:`/components/external_components`. + Custom components are deprecated, not recommended for new configurations and will be removed from ESPHome in a + future release. Please look at creating a real ESPHome component and "importing" it into your configuration with + :doc:`/components/external_components`. - You can find some basic documentation on creating your own components - at :ref:`contributing_to_esphome`. + You can find some basic documentation on creating your own components at :ref:`contributing_to_esphome`. + +.. warning:: + + While we try to keep the ESPHome YAML configuration options as stable as possible, the ESPHome API is less + stable. If something in the APIs needs to be changed in order for something else to work, we will do so. Lots of devices communicate using the SPI protocol. If you want to integrate a device into ESPHome that uses this protocol you can pretty much use almost diff --git a/custom/uart.rst b/custom/uart.rst index 57c52bcf0..40b71b668 100644 --- a/custom/uart.rst +++ b/custom/uart.rst @@ -1,15 +1,23 @@ Custom UART Device ================== +.. seo:: + :description: Instructions for setting up Custom C++ UART devices with ESPHome. + :image: language-cpp.svg + :keywords: C++, Custom + .. warning:: - Custom components are deprecated, not recommended for new configurations - and will be removed from ESPHome in a future release. - Please look at creating a real ESPHome component and "importing" it into your - configuration with :doc:`/components/external_components`. + Custom components are deprecated, not recommended for new configurations and will be removed from ESPHome in a + future release. Please look at creating a real ESPHome component and "importing" it into your configuration with + :doc:`/components/external_components`. - You can find some basic documentation on creating your own components - at :ref:`contributing_to_esphome`. + You can find some basic documentation on creating your own components at :ref:`contributing_to_esphome`. + +.. warning:: + + While we try to keep the ESPHome YAML configuration options as stable as possible, the ESPHome API is less + stable. If something in the APIs needs to be changed in order for something else to work, we will do so. Lots of devices communicate using the UART protocol. If you want to integrate a device into ESPHome that uses this protocol you can pretty much use almost diff --git a/guides/contributing.rst b/guides/contributing.rst index fc38f75b1..97a8a7791 100644 --- a/guides/contributing.rst +++ b/guides/contributing.rst @@ -485,7 +485,7 @@ Let's leave what's written in those files for (2.), but for now you should also whenever a component is loaded, all the C++ source files in the folder of the component are automatically copied into the generated PlatformIO project. So you just need to add the C++ source files in the folder and the ESPHome core will copy them with no additional code required -by the integration developer. +by the component developer. .. note:: @@ -520,7 +520,7 @@ called ``CONFIG_SCHEMA``. An example of such a schema is shown below: This variable is automatically loaded by the ESPHome core and validated against. The underlying system ESPHome uses for this is `voluptuous `__. Going into how to validate is out of scope for this guide, but the best way to learn is to look -at examples of how similar integrations validate user input. +at examples of how similar components validate user input. A few point on validation: @@ -537,7 +537,7 @@ After the user input has been successfully validated, the last step of the Pytho is called: Code generation. As you may know, ESPHome converts the user's configuration into C++ code (you can see the generated -code under ``/src/main.cpp``). Each integration must define its own ``to_code`` method +code under ``/src/main.cpp``). Each component must define its own ``to_code`` method that converts the user input to C++ code. This method is also automatically loaded and invoked by the ESPHome core. An example of @@ -555,10 +555,10 @@ such a method can be seen below: Again, going into all the details of ESPHome code generation would be out-of-scope. However, ESPHome's code generation is 99% syntactic sugar - and again it's probably best to study other -integrations and just copy what they do. +components and just copy what they do. There's one important concept for the ``to_code`` method: coroutines with ``yield``. -First the problem that leads to coroutines: In ESPHome, integrations can declare (via ``cg.Pvariable``) and access variables +First the problem that leads to coroutines: In ESPHome, components can declare (via ``cg.Pvariable``) and access variables (``cg.get_variable()``) - but sometimes when one part of the code base requests a variable it has not been declared yet because the code for the component creating the variable has not run yet. @@ -575,14 +575,14 @@ If you do not call "add" a piece of code explicitly, it will not be added to the ********** Okay, the Python part of the codebase is now complete - now let's talk about the C++ part of -creating a new integration. +creating a new component. -The two major parts of any integration roughly are: +The two major parts of any component roughly are: - Setup Phase - Run Phase -When you create a new integration, your new component will inherit from :apiclass:`Component`. +When you create a new component, your new component will inherit from :apiclass:`Component`. That class has a special ``setup()`` method that will be called once to set up the component - at the time the ``setup()`` method is called, all the setters generated by the Python codebase have already run and the all fields are set for your class. @@ -590,7 +590,7 @@ have already run and the all fields are set for your class. The ``setup()`` method should set up the communication interface for the component and check if communication works (if not, it should call ``mark_failed()``). -Again, look at examples of other integrations to learn more. +Again, look at examples of other components to learn more. The next thing that will be called with your component is ``loop()`` (or ``update()`` for a :apiclass:`PollingComponent`). In these methods you should retrieve the latest data from the @@ -621,11 +621,11 @@ loader. These are: - ``AUTO_LOAD``: Automatically load a component if the user hasn't added it manually. - ``MULTI_CONF``: Mark this component to accept an array of configurations. If this is an integer instead of a boolean, validation will only permit the given number of entries. -- ``CONFLICTS_WITH``: Mark a list of components as conflicting with this integration. If the user +- ``CONFLICTS_WITH``: Mark a list of components as conflicting with this component. If the user has one of them in the config, a validation error will be generated. -- ``ESP_PLATFORMS``: Provide a list of allowed ESP types this integration works with. -- ``CODEOWNERS``: GitHub usernames or team names of people that are responsible for this integration. +- ``ESP_PLATFORMS``: Provide a list of allowed ESP types this component works with. +- ``CODEOWNERS``: GitHub usernames or team names of people that are responsible for this component. You should add at least your GitHub username here, as well as anyone who helped you to write code that is being included. @@ -663,8 +663,8 @@ Standard for the esphome-core codebase: like ``Wire`` there's a problem because then the component may not modular (i.e. not possible to create two instances of a component on one ESP) -- Integrations **must** use the provided abstractions like ``Sensor``, ``Switch`` etc. - Integration should specifically **not** directly access other components like for example +- Components **must** use the provided abstractions like ``sensor``, ``switch`` etc. + Components should specifically **not** directly access other components like for example publish to MQTT topics. - Implementations for new devices should contain reference links for the datasheet and other sample diff --git a/guides/faq.rst b/guides/faq.rst index 61bc3a12b..a7b9abe9c 100644 --- a/guides/faq.rst +++ b/guides/faq.rst @@ -73,12 +73,14 @@ Tips for using ESPHome .. |include| replace:: ``!include`` .. _include: https://www.home-assistant.io/docs/configuration/splitting_configuration/ -I can't get flashing over USB to work. --------------------------------------- +I can't get flashing over USB to work +------------------------------------- .. _esphome-esptool: -ESPHome depends on the operating system the tool is running on to recognize the ESP. This can sometimes fail. Common causes are that you may not have the drivers installed (see :ref:`here `) or you are trying to upload from a Docker container and did not mount the ESP device into your container using ``--device=/dev/ttyUSB0``. +ESPHome depends on the operating system the tool is running on to recognize the ESP. This can sometimes fail. Common +causes are that you may not have the drivers installed (see :ref:`here `) or you are trying to +upload from a Docker container and did not mount the ESP device into your container using ``--device=/dev/ttyUSB0``. First, you need to get the firmware file to flash. For the Home Assistant add-on based installs you can use the ``Manual download`` method of the Dashboard (click ``Install`` in the overflow icon with the three dots @@ -90,10 +92,18 @@ Second, you need to put the ESP in :ref:`programming mode ` Third, to flash a firmware file downloaded from Home Assistant add-on Dashboard, you can use: -- `ESPHome Web `__ web-based installer, which requires a browser that supports WebSerial, like Google Chrome or Microsoft Edge. Connect the board to your computer, make sure it's detected as a :ref:`serial port `, and press **Connect**. Give the requested permission in the browser and in the popup box that appears, select the serial device which connects to your ESP. Then press **Install**, and browse for the binary file you downloaded from the Dashboard in the step above. Note that the file will be processed locally, it won't be uploaded to any cloud service. -- *esptool* `from the GitHub repository `__, package from your distro or install it yourself with ``pip install esptool`` (in case of Linux). +- `ESPHome Web `__ web-based installer, which requires a browser that supports WebSerial, like + Google Chrome or Microsoft Edge. Connect the board to your computer, make sure it's detected as a + :ref:`serial port `, and press **Connect**. Give the requested permission in the browser and in + the pop-up box that appears, select the serial device which connects to your ESP. Then press **Install**, and browse + for the binary file you downloaded from the Dashboard in the step above. Note that the file will be processed + locally, it won't be uploaded to any cloud service. +- *esptool* `from the GitHub repository `__, package from your distro or + install it yourself with ``pip install esptool`` (in case of Linux). -Before using ``esptool``, make sure you know which serial port your programming adapter is connected to. In Linux use the ``dmesg`` command afer you plug the device into the USB port to see the name of the newly detected serial port. In Windows check the Device Manager to see if a new serial port appears when you plug it in and note the COM number. +Before using ``esptool``, make sure you know which serial port your programming adapter is connected to. In Linux use +the ``dmesg`` command afer you plug the device into the USB port to see the name of the newly detected serial port. +In Windows check the Device Manager to see if a new serial port appears when you plug it in and note the COM number. Erase flash: @@ -109,15 +119,19 @@ Program flash with your firmware binary: .. note:: - If you're just seeing ``Connecting....____....`` on the screen and the flashing fails, check for these: + If you're just seeing ``Connecting....____....`` on the screen and flashing fails: - - the device name of the port has changed while you were re-plugging it too fast (eg. changed from ``/dev/ttyUSB0`` to ``/dev/ttyUSB1``). - - double check the UART wires are connected correctly if flashing using an external programmer (RX of programmer to TX of the ESP and vice-versa). + - verify that the device name of the port has not changed while you were re-plugging it too fast (eg. changed + from ``/dev/ttyUSB0`` to ``/dev/ttyUSB1``). + - double check the UART wires are connected correctly if flashing using an external programmer (RX of programmer to + TX of the ESP and vice-versa). - for some devices you need to keep ``GPIO0`` and ``GND`` connected at least until flashing has begun. - for some devices you need to power-cycle in programming mode after erasing flash, they don't auto-reset. - - it also might be a sign that ESP is defect or cannot be programmed. + - it also might be a sign that ESP is defective, damaged or otherwise cannot be programmed. - If you're in an RF noisy environment or your UART wires are a bit long, flashing can fail during transfer. Don't worry, an ESP won't brick just because of that. Put it again in programming mode and flash with a reduced baudrate for safer transfers: + If you're in an RF noisy environment or your UART wires are a bit long, flashing can fail during transfer. Don't + worry, an ESP won't brick just because of that. Put it again in programming mode and flash with a reduced baudrate + for safer transfers: ``esptool.py --port /dev/ttyUSB0 --baud 460800 write_flash 0x0 your_node_firmware.bin`` @@ -277,7 +291,7 @@ Some steps that can help with the issue: of the networking code. For this reason, we advise using a lower log level for production purposes. - Related to this, seems to be the number of clients that are simultaneously connected to the native - API server on the device. These might for example be Home Assistant (via the ESPHome integration) and + API server on the device. These might for example be Home Assistant (via the ESPHome component) and the log viewer on the web dashboard. In production, you will likely only have a single connection from Home Assistant, making this less of an issue. But beware that attaching a log viewer might have impact. @@ -367,14 +381,16 @@ And a docker compose file looks like this: .. _docker-reference-notes: .. note:: - By default ESPHome uses mDNS to show online/offline state in the dashboard view. So for that feature to work you need to enable host networking mode. + By default ESPHome uses mDNS to show online/offline state in the dashboard view. So for that feature to work you + need to enable host networking mode. On MacOS the networking mode ("-net=host" option) doesn't work as expected. You have to use another way to launch the dashboard with a port mapping option and use alternative to mDNS to have the online/offline stat (see below) mDNS might not work if your Home Assistant server and your ESPHome nodes are on different subnets. - If your router supports Avahi (eg. OpenWRT or pfSense), you are able to get mDNS working over different subnets following the steps below: + If your router supports Avahi (eg. OpenWRT or pfSense), you are able to get mDNS working over different subnets + following the steps below: 1. Enable Avahi on both subnets (install Avahi modules on OpenWRT or pfSense). 2. Enable UDP traffic from ESPHome node's subnet to 224.0.0.251/32 on port 5353. @@ -387,15 +403,22 @@ And a docker compose file looks like this: .. _faq-notes_on_disabling_mdns: Notes on disabling mDNS ------------------------------------------------------------------------------- -Some of ESPHome's functionalities rely on mDNS, so naturally :doc:`disabling ` it will cause these features to stop working. -Generally speaking, disabling mDNS without setting a :ref:`static IP address ` (or a static DHCP lease) is bound to cause problems. This is due to the fact that mDNS is used to find the IP address of each ESPHome nodes. +----------------------- +Some of ESPHome's functionalities rely on mDNS, so naturally :doc:`disabling ` it will cause these +features to stop working. +Generally speaking, disabling mDNS without setting a :ref:`static IP address ` (or a static DHCP lease) +is bound to cause problems. This is due to the fact that mDNS is used to find the IP address of each ESPHome nodes. - You will not be able to use the node's hostname to ping, find it's IP address or connect to it. -- Automatic discovery in Home Assistant when using :doc:`native API ` relies on mDNS broadcast messages to detect presence of new ESPHome nodes. If you need to use the native API with mDNS disabled, then you will have to use a static IP address and manually add the ESPHome integration with the fixed IP address. +- Automatic discovery in Home Assistant when using :doc:`native API ` relies on mDNS broadcast + messages to detect presence of new ESPHome nodes. If you need to use the native API with mDNS disabled, then you will + have to use a static IP address and manually add the ESPHome component with the fixed IP address. -- Online status detection in ESPHome's dashboard by default uses mDNS, so disabling mDNS will cause the ESPHome dashboard to show the status of the nodes created without mDNS support to be always offline. Currently, this does not affect any functionality, however if you want to see the online/offline status you could configure ESPHome to ping each node instead. See the :ref:`notes in the Docker Reference section ` for more information. +- Online status detection in ESPHome's dashboard by default uses mDNS, so disabling mDNS will cause the ESPHome + dashboard to show the status of the nodes created without mDNS support to be always offline. Currently, this does not + affect any functionality, however if you want to see the online/offline status you could configure ESPHome to ping + each node instead. See the :ref:`notes in the Docker Reference section ` for more information. Can Configuration Files Be Recovered From The Device? ----------------------------------------------------- @@ -411,25 +434,37 @@ Always back up all your files! Why shouldn't I use underscores in my device name? -------------------------------------------------- -The top level ``name:`` field in your .yaml file defines the node name(/hostname) on the local network. According to `RFC1912 `_, underscore characters (``_``) in hostnames are not valid. In reality some local DNS/DHCP setups will be ok with underscores and some will not. If connecting via a static IP address, there will probably be no issues. In some cases, initial setup using an underscore works, but later the connection might fail when Home Assistant restarts or if you change router hardware. Recommendation: use hyphen (``-``) instead of underscore if you can. +The top level ``name:`` field in your .yaml file defines the node name(/hostname) on the local network. According to +`RFC1912 `_, underscore characters (``_``) in hostnames are not valid. +In reality some local DNS/DHCP setups will be ok with underscores and some will not. If connecting via a static IP +address, there will probably be no issues. In some cases, initial setup using an underscore works, but later the +connection might fail when Home Assistant restarts or if you change router hardware. +Recommendation: use hyphen (``-``) instead of underscore if you can. -Important: follow these `instructions `_ to use the ``use_address`` parameter when renaming a live device, as the connection to an existing device will only work with the old name until the name change is complete. +Important: follow these `instructions `_ to use the +``use_address`` parameter when renaming a live device, as the connection to an existing device will only +work with the old name until the name change is complete. .. _strapping-warnings: Why am I getting a warning about strapping pins? --------------------------------------------------- +------------------------------------------------ -The ESP chips have special "strapping pins" that are read during the bootup procedure and determine how it boots up. They define whether the ESP boots into a special "flashing mode" or normal boot and a couple of other internal settings. +The ESP chips have special "strapping pins" that are read during the bootup procedure and determine how it boots up. +They define whether the ESP boots into a special "flashing mode" or normal boot and a couple of other internal settings. If an external pullup/down changes the configured voltage levels boot failures or hard to diagnose issues can happen. -While the use of them in software is not a problem, if there's something attached to the pins (particularly if they're not floating during the bootup) you may run into problems. -It's recommended to avoid them unless you have a pressing need to use them and you have reviewed the expected boot voltage levels of these pins from the ESP datasheet. +While the use of them in software is not a problem, if there's something attached to the pins (particularly if they're +not floating during the bootup) you may run into problems. +It's recommended to avoid them unless you have a pressing need to use them and you have reviewed the expected boot +voltage levels of these pins from the ESP datasheet. -Some development boards connect GPIO 0 to a button, often labeled "boot". Holding this button while the ESP is turning on will cause it to go into bootloader mode. Once the ESP is fully booted up, this button can be used as a normal input safely. +Some development boards connect GPIO 0 to a button, often labeled "boot". Holding this button while the ESP is +turning on will cause it to go into bootloader mode. Once the ESP is fully booted up, this button can be used +as a normal input safely. -Strapping pins should be safe to use as outputs if they are *only* connected to other devices that have hi-impedance inputs -with no pull-up or pull-down resistors. Note that I2C clock and data lines *do* have pull-up resistors and are not -safe on strapping pins. +Strapping pins should be safe to use as outputs if they are *only* connected to other devices that have hi-impedance +inputs with no pull-up or pull-down resistors. Note that I2C clock and data lines *do* have pull-up resistors and are +not safe on strapping pins. If you are absolutely sure that your use of strapping pins is safe, and want to suppress the warning, you can add ``ignore_strapping_warning: true`` to the relevant pin configurations. From 88e315e0e4b102996f2f2604f0ff9c6272ff514a Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 7 May 2024 17:40:12 +1200 Subject: [PATCH 34/34] Many example yaml tidy-ups (#3821) * Many example yaml tidy-ups * Update components/sensor/hlw8012.rst --------- Co-authored-by: Keith Burzinski --- components/alarm_control_panel/template.rst | 14 +- components/at581x.rst | 17 +- components/binary_sensor/cap1188.rst | 2 +- components/binary_sensor/esp32_touch.rst | 10 +- components/binary_sensor/haier.rst | 12 +- components/binary_sensor/hydreon_rgxx.rst | 6 - components/binary_sensor/rc522.rst | 2 +- components/button/output.rst | 2 +- components/button/uart.rst | 4 - components/canbus.rst | 68 ++--- components/climate/climate_ir.rst | 16 +- components/climate/haier.rst | 9 +- components/climate/midea.rst | 11 - components/dfplayer.rst | 21 +- components/display/addressable_light.rst | 18 +- components/display/ili9xxx.rst | 16 +- components/display/lcd_display.rst | 36 +-- components/display/nextion.rst | 30 +-- components/display/qspi_amoled.rst | 12 +- components/display/st7789v.rst | 14 +- components/display/tm1621.rst | 10 +- components/display/tm1638.rst | 20 +- components/esp32_camera.rst | 16 +- components/ethernet.rst | 16 +- components/exposure_notifications.rst | 2 +- components/fan/binary.rst | 11 +- components/fan/hbridge.rst | 8 - components/fingerprint_grow.rst | 59 ++-- components/gps.rst | 3 - components/i2c.rst | 12 +- components/i2s_audio.rst | 4 +- components/light/binary.rst | 4 - components/light/esp32_rmt_led_strip.rst | 2 +- components/light/fastled.rst | 6 +- components/light/hbridge.rst | 13 +- components/light/monochromatic.rst | 5 - components/light/neopixelbus.rst | 6 +- components/light/rgb.rst | 9 +- components/light/rgbw.rst | 3 +- components/light/rgbww.rst | 3 +- components/light/rp2040_pio_led_strip.rst | 2 +- components/light/spi_led_strip.rst | 7 +- components/light/status_led.rst | 4 +- components/lightwaverf.rst | 15 +- components/lock/output.rst | 2 +- components/matrix_keypad.rst | 16 +- components/max6956.rst | 55 ++-- components/mcp23Sxx.rst | 4 +- components/media_player/i2s_audio.rst | 6 +- components/microphone/i2s_audio.rst | 8 +- components/modbus_controller.rst | 64 ++--- components/output/ac_dimmer.rst | 4 +- components/output/bp1658cj.rst | 4 +- components/output/bp5758d.rst | 4 +- components/output/esp8266_pwm.rst | 2 +- components/output/gpio.rst | 2 +- components/output/ledc.rst | 55 ++-- components/output/my9231.rst | 14 +- components/output/pca9685.rst | 8 +- components/output/sigma_delta_output.rst | 10 +- components/output/slow_pwm.rst | 2 +- components/output/sm16716.rst | 28 +- components/output/sm2135.rst | 33 +-- components/output/sm2235.rst | 4 +- components/output/sm2335.rst | 4 +- components/output/template.rst | 8 +- components/output/tlc5947.rst | 24 +- components/output/tlc5971.rst | 20 +- components/output/x9c.rst | 8 +- components/pipsolar.rst | 10 +- components/pn7150.rst | 10 +- components/pn7160.rst | 20 +- components/power_supply.rst | 2 +- components/remote_receiver.rst | 9 +- components/remote_transmitter.rst | 23 +- components/rtttl.rst | 4 +- components/sensor/adc.rst | 2 +- components/sensor/adc128s102.rst | 22 +- components/sensor/ade7880.rst | 14 +- components/sensor/ade7953.rst | 42 +-- components/sensor/ads1118.rst | 12 +- components/sensor/as3935.rst | 60 ++--- components/sensor/as5600.rst | 18 +- components/sensor/atm90e26.rst | 12 +- components/sensor/atm90e32.rst | 10 +- components/sensor/binary_sensor_map.rst | 24 +- components/sensor/bl0939.rst | 12 - components/sensor/bme280.rst | 16 +- components/sensor/cs5460a.rst | 7 +- components/sensor/cse7761.rst | 11 - components/sensor/dallas.rst | 20 +- components/sensor/daly_bms.rst | 285 ++++++++------------ components/sensor/growatt_solar.rst | 23 +- components/sensor/haier.rst | 13 - components/sensor/havells_solar.rst | 13 +- components/sensor/hlw8012.rst | 26 +- components/sensor/honeywellabp.rst | 17 +- components/sensor/hrxl_maxsonar_wr.rst | 17 +- components/sensor/hydreon_rgxx.rst | 44 +-- components/sensor/kuntze.rst | 6 - components/sensor/max31856.rst | 13 +- components/sensor/mcp3204.rst | 35 ++- components/sensor/mhz19.rst | 21 +- components/sensor/pmsx003.rst | 6 - components/sensor/pulse_counter.rst | 6 +- components/sensor/pulse_meter.rst | 6 +- components/sensor/t6615.rst | 13 +- components/sensor/teleinfo.rst | 67 +++-- components/sensor/tx20.rst | 17 +- components/sensor/vl53l0x.rst | 6 +- components/servo.rst | 4 +- components/sim800l.rst | 2 +- components/sml.rst | 63 ++--- components/sn74hc165.rst | 34 +-- components/sn74hc595.rst | 13 +- components/speaker/i2s_audio.rst | 4 +- components/spi.rst | 36 +-- components/sprinkler.rst | 50 ++-- components/status_led.rst | 6 +- components/stepper/index.rst | 18 +- components/switch/gpio.rst | 12 +- components/switch/output.rst | 2 +- components/switch/uart.rst | 4 - components/text_sensor/wl_134.rst | 7 +- components/tm1651.rst | 4 +- components/touchscreen/cst226.rst | 2 +- components/touchscreen/cst816.rst | 4 +- components/touchscreen/ektf2232.rst | 4 +- components/touchscreen/ft63x6.rst | 28 +- components/touchscreen/gt911.rst | 2 +- components/touchscreen/index.rst | 4 +- components/touchscreen/tt21100.rst | 4 +- components/touchscreen/xpt2046.rst | 4 +- components/tuya.rst | 10 +- components/uart.rst | 8 +- components/vbus.rst | 10 +- components/wiegand.rst | 24 +- cookbook/display_time_temp_oled.rst | 8 +- cookbook/garage-door.rst | 4 +- cookbook/infostrip.rst | 14 +- cookbook/lambda_magic.rst | 38 +-- custom/uart.rst | 4 +- guides/automations.rst | 16 +- guides/configuration-types.rst | 20 +- guides/contributing.rst | 4 +- guides/faq.rst | 12 +- guides/getting_started_command_line.rst | 6 +- guides/getting_started_hassio.rst | 2 +- 148 files changed, 895 insertions(+), 1539 deletions(-) diff --git a/components/alarm_control_panel/template.rst b/components/alarm_control_panel/template.rst index 91796ff95..35f80ad5c 100644 --- a/components/alarm_control_panel/template.rst +++ b/components/alarm_control_panel/template.rst @@ -27,8 +27,8 @@ Configuration variables: - **codes** (*Optional*, list of string): A list of codes for disarming the alarm, if *requires_code_to_arm* set to true then for arming the alarm too. - **requires_code_to_arm** (*Optional*, boolean): Code required for arming the alarm, *codes* must be provided. - **arming_away_time** (*Optional*, :ref:`config-time`): The exit delay before the alarm is armed to away mode. Defaults to ``0s``. -- **arming_home_time** (*Optional*, :ref:`config-time`): The exit delay before the alarm is armed to home mode. -- **arming_night_time** (*Optional*, :ref:`config-time`): The exit delay before the alarm is armed to night mode. +- **arming_home_time** (*Optional*, :ref:`config-time`): The exit delay before the alarm is armed to home mode. +- **arming_night_time** (*Optional*, :ref:`config-time`): The exit delay before the alarm is armed to night mode. - **pending_time** (*Optional*, :ref:`config-time`): The entry delay before the alarm is triggered. Defaults to ``0s``. - **trigger_time** (*Optional*, :ref:`config-time`): The time after a triggered alarm before resetting to previous state if the sensors are cleared/off. Defaults to ``0s``. - **binary_sensors** (*Optional*, *list*): A list of binary sensors the panel should use. Each consists of: @@ -169,7 +169,7 @@ Example: name: Zone 1 device_class: door pin: - number: D1 + number: GPIOXX mode: INPUT_PULLUP inverted: True - platform: gpio @@ -177,7 +177,7 @@ Example: name: Zone 2 device_class: door pin: - number: D2 + number: GPIOXX mode: INPUT_PULLUP inverted: True - platform: gpio @@ -185,7 +185,7 @@ Example: name: Zone 3 device_class: motion pin: - number: D3 + number: GPIOXX mode: INPUT_PULLUP inverted: True - platform: gpio @@ -193,7 +193,7 @@ Example: name: Zone 4 device_class: door pin: - number: D4 + number: GPIOXX mode: INPUT_PULLUP inverted: True - platform: homeassistant @@ -206,7 +206,7 @@ Example: id: siren name: Siren icon: mdi:alarm-bell - pin: D7 + pin: GPIOXX See Also diff --git a/components/at581x.rst b/components/at581x.rst index 06b33c213..9513112a2 100644 --- a/components/at581x.rst +++ b/components/at581x.rst @@ -32,17 +32,6 @@ a :doc:`/components/i2c` component (and its requisite GPIO pins) is required in id: "Radar" i2c_id: bus_a - binary_sensor: - - platform: gpio - pin: GPIO21 - name: "Radar motion" - - switch: - # Switch to turn on/off RF emission - - platform: at581x - at581x_id: "Radar" - name: "Enable Radar" - .. _at581x-component: Component/Hub @@ -87,7 +76,7 @@ The state of the radar detection is available via its GPIO pin. It's required to binary_sensor: - platform: gpio name: "Human in front" - pin: GPIO21 + pin: GPIOXX Configuration variables: ************************ @@ -127,8 +116,8 @@ Actions .. warning:: - The hardware frontend reset option is only required to reset the frontend in case it is struck, before sending the - new configuration. However, a frontend reset is always performed after changing the settings. + The hardware frontend reset option is only required to reset the frontend in case it is struck, before sending the + new configuration. However, a frontend reset is always performed after changing the settings. The radar has several settings which can be changed. These settings are not saved in non-volatile memory and need to be set on each boot. diff --git a/components/binary_sensor/cap1188.rst b/components/binary_sensor/cap1188.rst index 0cc7a5113..016720311 100644 --- a/components/binary_sensor/cap1188.rst +++ b/components/binary_sensor/cap1188.rst @@ -30,7 +30,7 @@ required to be set up in your configuration for this sensor to work. cap1188: id: cap1188_component address: 0x29 - reset_pin: 14 + reset_pin: GPIOXX touch_threshold: 0x40 allow_multiple_touches: true diff --git a/components/binary_sensor/esp32_touch.rst b/components/binary_sensor/esp32_touch.rst index 5b9363fc2..7c6bc25f3 100644 --- a/components/binary_sensor/esp32_touch.rst +++ b/components/binary_sensor/esp32_touch.rst @@ -130,8 +130,8 @@ an ``OFF`` state. binary_sensor: - platform: esp32_touch - name: "ESP32 Touch Pad GPIO27" - pin: GPIO27 + name: "ESP32 Touch Pad" + pin: GPIOXX threshold: 1000 Configuration variables: @@ -164,7 +164,7 @@ If access to the raw values is required, a template sensor can be created that p binary_sensor: - platform: esp32_touch id: esp32_touch_pad - pin: GPIO4 + pin: GPIOXX threshold: 0 sensor: @@ -174,8 +174,8 @@ If access to the raw values is required, a template sensor can be created that p return id(esp32_touch_pad).get_value(); update_interval: 3s -One example of use is a wide area pressure sensor that integrates a number of smaller sensors in an area. Make two strips -of aluminium foil that sandwich paper, and connect one wire to a touch pin and the other to ground. Set up several sensors +One example of use is a wide area pressure sensor that integrates a number of smaller sensors in an area. Make two strips +of aluminium foil that sandwich paper, and connect one wire to a touch pin and the other to ground. Set up several sensors under a flexible object like a plastic mat, add the raw values, and apply a threshold. .. _esp32-touch-pad-pins: diff --git a/components/binary_sensor/haier.rst b/components/binary_sensor/haier.rst index 29e5445f5..69a581bde 100644 --- a/components/binary_sensor/haier.rst +++ b/components/binary_sensor/haier.rst @@ -17,17 +17,17 @@ Additional sensors for Haier Climate device. **These sensors are supported only # Example configuration entry uart: baud_rate: 9600 - tx_pin: 17 - rx_pin: 16 + tx_pin: GPIOXX + rx_pin: GPIOXX id: ac_port - + climate: - platform: haier id: haier_ac protocol: hOn name: Haier AC uart_id: ac_port - + binary_sensor: - platform: haier haier_id: haier_ac @@ -56,9 +56,9 @@ Configuration variables: All options from :ref:`Binary Sensor `. - **indoor_electric_heating_status** (*Optional*): A binary sensor that indicates electrical heating system activity. All options from :ref:`Binary Sensor `. -- **indoor_fan_status** (*Optional*): A binary sensor that indicates indoor fan activity. +- **indoor_fan_status** (*Optional*): A binary sensor that indicates indoor fan activity. All options from :ref:`Binary Sensor `. -- **outdoor_fan_status** (*Optional*): A binary sensor that indicates outdoor fan activity. +- **outdoor_fan_status** (*Optional*): A binary sensor that indicates outdoor fan activity. All options from :ref:`Binary Sensor `. See Also diff --git a/components/binary_sensor/hydreon_rgxx.rst b/components/binary_sensor/hydreon_rgxx.rst index 844b9a0ca..47a5b7dba 100644 --- a/components/binary_sensor/hydreon_rgxx.rst +++ b/components/binary_sensor/hydreon_rgxx.rst @@ -12,12 +12,6 @@ For this sensor to work, a :doc:`/components/sensor/hydreon_rgxx` must be set up .. code-block:: yaml # Example RG-9 entry - - uart: - rx_pin: GPIO16 - tx_pin: GPIO17 - baud_rate: 9600 - sensor: - platform: hydreon_rgxx model: "RG_9" diff --git a/components/binary_sensor/rc522.rst b/components/binary_sensor/rc522.rst index 48e60e643..1c89732b1 100644 --- a/components/binary_sensor/rc522.rst +++ b/components/binary_sensor/rc522.rst @@ -42,7 +42,7 @@ you can then create individual binary sensors that track if an NFC/RFID tag is c spi: rc522_spi: - cs_pin: GPIO15 + cs_pin: GPIOXX binary_sensor: - platform: rc522 diff --git a/components/button/output.rst b/components/button/output.rst index 9e83019a1..d037730fc 100644 --- a/components/button/output.rst +++ b/components/button/output.rst @@ -17,7 +17,7 @@ momentarily set a GPIO pin using a button. # Example configuration entry output: - platform: gpio - pin: 25 + pin: GPIOXX id: output1 button: diff --git a/components/button/uart.rst b/components/button/uart.rst index 5799e5b8d..565e42af2 100644 --- a/components/button/uart.rst +++ b/components/button/uart.rst @@ -11,10 +11,6 @@ The ``uart`` button platform allows you to send a pre-defined sequence of bytes .. code-block:: yaml # Example configuration entry - uart: - baud_rate: 9600 - tx_pin: D0 - button: - platform: uart name: "UART String Output" diff --git a/components/canbus.rst b/components/canbus.rst index 8656ab0e4..8c562f626 100644 --- a/components/canbus.rst +++ b/components/canbus.rst @@ -69,7 +69,7 @@ Configuration variables: - ``12K5BPS`` - Support by ``esp32_can`` depends on ESP32 variant - ``16KBPS`` - Support by ``esp32_can`` depends on ESP32 variant - ``20KBPS`` - Support by ``esp32_can`` depends on ESP32 variant - - ``25KBPS`` + - ``25KBPS`` - ``31K25BPS`` - Not supported by ``esp32_can`` - ``33KBPS`` - Not supported by ``esp32_can`` - ``40KBPS`` - Not supported by ``esp32_can`` @@ -197,8 +197,8 @@ You only need to specify the RX and TX pins. Any GPIO will work. # Example configuration entry canbus: - platform: esp32_can - tx_pin: GPIO5 - rx_pin: GPIO4 + tx_pin: GPIOXX + rx_pin: GPIOXX can_id: 4 bit_rate: 50kbps on_frame: @@ -209,28 +209,28 @@ You only need to specify the RX and TX pins. Any GPIO will work. The table lists the specific bit rates supported by the component for ESP32 variants: =================== ======= ========== ========== ========== ========== ========== - bit_rate ESP32 ESP32-S2 ESP32-S3 ESP32-C3 ESP32-C6 ESP32-H2 + bit_rate ESP32 ESP32-S2 ESP32-S3 ESP32-C3 ESP32-C6 ESP32-H2 =================== ======= ========== ========== ========== ========== ========== - 1KBPS x x x x x - 5KBPS x x x x x - 10KBPS x x x x x - 12K5BPS x x x x x - 16KBPS x x x x x - 20KBPS x x x x x - 25KBPS x x x x x x - 31K25BPS - 33KBPS - 40KBPS - 50KBPS x x x x x x - 80KBPS - 83K38BPS - 95KBPS - 100KBPS x x x x x x - 125KBPS (Default) x x x x x x - 250KBPS x x x x x x - 500KBPS x x x x x x - 800KBPS x x x x x x - 1000KBPS x x x x x x + 1KBPS x x x x x + 5KBPS x x x x x + 10KBPS x x x x x + 12K5BPS x x x x x + 16KBPS x x x x x + 20KBPS x x x x x + 25KBPS x x x x x x + 31K25BPS + 33KBPS + 40KBPS + 50KBPS x x x x x x + 80KBPS + 83K38BPS + 95KBPS + 100KBPS x x x x x x + 125KBPS (Default) x x x x x x + 250KBPS x x x x x x + 500KBPS x x x x x x + 800KBPS x x x x x x + 1000KBPS x x x x x x =================== ======= ========== ========== ========== ========== ========== @@ -273,7 +273,7 @@ For wiring up the MSP2515 please refer to the section below. # Example configuration entry canbus: - platform: mcp2515 - cs_pin: D5 + cs_pin: GPIOXX can_id: 4 bit_rate: 50kbps on_frame: @@ -359,7 +359,7 @@ Standard IDs and Extended IDs can coexist on the same segment. - platform: mcp2515 id: my_mcp2515 spi_id: McpSpi - cs_pin: GPIO14 + cs_pin: GPIOXX can_id: 0x1fff use_extended_id: true bit_rate: 125kbps @@ -385,9 +385,9 @@ Button is connected on a can node which sends an A message on ID 0x100 with payl spi: id: McpSpi - clk_pin: GPIO16 - mosi_pin: GPIO5 - miso_pin: GPIO4 + clk_pin: GPIOXX + mosi_pin: GPIOXX + miso_pin: GPIOXX binary_sensor: - platform: template @@ -398,7 +398,7 @@ Button is connected on a can node which sends an A message on ID 0x100 with payl - platform: mcp2515 id: my_mcp2515 spi_id: McpSpi - cs_pin: GPIO14 + cs_pin: GPIOXX can_id: 4 bit_rate: 125kbps on_frame: @@ -430,15 +430,15 @@ Buttons are connected on the CAN-Node and also the motor is connected via CAN. spi: id: McpSpi - clk_pin: GPIO16 - mosi_pin: GPIO5 - miso_pin: GPIO4 + clk_pin: GPIOXX + mosi_pin: GPIOXX + miso_pin: GPIOXX canbus: - platform: mcp2515 id: my_mcp2515 spi_id: McpSpi - cs_pin: GPIO14 + cs_pin: GPIOXX can_id: 4 bit_rate: 125kbps on_frame: diff --git a/components/climate/climate_ir.rst b/components/climate/climate_ir.rst index 249f181a4..9cb410abc 100644 --- a/components/climate/climate_ir.rst +++ b/components/climate/climate_ir.rst @@ -76,7 +76,7 @@ controller unit. # Example configuration entry remote_transmitter: - pin: GPIO32 + pin: GPIOXX carrier_duty_percent: 50% climate: @@ -156,7 +156,7 @@ IR receiver. remote_receiver: id: rcvr pin: - number: GPIO14 + number: GPIOXX inverted: true mode: input: true @@ -283,8 +283,8 @@ Configuration variables: - **set_fan_mode** (*Optional*, string): Select the fan modes desired or that are supported on your remote. Defaults to ``3levels`` - - Options are: ``3levels`` , ``4levels``, ``quiet_4levels``. - + - Options are: ``3levels`` , ``4levels``, ``quiet_4levels``. + - ``3levels``; Low [fan speed 1], Medium [2], High [3] - ``4levels``; Low [1], Middle [2], Medium [3], High [4] - ``quiet_4levels``; Low [1], Middle [2], Medium [3], High [4], Quiet [5] @@ -292,10 +292,10 @@ Configuration variables: - **supports_dry** (*Optional*, boolean): Enables setting dry mode for this unit. Defaults to ``false``. - **supports_fan_only** (*Optional*, boolean): Enables setting fan only mode for this unit. Confirm that mode is supported on your remote. Defaults to ``false``. -- **horizontal_default** (*Optional*, string): What to default to when the AC unit's horizontal direction is *not* set to swing. Defaults to ``middle``. +- **horizontal_default** (*Optional*, string): What to default to when the AC unit's horizontal direction is *not* set to swing. Defaults to ``middle``. - Options are: ``left``, ``middle-left``, ``middle``, ``middle-right``, ``right``, ``auto`` -- **vertical_default** (*Optional*, string): What to default to when the AC unit's vertical direction is *not* set to swing. Defaults to ``middle``. +- **vertical_default** (*Optional*, string): What to default to when the AC unit's vertical direction is *not* set to swing. Defaults to ``middle``. - Options are: ``down``, ``middle-down``, ``middle``, ``middle-up``, ``up``, ``auto`` @@ -423,8 +423,8 @@ Configuration variables: ``zhlt01`` Climate --------------------- -ZH/LT-01 is a remote control that is used with many locally branded split airconditioners. -Supported brands include: +ZH/LT-01 is a remote control that is used with many locally branded split airconditioners. +Supported brands include: - Eurom - Chigo diff --git a/components/climate/haier.rst b/components/climate/haier.rst index caf04d18e..843ecfa0b 100644 --- a/components/climate/haier.rst +++ b/components/climate/haier.rst @@ -58,18 +58,11 @@ This component requires a :ref:`uart` to be setup. .. code-block:: yaml # Example configuration entry - - uart: - baud_rate: 9600 - tx_pin: 17 - rx_pin: 16 - id: ac_port - climate: - platform: haier id: haier_ac protocol: hOn - name: Haier AC + name: Haier AC uart_id: ac_port wifi_signal: true beeper: true diff --git a/components/climate/midea.rst b/components/climate/midea.rst index fc560077e..cec59359c 100644 --- a/components/climate/midea.rst +++ b/components/climate/midea.rst @@ -25,17 +25,6 @@ The ``midea`` component creates a Midea air conditioner climate device. .. code-block:: yaml # Example configuration entry - - # Disable logging over UART (required) - logger: - baud_rate: 0 - - # UART settings for Midea dongle (required) - uart: - tx_pin: 1 # hardware dependant - rx_pin: 3 # hardware dependant - baud_rate: 9600 - # Main settings climate: - platform: midea diff --git a/components/dfplayer.rst b/components/dfplayer.rst index fadc1c232..672cc4615 100644 --- a/components/dfplayer.rst +++ b/components/dfplayer.rst @@ -30,16 +30,7 @@ will be required. .. code-block:: yaml # Example configuration entry - uart: - tx_pin: GPIO2 - rx_pin: GPIO5 - baud_rate: 9600 - - # Declare DFPlayer mini module dfplayer: - on_finished_playback: - then: - logger.log: 'Somebody press play!' Configuration variables: ------------------------ @@ -113,11 +104,11 @@ Configuration options: ``dfplayer.play_mp3`` Action ---------------------------- -Plays a track inside the folder ``mp3``. Files inside the folder must be numbered from 1 +Plays a track inside the folder ``mp3``. Files inside the folder must be numbered from 1 to 9999, like ``0001.mp3``, ``0002.mp3``, ... etc. -The folder name needs to be ``mp3``, placed under the SD card root directory, and the -mp3 file name needs to be 4 digits, for example, "0001.mp3", placed under the mp3 folder. -If you want, you can add additional text after the number in the filename, for example, +The folder name needs to be ``mp3``, placed under the SD card root directory, and the +mp3 file name needs to be 4 digits, for example, "0001.mp3", placed under the mp3 folder. +If you want, you can add additional text after the number in the filename, for example, ``0001hello.mp3``, but must always be referenced by number only in yaml. .. code-block:: bash @@ -344,8 +335,8 @@ Sample code .. code-block:: yaml uart: - tx_pin: GPIO2 - rx_pin: GPIO5 + tx_pin: GPIOXX + rx_pin: GPIOXX baud_rate: 9600 dfplayer: diff --git a/components/display/addressable_light.rst b/components/display/addressable_light.rst index 44c125b7e..8f9e39481 100644 --- a/components/display/addressable_light.rst +++ b/components/display/addressable_light.rst @@ -19,18 +19,6 @@ The display requires that an :apiclass:`AddressableLight `): A lambda that returns the integer address of the LED - given the supplied the ``x`` and ``y`` pixel coordinate. By default, a left-to-right direct pixel mapper is used. + given the supplied the ``x`` and ``y`` pixel coordinate. By default, a left-to-right direct pixel mapper is used. - **lambda** (*Optional*, :ref:`lambda `): The lambda to use for rendering the content on the display. ``it`` will be an instance of :apiclass:`DisplayBuffer `. - See :ref:`display-engine` for more information. + See :ref:`display-engine` for more information. - **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation. @@ -73,7 +61,7 @@ Configuration variables: When enabled (the default, but also via ``it.set_enabled(true)``), any effect currently running on the addressable light will be disabled. When disabled (``it.set_enabled(false)``), the last configured effect will be restored. - + While the display is enabled, it is still possible to control the parent addressable light component in some limited capacity. Changing the brightness will still work, but changing the color will have no affect. It is not adivsable to enable any effects (ex: rainbow, color wipe, etc) while the display is enabled, as this will cause a diff --git a/components/display/ili9xxx.rst b/components/display/ili9xxx.rst index f734b2a13..7bd3ddecc 100644 --- a/components/display/ili9xxx.rst +++ b/components/display/ili9xxx.rst @@ -55,8 +55,8 @@ beyond the basic SPI connections, and a reasonable amount of RAM, it is not well display: - platform: ili9xxx model: ili9341 - dc_pin: 27 - reset_pin: 33 + dc_pin: GPIOXX + reset_pin: GPIOXX lambda: |- it.fill(COLOR_BLACK); it.print(0, 0, id(my_font), id(my_red), TextAlign::TOP_LEFT, "Hello World!"); @@ -180,13 +180,13 @@ To configure a dimmable backlight: # Define a PWM output on the ESP32 output: - platform: ledc - pin: 32 - id: gpio_32_backlight_pwm + pin: GPIOXX + id: backlight_pwm # Define a monochromatic, dimmable light for the backlight light: - platform: monochromatic - output: gpio_32_backlight_pwm + output: backlight_pwm name: "Display Backlight" id: back_light restore_mode: ALWAYS_ON @@ -204,8 +204,8 @@ To configure an image adaptive color pallet to show greater than 8 bit color dep display: - platform: ili9xxx model: ili9341 - dc_pin: 4 - reset_pin: 22 + dc_pin: GPIOXX + reset_pin: GPIOXX rotation: 90 id: tft_ha color_palette: IMAGE_ADAPTIVE @@ -234,7 +234,7 @@ This config rotates the display into landscape mode using the driver chip. mirror_y: true color_order: bgr data_rate: 80MHz - cs_pin: 10 + cs_pin: GPIOXX dc_pin: GPIO13 reset_pin: GPIO9 diff --git a/components/display/lcd_display.rst b/components/display/lcd_display.rst index 530b13b23..c1bbf04e3 100644 --- a/components/display/lcd_display.rst +++ b/components/display/lcd_display.rst @@ -6,7 +6,7 @@ Character-Based LCD Display :image: lcd.jpg The ``lcd_pcf8574`` and ``lcd_gpio`` display components allow you to use HD44780-compatible, character-based LCDs -with ESPHome. This component is only for LCDs that display individual characters on a screen +with ESPHome. This component is only for LCDs that display individual characters on a screen (usually 8-40 columns and 2-4 rows), and not for LCDs that can control each pixel individually. .. figure:: images/lcd-hello_world.jpg @@ -15,12 +15,12 @@ with ESPHome. This component is only for LCDs that display individual characters .. note:: - Multiple versions of the display exist, supporting different character sets: - + Multiple versions of the display exist, supporting different character sets: + - HD44780UA00 English-Japanese which includes katakana characters, some Greek letters and mathematical symbols - HD44780UA02 English-European which includes Greek, Cyrillic and Western European characters (with some diacritics) - HD44780UBxx custom, manufacturer-specific character sets - + It is also possible to add eight user-defined characters. .. _lcd-pcf8574: @@ -28,7 +28,7 @@ with ESPHome. This component is only for LCDs that display individual characters lcd_pcf8574 Component --------------------- -``lcd_pcf8574`` is for LCD displays with a PCF8574 GPIO expander module connected to all the data pins. This has the +``lcd_pcf8574`` is for LCD displays with a PCF8574 GPIO expander module connected to all the data pins. This has the benefit that you only need to connect two data wires to the ESP instead of the six or ten as with the :ref:`lcd-gpio`. The communication happens via :ref:`I²C Bus `, you need to have an ``i2c:`` section in your configuration. @@ -65,7 +65,7 @@ Configuration variables: .. note:: - If you're not seeing anything on the display, try turning the contrast potentiometer around on the + If you're not seeing anything on the display, try turning the contrast potentiometer around on the PCF8574 board. .. _lcd-gpio: @@ -74,7 +74,7 @@ lcd_gpio Component ------------------ The ``lcd_gpio`` version of this component addresses the screen directly and does not employ a GPIO expander module. -Each of the data pins of the LCD needs a dedicated GPIO pin on the ESP. Connecting the screen this way offers +Each of the data pins of the LCD needs a dedicated GPIO pin on the ESP. Connecting the screen this way offers faster refresh, especially in conjunction with an :ref:`LCD Menu `. .. figure:: images/lcd_gpio.svg @@ -90,12 +90,12 @@ faster refresh, especially in conjunction with an :ref:`LCD Menu `. - platform: lcd_gpio dimensions: 20x4 data_pins: - - GPIO32 - - GPIO33 - - GPIO5 - - GPIO17 - enable_pin: D4 - rs_pin: D5 + - GPIOXX + - GPIOXX + - GPIOXX + - GPIOXX + enable_pin: GPIOXX + rs_pin: GPIOXX lambda: |- it.print("Hello World!"); @@ -105,8 +105,8 @@ Configuration variables: - **dimensions** (**Required**, string): The dimensions of the display with ``COLUMNSxROWS``. If you're not sure, power the display on, turn contrast high up and just count them. - **data_pins** (**Required**, list of :ref:`pins `): A list of the data pins you - have hooked up to the LCD. The list can either be 4 items long (operating in 4-bit mode with - either the first 4 data pins connected or the last 4 data pins connected), or 8 items long (when you have + have hooked up to the LCD. The list can either be 4 items long (operating in 4-bit mode with + either the first 4 data pins connected or the last 4 data pins connected), or 8 items long (when you have connected all 8 data pins). - **enable_pin** (**Required**, :ref:`pin `): The pin you have ``E`` (``06``) hooked up to. - **rs_pin** (**Required**, :ref:`pin `): The pin you have ``RS`` (``04``) hooked up to. @@ -118,7 +118,7 @@ Configuration variables: .. note:: - If you're not seeing anything on the display, make sure you apply ``3.3V`` to the ``VEE`` (``03``) contrast control + If you're not seeing anything on the display, make sure you apply ``3.3V`` to the ``VEE`` (``03``) contrast control pin of the board. You can use a potentiometer to make it adjustable. @@ -177,7 +177,7 @@ The LCD display has the possibility to define up to eight user defined character ``0`` to ``7`` and mirrored at ``8`` to ``15`` (i.e. ``\x08`` can be used instead of the ``\0`` that can be problematic in strings). Each character has eight lines of five bits, with the first line on the top and the most significant bit on the left, meaning that ``0b10000`` followed by six zeros and a ``0b00001`` -defines a dot at the upper left and lower right of the character. +defines a dot at the upper left and lower right of the character. .. code-block:: yaml @@ -221,7 +221,7 @@ Keep in mind that the display lambda runs for every ``update_interval``, so if t it cannot be overridden from other parts. With the ``lcd_gpio``, the backlight is lit by applying ``Vcc`` to the ``BLA`` (``15``) pin and connect ``BLK`` (``16``) -pin to ``GND``. The backlight can draw more power than the microcontroller output pins can supply, so it is advisable +pin to ``GND``. The backlight can draw more power than the microcontroller output pins can supply, so it is advisable to use a transistor as a switch to control the power for the backlight pins. Below an example for a typical use-case where the backlight is turned on when a motion sensor activates and diff --git a/components/display/nextion.rst b/components/display/nextion.rst index 95c29a89e..09d8a85f9 100644 --- a/components/display/nextion.rst +++ b/components/display/nextion.rst @@ -18,15 +18,15 @@ with ESPHome. As the communication with the Nextion LCD display is done using UART, you need to have an :ref:`UART bus ` in your configuration with ``rx_pin`` both the ``tx_pin`` set to the respective pins on the display. The Nextion uses a baud rate of 9600 by default. It may be configured to use a faster speed by adding (for -example) +example) .. code-block:: c++ baud=115200 // Sets the baud rate to 115200 bkcmd=0 // Tells the Nextion to not send responses on commands. This is the current default but can be set just in case - - + + to the ``program.s`` source file (in the Nextion Editor) before the ``page`` line. This permits faster communication with the Nextion display and it is highly recommended when using :ref:`uart-hardware_uarts`. Without a hardware uart make sure to set the baud rate to 9600. @@ -36,17 +36,9 @@ The below example configures a UART for the Nextion display to use .. code-block:: yaml # Example configuration entry - uart: - id: uart_2 - rx_pin: GPIO16 - tx_pin: GPIO17 - baud_rate: 115200 - - display: - platform: nextion id: nextion1 - uart_id: uart_2 lambda: |- it.set_component_value("gauge", 50); it.set_component_text("textview", "Hello World!"); @@ -73,7 +65,7 @@ Configuration variables: - **on_wake** (*Optional*, :ref:`Action `): An action to be performed when the Nextion wakes up. See :ref:`Nextion Automation `. - **on_page** (*Optional*, :ref:`Action `): An action to be performed after a page change. See :ref:`Nextion Automation `. - **on_touch** (*Optional*, :ref:`Action `): An action to be performed after a touch event (press or release). See :ref:`Nextion Automation `. - + .. _display-nextion_lambda: Rendering Lambda @@ -113,7 +105,7 @@ Lambda Calls ************ Several methods are available for use within :ref:`lambdas `; these permit advanced functionality beyond simple -display updates. See the full :apiref:`nextion/nextion.h` for more info. +display updates. See the full :apiref:`nextion/nextion.h` for more info. .. _nextion_upload_tft: @@ -126,7 +118,7 @@ The developer tools in Home Assistant can be used to trigger the update. The bel services: - service: update_nextion then: - - lambda: 'id(nextion1)->upload_tft();' + - lambda: 'id(nextion1)->upload_tft();' .. _nextion_update_all_components: @@ -178,7 +170,7 @@ The developer tools in Home Assistant can be used to trigger the update. The bel .. _nextion_queue_types: - Queue Types: + Queue Types: - SENSOR 0 - BINARY_SENSOR 1 - SWITCH 2 @@ -291,7 +283,7 @@ The following arguments will be available: Uploading A TFT File -------------------- This will download the file from the tft_url and will transfer it over the UART to the Nextion. -Once completed both the ESP and Nextion will reboot. During the upload process esphome will be +Once completed both the ESP and Nextion will reboot. During the upload process esphome will be unresponsive and no logging will take place. This uses the same protocol as the Nextion editor and only updates the changes of the TFT file. If HTTPS/SSL is enabled it will be about 1kB/sec. @@ -304,7 +296,7 @@ To host the TFT file you can use Home Assistant itself or any other web server. Home Assistant ************** -To host the TFT file from Home Assistant, create a www directory if it doesn't exist in your config +To host the TFT file from Home Assistant, create a www directory if it doesn't exist in your config directory. You can create a subdirectory for those files as well. For example if the file is located @@ -321,8 +313,8 @@ The below NGINX example configuration will serve files out of the /var/www/nexti .. code-block:: nginx server { - listen 80; - access_log /var/log/nginx/nextion_access.log; + listen 80; + access_log /var/log/nginx/nextion_access.log; error_log /var/log/nginx/nextion_error.log; root /var/www/nextion; } diff --git a/components/display/qspi_amoled.rst b/components/display/qspi_amoled.rst index 54e277b82..5d65d8b46 100644 --- a/components/display/qspi_amoled.rst +++ b/components/display/qspi_amoled.rst @@ -50,9 +50,9 @@ ESP-IDF. PSRAM is a requirement due to the size of the display buffer. A :ref:`q color_order: rgb invert_colors: false brightness: 255 - cs_pin: 11 - reset_pin: 13 - enable_pin: 9 + cs_pin: GPIOXX + reset_pin: GPIOXX + enable_pin: GPIOXX Configuration variables: @@ -150,17 +150,17 @@ Lilygo T-Display S3 AMOLED - 7 - 48 - 5 - + i2c: sda: 3 scl: 2 - + touchscreen: - platform: cst816 id: my_touchscreen interrupt_pin: number: 21 - + display: - platform: qspi_amoled model: RM67162 diff --git a/components/display/st7789v.rst b/components/display/st7789v.rst index 1395d5d01..e56924b6c 100644 --- a/components/display/st7789v.rst +++ b/components/display/st7789v.rst @@ -40,17 +40,13 @@ to an ESP module. .. code-block:: yaml # Example minimal configuration entry - spi: - clk_pin: GPIO18 - mosi_pin: GPIO19 - display: - platform: st7789v model: TTGO TDisplay 135x240 - backlight_pin: GPIO4 - cs_pin: GPIO5 - dc_pin: GPIO16 - reset_pin: GPIO23 + backlight_pin: GPIOXX + cs_pin: GPIOXX + dc_pin: GPIOXX + reset_pin: GPIOXX lambda: |- it.print(0, 0, id(font), "Hello World!"); @@ -191,7 +187,7 @@ Items marked RQ are hardware dependent but required and not preset. Items marked - 22 - 23 - 4 - - + - - 18 - 19 * - Custom diff --git a/components/display/tm1621.rst b/components/display/tm1621.rst index 169ff2e95..e1619a965 100644 --- a/components/display/tm1621.rst +++ b/components/display/tm1621.rst @@ -22,10 +22,10 @@ The LCD have four signal, ``cs`` for chip select, ``data`` for data signal, ``re display: platform: tm1621 id: tm1621_display - cs_pin: GPIO17 - data_pin: GPIO5 - read_pin: GPIO23 - write_pin: GPIO18 + cs_pin: GPIOXX + data_pin: GPIOXX + read_pin: GPIOXX + write_pin: GPIOXX lambda: |- it.printf(0, "%.1f", id(my_sensor1).state); it.display_celsius(true); @@ -82,7 +82,7 @@ Also we have five function to display or not some unites: - °F on the first line : ``display_fahrenheit(bool)`` - %HR on the second line : ``display_humidity(bool)`` - V on the first line and A on the second line : ``display_voltage(bool)`` - - kW/h on the first line and W on the second line : ``display_kwh(bool)`` + - kW/h on the first line and W on the second line : ``display_kwh(bool)`` See Also -------- diff --git a/components/display/tm1638.rst b/components/display/tm1638.rst index 742f1ccbd..025d1ab99 100644 --- a/components/display/tm1638.rst +++ b/components/display/tm1638.rst @@ -23,9 +23,9 @@ The module can be powered with 5v DC. To display the colon punctuation use the display: platform: tm1638 id: tm1638_display - stb_pin: 5 - clk_pin: 18 - dio_pin: 23 + stb_pin: GPIOXX + clk_pin: GPIOXX + dio_pin: GPIOXX intensity: 5 update_interval: 5s lambda: |- @@ -113,9 +113,9 @@ The following example creates a typical digital clock with the ``:`` colon flash display: platform: tm1638 - clk_pin: 18 - dio_pin: 23 - stb_pin: 5 + clk_pin: GPIOXX + dio_pin: GPIOXX + stb_pin: GPIOXX update_interval: 500ms lambda: |- static int i = 0; @@ -132,16 +132,16 @@ The TM1638 7 Segment Display Keypad & LED Module has 8 LED lights across the top .. code-block:: yaml - switch: + switch: - platform: tm1638 id: TM1638Led1 led: 0 - + output: - platform: tm1638 id: TM1638Led2 led: 1 - + Buttons @@ -163,7 +163,7 @@ The TM1638 7 Segment Display Keypad & LED Module has 8 buttons across the top or on_release: then: - switch.turn_off: TM1638Led1 - + - platform: tm1638 name: "TM1638 Button 2" id: TM1638Button2 diff --git a/components/esp32_camera.rst b/components/esp32_camera.rst index 0981c25fc..0de4c1ffd 100644 --- a/components/esp32_camera.rst +++ b/components/esp32_camera.rst @@ -14,16 +14,16 @@ directly integrate into Home Assistant through the native API. esp32_camera: name: My Camera external_clock: - pin: GPIO27 + pin: GPIOXX frequency: 20MHz i2c_pins: - sda: GPIO25 - scl: GPIO23 - data_pins: [GPIO17, GPIO35, GPIO34, GPIO5, GPIO39, GPIO18, GPIO36, GPIO19] - vsync_pin: GPIO22 - href_pin: GPIO26 - pixel_clock_pin: GPIO21 - reset_pin: GPIO15 + sda: GPIOXX + scl: GPIOXX + data_pins: [GPIOXX, GPIOXX, GPIOXX, GPIOXX, GPIOXX, GPIOXX, GPIOXX, GPIOXX] + vsync_pin: GPIOXX + href_pin: GPIOXX + pixel_clock_pin: GPIOXX + reset_pin: GPIOXX resolution: 640x480 jpeg_quality: 10 diff --git a/components/ethernet.rst b/components/ethernet.rst index 80fa7dd0b..b10165883 100644 --- a/components/ethernet.rst +++ b/components/ethernet.rst @@ -17,8 +17,8 @@ This component and the Wi-Fi component may **not** be used simultaneously, even # Example configuration entry for RMII chips ethernet: type: LAN8720 - mdc_pin: GPIO23 - mdio_pin: GPIO18 + mdc_pin: GPIOXX + mdio_pin: GPIOXX clk_mode: GPIO0_IN phy_addr: 0 @@ -33,12 +33,12 @@ This component and the Wi-Fi component may **not** be used simultaneously, even # Example configuration entry for SPI chips ethernet: type: W5500 - clk_pin: GPIO19 - mosi_pin: GPIO21 - miso_pin: GPIO23 - cs_pin: GPIO18 - interrupt_pin: GPIO36 - reset_pin: GPIO22 + clk_pin: GPIOXX + mosi_pin: GPIOXX + miso_pin: GPIOXX + cs_pin: GPIOXX + interrupt_pin: GPIOXX + reset_pin: GPIOXX Configuration variables: ------------------------ diff --git a/components/exposure_notifications.rst b/components/exposure_notifications.rst index 75f323de3..1007cf55f 100644 --- a/components/exposure_notifications.rst +++ b/components/exposure_notifications.rst @@ -52,7 +52,7 @@ minute, the indicator will be on. switch: - platform: gpio - pin: GPIO22 + pin: GPIOXX id: led script: diff --git a/components/fan/binary.rst b/components/fan/binary.rst index eefad56e1..c7328c5e7 100644 --- a/components/fan/binary.rst +++ b/components/fan/binary.rst @@ -14,18 +14,13 @@ The ``binary`` fan platform lets you represent any binary :ref:`output` as a fan .. code-block:: yaml # Example configuration entry - output: - - id: fan_output - platform: gpio - pin: GPIO16 - fan: - platform: binary output: fan_output name: "Living Room Fan" - - - + + + Configuration variables: ------------------------ diff --git a/components/fan/hbridge.rst b/components/fan/hbridge.rst index 4ed716697..7e4295f8c 100644 --- a/components/fan/hbridge.rst +++ b/components/fan/hbridge.rst @@ -23,14 +23,6 @@ The ``hbridge`` fan platform allows you to use a compatible *h-bridge* (L298N, D .. code-block:: yaml # Example configuration entry - output: - - platform: ... - id: motor_forward_pin - pin: GPIO5 - - platform: ... - id: motor_reverse_pin - pin: GPIO4 - fan: - platform: hbridge id: my_fan diff --git a/components/fingerprint_grow.rst b/components/fingerprint_grow.rst index 56435d509..cdba66074 100644 --- a/components/fingerprint_grow.rst +++ b/components/fingerprint_grow.rst @@ -30,16 +30,10 @@ If available on your reader model, it's recommended to connect 3.3VT (touch indu .. code-block:: yaml # Example configuration entry - uart: - rx_pin: GPIO13 - tx_pin: GPIO15 - baud_rate: 57600 - - # Declare Grow Fingerprint Reader fingerprint_grow: - sensing_pin: GPIO12 + sensing_pin: GPIOXX sensor_power_pin: - number: GPIO18 + number: GPIOXX inverted: true idle_period_to_sleep: 5s @@ -93,46 +87,27 @@ Configuration variables: - **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation. - All other options from :ref:`Binary Sensor `. -Optional Sensor Configuration: Sensor ------ - **fingerprint_count**: The number of enrolled fingerprints stored on the reader. - - - **name** (**Required**, string): The name for the sensor. - - **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation. - - All other options from :ref:`Sensor `. + All options from :ref:`Sensor `. - **last_finger_id**: The last matched enrolled fingerprint as set by :ref:`fingerprint_grow-on_finger_scan_matched`. - - - **name** (**Required**, string): The name for the sensor. - - **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation. - - All other options from :ref:`Sensor `. + All options from :ref:`Sensor `. - **last_confidence**: The last matched confidence as set by :ref:`fingerprint_grow-on_finger_scan_matched`. - - - **name** (**Required**, string): The name for the sensor. - - **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation. - - All other options from :ref:`Sensor `. + All options from :ref:`Sensor `. - **status**: The integer representation of the internal status register of the reader. - - - **name** (**Required**, string): The name for the sensor. - - **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation. - - All other options from :ref:`Sensor `. + All options from :ref:`Sensor `. - **capacity**: The fingerprint storage capacity of the reader. - - - **name** (**Required**, string): The name for the sensor. - - **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation. - - All other options from :ref:`Sensor `. + All options from :ref:`Sensor `. - **security_level**: The integer representation of the currently configured security level of the reader. Higher security levels reduce the false acceptance rate (FAR) at the expense of increasing the false rejection rate (FRR). Range is 1 (lowest) to 5 (highest). - - - **name** (**Required**, string): The name for the sensor. - - **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation. - - All other options from :ref:`Sensor `. + All options from :ref:`Sensor `. .. _fingerprint_grow-sleep_mode: @@ -150,14 +125,14 @@ This is a wiring example for the R503 and below you can find the respective conf .. code-block:: yaml uart: - rx_pin: GPIO16 - tx_pin: GPIO17 + rx_pin: GPIOXX + tx_pin: GPIOXX baud_rate: 57600 - + fingerprint_grow: - sensing_pin: GPIO4 + sensing_pin: GPIOXX sensor_power_pin: - number: GPIO18 + number: GPIOXX inverted: true idle_period_to_sleep: 5s @@ -191,7 +166,7 @@ The ``new_password:`` configuration option is meant to be compiled, flashed to t ``on_finger_scan_start`` Trigger ------------------------------------ -With this configuration option, you can trigger an automation when a finger is detected touching the sensor. Very useful to indicate to the user via AuraLed that the sensor has detected the finger touch and will perform the scan. This trigger will **only** activate if your fingerprint sensor is configured with the ``sensing_pin`` option. +With this configuration option, you can trigger an automation when a finger is detected touching the sensor. Very useful to indicate to the user via AuraLed that the sensor has detected the finger touch and will perform the scan. This trigger will **only** activate if your fingerprint sensor is configured with the ``sensing_pin`` option. .. code-block:: yaml @@ -513,12 +488,12 @@ Sample code .. code-block:: yaml uart: - rx_pin: GPIO13 - tx_pin: GPIO15 + rx_pin: GPIOXX + tx_pin: GPIOXX baud_rate: 57600 fingerprint_grow: - sensing_pin: GPIO12 + sensing_pin: GPIOXX on_finger_scan_invalid: - homeassistant.event: event: esphome.test_node_finger_scan_invalid diff --git a/components/gps.rst b/components/gps.rst index 0f6834a71..94a4efbc0 100644 --- a/components/gps.rst +++ b/components/gps.rst @@ -22,9 +22,6 @@ in your configuration - only the RX pin should be necessary. .. code-block:: yaml # Example configuration entry - uart: - rx_pin: D7 - baud_rate: 9600 # Declare GPS module gps: diff --git a/components/i2c.rst b/components/i2c.rst index 48176e248..a4fe7a4df 100644 --- a/components/i2c.rst +++ b/components/i2c.rst @@ -20,8 +20,8 @@ connecting the wires from each device back to the two I²C pins on the ESP. # Example configuration entry for ESP32 i2c: - sda: 21 - scl: 22 + sda: GPIOXX + scl: GPIOXX scan: true id: bus_a @@ -51,12 +51,12 @@ Configuration variables: # Example configuration entry i2c: - id: bus_a - sda: 13 - scl: 16 + sda: GPIOXX + scl: GPIOXX scan: true - id: bus_b - sda: 14 - scl: 15 + sda: GPIOXX + scl: GPIOXX scan: true # Sensors should be specified as follows - platform: bme680 diff --git a/components/i2s_audio.rst b/components/i2s_audio.rst index 3eb07a8f6..424fc5b1d 100644 --- a/components/i2s_audio.rst +++ b/components/i2s_audio.rst @@ -14,8 +14,8 @@ This component only works on ESP32 based chips. # Example configuration entry i2s_audio: - i2s_lrclk_pin: GPIO33 - i2s_bclk_pin: GPIO19 + i2s_lrclk_pin: GPIOXX + i2s_bclk_pin: GPIOXX Configuration variables: ------------------------ diff --git a/components/light/binary.rst b/components/light/binary.rst index 43e1ee7bc..4a3bf44e5 100644 --- a/components/light/binary.rst +++ b/components/light/binary.rst @@ -20,10 +20,6 @@ The ``binary`` light platform creates a simple ON/OFF-only light from a name: "Desk Lamp" output: light_output - output: - - id: light_output - platform: gpio - pin: GPIO16 Configuration variables: ------------------------ diff --git a/components/light/esp32_rmt_led_strip.rst b/components/light/esp32_rmt_led_strip.rst index 8c4a67c2e..cb1914244 100644 --- a/components/light/esp32_rmt_led_strip.rst +++ b/components/light/esp32_rmt_led_strip.rst @@ -12,7 +12,7 @@ This is a component using the ESP32 RMT peripheral to drive most addressable LED light: - platform: esp32_rmt_led_strip rgb_order: GRB - pin: GPIO13 + pin: GPIOXX num_leds: 30 rmt_channel: 0 chipset: ws2812 diff --git a/components/light/fastled.rst b/components/light/fastled.rst index 41c61a060..f1799fca0 100644 --- a/components/light/fastled.rst +++ b/components/light/fastled.rst @@ -47,7 +47,7 @@ Clockless FastLED lights differ from the light: - platform: fastled_clockless chipset: WS2811 - pin: GPIO23 + pin: GPIOXX num_leds: 60 rgb_order: BRG name: "FastLED WS2811 Light" @@ -126,8 +126,8 @@ whereas the clockless lights only need a single pin. light: - platform: fastled_spi chipset: WS2801 - data_pin: GPIO23 - clock_pin: GPIO22 + data_pin: GPIOXX + clock_pin: GPIOXX num_leds: 60 rgb_order: BRG name: "FastLED SPI Light" diff --git a/components/light/hbridge.rst b/components/light/hbridge.rst index 6dcd095d6..07b8c23cc 100644 --- a/components/light/hbridge.rst +++ b/components/light/hbridge.rst @@ -12,23 +12,12 @@ The ``hbridge`` light platform creates a dual color brightness controlled light :align: center :width: 40.0% -H-bridge lights are very common for Christmas lighting and they use 2 wires for a bunch of LEDs. +H-bridge lights are very common for Christmas lighting and they use 2 wires for a bunch of LEDs. The pins are switched alternatively to allow two sets of lights to operate. .. code-block:: yaml # Example configuration entry - - # Specify the two pins of the h-bridge as PWM pins - output: - - platform: esp8266_pwm - id: pina - pin: GPIO12 - - platform: esp8266_pwm - id: pinb - pin: GPIO14 - - # Create a light using the hbridge light: - platform: hbridge id: mainlight diff --git a/components/light/monochromatic.rst b/components/light/monochromatic.rst index 2b86555d2..c24a9787a 100644 --- a/components/light/monochromatic.rst +++ b/components/light/monochromatic.rst @@ -26,11 +26,6 @@ The ``monochromatic`` light platform creates a simple brightness-only light from name: "Kitchen Lights" output: output_component1 - # Example output entry - output: - - platform: esp8266_pwm - id: output_component1 - pin: D1 Configuration variables: ------------------------ diff --git a/components/light/neopixelbus.rst b/components/light/neopixelbus.rst index 701fa7337..852978677 100644 --- a/components/light/neopixelbus.rst +++ b/components/light/neopixelbus.rst @@ -28,7 +28,7 @@ the `NeoPixelBus `__ library internally. - platform: neopixelbus type: GRB variant: WS2811 - pin: GPIO23 + pin: GPIOXX num_leds: 60 name: "NeoPixel Light" @@ -129,7 +129,7 @@ settings vary by method: - **esp8266_uart**: An alternative method for ESP8266s that uses the UART peripheral to send data. Available on pin GPIO1 for bus 0, and GPIO2 for bus 1. Additional options: - - **bus** (*Optional*, int): The UART bus to use. If 0, the logger ``baud_rate`` option must + - **bus** (*Optional*, int): The UART bus to use. If 0, the logger ``baud_rate`` option must be set to 0 and logs over USB/serial won't work. - **async** (*Optional*, boolean): Use an asynchronous transfer. Defaults to ``false``. If enabled, the logger must be disabled even if bus 1 is used. @@ -154,7 +154,7 @@ The following method is available only for two-wire chips (specify ``data_pin`` - **bus** (*Optional*, string): On ESP32s the SPI bus to be used can be selected. One of ``vspi`` and ``hspi``. - **speed** (*Optional*, int): The frequency to send data with. Defaults to ``10MHz``. One of ``40MHz``, ``20MHz``, ``10MHz``, ``5MHz``, ``2MHz``, ``1MHz``, ``500KHz``. - + On ESP8266 only GPIO13 can be used for ``data_pin`` and only GPIO14 can be used for ``clock_pin``. The ``method`` key also accepts a short-hand syntax consisting of a single value for historic reasons. Usage of diff --git a/components/light/rgb.rst b/components/light/rgb.rst index 61bb69936..2c1f4f837 100644 --- a/components/light/rgb.rst +++ b/components/light/rgb.rst @@ -28,12 +28,6 @@ The ``rgb`` light platform creates an RGB light from 3 :ref:`float output compon green: output_component2 blue: output_component3 - # Example output entry - output: - - platform: esp8266_pwm - id: output_component1 - pin: D1 - # Repeat for green and blue output Color Correction ---------------- @@ -54,9 +48,8 @@ perceived intensity of different colors will generally vary. This can be done by # Example output entry output: - - platform: esp8266_pwm + - platform: ... id: output_component1 - pin: D1 max_power: 80% # Repeat for green and blue output diff --git a/components/light/rgbw.rst b/components/light/rgbw.rst index 3383f8ff5..ca089b07d 100644 --- a/components/light/rgbw.rst +++ b/components/light/rgbw.rst @@ -38,9 +38,8 @@ perceived intensity of different colors will generally vary. This can be done by # Example output entry output: - - platform: esp8266_pwm + - platform: ... id: output_component1 - pin: D1 max_power: 80% .. note:: diff --git a/components/light/rgbww.rst b/components/light/rgbww.rst index f40f2dfca..426e45f1b 100644 --- a/components/light/rgbww.rst +++ b/components/light/rgbww.rst @@ -44,9 +44,8 @@ perceived intensity of different colors will generally vary. This can be done by # Example output entry output: - - platform: esp8266_pwm + - platform: ... id: output_component1 - pin: D1 max_power: 80% .. note:: diff --git a/components/light/rp2040_pio_led_strip.rst b/components/light/rp2040_pio_led_strip.rst index d012329e3..ceeda5cfa 100644 --- a/components/light/rp2040_pio_led_strip.rst +++ b/components/light/rp2040_pio_led_strip.rst @@ -13,7 +13,7 @@ This is a component using the RP2040 PIO peripheral to drive most addressable LE - platform: rp2040_pio_led_strip name: led_strip id: led_strip - pin: GPIO13 + pin: GPIOXX num_leds: 10 pio: 0 rgb_order: GRB diff --git a/components/light/spi_led_strip.rst b/components/light/spi_led_strip.rst index d6cb4a75d..31b226e09 100644 --- a/components/light/spi_led_strip.rst +++ b/components/light/spi_led_strip.rst @@ -8,7 +8,7 @@ SPI LED Strip Light The ``spi_led_strip`` light platform drives one or more SPI interfaced RGB LEDs. These LEDs are often used in strips, where each LED is individually addressable. This component requires an SPI interface to be configured. -This component has been tested with APA102 LEDs and the P9813 LED driver. It should also work with HD107 and SK9822 type +This component has been tested with APA102 LEDs and the P9813 LED driver. It should also work with HD107 and SK9822 type LEDs, or any others with a similar interface - SPI, 8 bits per colour and BGR ordering. .. figure:: images/apa102.jpg @@ -18,14 +18,9 @@ LEDs, or any others with a similar interface - SPI, 8 bits per colour and BGR or .. code-block:: yaml # Example configuration entry - spi: - mosi_pin: GPIO3 - clk_pin: GPIO9 - light: - platform: spi_led_strip num_leds: 30 - color_correct: [80%, 60%, 100%] id: rgb_led name: "RGB LED Strip" data_rate: 1MHz diff --git a/components/light/status_led.rst b/components/light/status_led.rst index 99d1fa52f..69b315b5f 100644 --- a/components/light/status_led.rst +++ b/components/light/status_led.rst @@ -22,7 +22,7 @@ When the device is in OK state, the LED will be restored to the state of the ``b light: - platform: status_led name: "Switch state" - pin: GPIO2 + pin: GPIOXX .. note:: @@ -50,7 +50,7 @@ Configuration variables: .. code-block:: yaml pin: - number: GPIO2 + number: GPIOXX inverted: true diff --git a/components/lightwaverf.rst b/components/lightwaverf.rst index 78bcac9e5..1026b677f 100644 --- a/components/lightwaverf.rst +++ b/components/lightwaverf.rst @@ -22,19 +22,8 @@ Using an inexpensive RF transmitter and receiver you can control your devices vi # Specify the two pins to connect the receiver and transmitter lightwaverf: - read_pin: 13 - write_pin: 14 - - # Create a switch to trigger a light - switch: - - platform: template - name: "Turn off sofa" - id: light_off_ceiling_sofa - turn_on_action: - lightwaverf.send_raw: - code: [0x04, 0x00, 0x00, 0x00, 0x0f, 0x03, 0x0d, 0x09, 0x08, 0x08] - name: "Sofa" - repeat: 1 + read_pin: GPIOXX + write_pin: GPIOXX Note: To gather the RAW codes from the remote, setup the ``read_pin`` and observe in the logs the printing of the codes. diff --git a/components/lock/output.rst b/components/lock/output.rst index 282763eb7..ef07f4518 100644 --- a/components/lock/output.rst +++ b/components/lock/output.rst @@ -16,7 +16,7 @@ The ``output`` lock platform allows you to use any output component as a lock. # Example configuration entry output: - platform: gpio - pin: 25 + pin: GPIOXX id: 'generic_out' lock: - platform: output diff --git a/components/matrix_keypad.rst b/components/matrix_keypad.rst index 2820df56f..bf9703223 100644 --- a/components/matrix_keypad.rst +++ b/components/matrix_keypad.rst @@ -23,15 +23,15 @@ Component matrix_keypad: id: mykeypad rows: - - pin: 21 - - pin: 19 - - pin: 18 - - pin: 5 + - pin: GPIOXX + - pin: GPIOXX + - pin: GPIOXX + - pin: GPIOXX columns: - - pin: 17 - - pin: 16 - - pin: 4 - - pin: 15 + - pin: GPIOXX + - pin: GPIOXX + - pin: GPIOXX + - pin: GPIOXX keys: "123A456B789C*0#D" has_diodes: false diff --git a/components/max6956.rst b/components/max6956.rst index 7e2871908..9ef10f5a1 100644 --- a/components/max6956.rst +++ b/components/max6956.rst @@ -13,7 +13,7 @@ The ``max6956`` exists in 2 versions 20 or 28 ports, depending on the packaging. Once configured, you can use any of the 20 or 28 pins for your projects. Within ESPHome they emulate a real internal GPIO pin and can therefore be used with many of ESPHome's components such as the GPIO binary sensor or GPIO switch. Interrupt-on-change for inputs is not possible. -Pins can also be individualy configured as led driver and used with Light components. Current value can be set globaly or for each pin, through 16 possible levels. Driving RGB +Pins can also be individualy configured as led driver and used with Light components. Current value can be set globaly or for each pin, through 16 possible levels. Driving RGB led requires 3 pins. Any option accepting a :ref:`Pin Schema ` can theoretically be used. @@ -48,7 +48,7 @@ Configuration variables: - **brightness_global** (*Optional*): Set the value of the current to be sink by all pins configured as led driver. Defaults to ``0`` - **brightness_mode** (*Optional*): Define if the current to be sink will be confgured globaly or per pin configured as led driver. - Defaults to ``global`` + Defaults to ``global`` Binary Sensor Example @@ -58,19 +58,7 @@ Binary Sensor Example .. code-block:: yaml - # Example configuration : pin as input with pullup - i2c: - id: bus_a - sda: GPIO13 - scl: GPIO16 - scan: false - - max6956: - - id: max6956_1 - address: 0x40 - i2c_id: bus_a - - # Individual input + # Example configuration binary_sensor: - platform: gpio name: "MaxIn Pin 4" @@ -78,7 +66,7 @@ Binary Sensor Example pin: max6956: max6956_1 number: 4 - mode: + mode: input: true pullup: true inverted: False @@ -91,18 +79,7 @@ Switch Example .. code-block:: yaml - # Example configuration : pin as output - i2c: - id: bus_a - sda: GPIO13 - scl: GPIO16 - - max6956: - - id: max6956_1 - address: 0x40 - i2c_id: bus_a - - # Individual output + # Example configuration switch: - platform: gpio name: "MaxIn Pin 8" @@ -110,9 +87,9 @@ Switch Example pin: max6956: max6956_1 number: 8 - mode: + mode: output: true - inverted: False + inverted: False Led driver Example @@ -126,8 +103,8 @@ Led driver Example # Example configuration : pin as led driver, current globaly i2c: id: bus_a - sda: GPIO13 - scl: GPIO16 + sda: GPIOXX + scl: GPIOXX switch: - platform: template @@ -153,7 +130,7 @@ Led driver Example - max6956.set_brightness_global: id: max6956_1 brightness_global: !lambda return x; - + max6956: - id: max6956_1 address: 0x40 @@ -166,7 +143,7 @@ Led driver Example - platform: max6956 pin: 4 id: maxOut_pin4 - + #led binded to output light: - platform: monochromatic @@ -178,8 +155,8 @@ Led driver Example # Example configuration : pin as led driver, current managed individualy (RBG led) i2c: id: bus_a - sda: GPIO13 - scl: GPIO16 + sda: GPIOXX + scl: GPIOXX max6956: - id: max6956_1 @@ -229,7 +206,7 @@ Led driver Example - output.set_level: id: maxOut_pin4 level: !lambda return x/100; - + - platform: template name: "Number Green" id: number_LedGreen @@ -256,7 +233,7 @@ Led driver Example on_value: - output.set_level: id: maxOut_pin6 - level: !lambda return x/100; + level: !lambda return x/100; output: - platform: max6956 pin: 4 @@ -275,7 +252,7 @@ Led driver Example gamma_correct: 1 red: maxOut_pin4 green: maxOut_pin5 - blue: maxOut_pin6 + blue: maxOut_pin6 diff --git a/components/mcp23Sxx.rst b/components/mcp23Sxx.rst index c058eaf65..af26d0876 100644 --- a/components/mcp23Sxx.rst +++ b/components/mcp23Sxx.rst @@ -26,7 +26,7 @@ The MCP23S08 component (`datasheet `): The GPIO pin to use to mute the media player. - **mode** (*Optional*, string): The mode of the I²S bus. Can be ``mono`` or ``stereo``. Defaults to ``mono``. - **i2s_audio_id** (*Optional*, :ref:`config-id`): The ID of the :ref:`I²S Audio ` you wish to use for this media player. -- **i2s_comm_fmt** (*Optional*, string): I2S communication format. By default MSB format is used (AC101, PCM5102A). - Set to ``lsb`` if using an external DAC that uses Japanese (Least Significant Bit Justified) format (like PT8211). +- **i2s_comm_fmt** (*Optional*, string): I2S communication format. By default MSB format is used (AC101, PCM5102A). + Set to ``lsb`` if using an external DAC that uses Japanese (Least Significant Bit Justified) format (like PT8211). Can be ``msb`` or ``lsb``. Defaults to ``msb``. For best results, keep the wires as short as possible. diff --git a/components/microphone/i2s_audio.rst b/components/microphone/i2s_audio.rst index 468a0e1db..7e84843f9 100644 --- a/components/microphone/i2s_audio.rst +++ b/components/microphone/i2s_audio.rst @@ -24,12 +24,12 @@ This platform only works on ESP32 based chips. - platform: i2s_audio id: external_mic adc_type: external - i2s_din_pin: GPIO23 + i2s_din_pin: GPIOXX - platform: i2s_audio id: adc_mic adc_type: internal - adc_pin: GPIO35 + adc_pin: GPIOXX Configuration variables: @@ -80,7 +80,7 @@ M5Stack Atom Echo microphone: - platform: i2s_audio adc_type: external - i2s_din_pin: GPIO23 + i2s_din_pin: GPIOXX pdm: true RaspiAudio Muse Luxe @@ -90,7 +90,7 @@ RaspiAudio Muse Luxe microphone: - platform: i2s_audio - i2s_din_pin: GPIO35 + i2s_din_pin: GPIOXX adc_type: external pdm: false diff --git a/components/modbus_controller.rst b/components/modbus_controller.rst index c21b0a13e..00fcfd135 100644 --- a/components/modbus_controller.rst +++ b/components/modbus_controller.rst @@ -78,7 +78,7 @@ Technically there is no difference between the "inline" and the standard definit ... modbus: - flow_control_pin: 5 + flow_control_pin: GPIOXX id: modbus1 modbus_controller: @@ -129,43 +129,43 @@ Bitmasks Some devices use decimal values in read registers to show multiple binary states occupying only one register address. To decode them, you can use bitmasks according to the table below. The decimal value corresponding to a bit is always double of the previous one in the row. Multiple bits can be represented in a single register by making a sum of all the values corresponding to the bits. -+------------+------------------+-----------+-----------+ ++------------+------------------+-----------+-----------+ | Alarm bit | Description | DEC value | HEX value | -+============+==================+===========+===========+ ++============+==================+===========+===========+ | bit 0 | Binary Sensor 0 | 1 | 1 | -+------------+------------------+-----------+-----------+ ++------------+------------------+-----------+-----------+ | bit 1 | Binary Sensor 1 | 2 | 2 | -+------------+------------------+-----------+-----------+ ++------------+------------------+-----------+-----------+ | bit 2 | Binary Sensor 2 | 4 | 4 | -+------------+------------------+-----------+-----------+ ++------------+------------------+-----------+-----------+ | bit 3 | Binary Sensor 3 | 8 | 8 | -+------------+------------------+-----------+-----------+ ++------------+------------------+-----------+-----------+ | bit 4 | Binary Sensor 4 | 16 | 10 | -+------------+------------------+-----------+-----------+ ++------------+------------------+-----------+-----------+ | bit 5 | Binary Sensor 5 | 32 | 20 | -+------------+------------------+-----------+-----------+ ++------------+------------------+-----------+-----------+ | bit 6 | Binary Sensor 6 | 64 | 40 | -+------------+------------------+-----------+-----------+ ++------------+------------------+-----------+-----------+ | bit 7 | Binary Sensor 7 | 128 | 80 | -+------------+------------------+-----------+-----------+ ++------------+------------------+-----------+-----------+ | bit 8 | Binary Sensor 8 | 256 | 100 | -+------------+------------------+-----------+-----------+ ++------------+------------------+-----------+-----------+ | bit 9 | Binary Sensor 9 | 512 | 200 | -+------------+------------------+-----------+-----------+ ++------------+------------------+-----------+-----------+ | bit 10 | Binary Sensor 10 | 1024 | 400 | -+------------+------------------+-----------+-----------+ ++------------+------------------+-----------+-----------+ | bit 11 | Binary Sensor 11 | 2048 | 800 | -+------------+------------------+-----------+-----------+ ++------------+------------------+-----------+-----------+ | bit 12 | Binary Sensor 12 | 4096 | 1000 | -+------------+------------------+-----------+-----------+ ++------------+------------------+-----------+-----------+ | bit 13 | Binary Sensor 13 | 8192 | 2000 | -+------------+------------------+-----------+-----------+ ++------------+------------------+-----------+-----------+ | bit 14 | Binary Sensor 14 | 16384 | 4000 | -+------------+------------------+-----------+-----------+ ++------------+------------------+-----------+-----------+ | bit 15 | Binary Sensor 15 | 32768 | 8000 | -+------------+------------------+-----------+-----------+ ++------------+------------------+-----------+-----------+ -In the example below, register ``15``, holds several binary values. It stores the decimal value ``12288``, which is the sum of ``4096`` + ``8192``, meaning the corresponding bits ``12`` and ``13`` are ``1``, the other bits are ``0``. +In the example below, register ``15``, holds several binary values. It stores the decimal value ``12288``, which is the sum of ``4096`` + ``8192``, meaning the corresponding bits ``12`` and ``13`` are ``1``, the other bits are ``0``. To gather some of these bits as binary sensors in ESPHome, use ``bitmask``: @@ -513,7 +513,7 @@ The response is mapped to the sensor based on ``register_count`` and offset in b The code synchronizes the localtime of MCU to the epever controller The time is set by writing 12 bytes to register 0x9013. Then battery charge settings are sent. - + .. code-block:: yaml esphome: @@ -565,7 +565,7 @@ The response is mapped to the sensor based on ``register_count`` and offset in b 0x04BA, // 900d Low Volt. Disconnect Volt. 11.8 0x04BA // 900E Discharging Limit Voltage 11.8 }; - + // Boost and equalization periods std::vector battery_settings2 = { 0x0000, // 906B Equalize Duration (min.) 0 @@ -574,7 +574,7 @@ The response is mapped to the sensor based on ``register_count`` and offset in b esphome::modbus_controller::ModbusCommandItem set_battery1_command = esphome::modbus_controller::ModbusCommandItem::create_write_multiple_command(controller, 0x9000, battery_settings1.size() , battery_settings1); - + esphome::modbus_controller::ModbusCommandItem set_battery2_command = esphome::modbus_controller::ModbusCommandItem::create_write_multiple_command(controller, 0x906B, battery_settings3.size(), battery_settings2); @@ -583,19 +583,19 @@ The response is mapped to the sensor based on ``register_count`` and offset in b delay(200) ; controller->queue_command(set_battery2_command); ESP_LOGI("ModbusLambda", "EPSOLAR Battery set"); - + uart: id: mod_bus - tx_pin: 19 - rx_pin: 18 + tx_pin: GPIOXX + rx_pin: GPIOXX baud_rate: 115200 stop_bits: 1 - + modbus: - #flow_control_pin: 23 + #flow_control_pin: GPIOXX send_wait_time: 200ms id: mod_bus_epever - + modbus_controller: - id: epever ## the Modbus device addr @@ -604,7 +604,7 @@ The response is mapped to the sensor based on ``register_count`` and offset in b command_throttle: 0ms setup_priority: -10 update_interval: ${updates} - + sensor: - platform: modbus_controller modbus_controller_id: epever @@ -617,7 +617,7 @@ The response is mapped to the sensor based on ``register_count`` and offset in b accuracy_decimals: 1 filters: - multiply: 0.01 - + - platform: modbus_controller modbus_controller_id: epever id: array_rated_current @@ -629,7 +629,7 @@ The response is mapped to the sensor based on ``register_count`` and offset in b accuracy_decimals: 2 filters: - multiply: 0.01 - + - platform: modbus_controller modbus_controller_id: epever id: array_rated_power diff --git a/components/output/ac_dimmer.rst b/components/output/ac_dimmer.rst index 1a7c2b1a3..0fd7ea664 100644 --- a/components/output/ac_dimmer.rst +++ b/components/output/ac_dimmer.rst @@ -33,9 +33,9 @@ There are several already made boards which are compatible with this component, output: - platform: ac_dimmer id: dimmer1 - gate_pin: D7 + gate_pin: GPIOXX zero_cross_pin: - number: D6 + number: GPIOXX mode: input: true inverted: yes diff --git a/components/output/bp1658cj.rst b/components/output/bp1658cj.rst index 84aeb2136..2743b77ba 100644 --- a/components/output/bp1658cj.rst +++ b/components/output/bp1658cj.rst @@ -24,8 +24,8 @@ It is used in some smart light bulbs: # Example configuration entry bp1658cj: - data_pin: GPIO6 - clock_pin: GPIO7 + data_pin: GPIOXX + clock_pin: GPIOXX max_power_color_channels: 4 # Valid values 0-15 max_power_white_channels: 6 # Valid values 0-15 diff --git a/components/output/bp5758d.rst b/components/output/bp5758d.rst index ffbcc2340..adde2757b 100644 --- a/components/output/bp5758d.rst +++ b/components/output/bp5758d.rst @@ -24,8 +24,8 @@ It is used in some smart light bulbs: # Example configuration entry bp5758d: - data_pin: GPIO3 - clock_pin: GPIO5 + data_pin: GPIOXX + clock_pin: GPIOXX Configuration variables: diff --git a/components/output/esp8266_pwm.rst b/components/output/esp8266_pwm.rst index e55a2dd43..ba2c572f7 100644 --- a/components/output/esp8266_pwm.rst +++ b/components/output/esp8266_pwm.rst @@ -15,7 +15,7 @@ like the one on the ESP32 (see :doc:`ledc`) are preferred. # Example configuration entry output: - platform: esp8266_pwm - pin: D1 + pin: GPIOXX frequency: 1000 Hz id: pwm_output diff --git a/components/output/gpio.rst b/components/output/gpio.rst index de9547819..26fdf0db9 100644 --- a/components/output/gpio.rst +++ b/components/output/gpio.rst @@ -14,7 +14,7 @@ will not show up in Home Assistant. See :doc:`/components/switch/gpio`. # Example configuration entry output: - platform: gpio - pin: D1 + pin: GPIOXX id: gpio_d1 Configuration variables: diff --git a/components/output/ledc.rst b/components/output/ledc.rst index 305b84350..a2e25b185 100644 --- a/components/output/ledc.rst +++ b/components/output/ledc.rst @@ -12,6 +12,32 @@ of the ESP32 as an output component. The frequency range of LEDC is from 10Hz to 40MHz - however, higher frequencies require a smaller bit depth which means the output is not that accurate for frequencies above ~300kHz. + +Configuration variables: +------------------------ + +- **pin** (**Required**, :ref:`config-pin`): The pin to use LEDC on. Can only be GPIO0-GPIO33. +- **id** (**Required**, :ref:`config-id`): The id to use for this output component. +- **frequency** (*Optional*, float): At which frequency to run the LEDC + channel’s timer. Defaults to 1000Hz. +- All other options from :ref:`Output `. + +Advanced options: + +- **channel** (*Optional*, int): Manually set the `LEDC + channel `__ + to use. Two adjacent channels share the same timer. Defaults to an automatic selection. + +Note: When configuring custom frequencies for two or more outputs, ensure that you manually specify +channel 0, 2, 4, 6 for each output. This will prevent issues that arise from automatic selection, +which chooses adjacent channels with shared timers. See +`Issue #3114 `__ for more details. + +- **phase_angle** (*Optional*, float): Set a phase angle to the other channel of this timer. + Range 0-360°, defaults to 0° + +Note: this variable is only available for the esp-idf framework + Example Usage For a Light ************************* @@ -20,8 +46,8 @@ Example Usage For a Light # Example configuration entry output: - platform: ledc - pin: GPIO19 - id: gpio_19 + pin: GPIOXX + id: gpio_ # Example usage in a light light: @@ -63,31 +89,6 @@ Example Usage For a Piezo Buzzer id: buzzer level: "50%" -Configuration variables: ------------------------- - -- **pin** (**Required**, :ref:`config-pin`): The pin to use LEDC on. Can only be GPIO0-GPIO33. -- **id** (**Required**, :ref:`config-id`): The id to use for this output component. -- **frequency** (*Optional*, float): At which frequency to run the LEDC - channel’s timer. Defaults to 1000Hz. -- All other options from :ref:`Output `. - -Advanced options: - -- **channel** (*Optional*, int): Manually set the `LEDC - channel `__ - to use. Two adjacent channels share the same timer. Defaults to an automatic selection. - -Note: When configuring custom frequencies for two or more outputs, ensure that you manually specify -channel 0, 2, 4, 6 for each output. This will prevent issues that arise from automatic selection, -which chooses adjacent channels with shared timers. See -`Issue #3114 `__ for more details. - -- **phase_angle** (*Optional*, float): Set a phase angle to the other channel of this timer. - Range 0-360°, defaults to 0° - -Note: this variable is only available for the esp-idf framework - Recommended frequencies ----------------------- diff --git a/components/output/my9231.rst b/components/output/my9231.rst index db062f5b6..c195b46dd 100644 --- a/components/output/my9231.rst +++ b/components/output/my9231.rst @@ -31,14 +31,9 @@ global ``my9231`` hub and give it an id, and then define the # Example configuration entry my9231: - - data_pin: GPIO12 - clock_pin: GPIO14 + - data_pin: GPIOXX + clock_pin: GPIOXX - # Individual outputs - output: - - platform: my9231 - id: 'my9231_output1' - channel: 0 Configuration variables: ************************ @@ -68,11 +63,6 @@ The MY931/MY9291 output component exposes a MY931/MY9291 channel of a global .. code-block:: yaml - # Example configuration entry - my9231: - - data_pin: GPIO12 - clock_pin: GPIO14 - # Individual outputs output: - platform: my9231 diff --git a/components/output/pca9685.rst b/components/output/pca9685.rst index 42772ecbf..00e9b6293 100644 --- a/components/output/pca9685.rst +++ b/components/output/pca9685.rst @@ -44,7 +44,7 @@ global ``pca9685`` hub and give it an id, and then define the output: # generate PWM from ESP32 ledc - platform: ledc - pin: 25 + pin: GPIOXX id: extclk min_power: 1 frequency: 40MHz @@ -118,10 +118,10 @@ This output can be used for different PWM functions. E.g. output for light, fan - platform: pca9685 channel: 0 id: pwm01 - + light: - - platform: monochromatic - name: 'main light' + - platform: monochromatic + name: 'main light' output: pwm01 See Also diff --git a/components/output/sigma_delta_output.rst b/components/output/sigma_delta_output.rst index 1201f981c..55b69a8a2 100644 --- a/components/output/sigma_delta_output.rst +++ b/components/output/sigma_delta_output.rst @@ -14,13 +14,13 @@ it is possible to update the output value with each update cycle, not just at th For example, if you choose to toggle the output at most once every 1 second and decide on a PWM period of 10 seconds, for reasonably frequent updates, with :doc:`/components/output/slow_pwm` there are only 10 possible levels, and for higher precision a longer update interval is needed, -restricting the update rate. +restricting the update rate. A *sigma-delta* output is updated during each cycle, thus a higher precision can be achieved, without being constrained by a calculation timeframe (=period). So instead of having to define a ``period`` where the width of the pulse determines the output level, here you -choose an ``update_interval`` which acts like a clock signal from where the pulse density determines the output level. +choose an ``update_interval`` which acts like a clock signal from where the pulse density determines the output level. This component can be used as a drop-in replacement for :doc:`/components/output/slow_pwm` by changing the ``platform`` to ``sigma_delta_output`` and changing ``period`` to ``update_interval`` (you usually want to set the *sigma-delta*'s @@ -35,7 +35,7 @@ This component can be used as a drop-in replacement for :doc:`/components/output id: sd_heater_output # Output to a pin - pin: 15 + pin: GPIOXX # Use the same output, but through automations turn_on_action: @@ -44,9 +44,9 @@ This component can be used as a drop-in replacement for :doc:`/components/output turn_off_action: then: - output.turn_off: heater_relay - + - platform: gpio - pin: 15 + pin: GPIOXX id: heater_relay Configuration variables: diff --git a/components/output/slow_pwm.rst b/components/output/slow_pwm.rst index 34d6c8aa7..bef7ae0ec 100644 --- a/components/output/slow_pwm.rst +++ b/components/output/slow_pwm.rst @@ -22,7 +22,7 @@ heating element through a relay where a fast PWM update cycle would not be appro # Example configuration entry output: - platform: slow_pwm - pin: D1 + pin: GPIOXX id: my_slow_pwm period: 15s diff --git a/components/output/sm16716.rst b/components/output/sm16716.rst index e5fc31826..d8e8bd856 100644 --- a/components/output/sm16716.rst +++ b/components/output/sm16716.rst @@ -28,22 +28,11 @@ global ``sm16716`` hub and give it an id, and then define the # Example configuration entry sm16716: - data_pin: GPIO14 - clock_pin: GPIO4 + data_pin: GPIOXX + clock_pin: GPIOXX num_channels: 3 num_chips: 1 - # Individual outputs - output: - - platform: sm16716 - id: output_red - channel: 0 - - platform: sm16716 - id: output_green - channel: 1 - - platform: sm16716 - id: output_blue - channel: 2 Configuration variables: ************************ @@ -69,13 +58,6 @@ The SM16716 output component exposes a SM16716 channel of a global .. code-block:: yaml - # Example configuration entry - sm16716: - data_pin: GPIO14 - clock_pin: GPIO4 - num_channels: 3 - num_chips: 1 - # Individual outputs output: - platform: sm16716 @@ -174,7 +156,7 @@ A complete configuration for a Feit Electric A19 looks like: The white LEDs are much brighter than the color LEDs and will fully overpower the set color when the white level is set even a little bit high. You will need to set the white level to 0 in order to get usable colors from this bulb. - + Alternative Costco Feit A19 RGBCT bulb configuration: .. code-block:: yaml @@ -224,8 +206,8 @@ Alternative Costco Feit A19 RGBCT bulb configuration: power_supply: - id: rgb_power pin: GPIO13 - - + + See Also -------- diff --git a/components/output/sm2135.rst b/components/output/sm2135.rst index 2ff9a1488..df6b064d2 100644 --- a/components/output/sm2135.rst +++ b/components/output/sm2135.rst @@ -27,31 +27,9 @@ global ``sm2135`` hub and give it an id, and then define the # Example configuration entry sm2135: - data_pin: GPIO12 - clock_pin: GPIO14 + data_pin: GPIOXX + clock_pin: GPIOXX - # Individual outputs - output: - - platform: sm2135 - id: output_red - channel: 0 - max_power: 0.8 - - platform: sm2135 - id: output_green - channel: 1 - max_power: 0.8 - - platform: sm2135 - id: output_blue - channel: 2 - max_power: 0.8 - - platform: sm2135 - id: output_white - channel: 3 - max_power: 0.8 - - platform: sm2135 - id: output_warmwhite - channel: 4 - max_power: 0.8 Configuration variables: ************************ @@ -62,7 +40,7 @@ Configuration variables: - **id** (*Optional*, :ref:`config-id`): The id to use for this ``sm2135`` component. Use this if you have multiple SM2135 chains connected at the same time. -- **cw_current** (*Optional*, current): The current used for the white channel. +- **cw_current** (*Optional*, current): The current used for the white channel. Defaults to ``10mA``. Can be one of ``10mA``, ``15mA``, ``20mA``, ``25mA``, ``30mA``, ``35mA``, ``40mA``, ``45mA``, ``50mA``, ``55mA``, ``60mA``. - **rgb_current** (*Optional*, current): The current used for the RGB channel. @@ -82,11 +60,6 @@ The SM2135 output component exposes a SM2135 channel of a global .. code-block:: yaml - # Example configuration entry - sm2135: - data_pin: GPIO12 - clock_pin: GPIO14 - # Individual outputs output: - platform: sm2135 diff --git a/components/output/sm2235.rst b/components/output/sm2235.rst index 71cbb7c30..e3008a032 100644 --- a/components/output/sm2235.rst +++ b/components/output/sm2235.rst @@ -21,8 +21,8 @@ global ``sm2235`` hub and give it an id, and then define the # Example configuration entry sm2235: - data_pin: GPIO4 - clock_pin: GPIO5 + data_pin: GPIOXX + clock_pin: GPIOXX max_power_color_channels: 9 max_power_white_channels: 9 diff --git a/components/output/sm2335.rst b/components/output/sm2335.rst index 011df7bc9..9ed107cbe 100644 --- a/components/output/sm2335.rst +++ b/components/output/sm2335.rst @@ -24,8 +24,8 @@ global ``sm2335`` hub and give it an id, and then define the # Example configuration entry sm2335: - data_pin: GPIO4 - clock_pin: GPIO5 + data_pin: GPIOXX + clock_pin: GPIOXX max_power_color_channels: 9 max_power_white_channels: 9 diff --git a/components/output/template.rst b/components/output/template.rst index 267c47cca..b479bcff7 100644 --- a/components/output/template.rst +++ b/components/output/template.rst @@ -22,14 +22,10 @@ The ``template`` output component can be used to create templated binary and flo id: output2 level: !lambda return state; - - platform: esp8266_pwm + - platform: ... id: output1 - pin: GPIO12 - inverted: true - - platform: esp8266_pwm + - platform: ... id: output2 - pin: GPIO14 - inverted: true diff --git a/components/output/tlc5947.rst b/components/output/tlc5947.rst index 57b84345d..0a880d44e 100644 --- a/components/output/tlc5947.rst +++ b/components/output/tlc5947.rst @@ -27,21 +27,9 @@ global ``tlc5947`` hub and give it an id, and then define the # Example configuration entry tlc5947: - data_pin: GPIO12 - clock_pin: GPIO14 - lat_pin: GPIO15 - - # Individual outputs - output: - - platform: tlc5947 - id: output_red - channel: 0 - - platform: tlc5947 - id: output_green - channel: 1 - - platform: tlc5947 - id: output_blue - channel: 2 + data_pin: GPIOXX + clock_pin: GPIOXX + lat_pin: GPIOXX Configuration variables: ************************ @@ -66,12 +54,6 @@ The tlc5947 output component exposes a tlc5947 channel of a global .. code-block:: yaml - # Example configuration entry - tlc5947: - data_pin: GPIO12 - clock_pin: GPIO14 - lat_pin: GPIO15 - # Individual outputs output: - platform: tlc5947 diff --git a/components/output/tlc5971.rst b/components/output/tlc5971.rst index 0a371c761..5701b3627 100644 --- a/components/output/tlc5971.rst +++ b/components/output/tlc5971.rst @@ -27,20 +27,9 @@ global ``tlc5971`` hub and give it an id, and then define the # Example configuration entry tlc5971: - data_pin: GPIO12 - clock_pin: GPIO14 + data_pin: GPIOXX + clock_pin: GPIOXX - # Individual outputs - output: - - platform: tlc5971 - id: output_red - channel: 0 - - platform: tlc5971 - id: output_green - channel: 1 - - platform: tlc5971 - id: output_blue - channel: 2 Configuration variables: ************************ @@ -63,11 +52,6 @@ The tlc5971 output component exposes a tlc5971 channel of a global .. code-block:: yaml - # Example configuration entry - tlc5971: - data_pin: GPIO12 - clock_pin: GPIO14 - # Individual outputs output: - platform: tlc5971 diff --git a/components/output/x9c.rst b/components/output/x9c.rst index ce7732d91..4a1ffebc8 100644 --- a/components/output/x9c.rst +++ b/components/output/x9c.rst @@ -15,7 +15,7 @@ The ``x9c`` output platform allows you to add an output that controls a `X9C dig The X9C family of digital potentiometers are available in different resistance values. -==================== ===================== +==================== ===================== ``X9C102`` ``1kΩ`` -------------------- --------------------- ``X9C103`` ``10kΩ`` @@ -33,9 +33,9 @@ All chips are controlled by a three wire interface and feature 100 possible wipe output: - platform: x9c id: x9c_pot - cs_pin: GPIO25 - inc_pin: GPIO27 - ud_pin: GPIO26 + cs_pin: GPIOXX + inc_pin: GPIOXX + ud_pin: GPIOXX initial_value: 0.5 Configuration variables: diff --git a/components/pipsolar.rst b/components/pipsolar.rst index d7f20ca46..5597ec1da 100644 --- a/components/pipsolar.rst +++ b/components/pipsolar.rst @@ -37,16 +37,8 @@ There is a buffer to buffer up to 10 commands. .. code-block:: yaml # Example configuration entry - uart: - - id: uart_bus - tx_pin: GPIO18 - rx_pin: GPIO19 - # most devices use 2400 as baud_rate - baud_rate: 2400 - pipsolar: - - uart_id: uart_bus - id: inverter0 + - id: inverter0 Configuration variables: ~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/components/pn7150.rst b/components/pn7150.rst index b76e6e2df..498f713ac 100644 --- a/components/pn7150.rst +++ b/components/pn7150.rst @@ -30,10 +30,10 @@ In addition, the :doc:`binary_sensor/nfc` platform may be used to quickly and ea .. code-block:: yaml pn7150_i2c: - dwl_req_pin: 17 - irq_pin: 35 - ven_pin: 16 - wkup_req_pin: 21 + dwl_req_pin: GPIOXX + irq_pin: GPIOXX + ven_pin: GPIOXX + wkup_req_pin: GPIOXX emulation_message: https://www.home-assistant.io/tag/pulse_ce tag_ttl: 1000ms @@ -348,7 +348,7 @@ NDEF Writing The examples below illustrate how NDEF messages may be written to cards/tags via the PN7150. Note that a :doc:`button ` is a great mechanism to use to trigger these actions. -The first example will write a simple, fixed NDEF message to a tag. +The first example will write a simple, fixed NDEF message to a tag. .. code-block:: yaml diff --git a/components/pn7160.rst b/components/pn7160.rst index f359a7b5d..dd8d6b5ca 100644 --- a/components/pn7160.rst +++ b/components/pn7160.rst @@ -42,11 +42,11 @@ The ``pn7160_spi`` component allows you to use :ref:`SPI-equipped ` PN7160 .. code-block:: yaml pn7160_spi: - cs_pin: 15 - dwl_req_pin: 17 - irq_pin: 35 - ven_pin: 16 - wkup_req_pin: 21 + cs_pin: GPIOXX + dwl_req_pin: GPIOXX + irq_pin: GPIOXX + ven_pin: GPIOXX + wkup_req_pin: GPIOXX emulation_message: https://www.home-assistant.io/tag/pulse_ce tag_ttl: 1000ms @@ -87,10 +87,10 @@ The ``pn7160_i2c`` component allows you to use :ref:`I²C-equipped ` PN7160 .. code-block:: yaml pn7160_i2c: - dwl_req_pin: 17 - irq_pin: 35 - ven_pin: 16 - wkup_req_pin: 21 + dwl_req_pin: GPIOXX + irq_pin: GPIOXX + ven_pin: GPIOXX + wkup_req_pin: GPIOXX emulation_message: https://www.home-assistant.io/tag/pulse_ce tag_ttl: 1000ms @@ -406,7 +406,7 @@ NDEF Writing The examples below illustrate how NDEF messages may be written to cards/tags via the PN7160. Note that a :doc:`button ` is a great mechanism to use to trigger these actions. -The first example will write a simple, fixed NDEF message to a tag. +The first example will write a simple, fixed NDEF message to a tag. .. code-block:: yaml diff --git a/components/power_supply.rst b/components/power_supply.rst index f4e69c574..bdd734a8a 100644 --- a/components/power_supply.rst +++ b/components/power_supply.rst @@ -21,7 +21,7 @@ after the last output has been disabled. # Example configuration entry power_supply: - id: 'power_supply1' - pin: 13 + pin: GPIOXX Configuration variables: ------------------------ diff --git a/components/remote_receiver.rst b/components/remote_receiver.rst index d3eb1f6f5..b6bbac710 100644 --- a/components/remote_receiver.rst +++ b/components/remote_receiver.rst @@ -20,7 +20,7 @@ which will trigger when they hear their own configured signal. # Example configuration entry remote_receiver: - pin: GPIO32 + pin: GPIOXX dump: all Configuration variables: @@ -206,10 +206,6 @@ then immediately OFF. .. code-block:: yaml # Example configuration entry - remote_receiver: - pin: GPIO32 - dump: all - binary_sensor: - platform: remote_receiver name: "Panasonic Remote Input" @@ -439,7 +435,7 @@ Remote code selection (exactly one of these has to be included): remote_receiver: pin: - number: D4 + number: GPIOXX inverted: true mode: input: true @@ -475,4 +471,3 @@ See Also - `IRRemoteESP8266 `__ by `Mark Szabo-Simon `__ - :apiref:`remote/remote_receiver.h` - :ghedit:`Edit` - diff --git a/components/remote_transmitter.rst b/components/remote_transmitter.rst index 5d34b30b3..6f18cfb75 100644 --- a/components/remote_transmitter.rst +++ b/components/remote_transmitter.rst @@ -24,18 +24,9 @@ remote signals. # Example configuration entry remote_transmitter: - pin: GPIO32 + pin: GPIOXX carrier_duty_percent: 50% - # Individual switches - switch: - - platform: template - name: "Panasonic TV Off" - turn_on_action: - remote_transmitter.transmit_panasonic: - address: 0x4004 - command: 0x100BCBD - Configuration variables: ------------------------ @@ -293,7 +284,7 @@ Configuration variables: - **id** (**Required**, int): The 24-bit ID to send. Each remote has a unique one. - **channel** (**Required**, int): The 8-bit channel to send, between 0 and 255 inclusive. -- **button** (**Required**, int): The 4-bit button to send, between 0 and 15 inclusive. +- **button** (**Required**, int): The 4-bit button to send, between 0 and 15 inclusive. - **check** (**Required**, int): The 4-bit check to send. Includes an indication that a button is being held down. See dumper output for more info. - All other options from :ref:`remote_transmitter-transmit_action`. @@ -911,7 +902,7 @@ remote_receiver instance: .. code-block:: yaml remote_receiver: - pin: D0 + pin: GPIOXX dump: all Compile and upload the code. While viewing the log output from the ESP, @@ -940,7 +931,7 @@ IR diode to a new pin on the ESP and configure a global ``remote_transmitter`` i .. code-block:: yaml remote_transmitter: - pin: D1 + pin: GPIOXX # Infrared remotes use a 50% carrier signal carrier_duty_percent: 50% @@ -986,7 +977,7 @@ First, connect the RF module to a pin on the ESP and set up a remote_receiver in .. code-block:: yaml remote_receiver: - pin: D0 + pin: GPIOXX dump: all # Settings to optimize recognition of RF devices tolerance: 50% @@ -1018,7 +1009,7 @@ You should see log output like below: .. code-block:: yaml remote_receiver: - pin: D0 + pin: GPIOXX dump: - rc_switch tolerance: 50% @@ -1036,7 +1027,7 @@ RF transmitter to a new pin on the ESP and configure a global ``remote_transmitt .. code-block:: yaml remote_transmitter: - pin: D1 + pin: GPIOXX # RF uses a 100% carrier signal carrier_duty_percent: 100% diff --git a/components/rtttl.rst b/components/rtttl.rst index d8e6e2c70..b502a649e 100644 --- a/components/rtttl.rst +++ b/components/rtttl.rst @@ -127,7 +127,7 @@ Common beeps You can do your own beep patterns too! Here's a short collection so you can just use right away or tweak them to your like: -.. code-block:: +.. code-block:: two_short:d=4,o=5,b=100:16e6,16e6 long:d=1,o=5,b=100:e6 @@ -165,7 +165,7 @@ Sample code output: - platform: esp8266_pwm - pin: D1 + pin: GPIOXX id: rtttl_out rtttl: diff --git a/components/sensor/adc.rst b/components/sensor/adc.rst index 3f6145292..fdb43a66a 100644 --- a/components/sensor/adc.rst +++ b/components/sensor/adc.rst @@ -22,7 +22,7 @@ ADC in your device to measure a voltage on certain pins. # Example configuration entry sensor: - platform: adc - pin: A0 + pin: GPIOXX name: "Living Room Brightness" update_interval: 60s diff --git a/components/sensor/adc128s102.rst b/components/sensor/adc128s102.rst index 779997910..780d016d4 100644 --- a/components/sensor/adc128s102.rst +++ b/components/sensor/adc128s102.rst @@ -6,8 +6,8 @@ ADC128S102 8-Channel 12-Bit A/D Converter :keywords: ADC128S102 :image: adc128s102.png -The ADC128S102 is a low-power, eight-channel CMOS 12-bit analog-to-digital converter specified for conversion -throughput rates of 500 ksps to 1 MSPS. The converter is based on a successive-approximation register architecture +The ADC128S102 is a low-power, eight-channel CMOS 12-bit analog-to-digital converter specified for conversion +throughput rates of 500 ksps to 1 MSPS. The converter is based on a successive-approximation register architecture with an internal track-and-hold circuit. .. figure:: images/adc128s102.png @@ -31,16 +31,9 @@ sensors for your projects. # Example configuration entry adc128s102: - cs_pin: GPIO15 + cs_pin: GPIOXX id: my_adc - sensor: - - platform: adc128s102 # Attached to pin 0 of the ADC128S102. - update_interval: 1s - adc128s102_id: my_adc - id: freezer_temp_source - channel: 0 # ADC128S102 channel - Configuration variables: - **id** (**Required**, :ref:`config-id`): The id to use for this ADC128S102 component. - **cs_pin** (**Required**, int): The SPI cable select pin to use @@ -52,6 +45,15 @@ The ``adc128s102`` sensor allows you to use your ADC128S102 12-Bit A/D Converter First, setup a :ref:`ADC128S102 Hub ` for your ADC128S102 sensor and then use this sensor platform to create individual sensors that will report the voltage to Home Assistant. +.. code-block:: yaml + + sensor: + - platform: adc128s102 # Attached to pin 0 of the ADC128S102. + update_interval: 1s + adc128s102_id: my_adc + id: freezer_temp_source + channel: 0 # ADC128S102 channel + Configuration variables: - **adc128s102_id** (**Required**, :ref:`config-id`): The id of the parent ADC128S102 component. diff --git a/components/sensor/ade7880.rst b/components/sensor/ade7880.rst index aca0c5a90..139aaf8e7 100644 --- a/components/sensor/ade7880.rst +++ b/components/sensor/ade7880.rst @@ -190,9 +190,9 @@ configured). sensor: - platform: ade7880 irq0_pin: - number: GPIO13 + number: GPIOXX irq1_pin: - number: GPIO5 + number: GPIOXX phase_a: name: Room Heater voltage: Voltage @@ -217,9 +217,9 @@ Heater Current', etc. sensor: - platform: ade7880 irq0_pin: - number: GPIO13 + number: GPIOXX irq1_pin: - number: GPIO5 + number: GPIOXX phase_a: voltage: Voltage current: @@ -249,11 +249,11 @@ configuration mode. sensor: - platform: ade7880 irq0_pin: - number: GPIO13 + number: GPIOXX irq1_pin: - number: GPIO5 + number: GPIOXX reset_pin: - number: GPIO16 + number: GPIOXX frequency: 60Hz phase_a: name: Phase A diff --git a/components/sensor/ade7953.rst b/components/sensor/ade7953.rst index f7e9d920c..c9aa54c02 100644 --- a/components/sensor/ade7953.rst +++ b/components/sensor/ade7953.rst @@ -35,7 +35,7 @@ Over I²C # Example configuration entry for i2c sensor: - platform: ade7953_i2c - irq_pin: GPIO16 + irq_pin: GPIOXX voltage: name: ADE7953 Voltage frequency: @@ -129,69 +129,35 @@ Over SPI .. code-block:: yaml - # Example configuration entry for SPI (taken from a Shelly Pro 4PM) + # Example configuration entry for SPI sensor: - platform: ade7953_spi - cs_pin: GPIO04 - irq_pin: GPIO35 - current_pga_gain_a: 2x - current_pga_gain_b: 2x - current_gain_a: 0x600000 - current_gain_b: 0x600000 + cs_pin: GPIOXX + irq_pin: GPIOXX voltage: name: "Voltage" - filters: - - delta: 1 frequency: name: ADE7953 Frequency - filters: - - delta: 0.1 current_a: name: "Current A" - filters: - - delta: 0.01 current_b: name: "Current B" - filters: - - delta: 0.01 power_factor_a: name: "Power Factor A" - filters: - - delta: 5 power_factor_b: name: "ADE7953 Power Factor B" - filters: - - delta: 5 apparent_power_a: name: "Apparent Power A" - filters: - - delta: 1 apparent_power_b: name: "Apparent Power B" - filters: - - delta: 1 active_power_a: name: "Power A" - id: active_power_1 - # active_power is inverted, so multiply by -1 - filters: - - multiply: -1 - - delta: 1 active_power_b: name: "Power B" - id: active_power_2 - # active_power is inverted, so multiply by -1 - filters: - - multiply: -1 - - delta: 1 reactive_power_a: name: "Reactive Power A" - filters: - - delta: 1 reactive_power_b: name: "Reactive Power B" - filters: - - delta: 1 Configuration variables: ************************ diff --git a/components/sensor/ads1118.rst b/components/sensor/ads1118.rst index 52947293b..416fcc05f 100644 --- a/components/sensor/ads1118.rst +++ b/components/sensor/ads1118.rst @@ -25,7 +25,7 @@ It uses the :ref:`SPI Bus ` for communication. .. code-block:: yaml ads1118: - cs_pin: GPIO15 + cs_pin: GPIOXX Configuration variables: ************************ @@ -46,14 +46,12 @@ sensor platform to create individual sensors that will report the voltage. .. code-block:: yaml - ads1118: - cs_pin: GPIO15 sensor: - platform: ads1118 - type: 'adc' - id: 'batt_volt' - name: "Battery Voltage" - multiplexer: 'A3_GND' + type: adc + id: batt_volt + name: Battery Voltage + multiplexer: A3_GND gain: 4.096 update_interval: .01s diff --git a/components/sensor/as3935.rst b/components/sensor/as3935.rst index d38520faa..c8e20951f 100644 --- a/components/sensor/as3935.rst +++ b/components/sensor/as3935.rst @@ -58,20 +58,10 @@ The ``as3935_spi`` sensor platform allows you to use your AS3935 sensor .. code-block:: yaml - # Example configuration for SPI (decide for one!) + # Example configuration for SPI 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" + cs_pin: GPIOXX + irq_pin: GPIOXX Configuration variables: @@ -117,19 +107,9 @@ The ``as3935_i2c`` sensor platform allows you to use your AS3935 sensor .. code-block:: yaml - # Example configuration for I²C (decide for one!) + # Example configuration for I²C as3935_i2c: - irq_pin: GPIO12 - # Example shared configuration - sensor: - - platform: as3935 - lightning_energy: - name: "Lightning Energy" - distance: - name: "Distance Storm" - binary_sensor: - - platform: as3935 - name: "Storm Alert" + irq_pin: GPIOXX Configuration variables: ************************ @@ -173,19 +153,22 @@ Sensor A sensor platform to read lightning data +.. code-block:: yaml + + sensor: + - platform: as3935 + lightning_energy: + name: Lightning Energy + distance: + name: Distance Storm + 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 `. + All 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 `. + All options from :ref:`Sensor `. Binary Sensor @@ -193,11 +176,16 @@ Binary Sensor Binary sensor that indicates if a lightning strike was detected. +.. code-block:: yaml + + # Example storm alert binary sensor + binary_sensor: + - platform: as3935 + name: Storm Alert + 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 `. +- All options from :ref:`Binary Sensor `. See Also diff --git a/components/sensor/as5600.rst b/components/sensor/as5600.rst index 51fe34b41..80126e3f5 100644 --- a/components/sensor/as5600.rst +++ b/components/sensor/as5600.rst @@ -30,7 +30,7 @@ the :ref:`I²C Bus ` and connect the sensor to the pins specified there. .. code-block:: yaml as5600: - dir_pin: 22 + dir_pin: GPIOXX start_position: 0deg range: 180deg @@ -39,7 +39,7 @@ Configuration variables: - **dir_pin** (*Optional*, int): The pin connected to the AS5600's direction pin. See :ref:`Direction ` for more information. -- **direction** (*Optional*, string): The direction that the magnet should rotate to increase values. +- **direction** (*Optional*, string): The direction that the magnet should rotate to increase values. Used in combination with the **dir_pin**. - ``clockwise`` (default) @@ -57,7 +57,7 @@ Configuration variables: - ``lsb2`` - ``lsb3`` -- **power_mode** (*Optional*, string): The power mode to run the sensor. Note: When **watchdog** is enabled, +- **power_mode** (*Optional*, string): The power mode to run the sensor. Note: When **watchdog** is enabled, it will switch the device to ``low3`` when there is not much change in position. - ``nominal`` (default) @@ -65,7 +65,7 @@ Configuration variables: - ``low2`` - ``low3`` -- **watchdog** (*Optional*, boolean): Whether to enable the watchdog that puts the the chip in to +- **watchdog** (*Optional*, boolean): Whether to enable the watchdog that puts the the chip in to low power mode 3. Check the datasheet for more information. Defaults to ``off``. - **slow_filter** (*Optional*, string): See datasheet. @@ -98,9 +98,9 @@ Direction The AS5600 has ``direction`` pin that controls which rotation direction will cause the position value to **increase**. This pin should be pulled low for clockwise, and pulled high for counterclockwise. If left floating, you are likely -to encounter erratic behavior. +to encounter erratic behavior. -If you would like the ESP controller to pull that pin high or low, you may configure the ``dir_pin`` and optionally, the +If you would like the ESP controller to pull that pin high or low, you may configure the ``dir_pin`` and optionally, the ``direction`` option to have the ESP controller pull the pin high or low. .. _as5600_position_range: @@ -136,7 +136,7 @@ For example, let's say we have the following component config: start_position: 90deg range: 180deg direction: clockwise - dir_pin: 22 + dir_pin: GPIOXX - If the magnet north was at the right side of the chip (i.e. 1024 / 90deg raw position), the scaled position would report a value of ``0``. - If the magnet north was at the bottom of the chip (i.e. 2048 / 180deg raw position), the scaled position would report a value of ``2048``. @@ -147,7 +147,7 @@ For example, let's say we have the following component config: .. note:: You may specify an ``end_position`` that is less than the ``start_position``. When doing so, the allowable range will start at the - ``start_position`` and continue through to the highest position value (i.e. ``4095``) and then continue from ``0`` until it reaches + ``start_position`` and continue through to the highest position value (i.e. ``4095``) and then continue from ``0`` until it reaches the ``end_position``. @@ -180,7 +180,7 @@ sensor platform to create individual sensors that will report the position to Ho .. code-block:: yaml as5600: - dir_pin: 22 + dir_pin: GPIOXX sensor: - platform: as5600 diff --git a/components/sensor/atm90e26.rst b/components/sensor/atm90e26.rst index 63394ab26..ffbfcd271 100644 --- a/components/sensor/atm90e26.rst +++ b/components/sensor/atm90e26.rst @@ -21,8 +21,8 @@ Configuration variables: - **cs_pin** (**Required**, :ref:`Pin Schema `): The pin CS is connected to. For the 6 channel meter main board, this will always be 5 and 4. For the add-on boards a jumper can be selected for each CS pin, but default to 0 and 16. - **line_frequency** (**Required**, string): The AC line frequency of the supply voltage. One of ``50Hz``, ``60Hz``. -- **meter_constant** (**Required**, float): The number of pulses per kWh. The ATM90E26 internally works based on pulses and - this value converts a pulse into Wh, which are emitted as ``forward_active_energy`` etc. Matching it against an existing +- **meter_constant** (**Required**, float): The number of pulses per kWh. The ATM90E26 internally works based on pulses and + this value converts a pulse into Wh, which are emitted as ``forward_active_energy`` etc. Matching it against an existing meter is useful in that it allows visual confirmation for some devices that blink an LED for each pulse. Common values are 1000 pulses/kWh, 1666.66 pulses/kWh, or 3200 pulses/kWh. See also **gain_metering** which determines after how much energy a pulse is emitted. @@ -111,13 +111,13 @@ Keeping the calibration values at the top of your yaml might make editing easier metering_cal: '7481' # default: 7481 - Calibrate this to match your meter based on the CF1 (CFx) pulse. spi: - clk_pin: 18 - miso_pin: 19 - mosi_pin: 23 + clk_pin: GPIOXX + miso_pin: GPIOXX + mosi_pin: GPIOXX sensor: - platform: atm90e26 - cs_pin: 5 + cs_pin: GPIOXX voltage: name: House Voltage accuracy_decimals: 1 diff --git a/components/sensor/atm90e32.rst b/components/sensor/atm90e32.rst index 198c3d118..000ccbd9a 100644 --- a/components/sensor/atm90e32.rst +++ b/components/sensor/atm90e32.rst @@ -168,7 +168,7 @@ a time-series-database, e.g. InfluxDB. sensor: #IC1 Main - platform: atm90e32 - cs_pin: 5 + cs_pin: GPIOXX phase_a: forward_active_energy: name: ${disp_name} ct1 FAWattHours @@ -208,13 +208,13 @@ Additional Examples # Example configuration entry for split single phase meter spi: - clk_pin: 18 - miso_pin: 19 - mosi_pin: 23 + clk_pin: GPIOXX + miso_pin: GPIOXX + mosi_pin: GPIOXX sensor: - platform: atm90e32 - cs_pin: 5 + cs_pin: GPIOXX phase_a: voltage: name: "EMON Line Voltage A" diff --git a/components/sensor/binary_sensor_map.rst b/components/sensor/binary_sensor_map.rst index 82e4ccf49..e23d0a014 100644 --- a/components/sensor/binary_sensor_map.rst +++ b/components/sensor/binary_sensor_map.rst @@ -6,17 +6,17 @@ Binary Sensor Map :image: binary_sensor_map.jpg The ``binary_sensor_map`` sensor platform allows you to map multiple :doc:`binary sensor ` -to an individual value. Depending on the state of each binary sensor, its associated configured parameters, and this sensor's mapping type, +to an individual value. Depending on the state of each binary sensor, its associated configured parameters, and this sensor's mapping type, the ``binary_sensor_map`` publishes a single numerical value. -Use this sensor to combine one or more binary sensors' ``ON`` or ``OFF`` states into a numerical value. Some possible use cases include +Use this sensor to combine one or more binary sensors' ``ON`` or ``OFF`` states into a numerical value. Some possible use cases include touch devices and determining Bayesian probabilities for an event. This platform supports three measurement types: ``BAYESIAN``, ``GROUP``, and ``SUM``. You need to specify your desired mapping with the ``type:`` configuration value. -When using the ``BAYESIAN`` type, add your binary sensors as ``observations`` to the binary sensor map. -If you use the ``GROUP`` or ``SUM`` type, add your binary sensors as ``channels``. +When using the ``BAYESIAN`` type, add your binary sensors as ``observations`` to the binary sensor map. +If you use the ``GROUP`` or ``SUM`` type, add your binary sensors as ``channels``. The maximum amount of observations/channels supported is 64. - ``BAYESIAN`` This type replicates Home Assistant's `Bayesian sensor `__. Based on the observation states, this sensor returns the Bayesian probability of a particular event occurring. The configured ``prior:`` probability is the likelihood that the Bayesian event is true, ignoring all external influences. Every observation has its own ``prob_given_true`` and ``prob_given_false`` parameters. The ``prob_given_true:`` value is the probability that the observation's binary sensor is ``ON`` when the Bayesian event is ``true``. The ``prob_given_false:`` value is the probability that the observation's binary sensor is ``ON`` when the Bayesian event is ``false``. Use an :doc:`/components/binary_sensor/analog_threshold` to convert this sensor's probability to a binary ``ON`` or ``OFF`` by setting an appropriate threshold. @@ -39,12 +39,12 @@ The maximum amount of observations/channels supported is 64. prob_given_false: 0.1 binary_sensor: - # If the Bayesian probability is greater than 0.6, + # If the Bayesian probability is greater than 0.6, # then predict the event is occuring - platform: analog_threshold name: "Bayesian Event Predicted State" sensor_id: bayesian_prob - threshold: 0.6 + threshold: 0.6 # ... - ``GROUP`` Each channel has its own ``value``. The sensor publishes the average value of all active @@ -78,7 +78,7 @@ The maximum amount of observations/channels supported is 64. channel: 0 id: touchkey0 # ... - + - ``SUM`` Each channel has its own ``value``. The sensor publishes the sum of all the active binary sensors values or ``0`` if no sensors are active. @@ -102,19 +102,19 @@ The maximum amount of observations/channels supported is 64. binary_sensor: - platform: gpio - pin: 4 + pin: GPIOXX id: bit0 - platform: gpio - pin: 5 + pin: GPIOXX id: bit1 - platform: gpio - pin: 6 + pin: GPIOXX id: bit2 - platform: gpio - pin: 7 + pin: GPIOXX id: bit3 # ... @@ -128,7 +128,7 @@ Configuration variables: - **binary_sensor** (**Required**): The id of the :doc:`binary sensor ` to add as a channel for this sensor. - **value** (**Required**): The value this channel should report when its binary sensor is active. -- **prior** (**Required for BAYESIAN type**, float between 0 and 1): The prior probability of the event. +- **prior** (**Required for BAYESIAN type**, float between 0 and 1): The prior probability of the event. - **observations** (**Required for BAYESIAN type**): A list of observations that influence the Bayesian probability of the event. - **binary_sensor** (**Required**): The id of the :doc:`binary sensor ` diff --git a/components/sensor/bl0939.rst b/components/sensor/bl0939.rst index d26792e22..59ed059fb 100644 --- a/components/sensor/bl0939.rst +++ b/components/sensor/bl0939.rst @@ -20,20 +20,8 @@ Additionally, you need to set the baud rate to 4800, parity to ``NONE`` and stop .. code-block:: yaml # Example configuration entry - # Disable logging over serial - logger: - baud_rate: 0 - - uart: - tx_pin: GPIO25 - rx_pin: GPIO26 - baud_rate: 4800 - parity: NONE - stop_bits: 2 - sensor: - platform: bl0939 - update_interval: 30s voltage: name: 'BL0939 Voltage' current_1: diff --git a/components/sensor/bme280.rst b/components/sensor/bme280.rst index 15b667518..36c597df5 100644 --- a/components/sensor/bme280.rst +++ b/components/sensor/bme280.rst @@ -9,7 +9,7 @@ BME280 Temperature+Pressure+Humidity Sensor The ``bme280`` sensor platform allows you to use your BME280 (`datasheet `__, `Adafruit`_) temperature, pressure and humidity sensors with ESPHome. The sensor -is used in *Forced Mode* where measurement is performed and then +is used in *Forced Mode* where measurement is performed and then the sensor returns to sleep mode until next measurement. The :ref:`I²C ` or :ref:`SPI ` is required to be set up in your configuration for this sensor to work. @@ -28,13 +28,10 @@ required to be set up in your configuration for this sensor to work. - platform: bme280_i2c temperature: name: "BME280 Temperature" - oversampling: 16x pressure: name: "BME280 Pressure" humidity: name: "BME280 Humidity" - address: 0x77 - update_interval: 60s # Example configuration entry SPI @@ -42,40 +39,31 @@ required to be set up in your configuration for this sensor to work. - platform: bme280_spi temperature: name: "BME280 Temperature" - oversampling: 16x pressure: name: "BME280 Pressure" humidity: name: "BME280 Humidity" - cs_pin: GPIO5 - update_interval: 60s + cs_pin: GPIOXX Configuration variables: ------------------------ - **temperature** (*Optional*): The information for the temperature sensor. - - **name** (**Required**, string): The name for the temperature - sensor. - **oversampling** (*Optional*): The oversampling parameter for the temperature sensor. See :ref:`Oversampling Options `. - - **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. - All other options from :ref:`Sensor `. - **pressure** (*Optional*): The information for the pressure sensor. - - **name** (**Required**, string): The name for the pressure sensor. - **oversampling** (*Optional*): The oversampling parameter for the temperature sensor. See :ref:`Oversampling Options `. - - **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. - All other options from :ref:`Sensor `. - **humidity** (*Optional*): The information for the pressure sensor. - - **name** (**Required**, string): The name for the humidity sensor. - **oversampling** (*Optional*): The oversampling parameter for the temperature sensor. See :ref:`Oversampling Options `. - - **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. - All other options from :ref:`Sensor `. - **address** (*Optional*, int): Manually specify the I²C address of diff --git a/components/sensor/cs5460a.rst b/components/sensor/cs5460a.rst index 0caa5b7ad..61a4136ce 100644 --- a/components/sensor/cs5460a.rst +++ b/components/sensor/cs5460a.rst @@ -35,11 +35,6 @@ driven by a GPIO or wired to VCC. .. code-block:: yaml # Example configuration entry - spi: - clk_pin: 18 - mosi_pin: 23 - miso_pin: 19 - sensor: - platform: cs5460a current: @@ -58,7 +53,7 @@ driven by a GPIO or wired to VCC. current_gain: 0.01 voltage_gain: 0.000573 pulse_energy: 1 Wh - cs_pin: 33 + cs_pin: GPIOXX Configuration variables: ------------------------ diff --git a/components/sensor/cse7761.rst b/components/sensor/cse7761.rst index 64bb889c0..b1e856586 100644 --- a/components/sensor/cse7761.rst +++ b/components/sensor/cse7761.rst @@ -20,16 +20,6 @@ Additionally, you need to set the baud rate to 38400 and parity to ``EVEN``. .. code-block:: yaml # Example configuration entry - # Disable logging over serial - logger: - baud_rate: 0 - - uart: - tx_pin: GPIO25 - rx_pin: GPIO26 - baud_rate: 38400 - parity: EVEN - sensor: - platform: cse7761 voltage: @@ -42,7 +32,6 @@ Additionally, you need to set the baud rate to 38400 and parity to ``EVEN``. name: 'CSE7761 Active Power 1' active_power_2: name: 'CSE7761 Active Power 2' - update_interval: 5s .. note:: diff --git a/components/sensor/dallas.rst b/components/sensor/dallas.rst index 45032c2d7..d5c046d9d 100644 --- a/components/sensor/dallas.rst +++ b/components/sensor/dallas.rst @@ -28,13 +28,7 @@ if you don't have massively long wires. # Example configuration entry dallas: - - pin: 23 - - # Individual sensors - sensor: - - platform: dallas - address: 0x1c0000031edd2a28 - name: "Livingroom Temperature" + - pin: GPIOXX Configuration variables: ************************ @@ -71,10 +65,6 @@ To initialize a sensor, first supply either ``address`` **or** ``index`` to iden .. code-block:: yaml - # Example configuration entry - dallas: - - pin: GPIO23 - # Individual sensors sensor: - platform: dallas @@ -114,7 +104,7 @@ the scanning will happen even with no sensors connected. For example with this c # Example configuration entry dallas: - - pin: GPIO23 + - pin: GPIOXX # Note you don't have to add any sensors at this point @@ -128,7 +118,7 @@ Now we can add the individual sensors to our configuration: # Example configuration entry dallas: - - pin: GPIO23 + - pin: GPIOXX sensor: - platform: dallas @@ -154,9 +144,9 @@ Use this if you have multiple dallas hubs: # Example configuration entry dallas: - - pin: GPIO23 + - pin: GPIOXX id: hub_1 - - pin: GPIO24 + - pin: GPIOXX id: hub_2 sensor: diff --git a/components/sensor/daly_bms.rst b/components/sensor/daly_bms.rst index cdb28600b..7fca68c04 100644 --- a/components/sensor/daly_bms.rst +++ b/components/sensor/daly_bms.rst @@ -15,18 +15,29 @@ The BMS communicates via :ref:`UART `. :align: center :width: 100.0% +Component/Hub +------------- .. code-block:: yaml - # Example configuration entry (ESP8266) - uart: - tx_pin: GPIO1 - rx_pin: GPIO3 - baud_rate: 9600 - + # Example configuration entry daly_bms: update_interval: 20s + +Configuration variables: +************************ + +- **update_interval** (*Optional*, :ref:`config-time`): Delay between data requests. +- **address** (*Optional*, int): Address to use, defaults to ``0x80``. + +Sensor +------ + +A sensor platform to read BMS data + +.. code-block:: yaml + sensor: - platform: daly_bms voltage: @@ -68,11 +79,81 @@ The BMS communicates via :ref:`UART `. cell_4_voltage: name: "Cell 4 Voltage" +Configuration variables: +************************ + +- **voltage** (*Optional*): Voltage of the battery pack connected to Daly BMS. + All options from :ref:`Sensor `. + +- **current** (*Optional*): Current flowing trough the BMS (input or output from batttery). + All options from :ref:`Sensor `. + +- **battery_level** (*Optional*): Battery level in % (SoC). + All options from :ref:`Sensor `. + +- **max_cell_voltage** (*Optional*): The cell of the battery with the higher voltage. + All options from :ref:`Sensor `. + +- **max_cell_voltage_number** (*Optional*): The cell number of the battery with the higher voltage. + All options from :ref:`Sensor `. + +- **min_cell_voltage** (*Optional*): The cell of the battery with the lower voltage. + All options from :ref:`Sensor `. + +- **min_cell_voltage_number** (*Optional*): The cell number of the battery with the lower voltage. + All options from :ref:`Sensor `. + +- **max_temperature** (*Optional*): The higher temperature measured from the temperature sensors. + All options from :ref:`Sensor `. + +- **max_temperature_probe_number** (*Optional*): The sensor number which has measured the higher temperature. + All options from :ref:`Sensor `. + +- **min_temperature** (*Optional*): The lower temperature measured from the temperature sensors. + All options from :ref:`Sensor `. + +- **min_temperature_probe_number** (*Optional*): The sensor number which has measured the lower temperature. + All options from :ref:`Sensor `. + +- **remaining_capacity** (*Optional*): The capacity in Ah left in the battery. + All options from :ref:`Sensor `. + +- **cells_number** (*Optional*): The number of cells in series in the battery pack. + All options from :ref:`Sensor `. + +- **temperature_1** (*Optional*): The first temperature sensor. + All options from :ref:`Sensor `. + +- **temperature_2** (*Optional*): The second temperature sensor. + All options from :ref:`Sensor `. + +- **cell_1_voltage** (*Optional*): The voltage of cell number 1. Cell number can be from 1 to 16. + All options from :ref:`Sensor `. + +Text Sensor +----------- + +Text sensor that indicates the status of BMS. + +.. code-block:: yaml + text_sensor: - platform: daly_bms status: name: "BMS Status" +Configuration variables: +************************ + +- **status** (*Optional*): The BMS Status (Charging, Discharging, Stationary). + All options from :ref:`Text Sensor `. + +Binary Sensor +------------- + +Binary sensor that indicates the status of MOS. + +.. code-block:: yaml binary_sensor: - platform: daly_bms @@ -81,163 +162,25 @@ The BMS communicates via :ref:`UART `. discharging_mos_enabled: name: "Discharging MOS" -Component/Hub -------------- - -Configuration variables: -************************ - -- **update_interval** (*Optional*, :ref:`config-time`): Delay between data requests. -- **address** (*Optional*, int): Address to use, defaults to ``0x80``. - -Sensor ------- - -A sensor platform to read BMS data - -Configuration variables: -************************ - -- **voltage** (*Optional*): Voltage of the battery pack connected to Daly BMS. - - - **name** (**Required**, string): The name for the voltage sensor. - - **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. - - All other options from :ref:`Sensor `. - -- **current** (*Optional*): Current flowing trough the BMS (input or output from batttery). - - - **name** (**Required**, string): The name for the current sensor. - - **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. - - All other options from :ref:`Sensor `. - -- **battery_level** (*Optional*): Battery level in % (SoC). - - - **name** (**Required**, string): The name for the SoC sensor. - - **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. - - All other options from :ref:`Sensor `. - -- **max_cell_voltage** (*Optional*): The cell of the battery with the higher voltage. - - - **name** (**Required**, string): The name for the Max Cell Voltage sensor. - - **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. - - All other options from :ref:`Sensor `. - -- **max_cell_voltage_number** (*Optional*): The cell number of the battery with the higher voltage. - - - **name** (**Required**, string): The name for the Max Cell Voltage Number sensor. - - **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. - - All other options from :ref:`Sensor `. - -- **min_cell_voltage** (*Optional*): The cell of the battery with the lower voltage. - - - **name** (**Required**, string): The name for the Min Cell Voltage sensor. - - **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. - - All other options from :ref:`Sensor `. - -- **min_cell_voltage_number** (*Optional*): The cell number of the battery with the lower voltage. - - - **name** (**Required**, string): The name for the Min Cell Voltage Number sensor. - - **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. - - All other options from :ref:`Sensor `. - -- **max_temperature** (*Optional*): The higher temperature measured from the temperature sensors. - - - **name** (**Required**, string): The name for the Max Temperature sensor. - - **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. - - All other options from :ref:`Sensor `. - -- **max_temperature_probe_number** (*Optional*): The sensor number which has measured the higher temperature. - - - **name** (**Required**, string): The name for the Max Temperature Probe Number sensor. - - **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. - - All other options from :ref:`Sensor `. - -- **min_temperature** (*Optional*): The lower temperature measured from the temperature sensors. - - - **name** (**Required**, string): The name for the Min Temperature sensor. - - **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. - - All other options from :ref:`Sensor `. - -- **min_temperature_probe_number** (*Optional*): The sensor number which has measured the lower temperature. - - - **name** (**Required**, string): The name for the Min Temperature Probe Number sensor. - - **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. - - All other options from :ref:`Sensor `. - -- **remaining_capacity** (*Optional*): The capacity in Ah left in the battery. - - - **name** (**Required**, string): The name for the Remaining Capacity sensor. - - **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. - - All other options from :ref:`Sensor `. - -- **cells_number** (*Optional*): The number of cells in series in the battery pack. - - - **name** (**Required**, string): The name for the Cells Number sensor. - - **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. - - All other options from :ref:`Sensor `. - -- **temperature_1** (*Optional*): The first temperature sensor. - - - **name** (**Required**, string): The name for the first temperature sensor. - - **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. - - All other options from :ref:`Sensor `. - -- **temperature_2** (*Optional*): The second temperature sensor. - - - **name** (**Required**, string): The name for the second temperature sensor. - - **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. - - All other options from :ref:`Sensor `. - -- **cell_1_voltage** (*Optional*): The voltage of cell number 1. Cell number can be from 1 to 16. - - - **name** (**Required**, string): The name for the cell voltage sensor. - - **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. - - All other options from :ref:`Sensor `. - -Text Sensor ------------ - -Text sensor that indicates the status of BMS. - -Configuration variables: -************************ - -- **status** (*Optional*): The BMS Status (Charging, Discharging, Stationary). - - - **name** (**Required**, string): The name for the BMS status text sensor. - - **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. - - All other options from :ref:`Text Sensor `. - -Binary Sensor -------------- - -Binary sensor that indicates the status of MOS. - Configuration variables: ************************ - **charging_mos_enabled** (*Optional*): The BMS charging MOS status to enable the recharge of the battery. - - - **name** (**Required**, string): The name for the charging MOS binary sensor. - - **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. - - All other options from :ref:`Binary Sensor `. + All options from :ref:`Binary Sensor `. - **discharging_mos_enabled** (*Optional*): The BMS discharging mos status to enable the load. - - - **name** (**Required**, string): The name for the discharging MOS binary sensor. - - **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. - - All other options from :ref:`Binary Sensor `. + All options from :ref:`Binary Sensor `. Control BMS ----------- At this moment Daly sensor platform don't suppport controlling you BMS, but you can make some stuff using uart.write -First you need to setup binary sensors for charging and disharging MOS - -.. code-block:: yaml +First you need to setup binary sensors for charging and disharging MOS + +.. code-block:: yaml + - binary_sensor: - platform: daly_bms charging_mos_enabled: @@ -249,11 +192,11 @@ First you need to setup binary sensors for charging and disharging MOS id: bin_daly_dischg_mos # binary MOS sensor must have ID to use with switch internal: True # but you can make it internal to avoid duplication -Then you can add switches - -.. code-block:: yaml +Then you can add switches + +.. code-block:: yaml + - switch: - platform: template name: "Daly Charging MOS" @@ -266,12 +209,12 @@ Then you can add switches turn_on_action: - uart.write: data: [0xA5, 0x40, 0xDA, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC8] - - logger.log: + - logger.log: format: "Send cmd to Daly: Set charge MOS on" turn_off_action: - uart.write: data: [0xA5, 0x40, 0xDA, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC7] - - logger.log: + - logger.log: format: "Send cmd to Daly: Set charge MOS off" - platform: template @@ -285,20 +228,20 @@ Then you can add switches turn_on_action: - uart.write: data: [0xA5, 0x40, 0xD9, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC7] - - logger.log: + - logger.log: format: "Send cmd to Daly: Set discharge MOS on" turn_off_action: - uart.write: data: [0xA5, 0x40, 0xD9, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6] - - logger.log: + - logger.log: format: "Send cmd to Daly: Set discharge MOS off" Also you can add select to change battery level - -.. code-block:: yaml - +.. code-block:: yaml + + select: - platform: template name: "Daly Battery Level setup" @@ -318,7 +261,7 @@ Also you can add select to change battery level then: - uart.write: data: [0xA5, 0x40, 0x21, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE8, 0xF9] - - logger.log: + - logger.log: format: "Send cmd to Daly: Set SOC to 100%" else: - if: @@ -327,7 +270,7 @@ Also you can add select to change battery level then: - uart.write: data: [0xA5, 0x40, 0x21, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xEE, 0xFE] - - logger.log: + - logger.log: format: "Send cmd to Daly: Set SOC to 75%" else: - if: @@ -336,7 +279,7 @@ Also you can add select to change battery level then: - uart.write: data: [0xA5, 0x40, 0x21, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF4, 0x03] - - logger.log: + - logger.log: format: "Send cmd to Daly: Set SOC to 50%" else: - if: @@ -345,7 +288,7 @@ Also you can add select to change battery level then: - uart.write: data: [0xA5, 0x40, 0x21, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFA, 0x08] - - logger.log: + - logger.log: format: "Send cmd to Daly: Set SOC to 25%" else: - if: @@ -354,10 +297,10 @@ Also you can add select to change battery level then: - uart.write: data: [0xA5, 0x40, 0x21, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E] - - logger.log: + - logger.log: format: "Send cmd to Daly: Set SOC to 0%" - - + + UART Connection --------------- @@ -368,15 +311,15 @@ Connect RX from BMS to TX in ESP board and TX from BMS to RX in ESP board :width: 100.0% Uart Pinout. - + **3.3v Warning:** some BMS 3.3v cant source large currents and may not work to properly power the ESP. If you are having WIFI connection issues or similar, try a different power source. There is 12-15v available on the Daly connector which via a proper step-down converter can properly power the ESP. On the ESP32 (untested on ESP8266) if you are having missing data (such as Temperature 1/2), it may be due to UART buffer size. Add the following to your configuration to increase the buffer from the default 256 to 512. -.. code-block:: +.. code-block:: - uart: + uart: ... rx_buffer_size: 512 diff --git a/components/sensor/growatt_solar.rst b/components/sensor/growatt_solar.rst index 5aefa3623..7d52e4c77 100644 --- a/components/sensor/growatt_solar.rst +++ b/components/sensor/growatt_solar.rst @@ -15,27 +15,16 @@ The ``Growatt Inverter`` sensor platform allows you to use growatt inverter data Growatt Logo The communication with this component is done over a :ref:`UART bus ` using :ref:`Modbus `. -You must therefore have a ``uart:`` entry in your configuration with both the TX and RX pins set +You must therefore have a ``uart:`` and ``modbus:`` entry in your configuration with both the TX and RX pins set to some pins on your board and the baud rate set to 9600. .. code-block:: yaml - # Example configuration entry - uart: - - id: gw_uart - baud_rate: 9600 - tx_pin: GPIO1 - rx_pin: GPIO3 - - modbus: - uart_id: gw_uart - flow_control_pin: GPIO4 - + # Example configuration sensor: - platform: growatt_solar - update_interval: 10s protocol_version: RTU - + inverter_status: name: "Growatt Status Code" @@ -88,7 +77,7 @@ to some pins on your board and the baud rate set to 9600. energy_production_day: name: "Growatt Today's Generation" - + total_energy_production: name: "Growatt Total Energy Production" @@ -96,14 +85,12 @@ to some pins on your board and the baud rate set to 9600. name: "Growatt Inverter Module Temp" - - Configuration variables: ------------------------ - **inverter_status** (*Optional*): Status code of the inverter (0: waiting, 1: normal, 3:fault) -- **protocol_version** (*Optional*): Version of the protocol used by your inverter. +- **protocol_version** (*Optional*): Version of the protocol used by your inverter. Old inverters use RTU (default). Newer ones use RTU2 (e.g. MIC, MIN, MAX series) - **phase_a** (*Optional*): The group of exposed sensors for Phase A/1. diff --git a/components/sensor/haier.rst b/components/sensor/haier.rst index 9776656b7..d16bb56e7 100644 --- a/components/sensor/haier.rst +++ b/components/sensor/haier.rst @@ -15,19 +15,6 @@ Additional sensors for Haier Climate device. **These sensors are supported only .. code-block:: yaml # Example configuration entry - uart: - baud_rate: 9600 - tx_pin: 17 - rx_pin: 16 - id: ac_port - - climate: - - platform: haier - id: haier_ac - protocol: hOn - name: Haier AC - uart_id: ac_port - sensor: - platform: haier haier_id: haier_ac diff --git a/components/sensor/havells_solar.rst b/components/sensor/havells_solar.rst index dec07ff51..a3e46d1c8 100644 --- a/components/sensor/havells_solar.rst +++ b/components/sensor/havells_solar.rst @@ -17,23 +17,12 @@ with ESPHome. Havells On Grid Solar Inverter. The communication with this component is done via a :ref:`UART ` using :ref:`Modbus `. -You must therefore have a ``uart:`` entry in your configuration with both the TX and RX pins set +You must therefore have a ``uart:`` and ``modbus:`` entry in your configuration with both the TX and RX pins set to some pins on your board and the baud rate set to 9600. .. code-block:: yaml # Example configuration entry - uart: - - id: modbus_uart - baud_rate: 9600 - tx_pin: GPIO1 - rx_pin: GPIO3 - - - modbus: - uart_id: modbus_uart - flow_control_pin: GPIO4 - sensor: - platform: havells_solar update_interval: 60s diff --git a/components/sensor/hlw8012.rst b/components/sensor/hlw8012.rst index 4a635e7f7..89e940057 100644 --- a/components/sensor/hlw8012.rst +++ b/components/sensor/hlw8012.rst @@ -30,9 +30,9 @@ be measured at the same exact points in time. # Example configuration entry sensor: - platform: hlw8012 - sel_pin: 5 - cf_pin: 14 - cf1_pin: 13 + sel_pin: GPIOXX + cf_pin: GPIOXX + cf1_pin: GPIOXX current: name: "HLW8012 Current" voltage: @@ -69,11 +69,11 @@ Advanced Options: Defaults to the Sonoff POW's value ``0.001 ohm``. - **voltage_divider** (*Optional*, float): The value of the voltage divider on the board as ``(R_upstream + R_downstream) / R_downstream``. Defaults to the Sonoff POW's value ``2351``. -- **model** (*Optional*, string): The sensor model on the board, to set internal constant factors to convert pulses to measurements. - Possible values are ``HLW8012``, ``CSE7759``, ``BL0937``. Defaults to ``HLW8012``. +- **model** (*Optional*, string): The sensor model on the board, to set internal constant factors to convert pulses to measurements. + Possible values are ``HLW8012``, ``CSE7759``, ``BL0937``. Defaults to ``HLW8012``. CSE7759 uses same constants and it also works with default. Must be set for BL0937 to be able to calibrate all three measurements at the same time. - **change_mode_every** (*Optional*, int): After how many updates to cycle between the current/voltage measurement mode. - Note that the first value after switching is discarded because it is often inaccurate. When set to ``"never"`` the measurement mode will stay at the + Note that the first value after switching is discarded because it is often inaccurate. When set to ``"never"`` the measurement mode will stay at the set ``initial_mode``. Defaults to ``8``. - **initial_mode** (*Optional*, string): The initial measurement mode. Defaults to ``VOLTAGE``. Possible initial measurement modes are ``VOLTAGE`` or ``CURRENT``. @@ -89,9 +89,9 @@ the initial measurement mode to match whichever mode the device uses, and disabl # Example configuration entry for device with fixed measurement mode sensor: - platform: hlw8012 - sel_pin: 5 - cf_pin: 14 - cf1_pin: 13 + sel_pin: GPIOXX + cf_pin: GPIOXX + cf1_pin: GPIOXX current: name: "HLW8012 Current" voltage: @@ -114,11 +114,11 @@ when SEL=1 voltage is measured. To accommodate this change use the following con sensor: - platform: hlw8012 model: BL0937 - sel_pin: - number: 12 + sel_pin: + number: GPIOXX inverted: true - cf_pin: 4 - cf1_pin: 5 + cf_pin: GPIOXX + cf1_pin: GPIOXX current: name: "BL0937 Current" voltage: diff --git a/components/sensor/honeywellabp.rst b/components/sensor/honeywellabp.rst index 9ec686b9b..d85582e9a 100644 --- a/components/sensor/honeywellabp.rst +++ b/components/sensor/honeywellabp.rst @@ -6,7 +6,7 @@ Honeywell ABP Pressure Sensors :image: honeywellabp.jpg :keywords: Honeywell ABP -The ``honeywellabp`` sensor platform allows you to use your Honeywell ABP +The ``honeywellabp`` sensor platform allows you to use your Honeywell ABP (`website `__, `datasheet `__, `Mouser `_) pressure and temperature sensors with ESPHome. The :ref:`SPI ` is @@ -24,30 +24,27 @@ required to be set up in your configuration for this sensor to work sensor: - platform: honeywellabp pressure: - name: "Honeywell pressure" - unit_of_measurement: "psi" + name: Honeywell pressure min_pressure: 0 max_pressure: 15 temperature: - name: "Honeywell temperature" - cs_pin: GPIO5 #D5 + name: Honeywell temperature + cs_pin: GPIOXX Configuration variables: ------------------------ -The values for ``min_pressure`` and ``max_pressure`` can be found in the device datasheet for the specific device. These are used to calculate -the pressure reading published by the sensor. Some sensors measure pressure in ``bar`` or ``kPa``; set ``min_pressure`` and ``max_pressure`` to +The values for ``min_pressure`` and ``max_pressure`` can be found in the device datasheet for the specific device. These are used to calculate +the pressure reading published by the sensor. Some sensors measure pressure in ``bar`` or ``kPa``; set ``min_pressure`` and ``max_pressure`` to the measurement range and ``unit_of_measurement`` to the appropriate unit for your device. - **pressure** (*Optional*): The information for the pressure sensor. - - **name** (**Required**, string): The name for the pressure sensor. - **min_pressure** (**Required**, int or float): Minimum pressure for the pressure sensor, default unit ``psi``. - **max_pressure** (**Required**, int or float): Maximum pressure for the pressure sensor, default unit ``psi``. - - **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. - All other options from :ref:`Sensor `. -Some sensors do not have temperature sensing ability, see datasheet. In some cases the sensor may return a valid temperature even though the +Some sensors do not have temperature sensing ability, see datasheet. In some cases the sensor may return a valid temperature even though the datasheet indicates that the sensor does not measure temperature. - **temperature** (*Optional*): The information for the temperature sensor. diff --git a/components/sensor/hrxl_maxsonar_wr.rst b/components/sensor/hrxl_maxsonar_wr.rst index 6a091f369..7d442d664 100644 --- a/components/sensor/hrxl_maxsonar_wr.rst +++ b/components/sensor/hrxl_maxsonar_wr.rst @@ -6,7 +6,7 @@ HRXL/XL MaxSonar WR Series :image: hrxl_maxsonar_wr.jpg :keywords: ultrasonic, maxbotix, maxsonar -This sensor allows you to use HRXL MaxSonar WR series ultrasonic sensors by MaxBotix +This sensor allows you to use HRXL MaxSonar WR series ultrasonic sensors by MaxBotix (`datasheet `__) or the XL MaxSonar WR series (`datasheet `__) @@ -27,28 +27,15 @@ multiple times per second, filtering is highly recommended. .. code-block:: yaml # Example configuration entry - uart: - rx_pin: 36 - baud_rate: 9600 - sensor: - platform: "hrxl_maxsonar_wr" name: "Rainwater Tank" - # Tweak the filters for your application - filters: - - sliding_window_moving_average: - window_size: 12 - send_every: 12 - - or: - - throttle: "20min" - - delta: 0.02 Configuration variables: ------------------------ -- **name** (**Required**, string): The name of the sensor. -- All other options from :ref:`Sensor `. +- All options from :ref:`Sensor `. Advanced options: diff --git a/components/sensor/hydreon_rgxx.rst b/components/sensor/hydreon_rgxx.rst index aa3cc4237..04e08c06d 100644 --- a/components/sensor/hydreon_rgxx.rst +++ b/components/sensor/hydreon_rgxx.rst @@ -26,58 +26,40 @@ Device FAQ: ``__ .. code-block:: yaml # Example RG-9 entry - - uart: - rx_pin: GPIO16 - tx_pin: GPIO17 - baud_rate: 9600 - sensor: - platform: hydreon_rgxx - model: "RG_9" - id: "hydreon_1" - update_interval: 20s - disable_led: false + model: RG_9 + id: hydreon_1 moisture: - name: "Rain Level" + name: Rain Level temperature: - name: "Device Temperature" + name: Device Temperature binary_sensor: - platform: hydreon_rgxx - hydreon_rgxx_id: "hydreon_1" + hydreon_rgxx_id: hydreon_1 too_cold: - entity_category: diagnostic - name: "Temperature Status" + name: Temperature Status lens_bad: - entity_category: diagnostic - name: "Lens Status" + name: Lens Status em_sat: - entity_category: diagnostic - name: "Emitter Saturation" + name: Emitter Saturation .. code-block:: yaml # Example RG-15 entry - - uart: - rx_pin: GPIO16 - tx_pin: GPIO17 - baud_rate: 9600 - sensor: - platform: hydreon_rgxx - model: "RG_15" + model: RG_15 resolution: high - update_interval: 60s acc: - name: "rain" + name: Rain event_acc: - name: "rain event" + name: Rain Event" total_acc: - name: "rain total" + name: Rain Total" r_int: - name: "rain intensity" + name: Rain Intensity Configuration variables: ------------------------ diff --git a/components/sensor/kuntze.rst b/components/sensor/kuntze.rst index 6bd2372d7..76e222c74 100644 --- a/components/sensor/kuntze.rst +++ b/components/sensor/kuntze.rst @@ -48,12 +48,6 @@ A configured modbus component is optional. It will be automatically created. .. code-block:: yaml # Example configuration entry - uart: - - id: uart_bus - tx_pin: GPIO16 - rx_pin: GPIO17 - baud_rate: 19200 - parity: EVEN sensor: - platform: kuntze diff --git a/components/sensor/max31856.rst b/components/sensor/max31856.rst index 1d203e67e..420827b58 100644 --- a/components/sensor/max31856.rst +++ b/components/sensor/max31856.rst @@ -33,26 +33,19 @@ to have an :ref:`spi bus ` in your configuration with both **miso_pin** and .. code:: yaml # Example configuration entry - spi: - clk_pin: GPIO18 - miso_pin: GPIO19 - mosi_pin: GPIO23 - sensor: - platform: max31856 - name: "BBQ Temperature" - icon: "mdi:hamburger" - cs_pin: GPIO17 + name: BBQ Temperature + icon: mdi:hamburger + cs_pin: GPIOXX Configuration variables: ------------------------ -- **name** (**Required**, string): The name for the temperature sensor. - **cs_pin** (**Required**, :ref:`Pin Schema `): The Chip Select pin of the SPI interface. - **update_interval** (*Optional*, :ref:`config-time`): The interval to check the sensor. Defaults to ``60s``. - **mains_filter** (*Optional*, string): The mains power frequency to reject (``50 Hz`` or ``60 Hz``). Defaults to ``60 Hz``. - **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. - All other options from :ref:`Sensor `. See Also diff --git a/components/sensor/mcp3204.rst b/components/sensor/mcp3204.rst index 117b9359f..ebf18d9e7 100644 --- a/components/sensor/mcp3204.rst +++ b/components/sensor/mcp3204.rst @@ -36,25 +36,9 @@ Most configurations will set the ``reference_voltage`` = VREF pin # Example configuration entry mcp3204: - cs_pin: GPIO15 + cs_pin: GPIOXX reference_voltage: 3.3V - # Example config of sensors. - # This is a small 1.5v solar panel power rail attached to pin 0 - # of the MCP3204 - sensor: - - platform: mcp3204 # Attached to pin 0 of the MCP3204. - update_interval: 1s - id: solar_voltage - number: 0 # MCP3204 pin number - - # In case MCP3208 is used. you can specify pin number > 4 - - platform: mcp3204 # Attached to pin 7 of the MCP3208. - update_interval: 1s - id: supply_voltage - number: 7 # MCP3208 pin number - - Configuration variables: ************************ @@ -70,14 +54,27 @@ The ``mcp3204`` sensor allows you to use your MCP3204 or MCP3208 12-Bit A/D Conv First, setup a :ref:`MCP3204 Hub ` for your MCP3204/8 sensor and then use this sensor platform to create individual sensors that will report the voltage to Home Assistant. +.. code-block:: yaml + + # Example config of sensors. + # This is a small 1.5v solar panel power rail attached to pin 0 + # of the MCP3204 + sensor: + - platform: mcp3204 # Attached to pin 0 of the MCP3204. + id: solar_voltage + number: 0 # MCP3204 pin number + + # In case MCP3208 is used. you can specify pin number > 4 + - platform: mcp3204 # Attached to pin 7 of the MCP3208. + id: supply_voltage + number: 7 # MCP3208 pin number + Configuration variables: ************************ - **mcp3204_id** (**Required**, :ref:`config-id`): The id of the parent MCP3204 component. -- **name** (**Required**, string): The name of the voltage sensor. - **number** (**Required**, int): The pin number of the MCP3204 - **update_interval** (*Optional*, :ref:`config-time`): The interval to check the sensor. Defaults to ``60s``. -- **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation. - All other options from :ref:`Sensor `. See Also diff --git a/components/sensor/mhz19.rst b/components/sensor/mhz19.rst index 7b6e13ff5..0d3c8f313 100644 --- a/components/sensor/mhz19.rst +++ b/components/sensor/mhz19.rst @@ -26,36 +26,23 @@ TX/RX labels are from the perspective of the MH-Z19). Additionally, you need to .. code-block:: yaml # Example configuration entry - uart: - rx_pin: GPIO3 - tx_pin: GPIO1 - baud_rate: 9600 - sensor: - platform: mhz19 co2: - name: "MH-Z19 CO2 Value" + name: MH-Z19 CO2 Value temperature: - name: "MH-Z19 Temperature" - update_interval: 60s - automatic_baseline_calibration: false + name: MH-Z19 Temperature Configuration variables: ------------------------ - **co2** (**Required**): The CO_2 data from the sensor in parts per million (ppm). - - - **name** (**Required**, string): The name for the CO_2 sensor. - - **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. - - All other options from :ref:`Sensor `. + All options from :ref:`Sensor `. - **temperature** (**Required**): The information for the temperature sensor. Please note that this is not officially documented in the datasheet and seems to be quite inaccurate. - - - **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 `. + All options from :ref:`Sensor `. - **update_interval** (*Optional*, :ref:`config-time`): The interval to check the sensor. Defaults to ``60s``. diff --git a/components/sensor/pmsx003.rst b/components/sensor/pmsx003.rst index 0ecee8b54..e51fe8e70 100644 --- a/components/sensor/pmsx003.rst +++ b/components/sensor/pmsx003.rst @@ -31,11 +31,6 @@ If you wish to use the optional ``update_interval`` ensure you have a ``tx_pin`` .. code-block:: yaml # Example configuration entry - uart: - rx_pin: GPIO23 - tx_pin: GPIO22 - baud_rate: 9600 - sensor: - platform: pmsx003 type: PMSX003 @@ -45,7 +40,6 @@ If you wish to use the optional ``update_interval`` ensure you have a ``tx_pin`` name: "Particulate Matter <2.5µm Concentration" pm_10_0: name: "Particulate Matter <10.0µm Concentration" - update_interval: 120s Configuration variables: ------------------------ diff --git a/components/sensor/pulse_counter.rst b/components/sensor/pulse_counter.rst index 865cda92f..9486bd4de 100644 --- a/components/sensor/pulse_counter.rst +++ b/components/sensor/pulse_counter.rst @@ -21,7 +21,7 @@ on the ESP32. However, due to the use of the pulse counter peripheral, a maximum # Example configuration entry sensor: - platform: pulse_counter - pin: 12 + pin: GPIOXX name: "Pulse Counter" Configuration variables @@ -72,7 +72,7 @@ count the light pulses on a power meter, you can do the following: # Example configuration entry sensor: - platform: pulse_counter - pin: 12 + pin: GPIOXX unit_of_measurement: 'kW' name: 'Power Meter House' filters: @@ -90,7 +90,7 @@ measure the total consumed energy in kWh. # Example configuration entry sensor: - platform: pulse_counter - pin: 12 + pin: GPIOXX unit_of_measurement: 'kW' name: 'Power Meter House' filters: diff --git a/components/sensor/pulse_meter.rst b/components/sensor/pulse_meter.rst index 5941c377b..785f299c5 100644 --- a/components/sensor/pulse_meter.rst +++ b/components/sensor/pulse_meter.rst @@ -22,7 +22,7 @@ Please note that it is not possible to use both of these two sensors on the same # Example configuration entry sensor: - platform: pulse_meter - pin: 12 + pin: GPIOXX name: "Pulse Meter" Configuration variables @@ -32,7 +32,7 @@ Configuration variables - **name** (**Required**, string): The name of the sensor. - **internal_filter** (*Optional*, :ref:`config-time`): If a pulse shorter than this time is detected, it is discarded. Defaults to ``13us``. - + This acts as a debounce filter to eliminate input noise, so choose a value a little less than your expected minimum pulse width. - **internal_filter_mode** (*Optional*, string): Determines how the internal filter is applied. @@ -62,7 +62,7 @@ For example, if you’re using the pulse meter with a photodiode to count the li state_class: measurement internal_filter: 20ms # Assuming maximum load of 16 kW and 10000 impulses per kWh, any pulses faster than 22.5 ms would exceed load. -10% ~= 20 ms. accuracy_decimals: 0 - pin: 12 + pin: GPIOXX filters: - multiply: 6 # (60s / impulse constant) * (1000W / 1kW) diff --git a/components/sensor/t6615.rst b/components/sensor/t6615.rst index ee47d00c8..8b2526d5e 100644 --- a/components/sensor/t6615.rst +++ b/components/sensor/t6615.rst @@ -29,26 +29,17 @@ regulator, so you may need some additional components to power up the sensor. .. code-block:: yaml # Example configuration entry - uart: - rx_pin: 1 - tx_pin: 3 - baud_rate: 19200 - sensor: - platform: t6615 co2: - name: "CO2" - update_interval: 60s + name: CO2 Configuration variables: ------------------------ - **co2** (**Required**): The CO_2 data from the sensor in parts per million (ppm). - - - **name** (**Required**, string): The name for the CO_2 sensor. - - **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. - - All other options from :ref:`Sensor `. + All options from :ref:`Sensor `. - **update_interval** (*Optional*, :ref:`config-time`): The interval to check the sensor. Defaults to ``60s``. diff --git a/components/sensor/teleinfo.rst b/components/sensor/teleinfo.rst index 5f3d786aa..27d97a281 100644 --- a/components/sensor/teleinfo.rst +++ b/components/sensor/teleinfo.rst @@ -52,44 +52,9 @@ simply press -/+ buttons on the counter and look for `Standard mode` or .. code-block:: yaml # Example configuration entry - uart: - id: uart_bus - rx_pin: GPIO3 - tx_pin: GPIO1 - baud_rate: 1200 - parity: EVEN - data_bits: 7 - teleinfo: id: myteleinfo - update_interval: 60s - historical_mode: true - sensor: - - platform: teleinfo - tag_name: "HCHC" - name: "hchc" - unit_of_measurement: "Wh" - icon: mdi:flash - teleinfo_id: myteleinfo - - platform: teleinfo - tag_name: "HCHP" - name: "hchp" - unit_of_measurement: "Wh" - icon: mdi:flash - teleinfo_id: myteleinfo - - platform: teleinfo - tag_name: "PAPP" - name: "papp" - unit_of_measurement: "VA" - icon: mdi:flash - teleinfo_id: myteleinfo - - text_sensor: - - platform: teleinfo - tag_name: "OPTARIF" - name: "optarif" - teleinfo_id: myteleinfo Configuration variables: ------------------------ @@ -112,17 +77,45 @@ In teleinfo platform: Sensor ****** +.. code-block:: yaml + + sensor: + - platform: teleinfo + tag_name: "HCHC" + name: "hchc" + unit_of_measurement: "Wh" + icon: mdi:flash + teleinfo_id: myteleinfo + - platform: teleinfo + tag_name: "HCHP" + name: "hchp" + unit_of_measurement: "Wh" + icon: mdi:flash + teleinfo_id: myteleinfo + - platform: teleinfo + tag_name: "PAPP" + name: "papp" + unit_of_measurement: "VA" + icon: mdi:flash + teleinfo_id: myteleinfo + - **tag_name** (**Required**, string): Specify the tag you want to retrieve from the Teleinformation. - **teleinfo_id** (*Optional*, :ref:`config-id`): Specify the ID of used hub. -- **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation. - All other options from :ref:`Sensor `. Text Sensor *********** +.. code-block:: yaml + + text_sensor: + - platform: teleinfo + tag_name: "OPTARIF" + name: "optarif" + teleinfo_id: myteleinfo + - **tag_name** (**Required**, string): Specify the tag you want to retrieve from the Teleinformation. - **teleinfo_id** (*Optional*, :ref:`config-id`): Specify the ID of used hub. -- **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation. - All other options from :ref:`Text Sensor `. diff --git a/components/sensor/tx20.rst b/components/sensor/tx20.rst index 566e8ca8b..b4414262f 100644 --- a/components/sensor/tx20.rst +++ b/components/sensor/tx20.rst @@ -32,29 +32,22 @@ connected to GND in the TX20. sensor: - platform: tx20 wind_speed: - name: "Wind speed" + name: Wind speed wind_direction_degrees: - name: "Wind direction degrees" + name: Wind direction degrees pin: - number: GPIO04 + number: GPIOXX Configuration variables: ------------------------ - **wind_speed** (**Required**): The information for the wind speed sensor. - - - **name** (**Required**, string): The name for the wind speed - sensor. - - **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. - - All other options from :ref:`Sensor `. + All options from :ref:`Sensor `. - **wind_direction_degrees** (**Required**): The information for the direction in degrees sensor. - - - **name** (**Required**, string): The name for the direction sensor. - - **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. - - All other options from :ref:`Sensor `. + All options from :ref:`Sensor `. - **pin** (**Required**, :ref:`config-pin`): The pin, where the black or brown cable are connected. diff --git a/components/sensor/vl53l0x.rst b/components/sensor/vl53l0x.rst index 38c36d03a..86f173359 100644 --- a/components/sensor/vl53l0x.rst +++ b/components/sensor/vl53l0x.rst @@ -56,7 +56,6 @@ The :ref:`I²C Bus ` is required to be set up in your configuration for thi Configuration variables: ------------------------ -- **name** (**Required**, string): The name of the sensor. - **update_interval** (*Optional*, :ref:`config-time`): The interval to check the sensor. Defaults to ``60s``. - **signal_rate_limit** (*Optional*, float): Set the return signal rate limit in units of MCPS @@ -73,7 +72,6 @@ Configuration variables: on vl53l0x to enable/disable sensor. **Required** if not using address ``0x29`` which is the cause if you have multiple VL53L0X on the same i2c bus. In this case you have to assign a different pin to each VL53L0X. - **timeout** (*Optional*, :ref:`config-time`): Sensor setup timeout. Default to ``10ms``. -- **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation. - All other options from :ref:`Sensor `. @@ -86,7 +84,7 @@ Configuration variables: name: "distance1" id: distance1 address: 0x41 - enable_pin: GPIO16 + enable_pin: GPIOXX timeout: 200us update_interval: 500ms unit_of_measurement: "m" @@ -95,7 +93,7 @@ Configuration variables: name: "distance2" id: distance2 address: 0x42 - enable_pin: GPIO17 + enable_pin: GPIOXX timeout: 200us update_interval: 500ms unit_of_measurement: "m" diff --git a/components/servo.rst b/components/servo.rst index 271a78d95..2a50844a6 100644 --- a/components/servo.rst +++ b/components/servo.rst @@ -34,7 +34,7 @@ only operate in this frequency range. output: - platform: esp8266_pwm id: pwm_output - pin: D1 + pin: GPIOXX frequency: 50 Hz Configuration variables: @@ -141,7 +141,7 @@ this will make the servo motor stop immediately and disable its active control. Home Assistant Configuration ---------------------------- -The easiest way to control your servo from Home Assistant is to add a ``number`` to your ESPHome +The easiest way to control your servo from Home Assistant is to add a ``number`` to your ESPHome configuration. See :ref:`Number ` for more information. .. code-block:: yaml diff --git a/components/sim800l.rst b/components/sim800l.rst index 58b7f0a17..4babcb9e6 100644 --- a/components/sim800l.rst +++ b/components/sim800l.rst @@ -346,7 +346,7 @@ Relay management commands received from an authorized sender: switch: - platform: gpio id: relay_1 - pin: 0 + pin: GPIOXX See Also diff --git a/components/sml.rst b/components/sml.rst index e049335f5..a9f835323 100644 --- a/components/sml.rst +++ b/components/sml.rst @@ -26,7 +26,9 @@ mature solution can be found `here `_ (in German). There are plenty of other examples and ready to buy solutions on the web. -Configuration +.. _sml-platform: + +Component/Hub ------------- As the communciation with the sensor is done using UART, you need to have the :ref:`UART bus ` @@ -36,14 +38,6 @@ smart meter. If you see checksum errors in the log try changing the interface pa .. code-block:: yaml # Example configuration entry - uart: - id: uart_bus - rx_pin: GPIO3 - baud_rate: 9600 - data_bits: 8 - parity: NONE - stop_bits: 1 - sml: id: mysml uart_id: uart_bus @@ -55,6 +49,19 @@ smart meter. If you see checksum errors in the log try changing the interface pa id(mqttclient).publish("gridmeter/sensor/sml/error", format_hex(bytes)); } + + +Configuration variables: + +- **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation. +- **uart_id** (*Optional*, :ref:`config-id`): Manually specify the ID of the :ref:`UART Component ` if you want + to use multiple UART buses. + +Sensor +------ + +.. code-block:: yaml + sensor: - platform: sml name: "Total energy" @@ -68,6 +75,18 @@ smart meter. If you see checksum errors in the log try changing the interface pa filters: - multiply: 0.0001 +- **obis_code** (*Required*, string): Specify the OBIS code you want to retrieve data for from the device. + The format must be (A-B:C.D.E, e.g. 1-0:1.8.0) +- **server_id** (*Optional*, string): Specify the device's server_id to retrieve the OBIS code from. Should be specified if more then one device is connected to the same hardware sensor component. +- **sml_id** (*Optional*, :ref:`config-id`): The ID of the :ref:`SML platform ` +- All other options from :ref:`Sensor `. + + +Text Sensor +----------- + +.. code-block:: yaml + text_sensor: - platform: sml name: "Manufacturer" @@ -76,31 +95,6 @@ smart meter. If you see checksum errors in the log try changing the interface pa obis_code: "129-129:199.130.3" format: text - -Configuration variables: ------------------------- - -.. _sml-platform: - -SML platform -************ - -- **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation. -- **uart_id** (*Optional*, :ref:`config-id`): Manually specify the ID of the :ref:`UART Component ` if you want - to use multiple UART buses. - -Sensor -****** - -- **obis_code** (*Required*, string): Specify the OBIS code you want to retrieve data for from the device. - The format must be (A-B:C.D.E, e.g. 1-0:1.8.0) -- **server_id** (*Optional*, string): Specify the device's server_id to retrieve the OBIS code from. Should be specified if more then one device is connected to the same hardware sensor component. -- **sml_id** (*Optional*, :ref:`config-id`): The ID of the :ref:`SML platform ` -- All other options from :ref:`Sensor `. - -Text Sensor -*********** - - **obis_code** (*Required*, string): Specify the OBIS code you want to retrieve data for from the device. The format must be (A-B:C.D.E, e.g. 1-0:1.8.0) - **server_id** (*Optional*, string): Specify the device's server_id to retrieve the OBIS code from. Should be specified if more then one device is connected to the same hardware sensor component. @@ -108,6 +102,7 @@ Text Sensor - **format** (*Optional*, string): Override the automatic interpretation of the transmitted binary data value. Possible values (`int`, `uint`, `bool`, `hex`, `text`). - All other options from :ref:`Text Sensor `. + Automations: ------------ diff --git a/components/sn74hc165.rst b/components/sn74hc165.rst index baa3f3263..6af4544a4 100644 --- a/components/sn74hc165.rst +++ b/components/sn74hc165.rst @@ -17,23 +17,12 @@ shift register to the pin QH of the next shift register. # Example configuration entry sn74hc165: - id: sn74hc165_hub - clock_pin: GPIO16 - data_pin: GPIO17 - load_pin: GPIO4 - clock_inhibit_pin: GPIO18 + clock_pin: GPIOXX + data_pin: GPIOXX + load_pin: GPIOXX + clock_inhibit_pin: GPIOXX sr_count: 2 - # Individual inputs - binary_sensor: - - platform: gpio - name: "SN74HC165 Pin #0" - pin: - sn74hc165: sn74hc165_hub - # Use pin number 0 - number: 0 - inverted: false - - Configuration variables: ************************ @@ -48,7 +37,20 @@ Configuration variables: Pin configuration variables: **************************** -- **SN74HC165** (**Required**, :ref:`config-id`): The id of the SN74HC165 component of the pin. +.. code-block:: yaml + + # Individual inputs + binary_sensor: + - platform: gpio + name: "SN74HC165 Pin #0" + pin: + sn74hc165: sn74hc165_hub + # Use pin number 0 + number: 0 + inverted: false + + +- **sn74hc165** (**Required**, :ref:`config-id`): The id of the SN74HC165 component of the pin. - **number** (**Required**, int): The pin number. - **inverted** (*Optional*, boolean): If received value should be treated as inverted. Defaults to ``false``. diff --git a/components/sn74hc595.rst b/components/sn74hc595.rst index 7d48a6192..3d68f6a3f 100644 --- a/components/sn74hc595.rst +++ b/components/sn74hc595.rst @@ -32,10 +32,10 @@ Over GPIO # Example configuration entry sn74hc595: - id: 'sn74hc595_hub' - data_pin: D5 - clock_pin: D8 - latch_pin: D7 - oe_pin: D6 + data_pin: GPIOXX + clock_pin: GPIOXX + latch_pin: GPIOXX + oe_pin: GPIOXX sr_count: 2 # Individual outputs @@ -73,11 +73,10 @@ Over SPI .. code-block:: yaml # Example configuration entry - spi: sn74hc595: - id: 'sn74hc595_hub' - latch_pin: D7 - oe_pin: D6 + latch_pin: GPIOXX + oe_pin: GPIOXX sr_count: 2 # Individual outputs diff --git a/components/speaker/i2s_audio.rst b/components/speaker/i2s_audio.rst index 34ff78bbf..92023ab37 100644 --- a/components/speaker/i2s_audio.rst +++ b/components/speaker/i2s_audio.rst @@ -12,7 +12,7 @@ This platform only works on ESP32 based chips. .. warning:: Audio and voice components consume a significant amount of resources (RAM, CPU) on the device. - + **Crashes are likely to occur** if you include too many additional components in your device's configuration. In particular, Bluetooth/BLE components are known to cause issues when used in combination with Voice Assistant and/or other audio components. @@ -23,7 +23,7 @@ This platform only works on ESP32 based chips. speaker: - platform: i2s_audio dac_type: external - i2s_dout_pin: GPIO22 + i2s_dout_pin: GPIOXX mode: mono Configuration variables: diff --git a/components/spi.rst b/components/spi.rst index 485e246fe..bf2f2543c 100644 --- a/components/spi.rst +++ b/components/spi.rst @@ -35,30 +35,30 @@ This component also accepts a list of controllers if you want to implement multi # Example configuration entry - single controller spi: - clk_pin: GPIO14 - mosi_pin: GPIO13 - miso_pin: GPIO12 + clk_pin: GPIOXX + mosi_pin: GPIOXX + miso_pin: GPIOXX # Example configuration entry - three controllers, one using quad SPI spi: - id: spi_bus0 - clk_pin: GPIO18 - mosi_pin: GPIO23 - miso_pin: GPIO19 + clk_pin: GPIOXX + mosi_pin: GPIOXX + miso_pin: GPIOXX interface: hardware - id: spi_bus1 - clk_pin: GPIO14 - mosi_pin: GPIO27 - miso_pin: GPIO26 + clk_pin: GPIOXX + mosi_pin: GPIOXX + miso_pin: GPIOXX interface: any - id: quad_spi_bus type: quad - clk_pin: GPIO47 + clk_pin: GPIOXX data_pins: - - 40 - - 41 - - 42 - - 43 + - GPIOXX + - GPIOXX + - GPIOXX + - GPIOXX Configuration variables: ------------------------ @@ -117,14 +117,14 @@ Reads and writes on the device can be performed with lambdas. For example: .. code-block:: yaml spi: - clk_pin: GPIO14 - mosi_pin: GPIO27 - miso_pin: GPIO26 + clk_pin: GPIOXX + mosi_pin: GPIOXX + miso_pin: GPIOXX interface: hardware spi_device: id: spidev - cs_pin: GPIO13 + cs_pin: GPIOXX data_rate: 2MHz mode: 3 bit_order: lsb_first diff --git a/components/sprinkler.rst b/components/sprinkler.rst index 2f7ec30dd..0221411f9 100644 --- a/components/sprinkler.rst +++ b/components/sprinkler.rst @@ -662,7 +662,7 @@ could easily be added by adding the ``pump_switch_id`` parameter and a :ref:`swi switch: - platform: gpio id: garden_sprinkler_valve - pin: 5 + pin: GPIOXX Single Controller, Three Valves, No Pump **************************************** @@ -707,13 +707,13 @@ This example illustrates a complete, simple three-valve system with no pump/upst switch: - platform: gpio id: lawn_sprinkler_valve_sw0 - pin: 0 + pin: GPIOXX - platform: gpio id: lawn_sprinkler_valve_sw1 - pin: 2 + pin: GPIOXX - platform: gpio id: lawn_sprinkler_valve_sw2 - pin: 4 + pin: GPIOXX Single Controller, Three Valves, Single Pump ******************************************** @@ -759,16 +759,16 @@ This example illustrates a complete three-valve system with a single pump/upstre switch: - platform: gpio id: sprinkler_pump_sw - pin: 12 + pin: GPIOXX - platform: gpio id: lawn_sprinkler_valve_sw0 - pin: 0 + pin: GPIOXX - platform: gpio id: lawn_sprinkler_valve_sw1 - pin: 2 + pin: GPIOXX - platform: gpio id: lawn_sprinkler_valve_sw2 - pin: 4 + pin: GPIOXX Single Controller, Three Latching Valves, Single Latching Pump ************************************************************** @@ -832,28 +832,28 @@ a common pump/upstream valve. switch: - platform: gpio id: sprinkler_pump_sw_off - pin: 14 + pin: GPIOXX - platform: gpio id: sprinkler_pump_sw_on - pin: 15 + pin: GPIOXX - platform: gpio id: lawn_sprinkler_valve_sw0_off - pin: 0 + pin: GPIOXX - platform: gpio id: lawn_sprinkler_valve_sw0_on - pin: 2 + pin: GPIOXX - platform: gpio id: lawn_sprinkler_valve_sw1_off - pin: 4 + pin: GPIOXX - platform: gpio id: lawn_sprinkler_valve_sw1_on - pin: 5 + pin: GPIOXX - platform: gpio id: lawn_sprinkler_valve_sw2_off - pin: 12 + pin: GPIOXX - platform: gpio id: lawn_sprinkler_valve_sw2_on - pin: 13 + pin: GPIOXX Dual Controller, Five Valves, Two Pumps *************************************** @@ -925,25 +925,25 @@ valves, each of which are shared between the two controllers: switch: - platform: gpio id: sprinkler_pump_sw0 - pin: 12 + pin: GPIOXX - platform: gpio id: sprinkler_pump_sw1 - pin: 13 + pin: GPIOXX - platform: gpio id: lawn_sprinkler_valve_sw0 - pin: 0 + pin: GPIOXX - platform: gpio id: lawn_sprinkler_valve_sw1 - pin: 2 + pin: GPIOXX - platform: gpio id: lawn_sprinkler_valve_sw2 - pin: 4 + pin: GPIOXX - platform: gpio id: garden_sprinkler_valve_sw0 - pin: 14 + pin: GPIOXX - platform: gpio id: garden_sprinkler_valve_sw1 - pin: 15 + pin: GPIOXX .. note:: @@ -1160,7 +1160,7 @@ How Do I... *********** - **...determine if the sprinkler controller is running?** - + Use the method ``optional active_valve()`` to check if there is an active valve. If the ``optional`` returned ``has_value()``, the sprinkler controller is running and you may use the ``value()`` method to check which specific valve is active. @@ -1225,7 +1225,7 @@ How Do I... } - **...determine the sprinkler controller's multiplier/repeat values?** - + Methods of interest in this case are: - ``float multiplier()`` diff --git a/components/status_led.rst b/components/status_led.rst index 26d9e2fdc..fa629893c 100644 --- a/components/status_led.rst +++ b/components/status_led.rst @@ -9,7 +9,7 @@ The ``status_led`` hooks into all ESPHome components and can indicate the status the device. Specifically, it will: - Blink slowly (about every second) when a **warning** is active. Warnings are active when for - example reading a sensor value fails temporarily, the WiFi/MQTT connections are disrupted, or + example reading a sensor value fails temporarily, the WiFi/MQTT connections are disrupted, or if the native API component is included but no client is connected. - Blink quickly (multiple times per second) when an **error** is active. Errors indicate that ESPHome has found an error while setting up. In most cases, ESPHome will still try to @@ -20,7 +20,7 @@ the device. Specifically, it will: # Example configuration entry status_led: - pin: GPIO2 + pin: GPIOXX .. note:: @@ -42,7 +42,7 @@ Configuration variables: status_led: pin: - number: D0 + number: GPIOXX inverted: true See Also diff --git a/components/stepper/index.rst b/components/stepper/index.rst index 10401e88a..ea3225b3c 100644 --- a/components/stepper/index.rst +++ b/components/stepper/index.rst @@ -45,12 +45,12 @@ Put this code into the configuration file on ESPHome for this device. stepper: - platform: a4988 id: my_stepper - step_pin: D0 - dir_pin: D1 + step_pin: GPIOXX + dir_pin: GPIOXX max_speed: 250 steps/s # Optional: - sleep_pin: D2 + sleep_pin: GPIOXX acceleration: inf deceleration: inf @@ -78,7 +78,7 @@ Configuration variables: - platform: a4988 # ... dir_pin: - number: D1 + number: GPIOXX inverted: true ULN2003 Component @@ -92,10 +92,10 @@ Put this code into the configuration file on ESPHome for this device. stepper: - platform: uln2003 id: my_stepper - pin_a: D0 - pin_b: D1 - pin_c: D2 - pin_d: D3 + pin_a: GPIOXX + pin_b: GPIOXX + pin_c: GPIOXX + pin_d: GPIOXX max_speed: 250 steps/s # Optional: @@ -273,7 +273,7 @@ Configuration variables: Home Assistant Configuration ---------------------------- -The easiest way to control your stepper from Home Assistant is to add a ``number`` to your ESPHome +The easiest way to control your stepper from Home Assistant is to add a ``number`` to your ESPHome configuration. See :ref:`Number ` for more information. .. code-block:: yaml diff --git a/components/switch/gpio.rst b/components/switch/gpio.rst index 4d69d4c5b..3bdc5e0eb 100644 --- a/components/switch/gpio.rst +++ b/components/switch/gpio.rst @@ -18,7 +18,7 @@ through this platform. # Example configuration entry switch: - platform: gpio - pin: 25 + pin: GPIOXX name: "Living Room Dehumidifier" Configuration variables: @@ -26,8 +26,6 @@ Configuration variables: - **pin** (**Required**, :ref:`Pin Schema `): The GPIO pin to use for the switch. -- **name** (**Required**, string): The name for the switch. -- **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation. - **interlock** (*Optional*, list): A list of other GPIO switches in an interlock group. See :ref:`switch-gpio-interlocking`. - **interlock_wait_time** (*Optional*, :ref:`config-time`): For interlocking mode, set how long @@ -47,7 +45,7 @@ To create an active-low switch (one that is turned off by default), use the :ref switch: - platform: gpio pin: - number: 25 + number: GPIOXX inverted: true Momentary Switch @@ -65,7 +63,7 @@ or closes the gate. The relay simulates the button press for 500ms. # Example configuration entry switch: - platform: gpio - pin: 25 + pin: GPIOXX id: relay name: "Gate Remote" icon: "mdi:gate" @@ -92,13 +90,13 @@ with a list of all the switches in the group. # Prevent relay #1 and relay #2 from being activated at the same time. switch: - platform: gpio - pin: GPIO25 + pin: GPIOXX name: "Relay #1" id: relay1 interlock: [relay2] - platform: gpio - pin: GPIO26 + pin: GPIOXX name: "Relay #2" id: relay2 interlock: [relay1] diff --git a/components/switch/output.rst b/components/switch/output.rst index b637b250c..5282f3564 100644 --- a/components/switch/output.rst +++ b/components/switch/output.rst @@ -16,7 +16,7 @@ The ``output`` switch platform allows you to use any output component as a switc # Example configuration entry output: - platform: gpio - pin: 25 + pin: GPIOXX id: 'generic_out' switch: - platform: output diff --git a/components/switch/uart.rst b/components/switch/uart.rst index 1be109264..98957a318 100644 --- a/components/switch/uart.rst +++ b/components/switch/uart.rst @@ -11,10 +11,6 @@ The ``uart`` switch platform allows you to send a pre-defined sequence of bytes .. code-block:: yaml # Example configuration entry - uart: - baud_rate: 9600 - tx_pin: D0 - switch: - platform: uart name: "UART String Output" diff --git a/components/text_sensor/wl_134.rst b/components/text_sensor/wl_134.rst index a8bfe6c33..0f55e7f01 100644 --- a/components/text_sensor/wl_134.rst +++ b/components/text_sensor/wl_134.rst @@ -10,20 +10,15 @@ The ``wl_134`` text sensor platform exposes the last read pet tag as text sensor .. code-block:: yaml # Example configuration entry - uart: - rx_pin: GPIO17 - baud_rate: 9600 - text_sensor: - platform: wl_134 name: Transponder Code - reset: true Configuration variables: ------------------------ - **reset** (*Optional*, boolean): Reset the text sensor state back to "" 1s after reading a tag. Defaults to ``false``. -- All options from :ref:`Text Sensor `. +- All other options from :ref:`Text Sensor `. See Also -------- diff --git a/components/tm1651.rst b/components/tm1651.rst index 8ace6218d..51dc85144 100644 --- a/components/tm1651.rst +++ b/components/tm1651.rst @@ -22,8 +22,8 @@ and brightness settings. All updates can be made via lambda expressions. tm1651: id: tm1651_battery - clk_pin: D6 - dio_pin: D5 + clk_pin: GPIOXX + dio_pin: GPIOXX Configuration variables: ************************ diff --git a/components/touchscreen/cst226.rst b/components/touchscreen/cst226.rst index a9ddfaeab..8ac6328ef 100644 --- a/components/touchscreen/cst226.rst +++ b/components/touchscreen/cst226.rst @@ -27,7 +27,7 @@ Base Touchscreen Configuration touchscreen: platform: cst226 id: my_touchscreen - interrupt_pin: GPIO3 + interrupt_pin: GPIOXX Configuration variables: ************************ diff --git a/components/touchscreen/cst816.rst b/components/touchscreen/cst816.rst index 62f3bb79a..53e13aaeb 100644 --- a/components/touchscreen/cst816.rst +++ b/components/touchscreen/cst816.rst @@ -28,8 +28,8 @@ Base Touchscreen Configuration touchscreen: platform: cst816 id: my_touchscreen - interrupt_pin: GPIO3 - reset_pin: GPIO21 + interrupt_pin: GPIOXX + reset_pin: GPIOXX Configuration variables: ************************ diff --git a/components/touchscreen/ektf2232.rst b/components/touchscreen/ektf2232.rst index 220c61a37..c156584b7 100644 --- a/components/touchscreen/ektf2232.rst +++ b/components/touchscreen/ektf2232.rst @@ -15,8 +15,8 @@ The :ref:`I²C ` is required to be set up in your configuration for this se # Example configuration entry touchscreen: - platform: ektf2232 - interrupt_pin: GPIO36 - rts_pin: GPIO16 + interrupt_pin: GPIOXX + rts_pin: GPIOXX Configuration variables: diff --git a/components/touchscreen/ft63x6.rst b/components/touchscreen/ft63x6.rst index b206d21cb..75e9208aa 100644 --- a/components/touchscreen/ft63x6.rst +++ b/components/touchscreen/ft63x6.rst @@ -14,35 +14,9 @@ The :ref:`I²C ` is required to be set up in your configuration for this se .. code-block:: yaml # Example configuration entry - esp32: - board: m5stack-core2 - framework: - type: arduino - - i2c: - sda: GPIO18 - scl: GPIO19 - scan: false - - output: - - platform: ledc - pin: GPIO23 - id: screen_led - - light: - - platform: monochromatic - output: screen_led - default_transition_length: 0.2s - name: 'Backlight' - restore_mode: ALWAYS_ON - touchscreen: - platform: ft63x6 - interrupt_pin: GPIO39 - on_touch: - - logger.log: - format: Touch %d at (%d, %d) - args: [touch.id, touch.x, touch.y] + interrupt_pin: GPIOXX Configuration variables: ------------------------ diff --git a/components/touchscreen/gt911.rst b/components/touchscreen/gt911.rst index a1182c6f8..517563f50 100644 --- a/components/touchscreen/gt911.rst +++ b/components/touchscreen/gt911.rst @@ -27,7 +27,7 @@ Base Touchscreen Configuration touchscreen: platform: gt911 id: my_touchscreen - interrupt_pin: GPIO3 + interrupt_pin: GPIOXX Configuration variables: ************************ diff --git a/components/touchscreen/index.rst b/components/touchscreen/index.rst index c16c93ecf..2b9170fc3 100644 --- a/components/touchscreen/index.rst +++ b/components/touchscreen/index.rst @@ -124,7 +124,7 @@ The calibration assumes a display oriented in a way that you will be using it, i touchscreen: platform: xpt2046 id: my_touchscreen - cs_pin: 17 + cs_pin: GPIOXX on_touch: - lambda: |- ESP_LOGI("cal", "x=%d, y=%d, x_raw=%d, y_raw=%0d", @@ -256,7 +256,7 @@ For example you could do: Be aware that you need to check the state flag every time to see if the touch is still valid. - state value 0. means the touch is invalid as the touch is no longer detected. -- state value 1 means is being the first time detected. +- state value 1 means is being the first time detected. - state value 2 means the touch is still being detected but is moved on the screen. - state value 4 and higher means a touch release is detected. diff --git a/components/touchscreen/tt21100.rst b/components/touchscreen/tt21100.rst index ec0be66da..22c9cb9f2 100644 --- a/components/touchscreen/tt21100.rst +++ b/components/touchscreen/tt21100.rst @@ -32,8 +32,8 @@ Base Touchscreen Configuration touchscreen: platform: tt21100 id: my_touchscreen - interrupt_pin: GPIO3 - reset_pin: GPIO48 + interrupt_pin: GPIOXX + reset_pin: GPIOXX Configuration variables: ************************ diff --git a/components/touchscreen/xpt2046.rst b/components/touchscreen/xpt2046.rst index 7de79555b..77db1dfba 100644 --- a/components/touchscreen/xpt2046.rst +++ b/components/touchscreen/xpt2046.rst @@ -28,8 +28,8 @@ The :ref:`SPI ` is required to be set up in your configuration for this sen touchscreen: platform: xpt2046 id: my_touchscreen - cs_pin: 17 - interrupt_pin: 16 + cs_pin: GPIOXX + interrupt_pin: GPIOXX update_interval: 50ms threshold: 400 calibration: diff --git a/components/tuya.rst b/components/tuya.rst index 0710fb7d7..d941b8cf6 100644 --- a/components/tuya.rst +++ b/components/tuya.rst @@ -16,18 +16,10 @@ Put the ``tuya`` component in the config and it will list the possible devices f .. code-block:: yaml - # Make sure logging is not using the serial port - logger: - baud_rate: 0 - - uart: - rx_pin: GPIO3 - tx_pin: GPIO1 - baud_rate: 9600 - # Register the Tuya MCU connection tuya: + Here is an example output for a Tuya fan controller: .. code-block:: text diff --git a/components/uart.rst b/components/uart.rst index e808d3290..963238166 100644 --- a/components/uart.rst +++ b/components/uart.rst @@ -30,7 +30,7 @@ In some cases only **TX** or **RX** exists as the device at the other end only a On the ESP32, this component uses the hardware UART units and is thus very accurate. On the ESP8266 however, ESPHome has to use a software implementation as there are no other hardware UART units available other than the ones used for logging. Therefore the UART data on the ESP8266 can have occasional data glitches especially with - higher baud rates. + higher baud rates. .. note:: @@ -43,8 +43,8 @@ In some cases only **TX** or **RX** exists as the device at the other end only a # Example configuration entry uart: - tx_pin: 1 - rx_pin: 3 + tx_pin: GPIOXX + rx_pin: GPIOXX baud_rate: 9600 Configuration variables: @@ -74,7 +74,7 @@ be accurate at higher baud rates. logger and leave others available. If you have configured the logger to use a different hardware UART, the pins used for hardware sharing change accordingly. -The ESP32 has three UARTs. ESP32 lite variant chips (ESP32-S3, ESP32-C3, ESP32-S2, etc) may have fewer UARTs (usually two). Any pair of GPIO pins can be used, as long as they support the proper output/input modes. +The ESP32 has three UARTs. ESP32 lite variant chips (ESP32-S3, ESP32-C3, ESP32-S2, etc) may have fewer UARTs (usually two). Any pair of GPIO pins can be used, as long as they support the proper output/input modes. The ESP8266 has two UARTs; the second of which is TX-only. Only a limited set of pins can be used. ``UART0`` may use either ``tx_pin: GPIO1`` and ``rx_pin: GPIO3``, or ``tx_pin: GPIO15`` and ``rx_pin: GPIO13``. ``UART1`` must diff --git a/components/vbus.rst b/components/vbus.rst index 6ff20add9..3f582d1f8 100644 --- a/components/vbus.rst +++ b/components/vbus.rst @@ -74,17 +74,9 @@ Component .. code-block:: yaml # Example configuration entry - uart: - id: resol - rx_pin: GPIO3 - baud_rate: 9600 - vbus: uart_id: resol - logger: - baud_rate: 0 # disable uart logger on ESP8266 - .. warning:: If you are using the :doc:`logger` make sure you are not using the same pins for it or otherwise disable the UART @@ -234,7 +226,7 @@ Configuration variables: - **source** (**Required**): The address corresponding to ``your device model`` (see below). - **command** (**Required**): The ``command`` corresponding to your device (see below). - **sensors** (**Required**): A list of :ref:`Sensor ` definitions that include a ``lambda`` to do the decoding and return a ``float`` value. - + - **lambda** (**Required**, :ref:`lambda `): Code to parse a value from the incoming data packets and return it. The data packet is in a ``std::vector`` called ``x``. diff --git a/components/wiegand.rst b/components/wiegand.rst index ba6cb6998..7234006f6 100644 --- a/components/wiegand.rst +++ b/components/wiegand.rst @@ -5,7 +5,7 @@ Wiegand keypad and tag reader :description: Wiegand-standard key input and card/tag reader panel :image: wiegand.jpg -The ``wiegand`` component allows you to integrate Wiegand-standard key +The ``wiegand`` component allows you to integrate Wiegand-standard key input and card or tag reader panels in Home Assistant. .. figure:: ../images/wiegand.jpg @@ -16,9 +16,9 @@ input and card or tag reader panels in Home Assistant. .. note:: - Some keypads are preconfigured by the factory to act as Wiegand input - devices. In order to work with this component, they may need to - be reconfigured to act as *Wiegand 26 output* or *Wiegand 34 output* + Some keypads are preconfigured by the factory to act as Wiegand input + devices. In order to work with this component, they may need to + be reconfigured to act as *Wiegand 26 output* or *Wiegand 34 output* devices. @@ -30,8 +30,8 @@ Component # Example configuration entry wiegand: - id: mykeypad - d0: GPIO5 - d1: GPIO4 + d0: GPIOXX + d1: GPIOXX on_key: - lambda: ESP_LOGI("KEY", "received key %d", x); on_tag: @@ -44,19 +44,19 @@ Component Configuration variables: - **id** (*Optional*, :ref:`config-id`): Set the ID of this device for use in lambdas. -- **d0** (**Required**, :ref:`Pin Schema `): The pin where the ``D0`` output +- **d0** (**Required**, :ref:`Pin Schema `): The pin where the ``D0`` output of the Wiegand's interface connects. -- **d1** (**Required**, :ref:`Pin Schema `): The pin where the ``D1`` output +- **d1** (**Required**, :ref:`Pin Schema `): The pin where the ``D1`` output of the Wiegand's interface connects. Automations: ------------ -- **on_key** (*Optional*, :ref:`Automation `): An automation to perform +- **on_key** (*Optional*, :ref:`Automation `): An automation to perform when a key has been pressed on the pad. The key is in a variable called ``x``. -- **on_tag** (*Optional*, :ref:`Automation `): An automation to perform - when a Wiegand-compatible card or a tag has been read by the device. The tag code is +- **on_tag** (*Optional*, :ref:`Automation `): An automation to perform + when a Wiegand-compatible card or a tag has been read by the device. The tag code is in a variable called ``x``. - **on_raw** (*Optional*, :ref:`Automation `): An automation to perform for any data sent by the device. The value is in a variable called ``value``, the number of @@ -66,7 +66,7 @@ Automations: .. note:: - Automatic handling of multiple keys (e.g. PIN code entry) is possible with the + Automatic handling of multiple keys (e.g. PIN code entry) is possible with the the :ref:`Key Collector ` component. Keys 10 and 11 are ``*`` and ``#``. They might be labelled as ``ENT`` or ``ESC``, diff --git a/cookbook/display_time_temp_oled.rst b/cookbook/display_time_temp_oled.rst index ea3317f12..0e1ecfaca 100644 --- a/cookbook/display_time_temp_oled.rst +++ b/cookbook/display_time_temp_oled.rst @@ -99,14 +99,14 @@ Note your ``address`` and ``model`` might be different, use the scan option to f .. code-block:: yaml i2c: - sda: D1 - scl: D2 + sda: GPIOXX + scl: GPIOXX scan: false display: - platform: ssd1306_i2c model: "SH1106 128x64" - reset_pin: D0 + reset_pin: GPIOXX address: 0x3C lambda: |- // Print "Mitt Smarta Hus" in top center. @@ -148,7 +148,7 @@ Below follows an example that replaces the "Mitt smarta hem" top printout with t display: - platform: ssd1306_i2c model: "SH1106 128x64" - reset_pin: D0 + reset_pin: GPIOXX address: 0x3C lambda: |- // Print "Alarm State: " in top center diff --git a/cookbook/garage-door.rst b/cookbook/garage-door.rst index 542bf4d14..92a3156e7 100644 --- a/cookbook/garage-door.rst +++ b/cookbook/garage-door.rst @@ -13,11 +13,11 @@ for a short period of time, the close/open action begins. switch: - platform: gpio - pin: D3 + pin: GPIOXX name: "Garage Door Open Switch" id: open_switch - platform: gpio - pin: D4 + pin: GPIOXX name: "Garage Door Close Switch" id: close_switch cover: diff --git a/cookbook/infostrip.rst b/cookbook/infostrip.rst index 1885882a0..e20060aa8 100644 --- a/cookbook/infostrip.rst +++ b/cookbook/infostrip.rst @@ -26,17 +26,9 @@ ESPHome configuration .. code-block:: yaml - esphome: - name: esp_infostrip - - esp8266: - board: d1_mini - - # TODO -> add your personal wifi, logging, api, ota settings here - uart: - rx_pin: 4 - tx_pin: 5 + rx_pin: GPIOXX + tx_pin: GPIOXX baud_rate: 9600 sensor: @@ -57,7 +49,7 @@ ESPHome configuration - platform: fastled_clockless chipset: WS2812B id: light_fastled - pin: D4 + pin: GPIOXX num_leds: 4 rgb_order: GRB name: "Infostrip" diff --git a/cookbook/lambda_magic.rst b/cookbook/lambda_magic.rst index 7f901283b..5aa4aaea6 100644 --- a/cookbook/lambda_magic.rst +++ b/cookbook/lambda_magic.rst @@ -13,7 +13,7 @@ These things don't need external or custom components, and show how powerful :re Display pages alternative ------------------------- -Some displays like :ref:`lcd-pcf8574` don't support pages natively, but you can easily implement them +Some displays like :ref:`lcd-pcf8574` don't support pages natively, but you can easily implement them using Lambdas: .. code-block:: yaml @@ -28,10 +28,10 @@ using Lambdas: case 1: it.print(0, 1, "Page1"); break; - case 2: + case 2: it.print(0, 1, "Page2"); break; - case 3: + case 3: it.print(0, 1, "Page3"); break; } @@ -104,8 +104,8 @@ Tested on both `arduino` and `esp-idf` platforms. Custom UART Text Sensor ----------------------- -Lots of devices communicate using the UART protocol. If you want to read -lines from uart to a Text Sensor you can do so using this code example. +Lots of devices communicate using the UART protocol. If you want to read +lines from uart to a Text Sensor you can do so using this code example. With this you can use automations or lambda to set switch or sensor states. @@ -115,17 +115,17 @@ With this you can use automations or lambda to set switch or sensor states. class UartReadLineSensor : public Component, public UARTDevice, public TextSensor { public: - UartReadLineSensor(UARTComponent *parent) : UARTDevice(parent) {} + UartReadLineSensor(UARTComponent *parent) : UARTDevice(parent) {} void setup() override { // nothing to do here - } + } int readline(int readch, char *buffer, int len) { static int pos = 0; int rpos; - + if (readch > 0) { switch (readch) { case '\n': // Ignore new-lines @@ -143,7 +143,7 @@ With this you can use automations or lambda to set switch or sensor states. } // No end of line has been found, so return -1. return -1; - } + } void loop() override { const int max_line_length = 80; @@ -157,7 +157,7 @@ With this you can use automations or lambda to set switch or sensor states. }; (Store this file in your configuration directory, for example ``uart_read_line_sensor.h``) - + And in YAML: .. code-block:: yaml @@ -166,15 +166,15 @@ And in YAML: esphome: includes: - uart_read_line_sensor.h - + logger: level: VERBOSE #makes uart stream available in esphome logstream baud_rate: 0 #disable logging over uart uart: id: uart_bus - tx_pin: D0 - rx_pin: D1 + tx_pin: GPIOXX + rx_pin: GPIOXX baud_rate: 9600 text_sensor: @@ -215,7 +215,7 @@ Then the switch uses the text sensor state to publish its own state. - uart.write: "\r*pow=on#\r" turn_off_action: - uart.write: "\r*pow=off#\r" - + interval: - interval: 10s then: @@ -228,13 +228,13 @@ Delaying Remote Transmissions The solution below handles the problem of RF frames being sent out by :doc:`/components/rf_bridge` (or :doc:`/components/remote_transmitter`) too quickly one after another when operating radio controlled -covers. The cover motors seem to need at least 600-700ms of silence between the individual code transmissions +covers. The cover motors seem to need at least 600-700ms of silence between the individual code transmissions to be able to recognize them. This can be solved by building up a queue of raw RF codes and sending them out one after the other with -(a configurable) delay between them. Delay is only added to the next commands coming from a list of -covers which have to be operated at once from Home Assistant. This is transparent to the system, which -will still look like they operate simultaneously. +(a configurable) delay between them. Delay is only added to the next commands coming from a list of +covers which have to be operated at once from Home Assistant. This is transparent to the system, which +will still look like they operate simultaneously. .. code-block:: yaml @@ -305,7 +305,7 @@ One Button Cover Control The configuration below shows how with a single button you can control the motion of a motorized cover by cycling between: open->stop->close->stop->... -In this example a :doc:`/components/cover/time_based` is used with the GPIO configuration of a Sonoff Dual R2. +In this example a :doc:`/components/cover/time_based` is used with the GPIO configuration of a Sonoff Dual R2. .. note:: diff --git a/custom/uart.rst b/custom/uart.rst index 40b71b668..c4426cc2d 100644 --- a/custom/uart.rst +++ b/custom/uart.rst @@ -59,8 +59,8 @@ And in YAML: uart: id: uart_bus - tx_pin: D0 - rx_pin: D1 + tx_pin: GPIOXX + rx_pin: GPIOXX baud_rate: 9600 custom_component: diff --git a/guides/automations.rst b/guides/automations.rst index f1cd253e6..7bfe0e3b5 100644 --- a/guides/automations.rst +++ b/guides/automations.rst @@ -18,18 +18,18 @@ Let's begin with an example to explain these concepts. Suppose you have this con switch: - platform: gpio - pin: GPIO3 + pin: GPIOXX name: "Living Room Dehumidifier" binary_sensor: - platform: gpio - pin: GPIO4 + pin: GPIOXX name: "Living Room Dehumidifier Toggle Button" With this file you can already perform some basic tasks. You can control the ON/OFF state of the dehumidifier in your living room from Home Assistant's front-end. But in many cases, controlling everything strictly from the frontend is quite a pain. That's why you have -decided to also install a simple push button next to the dehumidifier on pin GPIO4. +decided to also install a simple push button next to the dehumidifier on pin GPIOXX. A simple push on this button should toggle the state of the dehumidifier. You *could* write an automation to do this task in Home Assistant's automation engine, but @@ -46,13 +46,13 @@ For example, this configuration would achieve your desired behavior: switch: - platform: gpio - pin: GPIO3 + pin: GPIOXX name: "Living Room Dehumidifier" id: dehumidifier1 binary_sensor: - platform: gpio - pin: GPIO4 + pin: GPIOXX name: "Living Room Dehumidifier Toggle Button" on_press: then: @@ -418,7 +418,7 @@ All Conditions -------------- - :ref:`lambda ` -- :ref:`and ` / :ref:`or ` / :ref:`xor ` / :ref:`not ` +- :ref:`and ` / :ref:`or ` / :ref:`xor ` / :ref:`not ` - :ref:`for ` - :ref:`binary_sensor.is_on ` / :ref:`binary_sensor.is_off ` - :ref:`switch.is_on ` / :ref:`switch.is_off ` @@ -706,7 +706,7 @@ After this action the component will refresh at the original update_interval rat This will allow the component to resume automatic update at the defined interval. -This action also allows to change the update interval, calling it without suspend, +This action also allows to change the update interval, calling it without suspend, replace the poller directly. Please note that this only works with PollingComponent types and others will result in a @@ -724,7 +724,7 @@ compile error. # Change the poller interval on_...: then: - - component.resume: + - component.resume: id: my_component update_interval: 15s diff --git a/guides/configuration-types.rst b/guides/configuration-types.rst index 29e32a906..4f9ae825d 100644 --- a/guides/configuration-types.rst +++ b/guides/configuration-types.rst @@ -34,7 +34,7 @@ names `__, package from your distro or - install it yourself with ``pip install esptool`` (in case of Linux). + install it yourself with ``pip install esptool`` (in case of Linux). Before using ``esptool``, make sure you know which serial port your programming adapter is connected to. In Linux use the ``dmesg`` command afer you plug the device into the USB port to see the name of the newly detected serial port. @@ -119,7 +119,7 @@ Program flash with your firmware binary: .. note:: - If you're just seeing ``Connecting....____....`` on the screen and flashing fails: + If you're just seeing ``Connecting....____....`` on the screen and flashing fails: - verify that the device name of the port has not changed while you were re-plugging it too fast (eg. changed from ``/dev/ttyUSB0`` to ``/dev/ttyUSB1``). @@ -128,11 +128,11 @@ Program flash with your firmware binary: - for some devices you need to keep ``GPIO0`` and ``GND`` connected at least until flashing has begun. - for some devices you need to power-cycle in programming mode after erasing flash, they don't auto-reset. - it also might be a sign that ESP is defective, damaged or otherwise cannot be programmed. - + If you're in an RF noisy environment or your UART wires are a bit long, flashing can fail during transfer. Don't worry, an ESP won't brick just because of that. Put it again in programming mode and flash with a reduced baudrate for safer transfers: - + ``esptool.py --port /dev/ttyUSB0 --baud 460800 write_flash 0x0 your_node_firmware.bin`` diff --git a/guides/getting_started_command_line.rst b/guides/getting_started_command_line.rst index 5746fad08..9cff10fa3 100644 --- a/guides/getting_started_command_line.rst +++ b/guides/getting_started_command_line.rst @@ -40,7 +40,7 @@ If you want to use `docker-compose` instead, here's a sample file: privileged: true network_mode: host environment: - - USERNAME=test + - USERNAME=test - PASSWORD=ChangeMe .. note:: @@ -107,7 +107,7 @@ GPIO switch ` to our app. switch: - platform: gpio name: "Living Room Dehumidifier" - pin: 5 + pin: GPIO5 The configuration format should hopefully immediately seem similar to you. ESPHome has tried to keep it as close to Home Assistant’s @@ -224,7 +224,7 @@ To start the ESPHome dashboard, simply start ESPHome with the following command .. code-block:: bash # Install dashboard dependencies - pip install tornado esptool\ + pip install tornado esptool\ esphome dashboard config # On Docker, host networking mode is required for online status indicators diff --git a/guides/getting_started_hassio.rst b/guides/getting_started_hassio.rst index 32aad9a36..e1da95fa1 100644 --- a/guides/getting_started_hassio.rst +++ b/guides/getting_started_hassio.rst @@ -101,7 +101,7 @@ to the configuration like this: switch: - platform: gpio name: "Living Room Dehumidifier" - pin: 5 + pin: GPIO5 In above example, we're simply adding a switch that's called "Living Room Dehumidifier" (could control anything really, for example lights) and is connected to the pin ``GPIO5``.