diff --git a/Doxygen b/Doxygen index 0a46d698b..2bac0a704 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 = 2023.3.2 +PROJECT_NUMBER = 2023.4.0 # 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 bb91407df..3b07c9333 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ ESPHOME_PATH = ../esphome -ESPHOME_REF = 2023.3.2 +ESPHOME_REF = 2023.4.0 .PHONY: html html-strict cleanhtml deploy help live-html Makefile netlify netlify-api api netlify-dependencies svg2png copy-svg2png minify diff --git a/_static/changelog-2023.4.0.png b/_static/changelog-2023.4.0.png new file mode 100644 index 000000000..38b113300 Binary files /dev/null and b/_static/changelog-2023.4.0.png differ diff --git a/_static/version b/_static/version index 745496025..b0db10dad 100644 --- a/_static/version +++ b/_static/version @@ -1 +1 @@ -2023.3.2 \ No newline at end of file +2023.4.0 \ No newline at end of file diff --git a/changelog/2023.4.0.rst b/changelog/2023.4.0.rst new file mode 100644 index 000000000..d97260feb --- /dev/null +++ b/changelog/2023.4.0.rst @@ -0,0 +1,241 @@ +ESPHome 2023.4.0 - 19th April 2023 +================================== + +.. seo:: + :description: Changelog for ESPHome 2023.4.0. + :image: /_static/changelog-2023.4.0.png + :author: Jesse Hills + :author_twitter: @jesserockz + +.. imgtable:: + :columns: 3 + + Voice Assistant, components/voice_assistant, voice-assistant.svg + Microphone Core, components/microphone/index, microphone.svg + I2S Microphone, components/microphone/i2s_audio, i2s_audio.svg + MMC5603, components/sensor/mmc5603, mmc5603.jpg + KSZ8081 Ethernet, components/ethernet, ethernet.svg + + +Voice Assistant +--------------- + +This year is the Year of the Voice for Home Assistant, and ESPHome is charging ahead with this in mind. +We've added a new :doc:`/components/voice_assistant` component that allows you to use ESPHome devices as an input +for `assist `__ in Home Assistant. + +With this also comes preliminary :doc:`microphone ` support, which has been built in a way that multiple +components, like ``voice_assistant`` can request start / stop of the microphone and get the data. We +hope this leads to more interesting use cases for the microphone in the future. + +Home Assistant is hosting a live stream all about the Year of the Voice - Chapter 2. + +.. raw:: html + + + + +Keith joins Nabu Casa +--------------------- + +Nabu Casa is pleased to annouce that long time contributor Keith Burzinski (:ghuser:`kbx81`) is joining the +team as a full time developer to help out on ESPHome. + +Breaking Changes +---------------- + +I²S Media Player +^^^^^^^^^^^^^^^^ + +With the introduction of the :doc:`/components/microphone/i2s_audio`, the media player platform has some +required breaking changes to the YAML configuration. This involves moving the ``i2s_lrclk_pin`` and +``i2s_bclk_pin`` to a new :doc:`/components/i2s_audio` component. + +.. code-block:: yaml + + # Before + media_player: + - platform: i2s_audio + name: ESPHome I2S Media Player + dac_type: external + i2s_lrclk_pin: GPIO33 + i2s_bclk_pin: GPIO19 + i2s_dout_pin: GPIO22 + mode: mono + + # After + i2s_audio: + i2s_lrclk_pin: GPIO33 + i2s_bclk_pin: GPIO19 + + media_player: + - platform: i2s_audio + name: ESPHome I2S Media Player + dac_type: external + i2s_dout_pin: GPIO22 + mode: mono + +Default restore mode for Switches, Fans and Lights +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The default ``restore_mode`` for switches, fans and lights has been changed +from ``RESTORE_DEFAULT_OFF`` to ``ALWAYS_OFF`` with the intention that restoring values +from flash should be manually specified by a user if desired in their YAML configuration. + +Number ``step`` +^^^^^^^^^^^^^^^ + +The ``number`` components have always internally set a ``step`` required in config, +but allowed it to be not specified at all. This caused issues on the Home Assistant side +of things. This is only a breaking change for external components that have a ``number`` platform. + +UART ids +^^^^^^^^ + +Due to ``uart0`` / ``uart1`` / ``uart2`` being defined in some of the platform code ESPHome uses, +ESPHome will now disallow these ids from being used in the config. You can simply change them to +``uart_0`` to continue using. + +Full list of changes +-------------------- + +New Components +^^^^^^^^^^^^^^ + +- Added in mmc5603 code :esphomepr:`4175` by :ghuser:`benhoff` (new-integration) +- Add push to talk voice assistant :esphomepr:`4648` by :ghuser:`jesserockz` (new-integration) + +Breaking Changes +^^^^^^^^^^^^^^^^ + +- Disallow uart0/1/2 as ids in config :esphomepr:`4446` by :ghuser:`jesserockz` (breaking-change) +- Require step to be set when calling register_number :esphomepr:`4622` by :ghuser:`jesserockz` (breaking-change) +- Fix restore :esphomepr:`4655` by :ghuser:`spacemanspiff2007` (breaking-change) + +Beta Changes +^^^^^^^^^^^^ + +- debug component, allow without debug logging :esphomepr:`4685` by :ghuser:`jesserockz` +- Fixed dns2 for ethernet :esphomepr:`4698` by :ghuser:`HeMan` +- Add timeout to i2c write error logs :esphomepr:`4697` by :ghuser:`Szewcson` +- Add event triggers to voice_assistant :esphomepr:`4699` by :ghuser:`jesserockz` +- Call on_error if no api client connected that handles voice :esphomepr:`4709` by :ghuser:`jesserockz` +- Add ethernet powerdown (fixes esphome/issues#4420) :esphomepr:`4706` by :ghuser:`tracestep` +- Bump arduino platform version to 5.3.0 :esphomepr:`4713` by :ghuser:`jesserockz` + +All changes +^^^^^^^^^^^ + +- Mark unique_id() virtual method as deprecated :esphomepr:`4538` by :ghuser:`oxan` +- Drop deprecated entity property base methods :esphomepr:`4539` by :ghuser:`oxan` +- Format test files :esphomepr:`4541` by :ghuser:`jesserockz` +- EntityBase: Icon string can stay in flash. :esphomepr:`4566` by :ghuser:`Fabian-Schmidt` +- Update the delta filter to be able to take a percentage change :esphomepr:`4391` by :ghuser:`TrentHouliston` +- Added missing PM_1_0 and PM_10_0 for PMS5003T and PMS5003ST :esphomepr:`4560` by :ghuser:`genestealer` +- Add an option to force SPI into software mode :esphomepr:`4556` by :ghuser:`wupeka` +- allow using a binary output for the status led :esphomepr:`4532` by :ghuser:`ssieb` +- Add option flip_x :esphomepr:`4555` by :ghuser:`rafal83` +- Bump aioesphomeapi from 13.5.0 to 13.5.1 :esphomepr:`4572` by :ghuser:`dependabot[bot]` +- Verbose output of define. :esphomepr:`4576` by :ghuser:`Fabian-Schmidt` +- Add support for ESP32 CAM 3MP and 5MP resolutions and arbitrary camera clock. :esphomepr:`4580` by :ghuser:`peterhalicky` +- Add a simple 'skip_initial' filter :esphomepr:`4582` by :ghuser:`sybrenstuvel` +- Fix outdated filter string in platformio_api :esphomepr:`4587` by :ghuser:`LordMike` +- Split test3.yaml :esphomepr:`4591` by :ghuser:`jesserockz` +- Disallow uart0/1/2 as ids in config :esphomepr:`4446` by :ghuser:`jesserockz` (breaking-change) +- Upgrade clang-format to v13 :esphomepr:`4535` by :ghuser:`oxan` +- B/W support for GooDisplay GDEY029T94 (as used on Adafruit MagTag) :esphomepr:`4222` by :ghuser:`AaronJackson` +- Fix negative sqrt root in ct_clamp_sensor.cpp :esphomepr:`4236` by :ghuser:`jerome992` +- Wrap ipv6 code a bit more :esphomepr:`4574` by :ghuser:`jesserockz` +- Remove EntityBase from sprinkler :esphomepr:`4606` by :ghuser:`jesserockz` +- Fix wrong port multiplexer name in dump GPIO function of sx1509 :esphomepr:`4592` by :ghuser:`skaldo` +- Bump zeroconf from 0.47.3 to 0.47.4 :esphomepr:`4597` by :ghuser:`dependabot[bot]` +- Bump pytest-asyncio from 0.20.3 to 0.21.0 :esphomepr:`4599` by :ghuser:`dependabot[bot]` +- Limit range on filter time period for remote_receiver :esphomepr:`4604` by :ghuser:`RoboMagus` +- add select_schema to select component :esphomepr:`4545` by :ghuser:`regevbr` +- Add ability to clear the gatt cache :esphomepr:`4621` by :ghuser:`bdraco` +- Bump actions/stale from 7 to 8 :esphomepr:`4615` by :ghuser:`dependabot[bot]` +- Require step to be set when calling register_number :esphomepr:`4622` by :ghuser:`jesserockz` (breaking-change) +- Lower range of CONF_FREQUENCY :esphomepr:`4619` by :ghuser:`berendhaan` +- Allow entity names to be set to None :esphomepr:`4607` by :ghuser:`jesserockz` +- Fix platform restriction for bme680_bsec :esphomepr:`4616` by :ghuser:`jesserockz` +- Fix EzoCommandType enum :esphomepr:`4593` by :ghuser:`alfredopironti` +- `EntityBase` Name can stay in flash. :esphomepr:`4594` by :ghuser:`Fabian-Schmidt` +- feat: Add support to unsubscribe from BLE advertisements :esphomepr:`4620` by :ghuser:`richardhopton` +- EntityBase: Move ObjectId to Flash :esphomepr:`4569` by :ghuser:`Fabian-Schmidt` +- Add workflow to sync device classes with HA dev :esphomepr:`4629` by :ghuser:`jesserockz` +- Synchronise Device Classes from Home Assistant :esphomepr:`4633` by :ghuser:`github-actions[bot]` +- Remove AUTO_LOAD from as3935 :esphomepr:`4630` by :ghuser:`jesserockz` +- Add ifdef to new bt proxy unsubscribe :esphomepr:`4634` by :ghuser:`jesserockz` +- add bluetooth mac address in dump_config() :esphomepr:`4628` by :ghuser:`felixlungu` +- Binary map bugfixes :esphomepr:`4636` by :ghuser:`kahrendt` +- entity_base avoid padding bytes. :esphomepr:`4637` by :ghuser:`Fabian-Schmidt` +- Avoid sensor padding. :esphomepr:`4638` by :ghuser:`Fabian-Schmidt` +- Support advanced UART customization :esphomepr:`4465` by :ghuser:`Fabian-Schmidt` +- Log calibration results at level INFO :esphomepr:`4240` by :ghuser:`Duckle29` +- Number step not optional :esphomepr:`4649` by :ghuser:`RoboMagus` +- VSCode / devcontainer updates :esphomepr:`4647` by :ghuser:`jesserockz` +- Retry PN532_COMMAND_VERSION_DATA on setup() (fixes esphome/issues#3823) :esphomepr:`4651` by :ghuser:`tracestep` +- Bump pylint from 2.16.4 to 2.17.2 :esphomepr:`4650` by :ghuser:`dependabot[bot]` +- Bump black from 23.1.0 to 23.3.0 :esphomepr:`4635` by :ghuser:`dependabot[bot]` +- Added in mmc5603 code :esphomepr:`4175` by :ghuser:`benhoff` (new-integration) +- fix compilation with latest esp-idf :esphomepr:`4671` by :ghuser:`Mic92` +- Bump zeroconf from 0.47.4 to 0.56.0 :esphomepr:`4674` by :ghuser:`dependabot[bot]` +- Bump pytest from 7.2.2 to 7.3.0 :esphomepr:`4673` by :ghuser:`dependabot[bot]` +- Add push to talk voice assistant :esphomepr:`4648` by :ghuser:`jesserockz` (new-integration) +- Fix ESP32 SPI hardware assignment in Arduino fw :esphomepr:`4669` by :ghuser:`kbx81` +- Fix some NFC/PN532 crashes :esphomepr:`4678` by :ghuser:`kbx81` +- Add support for SSD1306 72x40 displays :esphomepr:`4659` by :ghuser:`johnsto` +- Fix pin schema for i2s microphone :esphomepr:`4680` by :ghuser:`jesserockz` +- Fix BedJet setup priority [fixes esphome/issues#3807] :esphomepr:`4677` by :ghuser:`jhansche` +- Add always trigger stop :esphomepr:`4249` by :ghuser:`X-Ryl669` +- Fix graph limits for negative values and other corner cases :esphomepr:`4253` by :ghuser:`unhold` +- Fix cut-off on 2.13" waveshare/ttgo epaper displays :esphomepr:`4255` by :ghuser:`unhold` +- [Ethernet] Add PHY KSZ8081 support :esphomepr:`4668` by :ghuser:`Fabian-Schmidt` +- Fix restore :esphomepr:`4655` by :ghuser:`spacemanspiff2007` (breaking-change) +- debug component, allow without debug logging :esphomepr:`4685` by :ghuser:`jesserockz` +- Fixed dns2 for ethernet :esphomepr:`4698` by :ghuser:`HeMan` +- Add timeout to i2c write error logs :esphomepr:`4697` by :ghuser:`Szewcson` +- Add event triggers to voice_assistant :esphomepr:`4699` by :ghuser:`jesserockz` +- Call on_error if no api client connected that handles voice :esphomepr:`4709` by :ghuser:`jesserockz` +- Add ethernet powerdown (fixes esphome/issues#4420) :esphomepr:`4706` by :ghuser:`tracestep` +- Bump arduino platform version to 5.3.0 :esphomepr:`4713` by :ghuser:`jesserockz` + +Past Changelogs +--------------- + +- :doc:`2023.3.0` +- :doc:`2023.2.0` +- :doc:`2022.12.0` +- :doc:`2022.11.0` +- :doc:`2022.10.0` +- :doc:`2022.9.0` +- :doc:`2022.8.0` +- :doc:`2022.6.0` +- :doc:`2022.5.0` +- :doc:`2022.4.0` +- :doc:`2022.3.0` +- :doc:`2022.2.0` +- :doc:`2022.1.0` +- :doc:`2021.12.0` +- :doc:`2021.11.0` +- :doc:`2021.10.0` +- :doc:`2021.9.0` +- :doc:`2021.8.0` +- :doc:`v1.20.0` +- :doc:`v1.19.0` +- :doc:`v1.18.0` +- :doc:`v1.17.0` +- :doc:`v1.16.0` +- :doc:`v1.15.0` +- :doc:`v1.14.0` +- :doc:`v1.13.0` +- :doc:`v1.12.0` +- :doc:`v1.11.0` +- :doc:`v1.10.0` +- :doc:`v1.9.0` +- :doc:`v1.8.0` +- :doc:`v1.7.0` diff --git a/changelog/index.rst b/changelog/index.rst index 697efc4d3..432d05582 100644 --- a/changelog/index.rst +++ b/changelog/index.rst @@ -2,7 +2,7 @@ Changelog ========= .. redirect:: - :url: /changelog/2023.3.0.html + :url: /changelog/2023.4.0.html .. toctree:: :glob: diff --git a/components/binary_sensor/index.rst b/components/binary_sensor/index.rst index 8dd0a8870..1f87eb7ea 100644 --- a/components/binary_sensor/index.rst +++ b/components/binary_sensor/index.rst @@ -27,6 +27,13 @@ you can always override it. Configuration variables: +- **name** (**Required**, string): The name for the binary sensor. + + .. note:: + + If you have a :ref:`friendly_name ` set for your device and + you want the binary sensor to use that name, you can set ``name: None``. + - **device_class** (*Optional*, string): The device class for the sensor. See https://developers.home-assistant.io/docs/core/entity/binary-sensor/#available-device-classes for a list of available options. diff --git a/components/button/index.rst b/components/button/index.rst index c91b1fac8..330ef4852 100644 --- a/components/button/index.rst +++ b/components/button/index.rst @@ -41,6 +41,12 @@ All buttons in ESPHome have a name and an optional icon. Configuration variables: - **name** (**Required**, string): The name for the button. + + .. note:: + + If you have a :ref:`friendly_name ` set for your device and + you want the button to use that name, you can set ``name: None``. + - **icon** (*Optional*, icon): Manually set the icon to use for the button 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 diff --git a/components/climate/index.rst b/components/climate/index.rst index 3b57936e3..ceebe2525 100644 --- a/components/climate/index.rst +++ b/components/climate/index.rst @@ -33,6 +33,13 @@ All climate platforms in ESPHome inherit from the climate configuration schema. Configuration variables: +- **name** (**Required**, string): The name of the climate device. + + .. note:: + + If you have a :ref:`friendly_name ` set for your device and + you want the climate to use that name, you can set ``name: None``. + - **icon** (*Optional*, icon): Manually set the icon to use for the climate device in the frontend. - **visual** (*Optional*): Visual settings for the climate device - these do not affect operation and are solely for controlling how the climate device shows up in the diff --git a/components/cover/index.rst b/components/cover/index.rst index 4e1170faa..d6eaeff3b 100644 --- a/components/cover/index.rst +++ b/components/cover/index.rst @@ -28,6 +28,13 @@ All cover config schemas inherit from this schema - you can set these keys for c Configuration variables: +- **name** (**Required**, string): The name for the cover. + + .. note:: + + If you have a :ref:`friendly_name ` set for your device and + you want the cover 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/cover/ for a list of available options. - **icon** (*Optional*, icon): Manually set the icon to use for the cover in the frontend. diff --git a/components/cover/time_based.rst b/components/cover/time_based.rst index e5b321713..0f5e542dd 100644 --- a/components/cover/time_based.rst +++ b/components/cover/time_based.rst @@ -52,6 +52,13 @@ Configuration variables: detectors. In this configuration the ``stop_action`` is not performed when the open or close time is completed and if the cover is commanded to open or close the corresponding actions will be performed without checking current state. Defaults to ``false``. +- **manual_control** (*Optional*, boolean): For covers with manual external controls. With this + configuration if the cover is commanded to open or close the corresponding actions will be + performed even if the current state fully open or fully closed matches desired state, then + ``stop_action`` will be called after the full duration of the action elapses. + The current state will then be relearned upon completion. + It's recommended to set ``assumed_state`` to true so the cover control button aren't disabled + in the interface. Defaults to ``false``. - **assumed_state** (*Optional*, boolean): Whether the true state of the cover is not known. This will make the Home Assistant frontend show buttons for both OPEN and CLOSE actions, instead of hiding or disabling one of them. Defaults to ``true``. diff --git a/components/display/max7219digit.rst b/components/display/max7219digit.rst index dd4db5f13..2c7923c43 100644 --- a/components/display/max7219digit.rst +++ b/components/display/max7219digit.rst @@ -68,6 +68,7 @@ Configuration variables: - **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation. - **num_chip_lines** (*Optional*, int): Number of lines if you want to use the displays in Multiline Mode. Defaults to ``1`` Example: https://github.com/esphome/esphome/pull/1622#issue-836179156 - **chip_lines_style** (*Optional*): How are the lines in Multiline Mode connected? Possible values are ``zigzag`` and ``snake``. Defaults to ``snake`` +- **flip_x** (*Optional*, boolean): Flip the horizontal axis on the screen. Defaults to ``false``. .. _display-max7219digit_lambda: diff --git a/components/display/ssd1306.rst b/components/display/ssd1306.rst index 6733cceb6..6b322309e 100644 --- a/components/display/ssd1306.rst +++ b/components/display/ssd1306.rst @@ -51,6 +51,7 @@ Configuration variables: - ``SSD1306 128x32`` - SSD1306 with 128 columns and 32 rows - ``SSD1306 128x64`` - ``SSD1306 96x16`` + - ``SSD1306 72x40`` - ``SSD1306 64x48`` - ``SH1106 128x32`` - ``SH1106 128x64`` @@ -130,6 +131,7 @@ Configuration variables: - ``SSD1306 128x32`` (SSD1306 with 128 columns and 32 rows) - ``SSD1306 128x64`` - ``SSD1306 96x16`` + - ``SSD1306 72x40`` - ``SSD1306 64x48`` - ``SH1106 128x32`` - ``SH1106 128x64`` diff --git a/components/display/waveshare_epaper.rst b/components/display/waveshare_epaper.rst index b883d9e53..6eeb9d230 100644 --- a/components/display/waveshare_epaper.rst +++ b/components/display/waveshare_epaper.rst @@ -97,6 +97,7 @@ Configuration variables: - ``7.50inV2`` - Can't use with an ESP8266 as it runs out of RAM - ``7.50inV2alt`` (alternative version to the above ``7.50inV2``) - ``7.50in-hd-b`` - Can't use with an ESP8266 as it runs out of RAM + - ``gdey029t94`` - GooDisplay GDEY029T94, as used on the AdaFruit MagTag - **busy_pin** (*Optional*, :ref:`Pin Schema `): The BUSY pin. Defaults to not connected. - **reset_pin** (*Optional*, :ref:`Pin Schema `): The RESET pin. Defaults to not connected. diff --git a/components/esp32_camera.rst b/components/esp32_camera.rst index 73e402401..8361f0daf 100644 --- a/components/esp32_camera.rst +++ b/components/esp32_camera.rst @@ -53,8 +53,8 @@ Connection Options: - **external_clock** (**Required**): The configuration of the external clock to drive the camera. - **pin** (**Required**, pin): The pin the external clock line is connected to. - - **frequency** (*Optional*, float): The frequency of the external clock, must be either 20MHz - or 10MHz. Defaults to ``20MHz``. + - **frequency** (*Optional*, float): The frequency of the external clock, must be between 10 + and 20MHz. Defaults to ``20MHz``. - **i2c_pins** (**Required**): The I²C control pins of the camera. @@ -90,6 +90,15 @@ Image Settings: - ``1024x768`` (XGA) - ``1280x1024`` (SXGA) - ``1600x1200`` (UXGA) + - ``1920x1080`` (FHD) + - ``720x1280`` (Portrait HD) + - ``864x1536`` (Portrait 3MP) + - ``2048x1536`` (QXGA) + - ``2560x1440`` (QHD) + - ``2560x1600`` (WQXGA) + - ``1080x1920`` (Portrait FHD) + - ``2560x1920`` (QSXGA) + - **jpeg_quality** (*Optional*, int): The JPEG quality that the camera should encode images with. From 10 (best) to 63 (worst). Defaults to ``10``. diff --git a/components/ethernet.rst b/components/ethernet.rst index cd49e1308..c6405d9fa 100644 --- a/components/ethernet.rst +++ b/components/ethernet.rst @@ -40,6 +40,7 @@ Configuration variables: - ``DP83848`` - ``IP101`` - ``JL1101`` + - ``KSZ8081`` - **mdc_pin** (**Required**, :ref:`config-pin`): The MDC pin of the board. Usually this is ``GPIO23``. diff --git a/components/fan/index.rst b/components/fan/index.rst index 1fe4f2b51..c6ffb6493 100644 --- a/components/fan/index.rst +++ b/components/fan/index.rst @@ -27,15 +27,21 @@ Base Fan Configuration Configuration variables: - **name** (**Required**, string): The name of the fan. + + .. note:: + + If you have a :ref:`friendly_name ` set for your device and + you want the fan to use that name, you can set ``name: None``. + - **icon** (*Optional*, icon): Manually set the icon to use for the fan in the frontend. - **restore_mode** (*Optional*): Control how the fan attempts to restore state on boot. - ``NO_RESTORE`` - Don't restore any state. - - ``RESTORE_DEFAULT_OFF`` - Attempt to restore state and default to OFF if not possible to restore (default). + - ``RESTORE_DEFAULT_OFF`` - Attempt to restore state and default to OFF if not possible to restore. - ``RESTORE_DEFAULT_ON`` - Attempt to restore state and default to ON. - ``RESTORE_INVERTED_DEFAULT_OFF`` - Attempt to restore state inverted from the previous state and default to OFF. - ``RESTORE_INVERTED_DEFAULT_ON`` - Attempt to restore state inverted from the previous state and default to ON. - - ``ALWAYS_OFF`` - Always initialize the fan as OFF on bootup. + - ``ALWAYS_OFF`` (Default) - Always initialize the fan as OFF on bootup. - ``ALWAYS_ON`` - Always initialize the fan as ON on bootup. - **internal** (*Optional*, boolean): Mark this component as internal. Internal components will diff --git a/components/i2s_audio.rst b/components/i2s_audio.rst new file mode 100644 index 000000000..f7d59ea7a --- /dev/null +++ b/components/i2s_audio.rst @@ -0,0 +1,29 @@ +I²S Audio Component +=================== + +.. seo:: + :description: Instructions for setting up I²S based devices in ESPHome. + :image: i2s_audio.svg + +The ``i2s_audio`` component allows for sending and receiving audio via I²S. +This component only works on ESP32 based chips. + +.. code-block:: yaml + + # Example configuration entry + i2s_audio: + i2s_lrclk_pin: GPIO33 + i2s_bclk_pin: GPIO19 + +Configuration variables: +------------------------ + +- **i2s_lrclk_pin** (**Required**, :ref:`Pin Schema `): The GPIO pin to use for the I²S LRCLK (Word Select or Left/Right Clock) signal. +- **i2s_bclk_pin** (**Required**, :ref:`Pin Schema `): The GPIO pin to use for the I²S BCLK (Bit Clock) signal. + +See also +-------- + +- :doc:`microphone/i2s_audio` +- :doc:`media_player/i2s_audio` +- :ghedit:`Edit` diff --git a/components/index.rst b/components/index.rst index 1b2dd79a2..737a782af 100644 --- a/components/index.rst +++ b/components/index.rst @@ -23,5 +23,6 @@ Components lock/index display_menu/index media_player/index + microphone/index time/index * diff --git a/components/light/index.rst b/components/light/index.rst index 6dd4506dd..7c71549c6 100644 --- a/components/light/index.rst +++ b/components/light/index.rst @@ -26,6 +26,13 @@ All light configuration schemas inherit these options. Configuration variables: +- **name** (**Required**, string): The name of the light. + + .. note:: + + If you have a :ref:`friendly_name ` set for your device and + you want the light to use that name, you can set ``name: None``. + - **icon** (*Optional*, icon): Manually set the icon to use for the light in the frontend. - **effects** (*Optional*, list): A list of :ref:`light effects ` to use for this light. - **gamma_correct** (*Optional*, float): Apply a `gamma correction @@ -39,13 +46,13 @@ Configuration variables: For restoring on ESP8266s, also see ``esp8266_restore_from_flash`` in the :doc:`esphome section `. - - ``RESTORE_DEFAULT_OFF`` (Default) - Attempt to restore state and default to OFF if not possible to restore. + - ``RESTORE_DEFAULT_OFF`` - Attempt to restore state and default to OFF if not possible to restore. - ``RESTORE_DEFAULT_ON`` - Attempt to restore state and default to ON. - ``RESTORE_INVERTED_DEFAULT_OFF`` - Attempt to restore state inverted from the previous state and default to OFF. - ``RESTORE_INVERTED_DEFAULT_ON`` - Attempt to restore state inverted from the previous state and default to ON. - ``RESTORE_AND_OFF`` - Attempt to restore state but initialize the light as OFF. - ``RESTORE_AND_ON`` - Attempt to restore state but initialize the light as ON. - - ``ALWAYS_OFF`` - Always initialize the light as OFF on bootup. + - ``ALWAYS_OFF`` (Default) - Always initialize the light as OFF on bootup. - ``ALWAYS_ON`` - Always initialize the light as ON on bootup. - **on_turn_on** (*Optional*, :ref:`Action `): An automation to perform diff --git a/components/light/status_led.rst b/components/light/status_led.rst index 93170d9f6..99d1fa52f 100644 --- a/components/light/status_led.rst +++ b/components/light/status_led.rst @@ -8,6 +8,7 @@ Status LED Light The ``status_led`` light platform allows to share a single LED for indicating the status of the device (when on error/warning state) or as binary light (when on OK state). This is useful for devices with only one LED available. +You can also use a binary :ref:`output`. It provides the combined functionality of :doc:`status_led component ` and a :doc:`binary light component ` over a single shared GPIO led. @@ -33,9 +34,10 @@ When the device is in OK state, the LED will be restored to the state of the ``b Configuration variables: ------------------------ -- **name** (**Required**, string): The name of the light. -- **pin** (**Required**, :ref:`Pin Schema `): The GPIO pin to operate the LED on. +- **name** (*Optional*, string): The name of the light. - **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation. +- **pin** (*Optional*, :ref:`Pin Schema `): The GPIO pin to operate the LED on. +- **output** (*Optional*, :ref:`config-id`): The id of the binary :ref:`output` to use for this light. - **effects** (*Optional*, list): A list of :ref:`light effects ` to use for this light, though binary lights only support very few of them. - All other options from :ref:`Light `. diff --git a/components/lock/index.rst b/components/lock/index.rst index 2924e9cf2..0428510cb 100644 --- a/components/lock/index.rst +++ b/components/lock/index.rst @@ -6,7 +6,7 @@ Lock Component :image: folder-open.svg The ``lock`` domain includes all platforms that should function like a lock -with lock/unlock actions. +with lock/unlock actions. .. note:: @@ -26,6 +26,12 @@ Base Lock Configuration Configuration variables: - **name** (**Required**, string): The name of the lock. + + .. note:: + + If you have a :ref:`friendly_name ` set for your device and + you want the lock to use that name, you can set ``name: None``. + - **icon** (*Optional*, icon): Manually set the icon to use for the lock in the frontend. - **internal** (*Optional*, boolean): Mark this component as internal. Internal components will diff --git a/components/media_player/i2s_audio.rst b/components/media_player/i2s_audio.rst index 7d01e3bf3..68e8a846e 100644 --- a/components/media_player/i2s_audio.rst +++ b/components/media_player/i2s_audio.rst @@ -2,11 +2,11 @@ I2S Audio Media Player ====================== .. seo:: - :description: Instructions for setting up I2S based media players in ESPHome. + :description: Instructions for setting up I²S based media players in ESPHome. :image: i2s_audio.svg The ``i2s_audio`` media player platform allows you to play media from webservers and web streams -via the I2S bus. This platform only works on ESP32 based chips. +via the :doc:`/components/i2s_audio`. This platform only works on ESP32 based chips. .. code-block:: yaml @@ -15,9 +15,7 @@ via the I2S bus. This platform only works on ESP32 based chips. - platform: i2s_audio name: ESPHome I2S Media Player dac_type: external - i2s_lrclk_pin: GPIO33 i2s_dout_pin: GPIO22 - i2s_bclk_pin: GPIO19 mode: mono Configuration variables: @@ -33,10 +31,8 @@ Configuration variables: External DAC ************ -- **i2s_lrclk_pin** (**Required**, :ref:`Pin Schema `): The GPIO pin to use for the I2S LRCLK (Word Select or Left/Right Clock) signal. -- **i2s_dout_pin** (**Required**, :ref:`Pin Schema `): The GPIO pin to use for the I2S DOUT (Data Out) signal. -- **i2s_bclk_pin** (**Required**, :ref:`Pin Schema `): The GPIO pin to use for the I2S BCLK (Bit Clock) signal. -- **mode** (*Optional*, string): The mode of the I2S bus. Can be ``mono`` or ``stereo``. Defaults to ``mono``. +- **i2s_dout_pin** (**Required**, :ref:`Pin Schema `): The GPIO pin to use for the I²S DOUT (Data Out) signal. +- **mode** (*Optional*, string): The mode of the I²S bus. Can be ``mono`` or ``stereo``. Defaults to ``mono``. For best results, keep the wires as short as possible. diff --git a/components/media_player/index.rst b/components/media_player/index.rst index f5b288f84..01a33e595 100644 --- a/components/media_player/index.rst +++ b/components/media_player/index.rst @@ -26,6 +26,12 @@ Base Media Player Configuration Configuration variables: - **name** (**Required**, string): The name of the media player. + + .. note:: + + If you have a :ref:`friendly_name ` set for your device and + you want the media player to use that name, you can set ``name: None``. + - **icon** (*Optional*, icon): Manually set the icon to use for the media player in the frontend. - **internal** (*Optional*, boolean): Mark this component as internal. Internal components will diff --git a/components/microphone/i2s_audio.rst b/components/microphone/i2s_audio.rst new file mode 100644 index 000000000..255cb515a --- /dev/null +++ b/components/microphone/i2s_audio.rst @@ -0,0 +1,29 @@ +I²S Audio Microphone +==================== + +.. seo:: + :description: Instructions for setting up I²S based microphones in ESPHome. + :image: i2s_audio.svg + +The ``i2s_audio`` microphone platform allows you to receive audio via the the +:doc:`/components/i2s_audio`. This platform only works on ESP32 based chips. + +.. code-block:: yaml + + # Example configuration entry + microphone: + - platform: i2s_audio + i2s_din_pin: GPIO23 + +Configuration variables: +------------------------ + +- **i2s_din_pin** (**Required**, :ref:`Pin Schema `): The GPIO pin to use for the I²S DIN (Data In) signal. + +- All other options from :ref:`Microphone ` + +See also +-------- + +- :doc:`index` +- :ghedit:`Edit` diff --git a/components/microphone/index.rst b/components/microphone/index.rst new file mode 100644 index 000000000..405e98c66 --- /dev/null +++ b/components/microphone/index.rst @@ -0,0 +1,109 @@ +Microphone Components +===================== + +.. seo:: + :description: Instructions for setting up microphones in ESPHome. + :image: folder-open.svg + +The ``microphone`` domain contains common functionality shared across the +microphone platforms. + +.. _config-microphone: + +Base Microphone Configuration +----------------------------- + +Configuration variables: + +- **on_data** (*Optional*, :ref:`Automation `): An automation to + perform when new data is received. + +.. _microphone-actions: + +Microphone Actions +------------------ + +All ``microphone`` actions can be used without specifying an ``id`` if you have only one ``microphone`` in +your configuration YAML. + +Configuration variables: + +**id** (*Optional*, :ref:`config-id`): The microphone to control. Defaults to the only one in YAML. + + +.. _microphone-capture: + +``microphone.capture`` Action +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This action will start capturing audio data from the microphone. The data will be passed to any components listening +and will be available in the ``on_data`` trigger. + +.. _microphone-stop_capture: + +``microphone.stop_capture`` Action +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This action will stop capturing audio data from the microphone. + + +.. _microphone-triggers: + +Microphone Triggers +------------------- + +.. _microphone-on_data: + +``microphone.on_data`` Trigger +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This trigger will fire when new data is received from the microphone. +The data is available as a ``std::vector`` in the variable ``x``. + +.. code-block:: yaml + + microphone: + - platform: ... + on_data: + - logger.log: + format: "Received %d bytes" + args: ['x.size()'] + +Configuration variables: + +- **id** (*Optional*, :ref:`config-id`): The microphone to check. Defaults to the only one in YAML. + + +.. _microphone-conditions: + +Microphone Conditions +--------------------- + +All ``microphone`` conditions can be used without specifying an ``id`` if you have only one ``microphone`` in +your configuration YAML. + +Configuration variables: + +**id** (*Optional*, :ref:`config-id`): The microphone to check. Defaults to the only one in YAML. + +.. _microphone-is_capturing: + +``microphone.is_capturing`` Condition +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This condition will check if the microphone is currently capturing audio data. + + +Platforms +--------- + +.. toctree:: + :maxdepth: 1 + :glob: + + * + +See Also +-------- + +- :ghedit:`Edit` diff --git a/components/number/index.rst b/components/number/index.rst index 5a6edebe1..34e82cec9 100644 --- a/components/number/index.rst +++ b/components/number/index.rst @@ -31,6 +31,12 @@ All numbers in ESPHome have a name and an optional icon. Configuration variables: - **name** (**Required**, string): The name for the number. + + .. note:: + + If you have a :ref:`friendly_name ` set for your device and + you want the number to use that name, you can set ``name: None``. + - **icon** (*Optional*, icon): Manually set the icon to use for the number 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 diff --git a/components/select/index.rst b/components/select/index.rst index bc5e8dc5d..6d7e84bb8 100644 --- a/components/select/index.rst +++ b/components/select/index.rst @@ -31,6 +31,12 @@ All selects in ESPHome have a name and an optional icon. Configuration variables: - **name** (**Required**, string): The name for the select. + + .. note:: + + If you have a :ref:`friendly_name ` set for your device and + you want the select to use that name, you can set ``name: None``. + - **icon** (*Optional*, icon): Manually set the icon to use for the select 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 @@ -334,8 +340,8 @@ advanced stuff (see the full API Reference for more info). if (id(my_select).has_index(index)) { ESP_LOGI("main", "Select has index offset %d", index); } - - + + Example ------- @@ -347,13 +353,13 @@ Setting up three options and set component state to selected option value. - platform: template name: Mode id: mode - options: + options: - "Option1" - "Option2" - "Option3" initial_option: "OFF" optimistic: true - set_action: + set_action: - logger.log: format: "Chosen option: %s" args: ["x.c_str()"] diff --git a/components/sensor/index.rst b/components/sensor/index.rst index 6ee6f5ded..3b15ff77e 100644 --- a/components/sensor/index.rst +++ b/components/sensor/index.rst @@ -40,6 +40,12 @@ Configuration variables: - **id** (*Optional*, string): Manually specify the ID for code generation. At least one of **id** and **name** must be specified. - **name** (*Optional*, string): The name for the sensor. At least one of **id** and **name** must be specified. + + .. note:: + + If you have a :ref:`friendly_name ` set for your device and + you want the sensor to use that name, you can set ``name: None``. + - **unit_of_measurement** (*Optional*, string): Manually set the unit of measurement the sensor should advertise its values with. This does not actually do any maths (conversion between units). @@ -406,6 +412,21 @@ Configuration variables: published. With this parameter you can specify when the very first value is to be sent. Defaults to ``1``. +``skip_initial`` +**************** + +A simple skip filter; `skip_initial: N` skips the first `N` sensor readings and passes on the +rest. This can be used when the sensor needs a few readings to 'warm up'. After the initial +readings have been skipped, this filter does nothing. + +.. code-block:: yaml + + # Example configuration entry + - platform: wifi_signal + # ... + filters: + - skip_initial: 3 + ``throttle`` ************ @@ -456,11 +477,28 @@ values. ``delta`` ********* -This filter stores the last value passed through this filter and only -passes incoming values through if the absolute difference is greater than the configured -value. For example if a value of 1.0 first comes in, it's passed on. If the delta filter -is configured with a value of 5, it will now not pass on an incoming value of 2.0, only values -that are at least 6.0 big or -4.0. +This filter stores the last value passed through this filter and only passes incoming values through +if incoming value is sufficiently different from the previously passed one. +This difference can be calculated in two ways an absolute difference or a percentage difference. + +If a number is specified, it will be used as the absolute difference required. +For example if the filter were configured with a value of 2 and the last value passed through was 10, +only values greater than 12 or less than 8 would be passed through. + +.. code-block:: yaml + + filters: + - delta: 2.0 + +If a percentage is specified a percentage of the last value will be used as the required difference. +For example if the filter were configured with a value of 20% and the last value passed through was 10, +only values greater than 12 or less than 8 would be passed through. +However, if the last value passed through was 100 only values greater than 120 or less than 80 would be passed through. + +.. code-block:: yaml + + filters: + - delta: 20% ``or`` ****** @@ -643,7 +681,7 @@ From :ref:`lambdas `, you can call several methods on all sensors advanced stuff (see the full API Reference for more info). - ``publish_state()``: Manually cause the sensor to push out a value. It will then - be processed by the sensor filters, and once filtered will propagate though ESPHome and though the API to Home Assistant or out via MQTT if configured. + be processed by the sensor filters, and once filtered will propagate though ESPHome and though the API to Home Assistant or out via MQTT if configured. .. code-block:: cpp diff --git a/components/sensor/mmc5063.rst b/components/sensor/mmc5063.rst new file mode 100644 index 000000000..5b18557ba --- /dev/null +++ b/components/sensor/mmc5063.rst @@ -0,0 +1,63 @@ +.. _mmc5603: + +MMC5603 Magnetometer +===================== + +.. seo:: + :description: Instructions for setting up MMC5693 IMU compass sensors. + :image: mmc5603.jpg + :keywords: MMC5603 + +The ``mmc5603`` allows you to use your MMC5603 triple-axis magnetometers +(`datasheet `__, +`Adafruit`_) with ESPHome. The :ref:`I²C Bus ` is required to be set up in your configuration +for this sensor to work. + +.. figure:: ../../images/mmc5603.jpg + :align: center + :width: 30.0% + + MMC5603 Magnetometer. + +.. _Adafruit: https://www.adafruit.com/product/5579 + +.. code-block:: yaml + + # Example configuration entry + sensor: + - platform: MMC5603 + address: 0x30 + field_strength_x: + name: "MMC5603 Field Strength X" + field_strength_y: + name: "MMC5603 Field Strength Y" + field_strength_z: + name: "MMC5603 Field Strength Z" + heading: + name: "MMC5603 Heading" + update_interval: 60s + +Configuration variables: +------------------------ + +- **address** (*Optional*, int): Manually specify the I²C address of the sensor. Defaults to ``0x1E``. +- **field_strength_x** (*Optional*): The field strength in microtesla along the X-Axis. All options from + :ref:`Sensor `. +- **field_strength_y** (*Optional*): The field strength in microtesla along the Y-Axis. All options from + :ref:`Sensor `. +- **field_strength_z** (*Optional*): The field strength in microtesla along the Z-Axis. All options from + :ref:`Sensor `. +- **heading** (*Optional*): The heading of the sensor in degrees. All options from + :ref:`Sensor `. +- **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. + + +See Also +-------- + +- :ref:`sensor-filters` +- :doc:`template` +- :apiref:`mmc5603/mmc5603.h` +- :ghedit:`Edit` diff --git a/components/sensor/pmsx003.rst b/components/sensor/pmsx003.rst index df879a418..0ecee8b54 100644 --- a/components/sensor/pmsx003.rst +++ b/components/sensor/pmsx003.rst @@ -5,7 +5,7 @@ PMSX003 Particulate Matter Sensor :description: Instructions for setting up PMSX003 Particulate matter sensors :image: pmsx003.svg -The ``pmsx003`` sensor platform allows you to use your PMS5003, PMS7003, ... particulate matter +The ``pmsx003`` sensor platform allows you to use your Plantower PMS5003, PMS7003, ... laser based particulate matter sensors (`datasheet `__) sensors with ESPHome. @@ -18,9 +18,16 @@ value: - ``PMSX003`` for generic PMS5003, PMS7003, ...; these sensors support ``pm_1_0``, ``pm_2_5`` and ``pm_10_0`` output. - ``PMS5003S`` for PMS5003S. These support ``pm_1_0``, ``pm_2_5`` and ``pm_10_0`` and ``formaldehyde``. -- ``PMS5003T`` for PMS5003T. These support ``pm_2_5``, ``temperature`` and ``humidity``. +- ``PMS5003T`` for PMS5003T. These support ``pm_1_0``, ``pm_2_5`` and ``pm_10_0``, ``temperature`` and ``humidity``. - ``PMS5003ST`` for PMS5003ST. These support ``pm_2_5``, ``temperature``, ``humidity`` and ``formaldehyde``. +Sensor Longevity +------------------------ +The laser diode inside the PMSX003 has a lifetime of about 8000 hours, nearly one year. + +If you wish to use the optional ``update_interval`` ensure you have a ``tx_pin`` set in the UART configuration and connected to the RECEIVE/RX pin +(may also be called the TX pin, depending on the model) of the PMS. Setting ``update_interval`` to 120 seconds or higher may help extend the life span of the sensor. + .. code-block:: yaml # Example configuration entry @@ -38,34 +45,34 @@ value: name: "Particulate Matter <2.5µm Concentration" pm_10_0: name: "Particulate Matter <10.0µm Concentration" - update_interval: 60000ms + update_interval: 120s Configuration variables: ------------------------ -- **pm_1_0_std** (*Optional*): Use the concentration of particulates of size less than 1.0µm in µg per cubic meter at standard particle +- **pm_1_0_std** (*Optional*): Use the concentration of particulates of size less than 1.0µm in µg per cubic meter at standard particle. All options from :ref:`Sensor `. -- **pm_2_5_std** (*Optional*): Use the concentration of particulates of size less than 2.5µm in µg per cubic meter at standard particle +- **pm_2_5_std** (*Optional*): Use the concentration of particulates of size less than 2.5µm in µg per cubic meter at standard particle. All options from :ref:`Sensor `. -- **pm_10_0_std** (*Optional*): Use the concentration of particulates of size less than 10.0µm in µg per cubic meter at standard particle +- **pm_10_0_std** (*Optional*): Use the concentration of particulates of size less than 10.0µm in µg per cubic meter at standard particle. All options from :ref:`Sensor `. -- **pm_1_0** (*Optional*): Use the concentration of particulates of size less than 1.0µm in µg per cubic meter under atmospheric environment +- **pm_1_0** (*Optional*): Use the concentration of particulates of size less than 1.0µm in µg per cubic meter under atmospheric environment. All options from :ref:`Sensor `. -- **pm_2_5** (*Optional*): Use the concentration of particulates of size less than 2.5µm in µg per cubic meter under atmospheric environment +- **pm_2_5** (*Optional*): Use the concentration of particulates of size less than 2.5µm in µg per cubic meter under atmospheric environment. All options from :ref:`Sensor `. -- **pm_10_0** (*Optional*): Use the concentration of particulates of size less than 10.0µm in µg per cubic meter under atmospheric environment +- **pm_10_0** (*Optional*): Use the concentration of particulates of size less than 10.0µm in µg per cubic meter under atmospheric environment. All options from :ref:`Sensor `. -- **pm_0_3um** (*Optional*): Use the number of particles with diameter beyond 0.3um in 0.1L of air +- **pm_0_3um** (*Optional*): Use the number of particles with diameter beyond 0.3um in 0.1L of air. All options from :ref:`Sensor `. -- **pm_0_5um** (*Optional*): Use the number of particles with diameter beyond 0.5um in 0.1L of air +- **pm_0_5um** (*Optional*): Use the number of particles with diameter beyond 0.5um in 0.1L of air. All options from :ref:`Sensor `. -- **pm_1_0um** (*Optional*): Use the number of particles with diameter beyond 1.0um in 0.1L of air +- **pm_1_0um** (*Optional*): Use the number of particles with diameter beyond 1.0um in 0.1L of air. All options from :ref:`Sensor `. -- **pm_2_5um** (*Optional*): Use the number of particles with diameter beyond 2.5um in 0.1L of air +- **pm_2_5um** (*Optional*): Use the number of particles with diameter beyond 2.5um in 0.1L of air. All options from :ref:`Sensor `. -- **pm_5_0um** (*Optional*): Use the number of particles with diameter beyond 5.0um in 0.1L of air +- **pm_5_0um** (*Optional*): Use the number of particles with diameter beyond 5.0um in 0.1L of air. Not supported by the ``PMS5003T`` type sensors. All options from :ref:`Sensor `. -- **pm_10_0um** (*Optional*): Use the number of particles with diameter beyond 10.0um in 0.1L of air +- **pm_10_0um** (*Optional*): Use the number of particles with diameter beyond 10.0um in 0.1L of air. Not supported by the ``PMS5003T`` type sensors. All options from :ref:`Sensor `. - **temperature** (*Optional*): Use the temperature value in °C for the ``PMS5003T`` and ``PMS5003ST`` type sensors. All options from :ref:`Sensor `. diff --git a/components/spi.rst b/components/spi.rst index d6a433ced..8cac04e9c 100644 --- a/components/spi.rst +++ b/components/spi.rst @@ -41,6 +41,7 @@ Configuration variables: - **clk_pin** (**Required**, :ref:`Pin Schema `): The pin used for the clock line of the SPI bus. - **mosi_pin** (*Optional*, :ref:`Pin Schema `): The pin used for the MOSI line of the SPI bus. - **miso_pin** (*Optional*, :ref:`Pin Schema `): The pin used for the MISO line of the SPI bus. +- **force_sw** (*Optional*, boolean): Whether software implementation should be used even if hardware one is available. - **id** (*Optional*, :ref:`config-id`): Manually specify the ID for this SPI hub if you need multiple SPI hubs. See Also diff --git a/components/switch/index.rst b/components/switch/index.rst index e14ddf99c..881e4e046 100644 --- a/components/switch/index.rst +++ b/components/switch/index.rst @@ -23,6 +23,12 @@ Base Switch Configuration Configuration variables: - **name** (**Required**, string): The name of the switch. + + .. note:: + + If you have a :ref:`friendly_name ` set for your device and + you want the switch to use that name, you can set ``name: None``. + - **icon** (*Optional*, icon): Manually set the icon to use for the sensor in the frontend. - **inverted** (*Optional*, boolean): Whether to invert the binary @@ -41,11 +47,11 @@ Configuration variables: - ``RESTORE_DEFAULT_ON`` - Attempt to restore state and default to ON. - ``RESTORE_INVERTED_DEFAULT_OFF`` - Attempt to restore state inverted from the previous state and default to OFF. - ``RESTORE_INVERTED_DEFAULT_ON`` - Attempt to restore state inverted from the previous state and default to ON. - - ``ALWAYS_OFF`` - Always initialize the switch as OFF on bootup. + - ``ALWAYS_OFF`` (Default) - Always initialize the switch as OFF on bootup. - ``ALWAYS_ON`` - Always initialize the switch as ON on bootup. - - ``DISABLED`` - Does nothing and leaves it up to the downstream platform component to decide. For example, the component could read hardware and determine the state, or have a specific configuration option to regulate initial state. + - ``DISABLED`` - Does nothing and leaves it up to the downstream platform component to decide. For example, the component could read hardware and determine the state, or have a specific configuration option to regulate initial state. - Unless a specific platform defines another default value, the default is ``RESTORE_DEFAULT_OFF``. + Unless a specific platform defines another default value, the default is ``ALWAYS_OFF``. - **on_turn_on** (*Optional*, :ref:`Action `): An automation to perform when the switch is turned on. See :ref:`switch-on_turn_on_off_trigger`. diff --git a/components/text_sensor/index.rst b/components/text_sensor/index.rst index d5379c67d..c91a0997d 100644 --- a/components/text_sensor/index.rst +++ b/components/text_sensor/index.rst @@ -25,6 +25,12 @@ Base Text Sensor Configuration Configuration variables: - **name** (**Required**, string): The name for the sensor. + + .. note:: + + If you have a :ref:`friendly_name ` set for your device and + you want the text sensor to use that name, you can set ``name: None``. + - **icon** (*Optional*, icon): Manually set the icon to use for the sensor 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 @@ -145,7 +151,7 @@ The arguments are a list of substitutions, each in the form ``TO_FIND -> REPLACE ``map`` ******* -Lookup the current value of the text sensor in a list, and return the matching item if found. +Lookup the current value of the text sensor in a list, and return the matching item if found. Does not change the value of the text sensor if the current value wasn't found. diff --git a/components/voice_assistant.rst b/components/voice_assistant.rst new file mode 100644 index 000000000..8bd5c1b18 --- /dev/null +++ b/components/voice_assistant.rst @@ -0,0 +1,79 @@ +Voice Assistant +=============== + +.. seo:: + :description: Instructions for setting up a Voice Assistant in ESPHome. + :image: voice-assistant.svg + +ESPHome devices with a microphone are able to stream the audio to Home Assistant and be processed there by `assist `__. + +.. note:: + + Voice Assistant requires Home Assistant 2023.5 or later. + +Configuration: +-------------- + +.. code-block:: yaml + + microphone: + - platform: ... + id: mic_id + + voice_assistant: + microphone: mic_id + +- **microphone** (**Required**, :ref:`config-id`): The microphone to use for input. +- **on_start** (*Optional*, :ref:`Automation `): An automation to + perform when the voice assistant starts listening. +- **on_end** (*Optional*, :ref:`Automation `): An automation to perform + when the voice assistant is finished all tasks. +- **on_stt_end** (*Optional*, :ref:`Automation `): An automation to perform + when the voice assistant has finished speech-to-text. The resulting text is + available to automations as the variable ``x``. +- **on_tts_start** (*Optional*, :ref:`Automation `): An automation to perform + when the voice assistant has started text-to-speech. The text to be spoken is + available to automations as the variable ``x``. +- **on_tts_end** (*Optional*, :ref:`Automation `): An automation to perform + when the voice assistant has finished text-to-speech. A URL containing the audio response + is available to automations as the variable ``x``. +- **on_error** (*Optional*, :ref:`Automation `): An automation to perform + when the voice assistant has encountered an error. The error code and message are available to + automations as the variables ``code`` and ``message``. + +.. _voice_assistant-actions: + +Voice Assistant Actions +----------------------- + +The following actions are available for use in automations: + +- ``voice_assistant.start`` - Start listening for voice commands. +- ``voice_assistant.stop`` - Stop listening for voice commands. + + +Push to Talk +------------ + +Here is an example offering Push to Talk with a :doc:`/components/binary_sensor/index`. + +.. code-block:: yaml + + voice_assistant: + microphone: mic_id + + binary_sensor: + - platform: gpio + pin: ... + on_press: + - voice_assistant.start: + on_release: + - voice_assistant.stop: + + +See Also +-------- + +- :doc:`microphone/index` +- :apiref:`voice_assistant/voice_assistant.h` +- :ghedit:`Edit` diff --git a/conf.py b/conf.py index e2a34fce6..13647ccf8 100644 --- a/conf.py +++ b/conf.py @@ -67,9 +67,9 @@ author = "ESPHome" # built documents. # # The short X.Y version. -version = "2023.3" +version = "2023.4" # The full version, including alpha/beta/rc tags. -release = "2023.3.2" +release = "2023.4.0" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/guides/supporters.rst b/guides/supporters.rst index 78fc2f687..4c0d6ef55 100644 --- a/guides/supporters.rst +++ b/guides/supporters.rst @@ -16,6 +16,7 @@ Contributors (in alphabetical order) +- `007hacky007 (@007hacky007) `__ - `0hax (@0hax) `__ - `0x0a11c0de (@0x0a11c0de) `__ - `Denis Bodor (aka Lefinnois) (@0xDRRB) `__ @@ -26,10 +27,12 @@ Contributors - `Alessandro Campolo (@a13ssandr0) `__ - `Aalian Khan (@AalianKhan) `__ - `Adam Liddell (@aaliddell) `__ +- `Aaron Gamble (@aarongamble) `__ - `Aaron S. Jackson (@AaronJackson) `__ - `Abel Matser (@abelmatser) `__ - `Abílio Costa (@abmantis) `__ - `Antonio (@acarvajalperez) `__ +- `Avula Chandra Kiran Reddy (@ackr-8) `__ - `Zhenyu Wu (@Adam5Wu) `__ - `Chris Byrne (@adapt0) `__ - `Attila Darazs (@adarazs) `__ @@ -41,9 +44,12 @@ Contributors - `Stefan Agner (@agners) `__ - `Anders (@ahd71) `__ - `Alexander Pohl (@ahpohl) `__ +- `aidbish (@aidbish) `__ - `Airy André (@airy10) `__ +- `Airyzz (@Airyzz) `__ - `Adam Jacques (@ajacques) `__ - `Andrej Friesen (@ajfriesen) `__ +- `akennerly (@akennerly) `__ - `akoivist (@akoivist) `__ - `Andrej Komelj (@akomelj) `__ - `Alex Konradi (@akonradi) `__ @@ -58,13 +64,17 @@ Contributors - `Alex Iribarren (@alexiri) `__ - `Alex Mekkering (@AlexMekkering) `__ - `Alex (@alexyao2015) `__ +- `Alfredo (@alfredopironti) `__ - `Andreas Mandel (@amandel) `__ - `Amish Vishwakarma (@amishv) `__ +- `Amit Keret (@amitkeret) `__ - `Jason Nader (@ammgws) `__ - `Branden Cash (@ammmze) `__ - `Alexander Momchilov (@amomchilov) `__ - `anatoly-savchenkov (@anatoly-savchenkov) `__ - `andig (@andig) `__ +- `Andi Egli (@andilge) `__ +- `Kieren (@ando023) `__ - `András Bíró (@andrasbiro) `__ - `Andreas Hergert (@andreashergert1984) `__ - `Andrew J.Swan (@andrewjswan) `__ @@ -73,14 +83,17 @@ Contributors - `Andrzej (@andriej) `__ - `Andreas (@anduchs) `__ - `Andy2No (@Andy2No) `__ +- `AndyRPH (@AndyRPH) `__ - `Vegetto (@angelnu) `__ - `Sergey Anisimov (@anisimovsergey) `__ - `Nikolay Vasilchuk (@Anonym-tsk) `__ - `Anthony Keane (@anthonykeane) `__ +- `Rémi K. (@antibill51) `__ - `Antonio Fiol (@antonio-fiol) `__ - `Adriaan Peeters (@apeeters) `__ - `apendley (@apendley) `__ - `Darius Ratkevičius (@aphex008) `__ +- `aquaticus (@aquaticus) `__ - `Andy Allsopp (@arallsopp) `__ - `arantius (@arantius) `__ - `arturo182 (@arturo182) `__ @@ -88,33 +101,45 @@ Contributors - `Arya (@Arya11111) `__ - `Borys Pierov (@ashald) `__ - `Ash McKenzie (@ashmckenzie) `__ +- `ashp8i (@ashp8i) `__ - `Ashton Kemerling (@AshtonKem) `__ - `杨成锴 (@asjdf) `__ - `Pavel Pletenev (@ASMfreaK) `__ - `Andreas Soehlke (@asoehlke) `__ - `Mike Dunston (@atanisoft) `__ +- `Glenn Morrison (@atomicpapa) `__ - `Alexander Turlov (@aturlov) `__ +- `aus (@aus) `__ - `AustinMorris (@AustinMorris) `__ - `Avirsaam (@Avirsaam) `__ - `Arsène von Wyss (@avonwyss) `__ +- `Andrew Weddle (@aweddle2) `__ - `Achilleas Pipinellis (@axilleas) `__ - `Kamil Trzciński (@ayufan) `__ - `Nicholas Peters (@Azimath) `__ - `Daniel (@azrael783) `__ - `B48D81EFCC (@B48D81EFCC) `__ - `Florian Mösch (@badbadc0ffee) `__ +- `Baden (@baden03) `__ - `Marco Tombesi (@baggior) `__ - `balk77 (@balk77) `__ - `Paulus Schoutsen (@balloob) `__ - `Andrew Zaborowski (@balrog-kun) `__ - `BarryMar (@BarryMar) `__ +- `bartoszpierzchlewicz (@bartoszpierzchlewicz) `__ +- `BartoszPierzchlewiczMacrix (@BartoszPierzchlewiczMacrix) `__ - `Bascht74 (@Bascht74) `__ - `Viktr (@BbIKTOP) `__ - `J. Nick Koston (@bdraco) `__ - `Maxim Ocheretianko (@bearpawmaxim) `__ +- `beaudeanadams (@beaudeanadams) `__ - `Benjamin Freeman (@Beetix) `__ +- `beikeland (@beikeland) `__ +- `Ben-Schwabe (@Ben-Schwabe) `__ +- `Ben Hoff (@benhoff) `__ - `Benno Pütz (@bennop) `__ - `Benoit3 (@Benoit3) `__ +- `Ben Shaner (@bens545) `__ - `Ben Suffolk (@bensuffolk) `__ - `Berend Haan (@berendhaan) `__ - `Arturo Casal (@berfenger) `__ @@ -122,22 +147,29 @@ Contributors - `Bert Hertogen (@berthertogen) `__ - `Ivan Bessarabov (@bessarabov) `__ - `Brandon (@bgulla) `__ +- `Benedikt Hübschen (@bhuebschen) `__ - `Bierchermuesli (@Bierchermuesli) `__ - `Bill Church (@billchurch) `__ - `Brian Kaufman (@bkaufx) `__ - `JDavid (@blackhack) `__ - `blakadder (@blakadder) `__ - `Branimir Lambov (@blambov) `__ +- `bleeisme (@bleeisme) `__ - `Jim Ekman (@blejdfist) `__ - `Scott Smith (@blurfl) `__ - `Bob (@Bmooij) `__ - `Benjamin Klotz (@bnw) `__ +- `Bob Kersten (@bobkersten) `__ - `Bodmer (@Bodmer) `__ +- `Anthony Todd (@bohregard) `__ +- `Bomaker (@Bomaker) `__ - `Mauricio Bonani (@bonanitech) `__ - `Casey Olson (@bookcasey) `__ +- `Borja Burgos (@borjaburgos) `__ - `BoukeHaarsma23 (@BoukeHaarsma23) `__ - `brambo123 (@brambo123) `__ - `Bram Kragten (@bramkragten) `__ +- `Brandan Cotton (@Brando47) `__ - `Brad Davidson (@brandond) `__ - `Daniel H Brown (@brauhausdc) `__ - `Jens Bretschneider (@breti) `__ @@ -147,36 +179,52 @@ Contributors - `brianrjones69 (@brianrjones69) `__ - `Ben Brooks (@brooksben11) `__ - `buddydvd (@buddydvd) `__ +- `Matt Burke (@burkemw3) `__ - `Jon Little (@burundiocibu) `__ - `buxtronix (@buxtronix) `__ - `bvansambeek (@bvansambeek) `__ +- `c0ffeeca7 (@c0ffeeca7) `__ +- `Captain Haddock (@ca-haddock) `__ - `Cal Howard (@calhoward) `__ +- `callacomp (@callacomp) `__ +- `Callum Gare (@callumgare) `__ - `Carlos Gustavo Sarmiento (@carlos-sarmiento) `__ - `Carlos Garcia Saura (@CarlosGS) `__ - `Carlos Ruiz (@CarlosRDomin) `__ +- `carlywarly (@carlywarly) `__ - `carstenschroeder (@carstenschroeder) `__ - `Valentin Ochs (@Cat-Ion) `__ - `Stroe Andrei Catalin (@catalin2402) `__ - `cbialobos (@cbialobos) `__ +- `Cameron Bulock (@cbulock) `__ - `Ciprian Constantinescu (@cciprian5) `__ +- `cdmonk (@cdmonk) `__ +- `ceaswaran (@ceaswaran) `__ - `Cellie (@CelliesProjects) `__ - `Chris Feenstra (@cfeenstra1024) `__ +- `cg089 (@cg089) `__ - `Kostas Chatzikokolakis (@chatziko) `__ +- `Audric Schiltknecht (@chemicalstorm) `__ - `chris-jennings (@chris-jennings) `__ - `Chris (@chrismaki) `__ - `Christoph Wagner (@Christoph-Wagner) `__ - `Christian Taedcke (@chrta) `__ - `Pavel Skuratovich (@Chupaka) `__ - `Chris Johnson (@ciband) `__ +- `CircuitGuy (@CircuitGuy) `__ - `John (@CircuitSetup) `__ - `Colby Rome (@cisasteelersfan) `__ - `Chris Debenham (@cjd) `__ - `Chester (@clowrey) `__ +- `Colin McCambridge (@cmccambridge) `__ - `Clifford Roche (@cmroche) `__ - `Casey Burnett (@codeangler) `__ - `CODeRUS (@CODeRUS) `__ +- `Alex Miller (@Codex-) `__ - `Cody James (@codyjamestechnical) `__ +- `Ashton Lafferty (@cogneato) `__ - `Colin Leroy-Mira (@colinleroy) `__ +- `Max (@coltoncat) `__ - `Conclusio (@Conclusio) `__ - `John Coggeshall (@coogle) `__ - `James Crook (@cooljimy84) `__ @@ -189,20 +237,28 @@ Contributors - `Connor Prussin (@cprussin) `__ - `Corey Rice (@crice009) `__ - `cryptelli (@cryptelli) `__ +- `Christian Schwarzgruber (@cslux) `__ - `cstaahl (@cstaahl) `__ - `Chris Talkington (@ctalkington) `__ - `Massimo Cetra (@ctrix) `__ - `cvwillegen (@cvwillegen) `__ - `Christoph Wempe (@CWempe) `__ +- `Steven Webb (@cy1701) `__ - `Alex Solomaha (@CyanoFresh) `__ - `Luar Roji (@cyberplant) `__ +- `Petr Diviš (@czechdude) `__ - `Aleš Komárek (@cznewt) `__ +- `d-rez (@d-rez) `__ - `Dale Higgs (@dale3h) `__ - `damanti-me (@damanti-me) `__ +- `Dan C Williams (@dancwilliams) `__ - `Daniel Bjørnbakk (@danibjor) `__ - `Daniel Kucera (@danielkucera) `__ +- `Daniel O'Connor (@DanielO) `__ - `Daniel Rheinbay (@danielrheinbay) `__ - `Daniel Schramm (@danielschramm) `__ +- `Daniel Martin Gonzalez (@danimart1991) `__ +- `danlimlu (@danlimlu) `__ - `Chris (@darthsebulba04) `__ - `Dan Gentry (@dashdrum) `__ - `Aliasghar Dashkhaneh (@dashkhaneh) `__ @@ -215,13 +271,16 @@ Contributors - `David De Sloovere (@DavidDeSloovere) `__ - `David Beitey (@davidjb) `__ - `David Newgas (@davidn) `__ +- `David Noyes (@davidnoyes) `__ - `David Zovko (@davidzovko) `__ - `Davy Landman (@DavyLandman) `__ +- `Dawid Cieszyński (@dawidcieszynski) `__ - `Darren Tucker (@daztucker) `__ - `Donovan Baarda (@dbaarda) `__ - `David Buezas (@dbuezas) `__ - `dckiller51 (@dckiller51) `__ - `Daniel Correa Lobato (@dclobato) `__ +- `DeadEnd (@DeadEnded) `__ - `Debashish Sahu (@debsahu) `__ - `declanshanaghy (@declanshanaghy) `__ - `Maximilian (@DeerMaximum) `__ @@ -237,7 +296,9 @@ Contributors - `Deun Lee (@deunlee) `__ - `Develo (@devyte) `__ - `Dezorian (@Dezorian) `__ +- `Damian Gołda (@dgolda) `__ - `Dan Halbert (@dhalbert) `__ +- `Dustin L. Howett (@DHowett) `__ - `Alain Turbide (@Dilbert66) `__ - `Mark (@Diramu) `__ - `Dirk Heinke (@DirkHeinke) `__ @@ -254,19 +315,24 @@ Contributors - `Dorian Zedler (@dorianim) `__ - `Mark Dietzer (@Doridian) `__ - `Jiang Sheng (@doskoi) `__ +- `Artem Sheremet (@dotdoom) `__ - `Robert Schütz (@dotlambda) `__ - `Daniel Hyles (@DotNetDann) `__ - `dr-oblivium (@dr-oblivium) `__ - `Drew Perttula (@drewp) `__ - `drmpf (@drmpf) `__ +- `drogfild (@drogfild) `__ - `DrRob (@DrRob) `__ - `Daniel Müller (@dtmuller) `__ +- `Tom Soer (@dtx3k) `__ - `dubit0 (@dubit0) `__ - `Mikkel Jeppesen (@Duckle29) `__ - `Sergey V. DUDANOV (@dudanov) `__ - `David Girón (@duhow) `__ - `Duncan Findlay (@duncf) `__ - `Jannick (@DutchDeffy) `__ +- `David van der Leij (@dvanderleij) `__ +- `dxta1986 (@dxta1986) `__ - `dyarkovoy (@dyarkovoy) `__ - `Janez Troha (@dz0ny) `__ - `Dimitris Zervas (@dzervas) `__ @@ -279,10 +345,13 @@ Contributors - `Eduardo Pérez (@eduperez) `__ - `Eenoo (@Eenoo) `__ - `Eli Fidler (@efidler) `__ +- `egandro (@egandro) `__ - `Erwin Kooi (@egeltje) `__ - `Eike (@ei-ke) `__ - `Elazar Leibovich (@elazarl) `__ +- `Eli Yu (@elizhyu) `__ - `Elkropac (@Elkropac) `__ +- `Elliot Wood (@elliot-wood) `__ - `Joakim Plate (@elupus) `__ - `EmbeddedDevver (@EmbeddedDevver) `__ - `EmmanuelLM (@EmmanuelLM) `__ @@ -293,6 +362,7 @@ Contributors - `Bert (@Engelbert) `__ - `Nico Weichbrodt (@envy) `__ - `Evan Petousis (@epetousis) `__ +- `Josh Gwosdz (@erdii) `__ - `Eric Coffman (@ericbrian) `__ - `Eric Hiller (@erichiller) `__ - `Matt Hamilton (@Eriner) `__ @@ -307,20 +377,27 @@ Contributors - `Evgeni Golov (@evgeni) `__ - `Expaso (@Expaso) `__ - `Malte Franken (@exxamalte) `__ +- `f0rdprefect (@f0rdprefect) `__ - `Fabian Affolter (@fabaff) `__ - `Fabian (@Fabian-Schmidt) `__ - `Federico Ariel Castagnini (@facastagnini) `__ - `C W (@fake-name) `__ - `Florian idB (@fbeek) `__ - `Fabian Berthold (@fbrthld) `__ +- `felixlungu (@felixlungu) `__ - `Felix Storm (@felixstorm) `__ - `Christian Ferbar (@ferbar) `__ - `FeuerSturm (@FeuerSturm) `__ +- `Florian Golemo (@fgolemo) `__ - `Frank Riley (@fhriley) `__ +- `finity69x2 (@finity69x2) `__ - `Frédéric Jouault (@fjouault) `__ - `Sean Vig (@flacjacket) `__ - `Diego Elio Pettenò (@Flameeyes) `__ - `Flaviu Tamas (@flaviut) `__ +- `fluffymadness (@fluffymadness) `__ +- `fluffymonster (@fluffymonster) `__ +- `flyize (@flyize) `__ - `风飘雨 (@flyrainning) `__ - `Fractal147 (@Fractal147) `__ - `Francis-labo (@Francis-labo) `__ @@ -333,6 +410,7 @@ Contributors - `Evgeny (@freekode) `__ - `Brett McKenzie (@freerangeeggs) `__ - `Franck Nijhof (@frenck) `__ +- `Kenneth Fribert (@fribse) `__ - `frippe75 (@frippe75) `__ - `Fritz Mueller (@fritzm) `__ - `Florian Trück (@ftrueck) `__ @@ -350,6 +428,8 @@ Contributors - `Gérald Guiony (@gerald-guiony) `__ - `Gerard (@gerard33) `__ - `Giampiero Baggiani (@giampiero7) `__ +- `Gideon Kanikevich (@gid204) `__ +- `Giel Janssens (@gieljnssns) `__ - `Giovanni (@Gio-dot) `__ - `GitforZhangXL (@GitforZhangXL) `__ - `github-actions[bot] (@github-actions[bot]) `__ @@ -362,45 +442,62 @@ Contributors - `Germain Masse (@gmasse) `__ - `Garret Buell (@gmbuell) `__ - `Jelle Raaijmakers (@GMTA) `__ +- `Go0oSer (@Go0oSer) `__ - `Gonzalo Paniagua Javier (@gonzalop) `__ - `gordon-zhao (@gordon-zhao) `__ - `Gustavo Ambrozio (@gpambrozio) `__ +- `Granville Barker (@granvillebarker) `__ - `Antoine GRÉA (@grea09) `__ +- `Greg Arnold (@GregJArnold) `__ +- `Greg MacLellan (@gregmac) `__ - `Gil Peeters (@grillp) `__ - `George (@grob6000) `__ +- `groovejumper (@groovejumper) `__ - `gsexton (@gsexton) `__ - `Gabriel Sieben (@gsieben) `__ - `Jadson Santos (@gtjadsonsantos) `__ +- `guardmedia (@guardmedia) `__ - `Guillaume DELVIT (@guiguid) `__ - `guillempages (@guillempages) `__ - `Guyohms (@Guyohms) `__ - `Gilles van den Hoven (@gvdhoven) `__ +- `h0jeZvgoxFepBQ2C (@h0jeZvgoxFepBQ2C) `__ - `h3ndrik (@h3ndrik) `__ +- `Andi (@h4de5) `__ - `haade (@haade-administrator) `__ - `Peter van Dijk (@Habbie) `__ - `Hagai Shatz (@hagai-shatz) `__ - `Boris Hajduk (@hajdbo) `__ - `Gavin Mogan (@halkeye) `__ - `Charles (@hallard) `__ +- `Alex Griffith (@halomademeapc) `__ +- `Aniket (@HandyHat) `__ - `Charles Thompson (@haryadoon) `__ - `Ha Thach (@hathach) `__ - `hcoohb (@hcoohb) `__ - `Héctor Giménez (@hectorgimenez) `__ - `Jimmy Hedman (@HeMan) `__ +- `Hemi03 (@Hemi03) `__ - `HepoH3 (@HepoH3) `__ - `Hermann Kraus (@herm) `__ +- `Herr Frei (@herrfrei) `__ +- `highground88 (@highground88) `__ - `Hamish Moffatt (@hmoffatt) `__ - `Marcel Hoppe (@hobbypunk90) `__ - `MoA (@honomoa) `__ - `Hopperpop (@Hopperpop) `__ - `Yang Hau (@howjmay) `__ +- `hpineapples (@hpineapples) `__ - `Antonio Vanegas (@hpsaturn) `__ - `hreintke (@hreintke) `__ - `Jan Hubík (@hubikj) `__ - `Huub Eikens (@huubeikens) `__ - `Steve Rodgers (@hwstar) `__ +- `hificat (@hzkincony) `__ - `Arjan Filius (@iafilius) `__ +- `Iain Hay (@IainPHay) `__ - `Adrián Panella (@ianchi) `__ +- `Ian Anderson (@ianderso) `__ - `Ian Leeder (@ianleeder) `__ - `Jan Pobořil (@iBobik) `__ - `igg (@igg) `__ @@ -408,28 +505,38 @@ Contributors - `Petko Bordjukov (@ignisf) `__ - `ikatkov (@ikatkov) `__ - `iKK001 (@iKK001) `__ +- `ilium007 (@ilium007) `__ - `imgbot[bot] (@imgbot[bot]) `__ - `ImSorryButWho (@ImSorryButWho) `__ - `Dom (@Ing-Dom) `__ +- `Ingo Becker (@ingobecker) `__ - `Ingurum (@Ingurum) `__ +- `IoT-devices LLC (@iotdevicesdev) `__ - `Ivo Roefs (@ironirc) `__ - `irtimaled (@irtimaled) `__ - `Ingo Theiss (@itn3rd77) `__ - `Ivan Shvedunov (@ivan4th) `__ - `Ivan Kravets (@ivankravets) `__ +- `Ivan Lisenkov (@ivlis) `__ - `Ivo-tje (@Ivo-tje) `__ +- `J0RD4N300 (@J0RD4N300) `__ - `Fredrik Gustafsson (@jagheterfredrik) `__ - `Jan Harkes (@jaharkes) `__ +- `Jake Shirley (@JakeShirley) `__ - `Jakob Reiter (@jakommo) `__ - `James Braid (@jamesbraid) `__ - `James Duke (@jamesduke) `__ - `James Gao (@jamesgao) `__ +- `James Hirka (@jameshirka) `__ - `James Lakin (@jamesorlakin) `__ - `James Swift (@JamesSwift) `__ +- `Jason (@jamman9000) `__ - `Juraj Andrássy (@JAndrassy) `__ +- `Delio Castillo (@jangeador) `__ - `Jan Grewe (@jangrewe) `__ - `János Rusiczki (@janosrusiczki) `__ - `Jan Pieper (@janpieper) `__ +- `Jared Ring (@jaredring) `__ - `Jarek.P (@JaroslawPrzybyl) `__ - `Jason-nz (@Jason-nz) `__ - `Jason2866 (@Jason2866) `__ @@ -450,6 +557,7 @@ Contributors - `Jeff Rescignano (@JeffResc) `__ - `Jej (@jej) `__ - `Jens-Christian Skibakk (@jenscski) `__ +- `Jeremy Willans (@jeremywillans) `__ - `Jeroen (@jeroen85) `__ - `Jérôme Laban (@jeromelaban) `__ - `Jesse Hills (@jesserockz) `__ @@ -458,6 +566,7 @@ Contributors - `Jan Pieter Waagmeester (@jieter) `__ - `Jim Bauwens (@jimbauwens) `__ - `jimtng (@jimtng) `__ +- `jivesinger (@jivesinger) `__ - `Jérémy JOURDIN (@JJK801) `__ - `Jonathan Jefferies (@jjok) `__ - `John K. Luebs (@jkl1337) `__ @@ -465,14 +574,18 @@ Contributors - `Jeppe Ladefoged (@jladefoged) `__ - `Jean-Luc Béchennec (@jlbirccyn) `__ - `Jonas De Kegel (@jlsjonas) `__ +- `Jeff Anderson (@jman203) `__ - `Jonathan Martens (@jmartens) `__ - `jmichiel (@jmichiel) `__ +- `Jonathas Barbosa (@jnthas) `__ - `Joe Gross (@joegross) `__ - `Johan van der Kuijl (@johanvanderkuijl) `__ - `Johboh (@Johboh) `__ - `John Britton (@johndbritton) `__ - `John Erik Halse (@johnerikhalse) `__ - `John Moxley (@johnmoxley) `__ +- `Dave Johnston (@johnsto) `__ +- `joiboi (@joiboi) `__ - `JonasEr (@JonasEr) `__ - `Jonathan Adams (@jonathanadams) `__ - `Jonathan Treffler (@JonathanTreffler) `__ @@ -481,10 +594,12 @@ Contributors - `Joppy (@JoppyFurr) `__ - `Jared Sanson (@jorticus) `__ - `Joshua Spence (@joshuaspence) `__ +- `joskfg (@joskfg) `__ - `Joscha Wagner (@jowgn) `__ - `Javier Peletier (@jpeletier) `__ - `jsuanet (@jsuanet) `__ - `James Szalay (@jtszalay) `__ +- `Jules-R (@Jules-R) `__ - `Julie Koubová (@juliekoubova) `__ - `Justahobby01 (@Justahobby01) `__ - `Mike Ryan (@justfalter) `__ @@ -495,10 +610,12 @@ Contributors - `Jack Wozny (@jwozny) `__ - `Jozef Zuzelka (@jzlka) `__ - `Kris (@K-r-i-s-t-i-a-n) `__ +- `k0rtina (@k0rtina) `__ - `Harald Nagel (@k7hpn) `__ - `kaegi (@kaegi) `__ - `kahrendt (@kahrendt) `__ - `Kamahat (@kamahat) `__ +- `Karl0ss (@karl0ss) `__ - `Karol Zlot (@karolzlot) `__ - `Kattni (@kattni) `__ - `Krasimir Nedelchev (@kaykayehnn) `__ @@ -506,17 +623,25 @@ Contributors - `Keilin Bickar (@kbickar) `__ - `Keith Burzinski (@kbx81) `__ - `Ken Piper (@Kealper) `__ -- `Robert Kiss (@kepten) `__ +- `Kelvie Wong (@kelvie) `__ +- `Kenny Stier (@KennyStier) `__ +- `kernelpanic85 (@kernelpanic85) `__ - `Kevin O'Rourke (@kevinior) `__ +- `kevlar10 (@kevlar10) `__ +- `kfulko (@kfulko) `__ - `Kai Gerken (@KG3RK3N) `__ +- `kghandi (@kghandi) `__ - `Khoi Hoang (@khoih-prog) `__ +- `Kilowatt (@Kilowatt-W) `__ - `Ed (@kixtarter) `__ - `Kurt Kellner (@kkellner) `__ - `Klaas Schoute (@klaasnicolaas) `__ - `Klarstein (@Klarstein) `__ - `Marcus Klein (@kleini) `__ - `Kevin Lewis (@kll) `__ +- `KNXBroker (@KNXBroker) `__ - `Koen Vervloesem (@koenvervloesem) `__ +- `kokangit (@kokangit) `__ - `Petr Vraník (@konikvranik) `__ - `Kevin Pelzel (@kpelzel) `__ - `Karl Q. (@kquinsland) `__ @@ -524,24 +649,26 @@ Contributors - `KristopherMackowiak (@KristopherMackowiak) `__ - `kroimon (@kroimon) `__ - `krunkel (@krunkel) `__ +- `kryptonitecb3 (@kryptonitecb3) `__ - `Kendell R (@KTibow) `__ - `Kuba Szczodrzyński (@kuba2k2) `__ - `Jakub Šimo (@kubik369) `__ +- `Mark Kuchel (@kuchel77) `__ - `Ken Davidson (@kwdavidson) `__ -- `Kyle Hendricks (@kylehendricks) `__ -- `Kyle Manna (@kylemanna) `__ +- `Kyle Hill (@kylhill) `__ - `Kalashnikov Ilya (@l1bbcsg) `__ - `Limor "Ladyada" Fried (@ladyada) `__ -- `Lakshantha Dissanayake (@lakshanthad) `__ - `Luca Adrian L (@lal12) `__ - `Fredrik Lindqvist (@Landrash) `__ +- `Lawrie George (@lawriege) `__ - `Laszlo Gazdag (@lazlyhu) `__ +- `Ludovic BOUÉ (@lboue) `__ - `lcavalli (@lcavalli) `__ - `Craig Fletcher (@leakypixel) `__ - `Dominik Wagenknecht (@LeDominik) `__ - `Benny de Leeuw (@leeuwte) `__ - `Leonardo La Rocca (@leoli51) `__ -- `Lerosen (@Lerosen) `__ +- `Leo Winter (@LeoWinterDE) `__ - `Leon Loopik (@Lewn) `__ - `Luca Gugelmann (@lgugelmann) `__ - `Lubos Horacek (@lhoracek) `__ @@ -549,6 +676,7 @@ Contributors - `lillborje71 (@lillborje71) `__ - `lingex (@lingex) `__ - `lkomurcu (@lkomurcu) `__ +- `loadrunner42 (@loadrunner42) `__ - `Lazar Obradovic (@lobradov) `__ - `Barry Loong (@loongyh) `__ - `Michael Bisbjerg (@LordMike) `__ @@ -556,6 +684,9 @@ Contributors - `Joakim Sørensen (@ludeeus) `__ - `ludrao (@ludrao) `__ - `Lukas Klass (@LukasK13) `__ +- `Łukasz Świtaj (@lukaszswitaj) `__ +- `Luke (@Lukeskaiwalker) `__ +- `Jayden (@lukyjay) `__ - `Lumpusz (@Lumpusz) `__ - `Ohad Lutzky (@lutzky) `__ - `Luke Fitzgerald (@lwfitzgerald) `__ @@ -565,24 +696,31 @@ Contributors - `Marc-Antoine Courteau (@macourteau) `__ - `Massimiliano Ravelli (@madron) `__ - `Alexandre-Jacques St-Jacques (@Maelstrom96) `__ +- `Scott Cappellani (@maeneak) `__ - `Magnus Nordlander (@magnusnordlander) `__ - `majbthrd (@majbthrd) `__ - `Major Péter (@majorpeter) `__ +- `Kasper Malfroid (@malfroid) `__ +- `Malle355 (@Malle355) `__ - `raymonder jin (@mamil) `__ - `Manuel Díez (@manutenfruits) `__ +- `marcelolcosta (@marcelolcosta) `__ - `Marcel van der Veldt (@marcelveldt) `__ - `Marc (@MarcHagen) `__ +- `marcinkowalczyk (@marcinkowalczyk) `__ - `Marcio Granzotto Rodrigues (@marciogranzotto) `__ - `marecabo (@marecabo) `__ - `Ben Marengo (@marengaz) `__ - `Marvin Gaube (@margau) `__ - `maringeph (@maringeph) `__ - `Mario (@mario-tux) `__ +- `Mark Schabacker (@markschabacker) `__ - `Marek Marczykowski-Górecki (@marmarek) `__ - `marsjan155 (@marsjan155) `__ - `Martin (@martgras) `__ - `Martin Hjelmare (@MartinHjelmare) `__ - `MartinWelsch (@MartinWelsch) `__ +- `M-A (@maruel) `__ - `MasterTim17 (@MasterTim17) `__ - `Christopher Masto (@masto) `__ - `Mat931 (@Mat931) `__ @@ -595,28 +733,38 @@ Contributors - `Matus Ivanecky (@maty535) `__ - `Maximilian Gerhardt (@maxgerhardt) `__ - `mbo18 (@mbo18) `__ +- `mcmuller (@mcmuller) `__ +- `Miguel Diaz Gonçalves (@mdiazgoncalves) `__ - `Matthew Donoughe (@mdonoughe) `__ - `Me No Dev (@me-no-dev) `__ - `Alexandr Zarubkin (@me21) `__ - `Joseph Mearman (@Mearman) `__ - `mechanarchy (@mechanarchy) `__ - `Bas (@Mechazawa) `__ +- `megabitdragon (@megabitdragon) `__ - `meijerwynand (@meijerwynand) `__ - `Marco (@Melkor82) `__ - `Merlin Schumacher (@merlinschumacher) `__ - `Martin Flasskamp (@MFlasskamp) `__ - `Michael Gorven (@mgorven) `__ +- `Jörg Thalheim (@Mic92) `__ - `Michael Muré (@MichaelMure) `__ - `Micha Nordmann (@Michanord) `__ +- `Michel Munzert (@michelde) `__ - `Pauline Middelink (@middelink) `__ +- `Mike_Went (@MikeWent) `__ - `Mikko Tervala (@MikkoTervala) `__ - `MiKuBB (@MiKuBB) `__ - `André Klitzing (@misery) `__ - `Tomasz (@Misiu) `__ +- `mjbogusz (@mjbogusz) `__ - `Matthew Garrett (@mjg59) `__ - `Morton Jonuschat (@mjonuschat) `__ - `mjoshd (@mjoshd) `__ +- `Matt Kaatman (@mkaatman) `__ +- `Marcel Karger (@mkar1984) `__ - `mknjc (@mknjc) `__ +- `Matthew Kosmoski (@mkosmo) `__ - `Maurice Makaay (@mmakaay) `__ - `mmanza (@mmanza) `__ - `mnltake (@mnltake) `__ @@ -628,6 +776,8 @@ Contributors - `Morgan Robertson (@mrgnr) `__ - `Mariusz Kryński (@mrk-its) `__ - `Michael Davidson (@MrMDavidson) `__ +- `Murray Scott (@mscottco) `__ +- `MSe-5-14 (@MSe-5-14) `__ - `mtl010957 (@mtl010957) `__ - `mulcmu (@mulcmu) `__ - `Martin Murray (@murrayma) `__ @@ -642,6 +792,7 @@ Contributors - `Erik Näsström (@Naesstrom) `__ - `H. Árkosi Róbert (@nagyrobi) `__ - `Viktor Nagy (@nagyv) `__ +- `NanoSector (@NanoSector) `__ - `Oskar Napieraj (@napieraj) `__ - `Nate Lust (@natelust) `__ - `ueno (@nayuta-ueno) `__ @@ -654,24 +805,31 @@ Contributors - `Nick B. (@NickB1) `__ - `nickrout (@nickrout) `__ - `Nick Whyte (@nickw444) `__ +- `Nicky Ivy (@nickyivyca) `__ - `NP v/d Spek (@nielsnl68) `__ +- `Niels Zeilemaker (@NielsZeilemaker) `__ - `Joakim Vindgard (@nigobo) `__ - `nikito7 (@nikito7) `__ - `niklasweber (@niklasweber) `__ - `Niorix (@Niorix) `__ - `Zvonimir Haramustek (@nitko12) `__ +- `Nixspers (@Nixspers) `__ - `Dennis (@Nizzle) `__ - `nldroid (@nldroid) `__ - `Niccolò Maggioni (@nmaggioni) `__ +- `nmeachen (@nmeachen) `__ - `Jan Sandbrink (@NobodysNightmare) `__ +- `Álvaro Fernández Rojas (@Noltari) `__ - `Łukasz Śliwiński (@nonameplum) `__ - `Greg Johnson (@notgwj) `__ - `nouser2013 (@nouser2013) `__ +- `Nick (@ntompson) `__ - `Stephen Edgar (@ntwb) `__ - `Stanislav Meduna (@numo68) `__ - `Nuno Sousa (@nunofgs) `__ - `Maksym Lunin (@nut-code-monkey) `__ - `Chris Nussbaum (@nuttytree) `__ +- `Michał Sochoń (@nvtkaszpir) `__ - `Nathaniel Wesley Filardo (@nwf) `__ - `obrain17 (@obrain17) `__ - `Ockert Marais (@OckertM) `__ @@ -679,12 +837,14 @@ Contributors - `Andrey Ganzevich (@odya) `__ - `ogatatsu (@ogatatsu) `__ - `Oğuzhan Başer (@oguzhanbaser) `__ +- `OkhammahkO (@OkhammahkO) `__ - `Omar Ghader (@omarghader) `__ - `Ömer Şiar Baysal (@omersiar) `__ - `optimusprimespace (@optimusprimespace) `__ - `Oscar Bolmsten (@oscar-b) `__ - `Otamay (@Otamay) `__ - `Otto Winter (@OttoWinter) `__ +- `Maxime Dufour (@outscale-mdr) `__ - `Ben Owen (@owenb321) `__ - `Oxan van Leeuwen (@oxan) `__ - `Pablo Clemente Maseda (@paclema) `__ @@ -698,21 +858,30 @@ Contributors - `Paul Nicholls (@pauln) `__ - `Bartłomiej Biernacki (@pax0r) `__ - `Paul Doidge (@pdoidge) `__ +- `peddamat (@peddamat) `__ - `pedjas (@pedjas) `__ +- `pedrobsm (@pedrobsm) `__ - `per1234 (@per1234) `__ +- `David (@perldj) `__ - `Peter Valkov (@peter-valkov) `__ - `Peter Galantha (@peterg79) `__ - `Peter Halicky (@peterhalicky) `__ +- `Philippe Delodder (@phdelodder) `__ +- `philbowers (@philbowers) `__ - `Philippe FOUQUET (@Philippe12) `__ +- `Philip Rosenberg-Watt (@PhilRW) `__ - `pieterbrink123 (@pieterbrink123) `__ - `Piotr Kubiak (@piotr-kubiak) `__ - `Peter Kuehne (@pkuehne) `__ - `Plácido Revilla (@placidorevilla) `__ - `Marcus Kempe (@plopp) `__ +- `Jan Pluskal (@pluskal) `__ - `DK (@poldim) `__ +- `poloswiss (@poloswiss) `__ - `Pontus Oldberg (@PontusO) `__ - `poptix (@poptix) `__ - `Iván Povedano (@pove) `__ +- `Peter Provost (@PProvost) `__ - `probonopd (@probonopd) `__ - `Mike Lynch (@Prow7) `__ - `Peter Tatrai (@ptatrai) `__ @@ -722,6 +891,7 @@ Contributors - `Alex (@pxe-la) `__ - `[pʲɵs] (@pyos) `__ - `Qc (@qc24) `__ +- `Quinn Casey (@qcasey) `__ - `Karol Zlot (@qqgg231) `__ - `Tommy Jonsson (@quazzie) `__ - `Quentin Smith (@quentinmit) `__ @@ -735,14 +905,21 @@ Contributors - `Florian Ragwitz (@rafl) `__ - `Rai-Rai (@Rai-Rai) `__ - `randomllama (@randomllama) `__ +- `Marc Seeger (@rb2k) `__ - `rbaron (@rbaron) `__ - `Robert Cambridge (@rcambrj) `__ - `Rebbe Pod (@RebbePod) `__ +- `reddn (@reddn) `__ - `Alex (@redwngsrul) `__ +- `Refferic (@Refferic) `__ - `Regev Brody (@regevbr) `__ - `Alex Reid (@reidprojects) `__ +- `RenierM26 (@RenierM26) `__ - `Reuben (@reubn) `__ - `Robin Pronk (@rfpronk) `__ +- `Robert Gabrielson (@rgabrielson11) `__ +- `Rafael Goes (@rgriffogoes) `__ +- `rheinz (@rheinz) `__ - `richardhopton (@richardhopton) `__ - `Richard Klingler (@richardklingler) `__ - `Richard Lewis (@richrd) `__ @@ -750,47 +927,60 @@ Contributors - `rjlexx (@rjlexx) `__ - `René Klomp (@rklomp) `__ - `rlowens (@rlowens) `__ -- `LMR (@rmooreID) `__ - `Ryan Mounce (@rmounce) `__ - `rnauber (@rnauber) `__ - `Rob Deutsch (@rob-deutsch) `__ -- `Rob de Jonge (@robdejonge) `__ - `Robert Alfaro (@robert-alfaro) `__ - `Rob Gridley (@robgridley) `__ -- `Robin Smidsrød (@robinsmidsrod) `__ +- `Robinson1999 (@Robinson1999) `__ - `RoboMagus (@RoboMagus) `__ -- `Roi Tagar (@roitagar) `__ +- `Roeland Lutters (@Roeland54) `__ +- `RoganDawes (@RoganDawes) `__ - `Jérôme W. (@RomRider) `__ +- `roscoegray (@roscoegray) `__ - `rotarykite (@rotarykite) `__ - `Bob Perciaccante (@rperciaccante) `__ - `rradar (@rradar) `__ - `rspaargaren (@rspaargaren) `__ - `rsumner (@rsumner) `__ -- `Ruben De Smet (@rubdos) `__ - `@RubenKelevra (@RubenKelevra) `__ - `RubyBailey (@RubyBailey) `__ +- `Rus Ti (@Rusti-gotrage) `__ - `rweather (@rweather) `__ +- `Ryan Lang (@ryan-lang) `__ - `ryanalden (@ryanalden) `__ +- `Lukas Bachschwell (@s00500) `__ +- `Sabesto (@Sabesto) `__ - `Jan Čermák (@sairon) `__ +- `Sam Turner (@samturner3) `__ +- `Sender (@sanderlv) `__ - `sascha lammers (@sascha432) `__ +- `sbur83 (@sbur83) `__ - `Søren Christian Aarup (@scaarup) `__ - `Matthew Schinckel (@schinckel) `__ - `Nils Schulte (@Schnilz) `__ - `Wolle (@schreibfaul1) `__ - `Ville Skyttä (@scop) `__ - `Jeremy Pack (@scriptengine) `__ +- `Sean True (@seantrue) `__ - `sebcaps (@sebcaps) `__ - `Stefan Seyfried (@seife) `__ - `SenexCrenshaw (@SenexCrenshaw) `__ +- `Jason Sepinsky (@Sepinsky) `__ +- `Sergey Popov (@Sergey-SRG) `__ - `Sergio Mayoral Martínez (@sermayoral) `__ +- `Seth Girvan (@sethgirvan) `__ - `Emanuele Tessore (@setola) `__ - `Abdelkader Boudih (@seuros) `__ - `SharkSharp (@SharkSharp) `__ +- `Sebastiaan (@SharkWipf) `__ - `Fabio Todaro (@SharpEdgeMarshall) `__ - `ShellAddicted (@ShellAddicted) `__ - `sherbang (@sherbang) `__ - `Shish (@shish) `__ +- `signix (@signix) `__ - `SiliconAvatar (@SiliconAvatar) `__ +- `Mark Lopez (@Silvenga) `__ - `Francisco J. Solis (@sisco0) `__ - `Derek Hageman (@Sizurka) `__ - `Stephen Tierney (@sjtrny) `__ @@ -804,6 +994,8 @@ Contributors - `Sourabh Jaiswal (@sourabhjaiswal) `__ - `Philip Allgaier (@spacegaier) `__ - `spacemanspiff2007 (@spacemanspiff2007) `__ +- `sparkydave1981 (@sparkydave1981) `__ +- `spattinson (@spattinson) `__ - `Sean Brogan (@spbrogan) `__ - `Spegs21 (@Spegs21) `__ - `Eric Lind (@sperly) `__ @@ -812,49 +1004,73 @@ Contributors - `Stanislav Habich (@standahabich) `__ - `stegm (@stegm) `__ - `Stewart (@stewiem2000) `__ +- `sthorley (@sthorley) `__ - `sticilface (@sticilface) `__ - `Stijn Tintel (@stintel) `__ - `Mathias Stock (@Stock-M) `__ +- `Strixx76 (@Strixx76) `__ - `stubs12 (@stubs12) `__ - `Jordan Vohwinkel (@sublime93) `__ +- `sud33p (@sud33p) `__ - `sumirati (@sumirati) `__ - `swifty99 (@swifty99) `__ +- `Jan Gutowski (@Switch123456789) `__ - `Sybren A. Stüvel (@sybrenstuvel) `__ - `synco (@synco) `__ - `Marcel Feix (@Syndlex) `__ - `Suryandaru Triandana (@syndtr) `__ - `SyXavier (@SyXavier) `__ +- `Peter (@szpeter80) `__ - `Taigar2015 (@Taigar2015) `__ +- `Stefan Dragnev (@tailsu) `__ - `Levente Tamas (@tamisoft) `__ - `Aleksandr Oleinikov (@tannisroot) `__ - `tantive (@tantive) `__ - `Ryan Hoffman (@tekmaven) `__ - `testbughub (@testbughub) `__ - `Greg Lincoln (@tetious) `__ +- `Terry Hardie (@thardie) `__ +- `The-Paran0id-Andr0id (@The-Paran0id-Andr0id) `__ - `Nejc (@thedexboy) `__ - `Thomas Eckerstorfer (@TheEggi) `__ - `Theexternaldisk (@Theexternaldisk) `__ +- `Martijn van der Pol (@TheFes) `__ - `TheGroundZero (@TheGroundZero) `__ - `thejonesyboy (@thejonesyboy) `__ - `TheJulianJES (@TheJulianJES) `__ - `Zixuan Wang (@TheNetAdmin) `__ - `Dominik Bruhn (@theomega) `__ +- `Brian Levinsen (@therealeldaria) `__ +- `Steve Scott (@thewishy) `__ - `Florian Gareis (@TheZoker) `__ +- `Thibault Maekelbergh (@thibmaek) `__ +- `Matt (@ThisIsTheOnlyUsernameAvailable) `__ +- `Thomas Heiser (@thomasheiser85) `__ - `Andrew Thompson (@thompsa) `__ - `John (@thorrak) `__ +- `Thomas Langewouters (@thouters) `__ +- `Transylvania High Tech (@thtro) `__ +- `Thunderbiscuits (@Thunderbiscuits) `__ - `tiagofreire-pt (@tiagofreire-pt) `__ - `Tijs-B (@Tijs-B) `__ +- `Tim Laurence (@timdaman) `__ - `Aidan Timson (@timmo001) `__ - `Tim Savage (@timsavage) `__ +- `Tinkerfish (@tinkerfish) `__ +- `TJ Horner (@tjhorner) `__ +- `Christian (@Tntdruid) `__ - `Philipp Tölke (@toelke) `__ - `tomaszduda23 (@tomaszduda23) `__ - `Tom Brien (@TomBrien) `__ +- `Tom Hartogs (@TomHartogs) `__ - `tomlut (@tomlut) `__ - `tomle (@tomole444) `__ - `Tom Price (@tomtom5152) `__ - `David Kiliani (@torfbolt) `__ +- `tracestep (@tracestep) `__ - `Felix Eckhofer (@tribut) `__ - `Trick van Staveren (@trickv) `__ +- `TripitakaBC (@TripitakaBC) `__ - `Tobias (@tripplet) `__ - `Tyler Bules (@Troublebrewing) `__ - `Olli Salonen (@trsqr) `__ @@ -865,17 +1081,25 @@ Contributors - `tubalainen (@tubalainen) `__ - `tube0013 (@tube0013) `__ - `Alexey Vlasov (@turbulator) `__ +- `tvan0076 (@tvan0076) `__ - `Thorsten von Eicken (@tve) `__ - `Ubi de Feo (@ubidefeo) `__ +- `ulic75 (@ulic75) `__ +- `unhold (@unhold) `__ +- `Aaron Mildenstein (@untergeek) `__ - `uPesy Electronics (@uPesy) `__ - `UT2UH (@UT2UH) `__ - `Vc (@Valcob) `__ - `Nad (@valordk) `__ +- `Veli Veromann (@velijv) `__ - `André Lademann (@vergissberlin) `__ - `Austin (@vidplace7) `__ - `Vincèn (@vincegre) `__ +- `Virage Laboratories (@viragelabs) `__ - `VitaliyKurokhtin (@VitaliyKurokhtin) `__ - `Xuming Feng (@voicevon) `__ +- `vt-vaio (@vt-vaio) `__ +- `vtechun (@vtechun) `__ - `vxider (@Vxider) `__ - `Wai Weng (@waiweng83) `__ - `WallyCZ (@WallyCZ) `__ @@ -886,6 +1110,7 @@ Contributors - `Ian Wells (@wellsi) `__ - `wifwucite (@wifwucite) `__ - `wilberforce (@wilberforce) `__ +- `Wingman3434 (@Wingman3434) `__ - `Emil Hesslow (@WizKid) `__ - `WJCarpenter (@wjcarpenter) `__ - `Wouter van der Wal (@wjtje) `__ @@ -895,6 +1120,8 @@ Contributors - `Sven Serlier (@wrt54g) `__ - `Wolfgang Tremmel (@wtremmel) `__ - `wysiwyng (@wysiwyng) `__ +- `Jakob (@XDjackieXD) `__ +- `Mike Brown (@xenoxaos) `__ - `WitchKing (@xvil) `__ - `Yaroslav (@Yarikx) `__ - `Marcin Jaworski (@yawor) `__ @@ -903,10 +1130,13 @@ Contributors - `Yuval Aboulafia (@yuvalabou) `__ - `Björn Stenberg (@zagor) `__ - `david reid (@zathras777) `__ +- `Brynley McDonald (@ZephireNZ) `__ - `Geek_cat (@zhzhzhy) `__ - `I. Tomita (@ziceva) `__ - `Michael Labuschke (@zigman79) `__ +- `zivillian (@zivillian) `__ +- `Loïc (@zoic21) `__ - `Zack Barett (@zsarnett) `__ - `Christian Zufferey (@zuzu59) `__ -*This page was last updated March 27, 2023.* +*This page was last updated April 20, 2023.* diff --git a/images/microphone.svg b/images/microphone.svg new file mode 100644 index 000000000..33084ec26 --- /dev/null +++ b/images/microphone.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/mmc5603.jpg b/images/mmc5603.jpg new file mode 100644 index 000000000..de5897286 Binary files /dev/null and b/images/mmc5603.jpg differ diff --git a/images/voice-assistant.svg b/images/voice-assistant.svg new file mode 100644 index 000000000..4e2e8e01b --- /dev/null +++ b/images/voice-assistant.svg @@ -0,0 +1 @@ + diff --git a/index.rst b/index.rst index 078dea4f2..788aa06ae 100644 --- a/index.rst +++ b/index.rst @@ -339,6 +339,7 @@ Magnetic ESP32 Hall Sensor, components/sensor/esp32_hall, magnet.svg, ESP internal HMC5883L, components/sensor/hmc5883l, hmc5883l.jpg, 3-Axis magnetometer + MMC5603, components/sensor/mmc5603, mmc5603.jpg, 3-Axis magnetometer MLX90393, components/sensor/mlx90393, mlx90393.jpg, 3-Axis magnetometer QMC5883L, components/sensor/qmc5883l, qmc5883l.jpg, 3-Axis magnetometer @@ -704,6 +705,14 @@ Media Player Components Media Player Core, components/media_player/index, folder-open.svg I2S Audio, components/media_player/i2s_audio, i2s_audio.svg +Microphone Components +--------------------- + +.. imgtable:: + + Microphone Core, components/microphone/index, microphone.svg + I2S Microphone, components/microphone/i2s_audio, i2s_audio.svg + Time Components --------------- @@ -716,6 +725,17 @@ Time Components DS1307 RTC, components/time/ds1307, clock-outline.svg PCF85063 RTC, components/time/pcf85063, clock-outline.svg +Home Assistant Companion Components +----------------------------------- + +.. imgtable:: + + Bluetooth Proxy, components/bluetooth_proxy, bluetooth.svg + Voice Assistant, components/voice_assistant, voice-assistant.svg + Sensor, components/sensor/homeassistant, home-assistant.svg + Text Sensor, components/text_sensor/homeassistant, home-assistant.svg + Binary Sensor, components/binary_sensor/homeassistant, home-assistant.svg + Miscellaneous Components ------------------------ @@ -743,6 +763,8 @@ Miscellaneous Components ESP32 Camera, components/esp32_camera, camera.svg ESP32 Camera Web Server, components/esp32_camera_web_server, camera.svg + 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