Merge branch 'current' into next

This commit is contained in:
Jesse Hills 2022-01-13 09:55:20 +13:00
commit 10c2e0fc51
No known key found for this signature in database
GPG Key ID: BEAAE804EFD8E83A
27 changed files with 232 additions and 66 deletions

View File

@ -3,8 +3,5 @@
<li><a href="https://discord.gg/KhAMKrd" target="_blank">Join the community</a></li>
<li><a href="https://twitter.com/esphome_" target="_blank">Follow us on Twitter</a></li>
<li><a href="https://github.com/esphome/esphome" target="_blank">Source Code</a></li>
<li><a href="https://www.netlify.com" target="_blank">This site is powered by Netlify</a></li>
</ul>
<a href="https://www.netlify.com" style="border-bottom: none">
<img src="https://www.netlify.com/img/global/badges/netlify-color-accent.svg" alt="Deploys by Netlify" />
</a>

View File

@ -89,6 +89,20 @@ Release 2021.12.1 - December 15
- Set text sensor state property to filter output :esphomepr:`2893` by :ghuser:`oxan`
- Allow button POST on press from web server :esphomepr:`2913` by :ghuser:`wilberforce`
Release 2021.12.2 - December 21
-------------------------------
- Don't disable idle task WDT when it's not enabled :esphomepr:`2856` by :ghuser:`oxan`
- Fix MQTT button press action :esphomepr:`2917` by :ghuser:`oxan`
Release 2021.12.3 - December 30
-------------------------------
- Require arduino in webserver for better validation :esphomepr:`2941` by :ghuser:`jesserockz`
- Only allow internal pins for dht sensor :esphomepr:`2940` by :ghuser:`jesserockz`
- Workaround installing as editable package not working :esphomepr:`2936` by :ghuser:`jesserockz`
- Remove -e for hassio images :esphomepr:`2964` by :ghuser:`jesserockz`
Full list of changes
--------------------

View File

@ -452,7 +452,7 @@ And then later in code:
- id: page1
lambda: |-
// Draw the graph at position [x=10,y=20]
it.graph(10, 20, id(simple_temperature_graph));
it.graph(10, 20, id(single_temperature_graph));
- id: page2
lambda: |-
// Draw the graph at position [x=10,y=20]
@ -600,10 +600,10 @@ Configuration variables:
- ``BINARY``: Two colors, suitable for 1 color displays or 2 color image in color displays. Uses 1 bit
per pixel, 8 pixels per byte.
- ``GREYSCALE``: Full scale grey. Uses 8 bits per pixel, 1 pixel per byte.
- ``GRAYSCALE``: Full scale grey. Uses 8 bits per pixel, 1 pixel per byte.
- ``RGB24``: Full RGB color stored. Uses 3 bytes per pixel.
- **dither** (*Optional*): Specifies which dither method used to process each frame, only used in GREYSCALE and BINARY type image.
- **dither** (*Optional*): Specifies which dither method used to process each frame, only used in GRAYSCALE and BINARY type image.
Defaults to ``NONE``. You can read more about it `here <https://pillow.readthedocs.io/en/stable/reference/Image.html?highlight=Dither#PIL.Image.Image.convert>`__
and `here <https://en.wikipedia.org/wiki/Dither>`__.

View File

@ -18,13 +18,14 @@ Configuration variables:
- **board** (**Required**, string): The PlatformIO board ID that should
be used. Choose the appropriate board from
`this list <https://platformio.org/boards?count=1000&filter%5Bplatform%5D=espressif32>`__.
*This only affects pin aliases, flash size and some internal settings*, if unsure choose a generic board.
`this list <https://registry.platformio.org/packages/platforms/platformio/espressif32/boards>`__ (the icon next to the name
can be used to copy the board ID). *This only affects pin aliases, flash size and some internal settings*, if unsure
choose a generic board from Espressif such as ``esp32dev``.
- **framework** (*Optional*): Options for the underlying framework used by ESPHome.
See :ref:`esp32-arduino_framework` and :ref:`esp32-espidf_framework`.
- **variant** (*Optional*, boolean): Defaults to the variant detected from the board. If the board is not known this option becomes mandatory.
One of ``esp32``, ``esp32s2``, ``esp32s3``, ``esp32c3`` and ``esp32h2``.
- **variant** (*Optional*, boolean): The variant of the ESP32 that is used on this board. One of ``esp32``,
``esp32s2``, ``esp32s3``, ``esp32c3`` and ``esp32h2``. Defaults to the variant that is detected from the board, if
a board that's unknown to ESPHome is used, this option is mandatory.
.. _esp32-arduino_framework:

View File

@ -160,6 +160,28 @@ Configuration for M5Stack Camera
name: My Camera
# ...
Configuration for M5Stack Timer Camera X/F
------------------------------------------
.. code-block:: yaml
# Example configuration entry
esp32_camera:
external_clock:
pin: GPIO27
frequency: 20MHz
i2c_pins:
sda: GPIO25
scl: GPIO23
data_pins: [GPIO32, GPIO35, GPIO34, GPIO5, GPIO39, GPIO18, GPIO36, GPIO19]
vsync_pin: GPIO22
href_pin: GPIO26
pixel_clock_pin: GPIO21
reset_pin: GPIO15
# Image settings
name: My Camera
# ...
Configuration for Wrover Kit Boards
-----------------------------------

View File

@ -20,8 +20,9 @@ Configuration variables:
- **board** (**Required**, string): The PlatformIO board ID that should
be used. Choose the appropriate board from
`this list <https://platformio.org/boards?count=1000&filter%5Bplatform%5D=espressif8266>`__.
*This only affects pin aliases, flash size and some internal settings*, if unsure choose a generic board.
`this list <https://registry.platformio.org/platforms/platformio/espressif8266/boards>`__ (the icon next to the
name can be used to copy the board ID). *This only affects pin aliases, flash size and some internal settings*, if unsure
choose a generic board from Espressif such as ``esp01_1m``.
- **framework** (*Optional*): Options for the underlying framework used by ESPHome.
- **version** (*Optional*, string): The base framework version number to use, from

View File

@ -7,8 +7,7 @@ ESPHome Core Configuration
Here you specify some core information that ESPHome needs to create
firmwares. Most importantly, this is the section of the configuration
where you specify the **name** of the node, the **platform** and
**board** youre using.
where you specify the **name** of the node.
.. code-block:: yaml
@ -39,34 +38,29 @@ Advanced options:
platformio.ini file. See :ref:`esphome-platformio_options`.
- **includes** (*Optional*, list of files): A list of C/C++ files to include in the main (auto-generated) sketch file
for custom components. The paths in this list are relative to the directory where the YAML configuration file
is in. See :ref:`esphome-includes` for more info.
is in. See :ref:`esphome-includes`.
- **libraries** (*Optional*, list of libraries): A list of libraries to include in the project. See
:ref:`esphome-libraries` for more information.
:ref:`esphome-libraries`.
- **comment** (*Optional*, string): Additional text information about this node. Only for display in UI.
- **name_add_mac_suffix** (*Optional*, boolean): Appends the last 3 bytes of the mac address of the device to
the name in the form ``<name>-aabbcc``. Defaults to ``false``.
See :ref:`esphome-mac_suffix`.
- **project** (*Optional*): ESPHome Creator's Project information. See :ref:`esphome-creators_project`.
- **name** (**Required**, string): Name of the project
- **version** (**Required**, string): Version of the project
Platform options that have been moved (now in platform-specific sections :doc:`esp32 </components/esp32>` and :doc:`esp8266 </components/esp8266>`):
Old-style platform options, which have been moved to the platform-specific :doc:`esp32 </components/esp32>` and
:doc:`esp8266 </components/esp8266>` sections but are still accepted here for compatibility reasons (usage not
recommended for new projects):
- **platform** (**Required**, string): The type of platform. One of ``esp8266`` or ``esp32``.
- **board** (**Required**, string): The board that should be used. See
- **platform** (**Required**, string): The platform used, either ``esp8266`` or ``esp32``.
- **board** (**Required**, string): The board used, see
:doc:`esp32 </components/esp32>` and :doc:`esp8266 </components/esp8266>` for more information.
- **arduino_version** (*Optional*): The version of the Arduino framework to compile the project against.
- **arduino_version** (*Optional*, string): The version of the Arduino framework to compile the project against.
- **esp8266_restore_from_flash** (*Optional*, boolean): For ESP8266s, whether to store some persistent preferences in flash
memory.
Choose the appropriate board from
`this list <https://platformio.org/boards?count=1000&filter%5Bplatform%5D=espressif8266>`__ for the ESP8266, and
`this list <https://platformio.org/boards?count=1000&filter%5Bplatform%5D=espressif32>`__ for the ESP32 (the icon
next to the name can be used to copy the board ID). *This only affects pin aliases and some internal settings*,
if unsure choose a generic board from Espressif.
Automations:
- **on_boot** (*Optional*, :ref:`Automation <automation>`): An automation to perform
@ -154,7 +148,7 @@ This automation will be triggered on every ``loop()`` iteration (usually around
PlatformIO supports a number of options in its ``platformio.ini`` file. With the ``platformio_options``
parameter you can tell ESPHome what options to pass into the ``env`` section of the PlatformIO file
(Note you can also do this by editing the ``platformio.ini`` file manually).
(note you can also do this by editing the ``platformio.ini`` file manually).
You can view a full list of PlatformIO options here: https://docs.platformio.org/en/latest/projectconf/section_env.html

View File

@ -23,6 +23,14 @@ The `'hbridge`' fan platform allows you to use a compatible `h-bridge` (L298N, D
.. code-block:: yaml
# Example configuration entry
output:
- platform: ...
id: motor_forward_pin
pin: GPIO5
- platform: ...
id: motor_reverse_pin
pin: GPIO4
fan:
- platform: hbridge
id: my_fan
@ -43,12 +51,10 @@ Configuration variables:
:ref:`float output <output>` connected to the Enable pin of the h-bridge (if h-bridge uses enable).
- **decay_mode** (*Optional*, string): The decay mode you want to use with
the h-bridge. Either ``slow`` (braking) or ``fast`` (coasting). Defaults to ``slow``.
- **name** (**Required**, string): The name for this fan.
- **oscillation_output** (*Optional*, :ref:`config-id`): The id of the
:ref:`output <output>` to use for the oscillation state of this fan. Default is empty.
- **speed_count** (*Optional*, int): Set the number of supported discrete speed levels. The value is used
to calculate the percentages for each speed. E.g. ``2`` means that you have 50% and 100% while ``100``
will allow 1% increments in the output. Defaults to ``100``.
- **name** (**Required**, string): The name for this fan.
- **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation.
- All other options from :ref:`Fan Component <config-fan>`.

View File

@ -41,8 +41,8 @@ Configuration variables:
- ``RESTORE_DEFAULT_OFF`` (Default) - 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_OFF`` - Attempt to restore state inverted from the previous state and default to OFF.
- ``RESTORE_INVERTED_ON`` - Attempt to restore state inverted from the previous 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 light as OFF on bootup.
- ``ALWAYS_ON`` - Always initialize the light as ON on bootup.

View File

@ -2,7 +2,7 @@ MCP23Sxx I/O Expander
=====================
.. seo::
:description: Instructions for setting up MCP23S08, MCP23S16 or MCP23S17 digital port expander in ESPHome. This is exactly the same API as the MCP23SXX I/O Expander except talks on the SPI bus
:description: Instructions for setting up MCP23S08, MCP23S16 or MCP23S17 digital port expander in ESPHome. This is exactly the same API as the MCP230XX I/O Expander except talks on the SPI bus
:image: mcp230xx.svg
The Microchip MCP23Sxx series of general purpose, parallel I/O expansion for SPI bus applications.

View File

@ -347,7 +347,7 @@ Configuration variables:
.. code-block:: cpp
id(mqtt_client).subscribe("the/topic", [=](const std::string &payload) {
id(mqtt_client).subscribe("the/topic", [=](const std::string &topic, const std::string &payload) {
// do something with payload
});

View File

@ -74,7 +74,7 @@ Configuration variables:
- **transmitter_id** (*Optional*, :ref:`config-id`): The remote transmitter to send the
remote code with. Defaults to the first one defined in the configuration.
If you're looking for the same functionality as is default in the ``rpi_rf`` integration in
Home Assistant, you'll want to set the **times** to 10 and the **wait_time** to 0s.
@ -521,7 +521,7 @@ It transmits the ``address`` and ``command`` in two packets separated by a "spac
on_...:
- remote_transmitter.transmit_samsung36:
address: 0x0400
command: 0x000E00FF
command: 0x000E00FF
Configuration variables:
@ -571,6 +571,26 @@ Configuration variables:
- **Note:** this action transmits codes using the new(er) Toshiba AC protocol and likely will not work with older units.
- All other options from :ref:`remote_transmitter-transmit_action`.
Lambda calls
************
Actions may also be called from :ref:`lambdas <config-lambda>`. The ``.transmit()`` call can be populated with
encoded data for a specific protocol by following the example below.
See the full API Reference for more info.
- ``.transmit()``: Transmit an IR code using the remote transmitter.
.. code-block:: cpp
// Example - transmit using the Pioneer protocol
auto call = id(my_transmitter).transmit();
esphome::remote_base::PioneerData data = { rc_code_1, rc_code_2 };
esphome::remote_base::PioneerProtocol().encode(call.get_data(), data);
call.set_send_times(2);
call.perform();
.. _remote-setting-up-infrared:
Setting up Infrared Devices

View File

@ -21,7 +21,7 @@ The :ref:`I²C Bus <i2c>` is required to be set up in your configuration for thi
sensor:
- platform: ltr390
uvi:
uv:
name: "UV Index"
light:
name: "Light"

View File

@ -27,8 +27,8 @@ TX/RX labels are from the perspective of the MH-Z19). Additionally, you need to
# Example configuration entry
uart:
rx_pin: D0
tx_pin: D1
rx_pin: GPIO3
tx_pin: GPIO1
baud_rate: 9600
sensor:

View File

@ -27,9 +27,9 @@ Configuration variables:
- U_DWORD_R (unsigned 32 bit integer from 2 registers low word first)
- S_DWORD_R (signed 32 bit integer from 2 registers low word first)
- U_QWORD (unsigned 64 bit integer from 4 registers = 64bit)
- S_QWORD (unsigned 64 bit integer from 4 registers = 64bit)
- S_QWORD (signed 64 bit integer from 4 registers = 64bit)
- U_QWORD_R (unsigned 64 bit integer from 4 registers low word first)
- U_QWORD_R signed 64 bit integer from 4 registers low word first)
- S_QWORD_R (signed 64 bit integer from 4 registers low word first)
- FP32 (32 bit IEEE 754 floating point from 2 registers)
- FP32_R (32 bit IEEE 754 floating point - same as FP32 but low word first)s

View File

@ -238,7 +238,7 @@ Configuration example for PVVX MiThermometer firmware set to "Custom" advertisem
name: "PVVX Battery-Voltage"
MHO-C401
**********
********
Hygro thermometer, square body, e-ink display, encrypted, broadcasts temperature, humidity and battery status. Requires a bindkey in order to decrypt the received data (see :ref:`obtaining_the_bindkey`).
@ -248,7 +248,15 @@ Hygro thermometer, square body, e-ink display, encrypted, broadcasts temperature
( MHO-C201 doesn't have BT )
Configuration example:
Similar to the LYWSD03MMC, there is custom firmware available for this device, so there are the following possibilities to operate this sensor:
1. Xiaomi stock firmware (requires a bindkey in order to decrypt the received data, see :ref:`obtaining_the_bindkey`)
2. Device flashed with `PVVX MiThermometer <https://github.com/pvvx/ATC_MiThermometer>`__ custom firmware
- "Mi Like" advertisement (dummy bindkey required)
- "pvvx" custom advertisement (no bindkey required, only PVVX firmware)
Configuration example for Xiaomi stock firmware:
.. code-block:: yaml
@ -263,6 +271,23 @@ Configuration example:
battery_level:
name: "MHOC401 Battery Level"
Configuration example for PVVX MiThermometer firmware set to "Custom" advertisement:
.. code-block:: yaml
sensor:
- platform: pvvx_mithermometer
mac_address: "A4:C1:38:B1:CD:7F"
temperature:
name: "PVVX Temperature"
humidity:
name: "PVVX Humidity"
battery_level:
name: "PVVX Battery-Level"
battery_voltage:
name: "PVVX Battery-Voltage"
CGD1
****
@ -479,10 +504,10 @@ Obtaining The Bindkey
To set up an encrypted device such as the LYWSD03MMC (with Xiaomi stock firmware) and CGD1, you first need to obtain the bind key. The ``xiaomi_ble`` sensor component is not able to automatically generate a bind key so other workarounds are necessary.
LYWSD03MMC
**********
LYWSD03MMC/MHO-C401
*******************
If the LYWSD03MMC sensor is operated with the Xiaomi stock firmware, you can use the `TeLink flasher application <https://atc1441.github.io/TelinkFlasher.html>`__ to easily generate a new bind key and upload the key to the device without the need to flash a new firmware (see figure). For this, you load the flasher `webpage <https://atc1441.github.io/TelinkFlasher.html>`__ with a `supported browser <https://github.com/WebBluetoothCG/web-bluetooth/blob/master/implementation-status.md>`__ and connect the device by pressing "Connect". After the connection is established, you press the "Do Activation" button and the new key will be shown in the "Mi Bind Key" field. The key can be copied directly into the sensor YAML configuration.
If the LYWSD03MMC or MHO-C401 sensor is operated with the Xiaomi stock firmware, you can use the `TeLink flasher application <https://atc1441.github.io/TelinkFlasher.html>`__ to easily generate a new bind key and upload the key to the device without the need to flash a new firmware (see figure). For this, you load the flasher `webpage <https://atc1441.github.io/TelinkFlasher.html>`__ with a `supported browser <https://github.com/WebBluetoothCG/web-bluetooth/blob/master/implementation-status.md>`__ and connect the device by pressing "Connect". After the connection is established, you press the "Do Activation" button and the new key will be shown in the "Mi Bind Key" field. The key can be copied directly into the sensor YAML configuration.
.. figure:: images/telink_flasher.jpg
:align: center

View File

@ -34,8 +34,8 @@ Configuration variables:
- ``RESTORE_DEFAULT_OFF`` (Default) - 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_OFF`` - Attempt to restore state inverted from the previous state and default to OFF.
- ``RESTORE_INVERTED_ON`` - Attempt to restore state inverted from the previous 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 pin as OFF on bootup.
- ``ALWAYS_ON`` - Always initialize the pin as ON on bootup.

View File

@ -29,6 +29,7 @@ Configuration variables:
See Also
--------
- :doc:`/components/button/restart`
- :doc:`shutdown`
- :doc:`safe_mode`
- :doc:`template`

View File

@ -0,0 +1,63 @@
.. seo::
:description: AirGradient DIY Air Quality Sensor
:image: air_gradient_diy_air_quality_sensor.jpg
:keywords: Air Quality Sensor DIY
AirGradient DIY Air Quality Sensor
==================================
.. figure:: images/air_gradient_diy_air_quality_sensor.jpg
:align: center
:width: 100.0%
AirGradient has created a DIY Air Quality sensor.
They offer a PCB, PCB + components kit, etc.
A pretty neat package.
To use this you have to run their software but you can use the kit with ESPHome as well!
Here is what it can measure:
- **Temperature**
- **Humidity**
- **Air particles PM2.5**
- **Carbon Dioxide**
Additionally:
- There is a display so show off your data or whatever you desire from Home Assistant
- You can download a 3D printable case including a wall mount bracket
ESPHome Configuration
---------------------
Documentation:
- `Blog Article: Measuring Air Quality in your Home Office <https://www.ajfriesen.com/measuring-air-quality-in-your-home-office/>`__
- `ESPHome code with a setup guide for Home Assistant <https://github.com/ajfriesen/ESPHome-AirGradient>`__
- `AirGradient Shop for the PCB or PCB plus components <https://www.airgradient.com/diyshop/>`__
- `AirGradient Setup Guide (3D printeable case, setup guide, etc.) <https://www.airgradient.com/diy/>`__
`YAML configuration <https://github.com/ajfriesen/ESPHome-AirGradient/blob/main/air-gradient.yaml>`__
Soldering and setup video:
.. raw:: html
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/Cmr5VNALRAg" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
See Also
--------
- :doc:`/devices/nodemcu_esp8266`
- :doc:`/components/display/ssd1306`
- :doc:`/components/i2c`
- :doc:`/components/uart`
- :doc:`/components/sensor/sht3xd`
- :doc:`/components/sensor/pmsx003`
- :doc:`/components/sensor/senseair`
- :doc:`/components/wifi`
- :doc:`/components/api`
- :doc:`/components/logger`
- :doc:`/components/ota`
- :doc:`/components/switch/safe_mode`
- :ghedit:`Edit`

Binary file not shown.

After

Width:  |  Height:  |  Size: 268 KiB

View File

@ -251,16 +251,15 @@ ESPHome configuration
id: font1
size: 66
# wonky color fix, in lieu of finding a way to invert the display
color:
- id: color_wet
red: 100%
green: 100%
green: 0%
blue: 0%
- id: color_dry
red: 100%
green: 0%
blue: 100%
red: 0%
green: 100%
blue: 0%
# built-in 80x160 TFT
display:
@ -274,14 +273,16 @@ ESPHome configuration
cs_pin: GPIO5
dc_pin: GPIO23
reset_pin: GPIO18
invert_colors: true
use_bgr: true
lambda: |-
if (id(leak).state) {
it.fill(COLOR_ON);
it.fill(COLOR_OFF);
it.print(42, -24, id(font1), id(color_wet), TextAlign::TOP_CENTER, "W");
it.print(42, 32, id(font1), id(color_wet), TextAlign::TOP_CENTER, "E");
it.print(42, 85, id(font1), id(color_wet), TextAlign::TOP_CENTER, "T");
} else {
it.fill(COLOR_ON);
it.fill(COLOR_OFF);
it.print(42, -24, id(font1), id(color_dry), TextAlign::TOP_CENTER, "D");
it.print(42, 32, id(font1), id(color_dry), TextAlign::TOP_CENTER, "R");
it.print(42, 85, id(font1), id(color_dry), TextAlign::TOP_CENTER, "Y");

View File

@ -607,6 +607,20 @@ Standard for the esphome-core codebase:
# Run lint only over changed files
docker run --rm -v "${PWD}/":/esphome -it esphome/esphome-lint script/quicklint
If you are using Windows and have docker installed the syntax is slightly different.
If you have cloned esphome to ``c:\edev\esphome`` the volume format is ``c/edev/esphome``
.. code-block:: bash
# convert the volume format
$current_dir=(Get-Location).Path.ToLower().Replace(':','').Replace('\','/')
# Run lint only over changed files from powershell
docker run --rm -v "$($current_dir):/esphome" -it esphome/esphome-lint script/quicklint
ESPHome via Gitpod
******************

View File

@ -196,7 +196,7 @@ I have a question... How can I contact you?
Sure! We are happy to help :) You can contact us here:
- `Discord <https://discord.gg/KhAMKrd>`__
- `Home Assistant Community Forums <https://community.home-assistant.io/c/third-party/esphome>`__
- `Home Assistant Community Forums <https://community.home-assistant.io/c/esphome>`__
- ESPHome `issue <https://github.com/esphome/issues>`__ and
`feature request <https://github.com/esphome/feature-requests>`__ issue trackers. Preferably only for issues and
feature requests.

View File

@ -85,6 +85,7 @@ Contributors
- `Paulus Schoutsen (@balloob) <https://github.com/balloob>`__
- `Andrew Zaborowski (@balrog-kun) <https://github.com/balrog-kun>`__
- `Rutger Nijhuis (@BananaPukeh) <https://github.com/BananaPukeh>`__
- `BarryMar (@BarryMar) <https://github.com/BarryMar>`__
- `bazuchan (@bazuchan) <https://github.com/bazuchan>`__
- `Viktr (@BbIKTOP) <https://github.com/BbIKTOP>`__
- `J. Nick Koston (@bdraco) <https://github.com/bdraco>`__
@ -246,6 +247,7 @@ Contributors
- `Francis-labo (@Francis-labo) <https://github.com/Francis-labo>`__
- `Francisk0 (@Francisk0) <https://github.com/Francisk0>`__
- `Frank Bakker (@FrankBakkerNl) <https://github.com/FrankBakkerNl>`__
- `Frank Langtind (@frankiboy1) <https://github.com/frankiboy1>`__
- `Frankster-NL (@Frankster-NL) <https://github.com/Frankster-NL>`__
- `Fredrik Erlandsson (@fredrike) <https://github.com/fredrike>`__
- `Evgeny (@freekode) <https://github.com/freekode>`__
@ -279,6 +281,7 @@ Contributors
- `gordon-zhao (@gordon-zhao) <https://github.com/gordon-zhao>`__
- `Gustavo Ambrozio (@gpambrozio) <https://github.com/gpambrozio>`__
- `Antoine GRÉA (@grea09) <https://github.com/grea09>`__
- `George (@grob6000) <https://github.com/grob6000>`__
- `Andrea (@Guglio95) <https://github.com/Guglio95>`__
- `Guillaume DELVIT (@guiguid) <https://github.com/guiguid>`__
- `guptamp (@guptamp) <https://github.com/guptamp>`__
@ -296,6 +299,7 @@ Contributors
- `Jimmy Hedman (@HeMan) <https://github.com/HeMan>`__
- `HepoH3 (@HepoH3) <https://github.com/HepoH3>`__
- `Hermann Kraus (@herm) <https://github.com/herm>`__
- `Tom Cassady (@heytcass) <https://github.com/heytcass>`__
- `Hamish Moffatt (@hmoffatt) <https://github.com/hmoffatt>`__
- `MoA (@honomoa) <https://github.com/honomoa>`__
- `Hopperpop (@Hopperpop) <https://github.com/Hopperpop>`__
@ -325,6 +329,7 @@ Contributors
- `János Rusiczki (@janosrusiczki) <https://github.com/janosrusiczki>`__
- `Jan Pieper (@janpieper) <https://github.com/janpieper>`__
- `Jason-nz (@Jason-nz) <https://github.com/Jason-nz>`__
- `Jason2866 (@Jason2866) <https://github.com/Jason2866>`__
- `Jason Hines (@jasonehines) <https://github.com/jasonehines>`__
- `Jas Strong (@jasstrong) <https://github.com/jasstrong>`__
- `JbLb (@jblb) <https://github.com/jblb>`__
@ -344,6 +349,7 @@ Contributors
- `John K. Luebs (@jkl1337) <https://github.com/jkl1337>`__
- `Justin Maxwell (@jkmaxwell) <https://github.com/jkmaxwell>`__
- `Jeppe Ladefoged (@jladefoged) <https://github.com/jladefoged>`__
- `Jonas De Kegel (@jlsjonas) <https://github.com/jlsjonas>`__
- `Jonathan Martens (@jmartens) <https://github.com/jmartens>`__
- `Johan van der Kuijl (@johanvanderkuijl) <https://github.com/johanvanderkuijl>`__
- `Johboh (@Johboh) <https://github.com/Johboh>`__
@ -353,6 +359,7 @@ Contributors
- `Jonathan Treffler (@JonathanTreffler) <https://github.com/JonathanTreffler>`__
- `JonnyaiR (@jonnyair) <https://github.com/jonnyair>`__
- `Joppy (@JoppyFurr) <https://github.com/JoppyFurr>`__
- `Joscha Wagner (@jowgn) <https://github.com/jowgn>`__
- `jsuanet (@jsuanet) <https://github.com/jsuanet>`__
- `junnikokuki (@junnikokuki) <https://github.com/junnikokuki>`__
- `Justahobby01 (@Justahobby01) <https://github.com/Justahobby01>`__
@ -389,13 +396,11 @@ Contributors
- `Karl Q. (@kquinsland) <https://github.com/kquinsland>`__
- `krahabb (@krahabb) <https://github.com/krahabb>`__
- `Kodey Converse (@krconv) <https://github.com/krconv>`__
- `krikk (@krikk) <https://github.com/krikk>`__
- `KristopherMackowiak (@KristopherMackowiak) <https://github.com/KristopherMackowiak>`__
- `kroimon (@kroimon) <https://github.com/kroimon>`__
- `krunkel (@krunkel) <https://github.com/krunkel>`__
- `Kendell R (@KTibow) <https://github.com/KTibow>`__
- `Jakub Šimo (@kubik369) <https://github.com/kubik369>`__
- `kvvoff (@kvvoff) <https://github.com/kvvoff>`__
- `Ken Davidson (@kwdavidson) <https://github.com/kwdavidson>`__
- `Kyle Hendricks (@kylehendricks) <https://github.com/kylehendricks>`__
- `Kyle Manna (@kylemanna) <https://github.com/kylemanna>`__
@ -403,11 +408,11 @@ Contributors
- `Stefan Lässer (@Laess3r) <https://github.com/Laess3r>`__
- `Steffen Weinreich (@lairsdragon) <https://github.com/lairsdragon>`__
- `Fredrik Lindqvist (@Landrash) <https://github.com/Landrash>`__
- `larsonmpdx (@larsonmpdx) <https://github.com/larsonmpdx>`__
- `Laszlo Gazdag (@lazlyhu) <https://github.com/lazlyhu>`__
- `lcavalli (@lcavalli) <https://github.com/lcavalli>`__
- `lein1013 (@lein1013) <https://github.com/lein1013>`__
- `Benny de Leeuw (@leeuwte) <https://github.com/leeuwte>`__
- `Riku Lindblad (@lepinkainen) <https://github.com/lepinkainen>`__
- `Lerosen (@Lerosen) <https://github.com/Lerosen>`__
- `Leon Loopik (@Lewn) <https://github.com/Lewn>`__
- `Luca Gugelmann (@lgugelmann) <https://github.com/lgugelmann>`__
- `Juraj Liso (@LiJu09) <https://github.com/LiJu09>`__
@ -461,6 +466,7 @@ Contributors
- `meijerwynand (@meijerwynand) <https://github.com/meijerwynand>`__
- `Marco (@Melkor82) <https://github.com/Melkor82>`__
- `Merlin Schumacher (@merlinschumacher) <https://github.com/merlinschumacher>`__
- `Marco Lusini (@met67) <https://github.com/met67>`__
- `Michael Gorven (@mgorven) <https://github.com/mgorven>`__
- `mhentschke (@mhentschke) <https://github.com/mhentschke>`__
- `Michaël Arnauts (@michaelarnauts) <https://github.com/michaelarnauts>`__
@ -616,7 +622,6 @@ Contributors
- `Rubén G. (@rubengargar) <https://github.com/rubengargar>`__
- `@RubenKelevra (@RubenKelevra) <https://github.com/RubenKelevra>`__
- `RubyBailey (@RubyBailey) <https://github.com/RubyBailey>`__
- `Roberto Wagner (@rwagnervm) <https://github.com/rwagnervm>`__
- `rweather (@rweather) <https://github.com/rweather>`__
- `ryanalden (@ryanalden) <https://github.com/ryanalden>`__
- `Ryan Nazaretian (@ryannazaretian) <https://github.com/ryannazaretian>`__
@ -661,6 +666,7 @@ Contributors
- `sticilface (@sticilface) <https://github.com/sticilface>`__
- `StijnVdd (@StijnVdd) <https://github.com/StijnVdd>`__
- `Stijn Tintel (@stintel) <https://github.com/stintel>`__
- `Strixx76 (@Strixx76) <https://github.com/Strixx76>`__
- `stubs12 (@stubs12) <https://github.com/stubs12>`__
- `Jordan Vohwinkel (@sublime93) <https://github.com/sublime93>`__
- `sveip (@sveip) <https://github.com/sveip>`__
@ -762,4 +768,4 @@ Contributors
- `ZTX18 (@ZTX18) <https://github.com/ZTX18>`__
- `Christian Zufferey (@zuzu59) <https://github.com/zuzu59>`__
*This page was last updated December 15, 2021.*
*This page was last updated December 30, 2021.*

Binary file not shown.

After

Width:  |  Height:  |  Size: 268 KiB

View File

@ -671,6 +671,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
Do you have other awesome automations or cool setups? Please feel free to add them to the
documentation for others to copy. See :doc:`Contributing </guides/contributing>`.

View File

@ -1 +1 @@
sphinx==4.0.3
sphinx==4.3.2