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 01/19] 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 02/19] 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 03/19] 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 04/19] 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 05/19] 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 06/19] 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 07/19] 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 08/19] 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 01ea4397e43ad429bd7b3f47067a02326f9b7c04 Mon Sep 17 00:00:00 2001 From: Veli Veromann Date: Tue, 18 Apr 2023 10:36:31 +0300 Subject: [PATCH 09/19] fix "cycle: !lambda:" (#2854) the double ":" is not valid --- components/number/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/number/index.rst b/components/number/index.rst index e3a708bcc..5a6edebe1 100644 --- a/components/number/index.rst +++ b/components/number/index.rst @@ -278,7 +278,7 @@ using a generic templatable action call. - number.operation: id: my_number operation: !lambda "return NUMBER_OP_INCREMENT;" - cycle: !lambda: "return true;" + cycle: !lambda "return true;" Configuration variables: From 2910aae2c6c54f55a64ac7c4ee258d10c105f952 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20BOU=C3=89?= Date: Wed, 19 Apr 2023 16:27:50 +0200 Subject: [PATCH 10/19] Fix strftime issue in max7219 doc (#2856) Fix strftime issue in max7219 doc error: no matching function for call to 'esphome::max7219::MAX7219Component::strftime(const char [9])' it.strftime("%H.%M.%S"); --- components/display/max7219.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/display/max7219.rst b/components/display/max7219.rst index b60386cae..4959dbb10 100644 --- a/components/display/max7219.rst +++ b/components/display/max7219.rst @@ -104,7 +104,7 @@ segment of the previous position will be enabled. // Print the current time it.print(" "); - it.strftime("%H.%M.%S"); + it.strftime("%H.%M.%S", id(esptime).now()); // Result for 10:06:42 -> "10.06.42 " // Change the display intnsity based on another id. 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 11/19] 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 12/19] 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 13/19] 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 14/19] 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 15/19] 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 16/19] 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 17/19] 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 18/19] 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 --------------------- From 06292c9992e3ea318666ea7016ca117609cb5a5d Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 20 Apr 2023 03:44:11 +0000 Subject: [PATCH 19/19] Add some more context around Keith --- changelog/2023.4.0.rst | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/changelog/2023.4.0.rst b/changelog/2023.4.0.rst index d97260feb..aa863df17 100644 --- a/changelog/2023.4.0.rst +++ b/changelog/2023.4.0.rst @@ -43,7 +43,11 @@ Keith joins Nabu Casa --------------------- Nabu Casa is pleased to annouce that long time contributor Keith Burzinski (:ghuser:`kbx81`) is joining the -team as a full time developer to help out on ESPHome. +team as a full time developer to help out on ESPHome. Keith created the :doc:`/components/sprinkler`, +:doc:`/components/climate/thermostat`, a bunch of the ``ssd`` display components and a few other components +as well as fixing many bug along the way. I expect his house climate and garden area are kept well in line. + +Looking forward to working with you Keith. Breaking Changes ----------------