From 4c10581781caaae3732494ba311ec6b5182d56fd Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 9 Mar 2023 09:09:40 +1300 Subject: [PATCH 01/38] Bump version to 2023.4.0-dev --- Doxygen | 2 +- _static/version | 2 +- conf.py | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Doxygen b/Doxygen index 6e2b07ec9..017bb5aa6 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.0-dev +PROJECT_NUMBER = 2023.4.0-dev # 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/_static/version b/_static/version index 49b1cfc07..46bed8ae6 100644 --- a/_static/version +++ b/_static/version @@ -1 +1 @@ -2023.3.0-dev \ No newline at end of file +2023.4.0-dev \ No newline at end of file diff --git a/conf.py b/conf.py index a848ff807..53868d966 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.0-dev" +release = "2023.4.0-dev" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 64edd17b57d985ed0a8e3d6f8e5953037da09c97 Mon Sep 17 00:00:00 2001 From: Samuel Sieb Date: Wed, 8 Mar 2023 12:45:56 -0800 Subject: [PATCH 02/38] fix kuntze docs (#2698) Co-authored-by: Samuel Sieb --- components/logger.rst | 2 ++ components/{ => sensor}/kuntze.rst | 10 +++++----- index.rst | 1 + 3 files changed, 8 insertions(+), 5 deletions(-) rename components/{ => sensor}/kuntze.rst (93%) diff --git a/components/logger.rst b/components/logger.rst index b059efbba..27250dab6 100644 --- a/components/logger.rst +++ b/components/logger.rst @@ -1,3 +1,5 @@ +.. _logger: + Logger Component ================ diff --git a/components/kuntze.rst b/components/sensor/kuntze.rst similarity index 93% rename from components/kuntze.rst rename to components/sensor/kuntze.rst index d204b8671..b4727c693 100644 --- a/components/kuntze.rst +++ b/components/sensor/kuntze.rst @@ -11,7 +11,7 @@ instrument in ESPHome. It uses :ref:`UART ` (ModBUS) for communication. Once configured you can use sensors as described below for your projects. -.. figure:: ../images/kuntze.jpg +.. figure:: ../../images/kuntze.jpg :align: center Kuntze Neon® Multi instrument @@ -30,14 +30,14 @@ The device communicates at ``19200`` baud ``8E1``. To connect to ESPHome, an RS4 transceiver is needed. Choose a type which does not need a trigger to send and receive data, for example: -.. figure:: ../images/rs485.jpg +.. figure:: ../../images/rs485.jpg The controller connects to the UART of the MCU. For ESP32 GPIO `16` to `TXD` and `17` to RXD are the default ones but any other pins can be used as well. 3.3V to VCC and GND to GND. .. warning:: - If you are using the :doc:`logger` make sure you are not using the same pins for it or otherwise disable the UART + If you are using the :ref:`logger` make sure you are not using the same pins for it or otherwise disable the UART logging with the ``baud_rate: 0`` option. Component @@ -52,7 +52,7 @@ A configured modbus component is optional. It will be automatically created. - id: uart_bus tx_pin: GPIO16 rx_pin: GPIO17 - baud_rate: 19600 + baud_rate: 19200 parity: EVEN sensor: @@ -81,7 +81,7 @@ See Also -------- - :ref:`uart` -- :doc:`logger` +- :ref:`logger` - :ref:`Sensor ` - `Kuntze manuals `__ - `Communication protocol `__ diff --git a/index.rst b/index.rst index 2ab0cfdfd..ede62c1fa 100644 --- a/index.rst +++ b/index.rst @@ -365,6 +365,7 @@ Miscellaneous 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 Motion From ee3083a9c53d1e75e41a45447fb9067a6a16a9a6 Mon Sep 17 00:00:00 2001 From: Russell Cloran Date: Wed, 8 Mar 2023 15:25:20 -0800 Subject: [PATCH 03/38] Document NeoPixelBus support on ESP32-S3 (#2491) Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> --- components/light/neopixelbus.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/components/light/neopixelbus.rst b/components/light/neopixelbus.rst index b136d5ab2..cc5808a11 100644 --- a/components/light/neopixelbus.rst +++ b/components/light/neopixelbus.rst @@ -127,7 +127,8 @@ settings vary by method: - **async** (*Optional*, boolean): Use an asynchronous transfer. Defaults to ``false``. If enabled, the logger must be disabled even if bus 1 is used. -- **esp32_i2s**: The recommended method for ESP32. Available on all output pins. Additional options: +- **esp32_i2s**: The recommended method for ESP32, but not available on the ESP32-S3 or ESP32-C3. + Available on all output pins. Additional options: - **bus** (*Optional*): The I2S bus to use. The ESP32 has bus 0 or 1 available, but the ESP32-S2 only bus 0. One of ``0``, ``1``, ``dynamic``. @@ -135,7 +136,7 @@ settings vary by method: - **esp32_rmt**: An alternative method for ESP32 that uses the RMT peripheral to send data. Available on all output pins. Additional options: - - **channel** (*Optional*): The RMT channel to use. The ESP32 has channels 0-7, ESP32-S2 0-3 and ESP32-C3 0-1. + - **channel** (*Optional*): The RMT channel to use. The ESP32 has channels 0-7, ESP32-S2 0-3, ESP32-S3 0-3, and ESP32-C3 0-1. Defaults to 6 on ESP32, and 1 on other ESP32 variants. The following method is available only for two-wire chips (specify ``data_pin`` and ``clock_pin``): From 12e0073cb0bf8aa1dbbab56022f5f29c1e949a11 Mon Sep 17 00:00:00 2001 From: NP v/d Spek Date: Thu, 9 Mar 2023 01:02:14 +0100 Subject: [PATCH 04/38] Replace ili9341 with ili9xxx documentation (#2729) Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> --- _redirects | 1 + .../display/{ili9341.rst => ili9xxx.rst} | 44 +++++++++---------- index.rst | 2 +- 3 files changed, 23 insertions(+), 24 deletions(-) rename components/display/{ili9341.rst => ili9xxx.rst} (83%) diff --git a/_redirects b/_redirects index c288519ff..92ca9563f 100644 --- a/_redirects +++ b/_redirects @@ -8,3 +8,4 @@ /devices/esp32.html /components/esp32.html /changelog/2022.12.4.html /changelog/2022.12.0.html 301 +/components/display/ili9341.html /components/display/ili9xxx.html 301 diff --git a/components/display/ili9341.rst b/components/display/ili9xxx.rst similarity index 83% rename from components/display/ili9341.rst rename to components/display/ili9xxx.rst index 58da05c16..030e287cd 100644 --- a/components/display/ili9341.rst +++ b/components/display/ili9xxx.rst @@ -1,21 +1,25 @@ -ILI9341 TFT LCD -=============== + +ILI9xxx TFT LCD Series +====================== .. seo:: - :description: Instructions for setting up ILI9341 TFT LCD display drivers. + :description: Instructions for setting up ILI9xxx TFT LCD display drivers. :image: ili9341.jpg -.. _ili9341: +.. _ili9xxx: Usage ----- +This component is the successor of the ILI9341 component allowing to control more display drivers and use 16bit colors when enough free ram. -The ``ili9341`` display platform allows you to use +The ``ILI9xxx`` display platform allows you to use ILI9341 (`datasheet `__, -`Aliexpress `__) -displays with ESPHome. As this is a somewhat higher resolution display and may require pins +`Aliexpress `__) and other +displays from the same chip family with ESPHome. As this is a somewhat higher resolution display and may require pins beyond the typical SPI connections, it is better suited for use with the ESP32. +**Note:** To use 16bit instead of 8bit colors use a esp32 with enough PSRAM the display. + .. figure:: images/ili9341-full.jpg :align: center :width: 75.0% @@ -27,15 +31,13 @@ beyond the typical SPI connections, it is better suited for use with the ESP32. # Example minimal configuration entry display: - - platform: ili9341 - model: TFT 2.4 + - platform: ili9xxx + model: ili9341 cs_pin: 14 dc_pin: 27 - led_pin: 32 ### see note below ### reset_pin: 33 - lambda: |- - it.fill(Color::BLACK); + it.fill(COLOR_BLACK); it.print(0, 0, id(my_font), id(my_red), TextAlign::TOP_LEFT, "Hello World!"); Configuration variables: @@ -43,15 +45,12 @@ Configuration variables: - **model** (**Required**): The model of the display. Options are: - - ``M5STACK`` - - ``TFT 2.4`` - - ``TFT 2.4R`` (ILI9342) + - ``M5STACK``, ``TFT 2.4``, ``TFT 2.4R`` + - ``ILI9341``, ``ILI9342``, ``ILI9481``, ``ILI9486``, ``ILI9488``, ``ST7796`` - **cs_pin** (*Optional*, :ref:`Pin Schema `): The CS pin. - **dc_pin** (**Required**, :ref:`Pin Schema `): The DC pin. - **reset_pin** (*Optional*, :ref:`Pin Schema `): The RESET pin. -- **led_pin** (*Optional*, :ref:`Pin Schema `): The display's backlight pin. **Note:** Connect to a - PWM-capable pin to switch/dim the display's backlight **or** save a pin by connecting it through a 3.3K resistor to the +3V supply. - **rotation** (*Optional*): Set the rotation of the display. Everything drawn in the ``lambda:`` will be rotated per this option. One of ``0°`` (default), ``90°``, ``180°``, or ``270°``. - **lambda** (*Optional*, :ref:`lambda `): The lambda to use for rendering the content on the display. @@ -62,7 +61,7 @@ Configuration variables: - **pages** (*Optional*, list): Show pages instead of a single lambda. See :ref:`display-pages`. - **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation. - **color_palette** (*Optional*): The type of color pallet that will be used in the ESP's internal 8-bits-per-pixel buffer. This can be used to improve color depth quality of the image. For example if you know that the display will only be showing grayscale images, the clarity of the display can be improved by targeting the available colors to monochrome only. Options are: - + - ``NONE`` (default) - ``GRAYSCALE`` - ``IMAGE_ADAPTIVE`` @@ -124,7 +123,7 @@ To configure a dimmable backlight: light: - platform: monochromatic output: gpio_32_backlight_pwm - name: "ILI9341 Display Backlight" + name: "Display Backlight" id: back_light restore_mode: ALWAYS_ON @@ -139,11 +138,10 @@ To configure an image adaptive color pallet to show greater than 8 bit color dep type: RGB24 display: - - platform: ili9341 - model: TFT 2.4 + - platform: ili9xxx + model: ili9341 cs_pin: 5 dc_pin: 4 - led_pin: 15 reset_pin: 22 rotation: 90 id: tft_ha @@ -158,5 +156,5 @@ See Also -------- - :doc:`index` -- :apiref:`ili9341/ili9341_display.h` +- :apiref:`ili9xxx/ili9xxx_display.h` - :ghedit:`Edit` diff --git a/index.rst b/index.rst index ede62c1fa..18d68bf6b 100644 --- a/index.rst +++ b/index.rst @@ -565,7 +565,7 @@ Display Components ST7735, components/display/st7735, st7735.jpg ST7789V, components/display/st7789v, st7789v.jpg ST7920, components/display/st7920, st7920.jpg - ILI9341, components/display/ili9341, ili9341.jpg + ILI9xxx, components/display/ili9xxx, ili9341.jpg Waveshare E-Paper, components/display/waveshare_epaper, waveshare_epaper.jpg Inkplate, components/display/inkplate6, inkplate6.jpg PCD8544 (Nokia 5110/ 3310), components/display/pcd8544, pcd8544.jpg From 72c0fdd05f20e293cb9132ebd019f0143bcca56c Mon Sep 17 00:00:00 2001 From: Dorian Zedler Date: Sun, 12 Mar 2023 21:26:34 +0100 Subject: [PATCH 05/38] Feat: add hex color (#2731) --- components/display/index.rst | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/components/display/index.rst b/components/display/index.rst index 6994b0878..b33c68598 100644 --- a/components/display/index.rst +++ b/components/display/index.rst @@ -465,13 +465,36 @@ A ``color`` component exists for just this purpose: blue: 25% white: 0% +Alternatively, you can use ``_int`` to specify the color as an int value: + +.. code-block:: yaml + + color: + - id: my_light_red + red_int: 255 + green_int: 51 + blue_int: 64 + white_int: 0 + +Or, if you are more comforatble with hex values, you can use ``hex``: + +.. code-block:: yaml + + color: + - id: my_light_red + hex: FF3340 Configuration variables: - **red** (*Optional*, percentage): The percentage of the red component. Defaults to ``100%``. +- **red_int** (*Optional*, integer): The brightness of the red component on a scale of ``0`` to ``255``. Defaults to ``255``. - **green** (*Optional*, percentage): The percentage of the green component. Defaults to ``100%``. +- **green_int** (*Optional*, integer): The brightness of the green component on a scale of ``0`` to ``255``. Defaults to ``255``. - **blue** (*Optional*, percentage): The percentage of the blue component. Defaults to ``100%``. +- **blue_int** (*Optional*, integer): The brightness of the blue component on a scale of ``0`` to ``255``. Defaults to ``255``. - **white** (*Optional*, percentage): The percentage of the white component. Defaults to ``100%``. +- **white_int** (*Optional*, integer): The brightness of the white component on a scale of ``0`` to ``255``. Defaults to ``255``. +- **hex** (*Optional*, string): The color in hexadecimal representation. Defaults to ``FFFFFF``. RGB displays use red, green, and blue, while grayscale displays may use white. From d911bbbab408e537660427b10b6198609c503459 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Mon, 13 Mar 2023 13:13:51 +1300 Subject: [PATCH 06/38] Add supported touch pins for esp32-s2/s3 (#2743) --- components/binary_sensor/esp32_touch.rst | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/components/binary_sensor/esp32_touch.rst b/components/binary_sensor/esp32_touch.rst index 30b301d9b..cd5adafd4 100644 --- a/components/binary_sensor/esp32_touch.rst +++ b/components/binary_sensor/esp32_touch.rst @@ -104,7 +104,10 @@ Configuration variables: Touch Pad Pins -------------- -8 pins on the ESP32 can be used to detect touches. These are (in the default "raw" pin names): +Below are the raw GPIO pin numbers that can be used as touch pads for each variant. + +ESP32 +***** - ``GPIO0`` - ``GPIO2`` @@ -117,6 +120,25 @@ Touch Pad Pins - ``GPIO32`` - ``GPIO33`` +ESP32-S2 & ESP32-S3 +******************* + +- ``GPIO1`` +- ``GPIO2`` +- ``GPIO3`` +- ``GPIO4`` +- ``GPIO5`` +- ``GPIO6`` +- ``GPIO7`` +- ``GPIO8`` +- ``GPIO9`` +- ``GPIO10`` +- ``GPIO11`` +- ``GPIO12`` +- ``GPIO13`` +- ``GPIO14`` + + Finding thresholds ------------------ From 1301ee92a1f1e0a74e5de41bf8fc03285da06904 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 15 Mar 2023 20:47:04 +1300 Subject: [PATCH 07/38] Revert "Add supported touch pins for esp32-s2/s3" (#2751) --- components/binary_sensor/esp32_touch.rst | 24 +----------------------- 1 file changed, 1 insertion(+), 23 deletions(-) diff --git a/components/binary_sensor/esp32_touch.rst b/components/binary_sensor/esp32_touch.rst index cd5adafd4..30b301d9b 100644 --- a/components/binary_sensor/esp32_touch.rst +++ b/components/binary_sensor/esp32_touch.rst @@ -104,10 +104,7 @@ Configuration variables: Touch Pad Pins -------------- -Below are the raw GPIO pin numbers that can be used as touch pads for each variant. - -ESP32 -***** +8 pins on the ESP32 can be used to detect touches. These are (in the default "raw" pin names): - ``GPIO0`` - ``GPIO2`` @@ -120,25 +117,6 @@ ESP32 - ``GPIO32`` - ``GPIO33`` -ESP32-S2 & ESP32-S3 -******************* - -- ``GPIO1`` -- ``GPIO2`` -- ``GPIO3`` -- ``GPIO4`` -- ``GPIO5`` -- ``GPIO6`` -- ``GPIO7`` -- ``GPIO8`` -- ``GPIO9`` -- ``GPIO10`` -- ``GPIO11`` -- ``GPIO12`` -- ``GPIO13`` -- ``GPIO14`` - - Finding thresholds ------------------ From 67db98f803ccf1b645d042fe13a8728d0cfb30b3 Mon Sep 17 00:00:00 2001 From: Trent Houliston Date: Thu, 16 Mar 2023 09:48:44 +1100 Subject: [PATCH 08/38] Update delta filter docs for new percentage mode (#2647) --- components/sensor/index.rst | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/components/sensor/index.rst b/components/sensor/index.rst index 42dd1b993..0127d108c 100644 --- a/components/sensor/index.rst +++ b/components/sensor/index.rst @@ -456,11 +456,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`` ****** From 22c235793b526d13422870443895a48e9fc9a03d Mon Sep 17 00:00:00 2001 From: R Huish <5207490+genestealer@users.noreply.github.com> Date: Wed, 15 Mar 2023 22:49:07 +0000 Subject: [PATCH 09/38] Added missing PM_1_0 and PM_10_0 for TYPE_PMS5003T (#2741) --- components/sensor/pmsx003.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/sensor/pmsx003.rst b/components/sensor/pmsx003.rst index df879a418..66827d136 100644 --- a/components/sensor/pmsx003.rst +++ b/components/sensor/pmsx003.rst @@ -18,7 +18,7 @@ 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``. .. code-block:: yaml From 6b42fc13e4baa2eeaee5bd6f9067e838d5016fc1 Mon Sep 17 00:00:00 2001 From: Witold Krecicki Date: Wed, 15 Mar 2023 23:49:26 +0100 Subject: [PATCH 10/38] Spi force sw (#2748) --- components/spi.rst | 1 + 1 file changed, 1 insertion(+) 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 From 174b72b502fd7fe6b47bdd34b08d8f47e495bc14 Mon Sep 17 00:00:00 2001 From: Samuel Sieb Date: Wed, 15 Mar 2023 15:49:46 -0700 Subject: [PATCH 11/38] add output option for status led (#2727) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: H. Árkosi Róbert --- components/light/status_led.rst | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) 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 `. From 77bcde8e60b2b6f2def07c66555858a34e43d04e Mon Sep 17 00:00:00 2001 From: Raph Date: Thu, 16 Mar 2023 00:24:09 +0100 Subject: [PATCH 12/38] Add flip_x (#2746) --- components/display/max7219digit.rst | 1 + 1 file changed, 1 insertion(+) 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: From e01079d2bebbf5b5f7521d130ae98307d86fd7b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sybren=20A=2E=20St=C3=BCvel?= Date: Sun, 19 Mar 2023 20:50:21 +0100 Subject: [PATCH 13/38] Documentation for the `skip_initial` filter (#2760) --- components/sensor/index.rst | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/components/sensor/index.rst b/components/sensor/index.rst index 0127d108c..3cd85b275 100644 --- a/components/sensor/index.rst +++ b/components/sensor/index.rst @@ -406,6 +406,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`` ************ @@ -650,7 +665,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 From 41ed5a7294d129c4be10325b60027ab63218dff9 Mon Sep 17 00:00:00 2001 From: Peter Halicky Date: Sun, 19 Mar 2023 20:50:38 +0100 Subject: [PATCH 14/38] Add support for ESP32 CAM 3MP and 5MP resolutions and arbitrary camera clock. (#2759) --- components/esp32_camera.rst | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) 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``. From f9aa59fd33ccc8e892529fa9af5165005fa25a16 Mon Sep 17 00:00:00 2001 From: "Aaron S. Jackson" Date: Mon, 20 Mar 2023 04:01:59 +0000 Subject: [PATCH 15/38] GooDisplay GDEY029T94 (#2765) --- 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 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. From 8fbb53e0165ef4e1b0d188d0ef9e8eaa9e6bd54c Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Mon, 27 Mar 2023 15:35:26 +1300 Subject: [PATCH 16/38] Add note for names to use friendly_name (#2774) --- components/binary_sensor/index.rst | 7 +++++++ components/button/index.rst | 6 ++++++ components/climate/index.rst | 7 +++++++ components/cover/index.rst | 7 +++++++ components/fan/index.rst | 6 ++++++ components/light/index.rst | 7 +++++++ components/lock/index.rst | 8 +++++++- components/media_player/index.rst | 6 ++++++ components/number/index.rst | 6 ++++++ components/select/index.rst | 14 ++++++++++---- components/sensor/index.rst | 6 ++++++ components/switch/index.rst | 8 +++++++- components/text_sensor/index.rst | 8 +++++++- 13 files changed, 89 insertions(+), 7 deletions(-) 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/fan/index.rst b/components/fan/index.rst index 1fe4f2b51..ac1e6690b 100644 --- a/components/fan/index.rst +++ b/components/fan/index.rst @@ -27,6 +27,12 @@ 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. diff --git a/components/light/index.rst b/components/light/index.rst index 6dd4506dd..ef43ee22d 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 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/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/number/index.rst b/components/number/index.rst index e3a708bcc..20f8253a4 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 3cd85b275..1fd3b1858 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). diff --git a/components/switch/index.rst b/components/switch/index.rst index e14ddf99c..6dc9888e3 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 @@ -43,7 +49,7 @@ Configuration variables: - ``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_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``. 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. From f44e9b3e8f2a6fe36357dff974461ef2eebd8bad Mon Sep 17 00:00:00 2001 From: Ben Hoff Date: Tue, 4 Apr 2023 21:30:47 -0400 Subject: [PATCH 17/38] Mmc5603 (#2524) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: H. Árkosi Róbert Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> --- components/sensor/mmc5063.rst | 63 ++++++++++++++++++++++++++++++++++ images/mmc5603.jpg | Bin 0 -> 17096 bytes index.rst | 1 + 3 files changed, 64 insertions(+) create mode 100644 components/sensor/mmc5063.rst create mode 100644 images/mmc5603.jpg 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/images/mmc5603.jpg b/images/mmc5603.jpg new file mode 100644 index 0000000000000000000000000000000000000000..de5897286dfd5d4b22f2cb6020cf9ebfaf0baf40 GIT binary patch literal 17096 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 literal 0 HcmV?d00001 diff --git a/index.rst b/index.rst index 83c2f5197..c9e81e38c 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 From c745a29af7581a7bd73ed4b4eed4092db9e25329 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 12 Apr 2023 11:53:24 +1200 Subject: [PATCH 18/38] Initial voice assistant documentation (#2813) --- components/i2s_audio.rst | 29 +++++++ components/index.rst | 1 + components/media_player/i2s_audio.rst | 12 +-- components/microphone/i2s_audio.rst | 29 +++++++ components/microphone/index.rst | 109 ++++++++++++++++++++++++++ components/voice_assistant.rst | 64 +++++++++++++++ images/microphone.svg | 1 + images/voice-assistant.svg | 1 + index.rst | 23 +++++- 9 files changed, 260 insertions(+), 9 deletions(-) create mode 100644 components/i2s_audio.rst create mode 100644 components/microphone/i2s_audio.rst create mode 100644 components/microphone/index.rst create mode 100644 components/voice_assistant.rst create mode 100644 images/microphone.svg create mode 100644 images/voice-assistant.svg 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/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/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/voice_assistant.rst b/components/voice_assistant.rst new file mode 100644 index 000000000..87acf693e --- /dev/null +++ b/components/voice_assistant.rst @@ -0,0 +1,64 @@ +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. + + +.. _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/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/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 c9e81e38c..40abfc0a6 100644 --- a/index.rst +++ b/index.rst @@ -668,6 +668,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 --------------- @@ -680,6 +688,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 + Misc Components --------------- @@ -707,6 +726,8 @@ Misc 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 @@ -785,7 +806,7 @@ Cookbook IWOOLE Table Lamp, cookbook/iwoole_rgbw_table_lamp, iwoole_rgbw_table_lamp.png EPEVER Tracer, cookbook/tracer-an, tracer-an.jpg Ilonda Wifi Smart Fish Feeder, cookbook/ilonda-wifi-smart-fish-feeder, ilonda-wifi-smart-fish-feeder-cookbook.jpg - AirGradient DIY Air Quality Sensor, cookbook/air_gradient_diy_air_quality_sensor, air_gradient_diy_air_quality_sensor.jpg + AirGradient DIY Air Quality Sensor, cookbook/air_gradient_diy_air_quality_sensor, air_gradient_diy_air_quality_sensor.jpg Geiger Counter, cookbook/geiger-counter, radiationD-v1-1-cajoe_small.jpg EHMTX a matrix status/text display, cookbook/ehmtx, ehmtx.jpg From a925b1a63b65c7579a7a42724782224b5e93fcbd Mon Sep 17 00:00:00 2001 From: Dave Johnston <1548274+johnsto@users.noreply.github.com> Date: Wed, 12 Apr 2023 05:02:20 +0100 Subject: [PATCH 19/38] add docs for SSD1306 72x40 display (#2805) --- components/display/ssd1306.rst | 2 ++ 1 file changed, 2 insertions(+) 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`` From c40572eb48f69caed3624268ec079c967ff5ed0c Mon Sep 17 00:00:00 2001 From: Fabian Date: Wed, 12 Apr 2023 23:52:18 +0200 Subject: [PATCH 20/38] [Ethernet] Add PHY KSZ8081 support (#2808) Co-authored-by: Your Name --- components/ethernet.rst | 1 + 1 file changed, 1 insertion(+) 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``. From 4b517933a352f953e77a1b5ee191f75ab4069167 Mon Sep 17 00:00:00 2001 From: X-Ryl669 Date: Wed, 12 Apr 2023 23:53:37 +0200 Subject: [PATCH 21/38] feat: Add manual control config variable doc (#2571) --- components/cover/time_based.rst | 7 +++++++ 1 file changed, 7 insertions(+) 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``. From 63429dc3dcdc3afcc327f6f6e469b9410d758c88 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 13 Apr 2023 10:00:04 +1200 Subject: [PATCH 22/38] Change default restore mode for fan/light/switch (#2830) --- components/fan/index.rst | 4 ++-- components/light/index.rst | 4 ++-- components/switch/index.rst | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/components/fan/index.rst b/components/fan/index.rst index ac1e6690b..c6ffb6493 100644 --- a/components/fan/index.rst +++ b/components/fan/index.rst @@ -37,11 +37,11 @@ Configuration variables: - **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/light/index.rst b/components/light/index.rst index ef43ee22d..7c71549c6 100644 --- a/components/light/index.rst +++ b/components/light/index.rst @@ -46,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/switch/index.rst b/components/switch/index.rst index 6dc9888e3..881e4e046 100644 --- a/components/switch/index.rst +++ b/components/switch/index.rst @@ -47,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. - 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`. From 894cb4aa6f9e433e72995f02049352f91ae970b4 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 13 Apr 2023 10:13:53 +1200 Subject: [PATCH 23/38] Bump version to 2023.4.0b1 --- Doxygen | 2 +- Makefile | 2 +- _static/version | 2 +- conf.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Doxygen b/Doxygen index 017bb5aa6..f376daee6 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.4.0-dev +PROJECT_NUMBER = 2023.4.0b1 # 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 299496721..8dc9f18e9 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ ESPHOME_PATH = ../esphome -ESPHOME_REF = dev +ESPHOME_REF = 2023.4.0b1 .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 46bed8ae6..74eecfea5 100644 --- a/_static/version +++ b/_static/version @@ -1 +1 @@ -2023.4.0-dev \ No newline at end of file +2023.4.0b1 \ No newline at end of file diff --git a/conf.py b/conf.py index 53868d966..2bdc49b7a 100644 --- a/conf.py +++ b/conf.py @@ -69,7 +69,7 @@ author = "ESPHome" # The short X.Y version. version = "2023.4" # The full version, including alpha/beta/rc tags. -release = "2023.4.0-dev" +release = "2023.4.0b1" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 15be2ce50eb8d2340e1c0022ef6355e69d214ff7 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 13 Apr 2023 10:42:35 +1200 Subject: [PATCH 24/38] Update changelog for 2023.4.0b1 --- _static/changelog-2023.4.0.png | Bin 0 -> 50652 bytes changelog/2023.4.0.rst | 179 +++++++++++++++++++++++++++++++++ changelog/index.rst | 2 +- 3 files changed, 180 insertions(+), 1 deletion(-) create mode 100644 _static/changelog-2023.4.0.png create mode 100644 changelog/2023.4.0.rst diff --git a/_static/changelog-2023.4.0.png b/_static/changelog-2023.4.0.png new file mode 100644 index 0000000000000000000000000000000000000000..38b11330094e819a004769d2676558f48842032e GIT binary patch literal 50652 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 ZY_!E)cUwHd9gG}@D99*FmrI(2{6G3?ShD~C literal 0 HcmV?d00001 diff --git a/changelog/2023.4.0.rst b/changelog/2023.4.0.rst new file mode 100644 index 000000000..07d881733 --- /dev/null +++ b/changelog/2023.4.0.rst @@ -0,0 +1,179 @@ +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. + +.. note:: + + TODO: Add link to tutorial for setting up M5Stack Atom Echo with Voice Assistant. + +Breaking Changes +---------------- + +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) + +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]` +- Added in mmc5603 code :esphomepr:`4175` by :ghuser:`benhoff` (new-integration) +- Bump black from 23.1.0 to 23.3.0 :esphomepr:`4635` by :ghuser:`dependabot[bot]` +- 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) + +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: From 6dc9e909db6b98b0b8468c422ec10c123f327f4a Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 13 Apr 2023 10:44:14 +1200 Subject: [PATCH 25/38] Update supporters for 2023.4.0b1 --- guides/supporters.rst | 247 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 237 insertions(+), 10 deletions(-) diff --git a/guides/supporters.rst b/guides/supporters.rst index 78fc2f687..32dceb9a8 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,6 +574,7 @@ Contributors - `Jeppe Ladefoged (@jladefoged) `__ - `Jean-Luc Béchennec (@jlbirccyn) `__ - `Jonas De Kegel (@jlsjonas) `__ +- `Jeff Anderson (@jman203) `__ - `Jonathan Martens (@jmartens) `__ - `jmichiel (@jmichiel) `__ - `Joe Gross (@joegross) `__ @@ -473,6 +583,8 @@ Contributors - `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 +593,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 +609,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 +622,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 +648,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) `__ - `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 +675,7 @@ Contributors - `lillborje71 (@lillborje71) `__ - `lingex (@lingex) `__ - `lkomurcu (@lkomurcu) `__ +- `loadrunner42 (@loadrunner42) `__ - `Lazar Obradovic (@lobradov) `__ - `Barry Loong (@loongyh) `__ - `Michael Bisbjerg (@LordMike) `__ @@ -556,6 +683,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 +695,30 @@ 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) `__ - `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 +731,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 +774,7 @@ Contributors - `Morgan Robertson (@mrgnr) `__ - `Mariusz Kryński (@mrk-its) `__ - `Michael Davidson (@MrMDavidson) `__ +- `MSe-5-14 (@MSe-5-14) `__ - `mtl010957 (@mtl010957) `__ - `mulcmu (@mulcmu) `__ - `Martin Murray (@murrayma) `__ @@ -642,6 +789,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 +802,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 +834,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 +855,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 +888,7 @@ Contributors - `Alex (@pxe-la) `__ - `[pʲɵs] (@pyos) `__ - `Qc (@qc24) `__ +- `Quinn Casey (@qcasey) `__ - `Karol Zlot (@qqgg231) `__ - `Tommy Jonsson (@quazzie) `__ - `Quentin Smith (@quentinmit) `__ @@ -735,14 +902,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 +924,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 +991,8 @@ Contributors - `Sourabh Jaiswal (@sourabhjaiswal) `__ - `Philip Allgaier (@spacegaier) `__ - `spacemanspiff2007 (@spacemanspiff2007) `__ +- `sparkydave1981 (@sparkydave1981) `__ +- `spattinson (@spattinson) `__ - `Sean Brogan (@spbrogan) `__ - `Spegs21 (@Spegs21) `__ - `Eric Lind (@sperly) `__ @@ -812,49 +1001,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 +1078,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 +1107,7 @@ Contributors - `Ian Wells (@wellsi) `__ - `wifwucite (@wifwucite) `__ - `wilberforce (@wilberforce) `__ +- `Wingman3434 (@Wingman3434) `__ - `Emil Hesslow (@WizKid) `__ - `WJCarpenter (@wjcarpenter) `__ - `Wouter van der Wal (@wjtje) `__ @@ -895,6 +1117,8 @@ Contributors - `Sven Serlier (@wrt54g) `__ - `Wolfgang Tremmel (@wtremmel) `__ - `wysiwyng (@wysiwyng) `__ +- `Jakob (@XDjackieXD) `__ +- `Mike Brown (@xenoxaos) `__ - `WitchKing (@xvil) `__ - `Yaroslav (@Yarikx) `__ - `Marcin Jaworski (@yawor) `__ @@ -903,10 +1127,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 13, 2023.* From d978a94b6c9eb5f04f5ea71af9c342dbf3adfee5 Mon Sep 17 00:00:00 2001 From: R Huish <5207490+genestealer@users.noreply.github.com> Date: Thu, 13 Apr 2023 09:10:58 +0100 Subject: [PATCH 26/38] Added Sensor Longevity and correction to PMSX003 (#2824) --- components/sensor/pmsx003.rst | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/components/sensor/pmsx003.rst b/components/sensor/pmsx003.rst index 66827d136..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. @@ -21,6 +21,13 @@ value: - ``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 `. From 72cb2fd2ccaac4aa4833f09584c29d2b47d6d7e6 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Mon, 17 Apr 2023 14:57:41 +1200 Subject: [PATCH 27/38] Add triggers to voice assistant (#2849) --- components/voice_assistant.rst | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/components/voice_assistant.rst b/components/voice_assistant.rst index 87acf693e..8bd5c1b18 100644 --- a/components/voice_assistant.rst +++ b/components/voice_assistant.rst @@ -24,7 +24,22 @@ Configuration: 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: From d04feda16810424524f64be8ceea2b4e36349970 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Mon, 17 Apr 2023 15:45:39 +1200 Subject: [PATCH 28/38] Bump version to 2023.4.0b2 --- Doxygen | 2 +- Makefile | 2 +- _static/version | 2 +- conf.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Doxygen b/Doxygen index f376daee6..a06d55162 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.4.0b1 +PROJECT_NUMBER = 2023.4.0b2 # 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 8dc9f18e9..e5f206f96 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ ESPHOME_PATH = ../esphome -ESPHOME_REF = 2023.4.0b1 +ESPHOME_REF = 2023.4.0b2 .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 74eecfea5..9d23e047f 100644 --- a/_static/version +++ b/_static/version @@ -1 +1 @@ -2023.4.0b1 \ No newline at end of file +2023.4.0b2 \ No newline at end of file diff --git a/conf.py b/conf.py index 2bdc49b7a..dae5c0143 100644 --- a/conf.py +++ b/conf.py @@ -69,7 +69,7 @@ author = "ESPHome" # The short X.Y version. version = "2023.4" # The full version, including alpha/beta/rc tags. -release = "2023.4.0b1" +release = "2023.4.0b2" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 8a4396b3bb9415cfbccb3f23601bf99ede188097 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Mon, 17 Apr 2023 15:46:42 +1200 Subject: [PATCH 29/38] Update changelog for 2023.4.0b2 --- changelog/2023.4.0.rst | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/changelog/2023.4.0.rst b/changelog/2023.4.0.rst index 07d881733..77985f258 100644 --- a/changelog/2023.4.0.rst +++ b/changelog/2023.4.0.rst @@ -56,6 +56,14 @@ Due to ``uart0`` / ``uart1`` / ``uart2`` being defined in some of the platform c ESPHome will now disallow these ids from being used in the config. You can simply change them to ``uart_0`` to continue using. +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` + Full list of changes -------------------- @@ -141,6 +149,10 @@ All changes - 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` Past Changelogs --------------- From 4a15f67cbce68e03f13db4b7a263ff35fee979a1 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Mon, 17 Apr 2023 15:47:12 +1200 Subject: [PATCH 30/38] Update supporters for 2023.4.0b2 --- guides/supporters.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/guides/supporters.rst b/guides/supporters.rst index 32dceb9a8..fdfe508dd 100644 --- a/guides/supporters.rst +++ b/guides/supporters.rst @@ -577,6 +577,7 @@ Contributors - `Jeff Anderson (@jman203) `__ - `Jonathan Martens (@jmartens) `__ - `jmichiel (@jmichiel) `__ +- `Jonathas Barbosa (@jnthas) `__ - `Joe Gross (@joegross) `__ - `Johan van der Kuijl (@johanvanderkuijl) `__ - `Johboh (@Johboh) `__ @@ -774,6 +775,7 @@ 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) `__ @@ -1136,4 +1138,4 @@ Contributors - `Zack Barett (@zsarnett) `__ - `Christian Zufferey (@zuzu59) `__ -*This page was last updated April 13, 2023.* +*This page was last updated April 17, 2023.* From caca96363776b02c9538cf53758af21219a85307 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 20 Apr 2023 10:15:35 +1200 Subject: [PATCH 31/38] Bump version to 2023.4.0b3 --- Doxygen | 2 +- Makefile | 2 +- _static/version | 2 +- conf.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Doxygen b/Doxygen index a06d55162..4f50c888f 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.4.0b2 +PROJECT_NUMBER = 2023.4.0b3 # 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 e5f206f96..85c052ee9 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ ESPHOME_PATH = ../esphome -ESPHOME_REF = 2023.4.0b2 +ESPHOME_REF = 2023.4.0b3 .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 9d23e047f..52205dfdd 100644 --- a/_static/version +++ b/_static/version @@ -1 +1 @@ -2023.4.0b2 \ No newline at end of file +2023.4.0b3 \ No newline at end of file diff --git a/conf.py b/conf.py index dae5c0143..ae0960cd7 100644 --- a/conf.py +++ b/conf.py @@ -69,7 +69,7 @@ author = "ESPHome" # The short X.Y version. version = "2023.4" # The full version, including alpha/beta/rc tags. -release = "2023.4.0b2" +release = "2023.4.0b3" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 3136786bbe4091221074f369e5b4380112101614 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 20 Apr 2023 10:16:23 +1200 Subject: [PATCH 32/38] Update changelog for 2023.4.0b3 --- changelog/2023.4.0.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/changelog/2023.4.0.rst b/changelog/2023.4.0.rst index 77985f258..6b430701c 100644 --- a/changelog/2023.4.0.rst +++ b/changelog/2023.4.0.rst @@ -63,6 +63,7 @@ Beta Changes - 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` Full list of changes -------------------- @@ -153,6 +154,7 @@ All changes - 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` Past Changelogs --------------- From b5ee528310a3ba0e88d8951073d3d6bd07e94c8d Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 20 Apr 2023 10:16:51 +1200 Subject: [PATCH 33/38] Update supporters for 2023.4.0b3 --- guides/supporters.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/guides/supporters.rst b/guides/supporters.rst index fdfe508dd..4c0d6ef55 100644 --- a/guides/supporters.rst +++ b/guides/supporters.rst @@ -655,7 +655,6 @@ Contributors - `Jakub Šimo (@kubik369) `__ - `Mark Kuchel (@kuchel77) `__ - `Ken Davidson (@kwdavidson) `__ -- `Kyle Hendricks (@kylehendricks) `__ - `Kyle Hill (@kylhill) `__ - `Kalashnikov Ilya (@l1bbcsg) `__ - `Limor "Ladyada" Fried (@ladyada) `__ @@ -663,6 +662,7 @@ Contributors - `Fredrik Lindqvist (@Landrash) `__ - `Lawrie George (@lawriege) `__ - `Laszlo Gazdag (@lazlyhu) `__ +- `Ludovic BOUÉ (@lboue) `__ - `lcavalli (@lcavalli) `__ - `Craig Fletcher (@leakypixel) `__ - `Dominik Wagenknecht (@LeDominik) `__ @@ -704,6 +704,7 @@ Contributors - `Malle355 (@Malle355) `__ - `raymonder jin (@mamil) `__ - `Manuel Díez (@manutenfruits) `__ +- `marcelolcosta (@marcelolcosta) `__ - `Marcel van der Veldt (@marcelveldt) `__ - `Marc (@MarcHagen) `__ - `marcinkowalczyk (@marcinkowalczyk) `__ @@ -1138,4 +1139,4 @@ Contributors - `Zack Barett (@zsarnett) `__ - `Christian Zufferey (@zuzu59) `__ -*This page was last updated April 17, 2023.* +*This page was last updated April 20, 2023.* From 0d4948d8787195df1832fae9f4cd1439a1a08484 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 20 Apr 2023 13:10:27 +1200 Subject: [PATCH 34/38] Bump version to 2023.4.0b4 --- Doxygen | 2 +- Makefile | 2 +- _static/version | 2 +- conf.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Doxygen b/Doxygen index 4f50c888f..2294963a7 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.4.0b3 +PROJECT_NUMBER = 2023.4.0b4 # 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 85c052ee9..c5dee6275 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ ESPHOME_PATH = ../esphome -ESPHOME_REF = 2023.4.0b3 +ESPHOME_REF = 2023.4.0b4 .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 52205dfdd..f900e6c51 100644 --- a/_static/version +++ b/_static/version @@ -1 +1 @@ -2023.4.0b3 \ No newline at end of file +2023.4.0b4 \ No newline at end of file diff --git a/conf.py b/conf.py index ae0960cd7..37f1e753f 100644 --- a/conf.py +++ b/conf.py @@ -69,7 +69,7 @@ author = "ESPHome" # The short X.Y version. version = "2023.4" # The full version, including alpha/beta/rc tags. -release = "2023.4.0b3" +release = "2023.4.0b4" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From b6852d5d63e828df65dc1aac6ff454ab7d5176b1 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 20 Apr 2023 13:13:30 +1200 Subject: [PATCH 35/38] Update changelog for 2023.4.0b4 --- changelog/2023.4.0.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/changelog/2023.4.0.rst b/changelog/2023.4.0.rst index 6b430701c..8fbc54410 100644 --- a/changelog/2023.4.0.rst +++ b/changelog/2023.4.0.rst @@ -64,6 +64,8 @@ Beta Changes - 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` Full list of changes -------------------- @@ -155,6 +157,8 @@ All changes - 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 --------------- From 4f7648baa7506c93e69a706355cedadd0f5ff582 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 20 Apr 2023 14:06:53 +1200 Subject: [PATCH 36/38] Bump version to 2023.4.0 --- Doxygen | 2 +- Makefile | 2 +- _static/version | 2 +- conf.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Doxygen b/Doxygen index 2294963a7..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.4.0b4 +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 c5dee6275..3b07c9333 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ ESPHOME_PATH = ../esphome -ESPHOME_REF = 2023.4.0b4 +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/version b/_static/version index f900e6c51..b0db10dad 100644 --- a/_static/version +++ b/_static/version @@ -1 +1 @@ -2023.4.0b4 \ No newline at end of file +2023.4.0 \ No newline at end of file diff --git a/conf.py b/conf.py index 37f1e753f..13647ccf8 100644 --- a/conf.py +++ b/conf.py @@ -69,7 +69,7 @@ author = "ESPHome" # The short X.Y version. version = "2023.4" # The full version, including alpha/beta/rc tags. -release = "2023.4.0b4" +release = "2023.4.0" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 9e11f5dd3d2ff0d2d1beffdd827085d7d396d117 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 20 Apr 2023 14:22:09 +1200 Subject: [PATCH 37/38] Update changelog for 2023.4.0 --- changelog/2023.4.0.rst | 61 ++++++++++++++++++++++++++++++++---------- 1 file changed, 47 insertions(+), 14 deletions(-) diff --git a/changelog/2023.4.0.rst b/changelog/2023.4.0.rst index 8fbc54410..8f51bff4b 100644 --- a/changelog/2023.4.0.rst +++ b/changelog/2023.4.0.rst @@ -28,13 +28,46 @@ With this also comes preliminary :doc:`microphone 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. -.. note:: +Keith joins Nabu Casa +--------------------- - TODO: Add link to tutorial for setting up M5Stack Atom Echo with Voice Assistant. +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 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -56,17 +89,6 @@ Due to ``uart0`` / ``uart1`` / ``uart2`` being defined in some of the platform c ESPHome will now disallow these ids from being used in the config. You can simply change them to ``uart_0`` to continue using. -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` - Full list of changes -------------------- @@ -83,6 +105,17 @@ Breaking Changes - 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 ^^^^^^^^^^^ @@ -136,8 +169,8 @@ All changes - 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]` -- Added in mmc5603 code :esphomepr:`4175` by :ghuser:`benhoff` (new-integration) - 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]` From fb2d790aac0ac2b75132094946d4edc0751228dc Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 20 Apr 2023 14:59:04 +1200 Subject: [PATCH 38/38] Add live stream embed --- changelog/2023.4.0.rst | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/changelog/2023.4.0.rst b/changelog/2023.4.0.rst index 8f51bff4b..d97260feb 100644 --- a/changelog/2023.4.0.rst +++ b/changelog/2023.4.0.rst @@ -28,6 +28,17 @@ With this also comes preliminary :doc:`microphone 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 ---------------------