From deadaaaee8894c2613684ed7fe43c2aca2eae0ce Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 13 Oct 2021 16:40:47 +1300 Subject: [PATCH 01/37] Bump version to 2021.10.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 8b0dc9c98..790fcddee 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 = 2021.10.0-dev +PROJECT_NUMBER = 2021.10.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 a3947eab0..c5288bc44 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ ESPHOME_PATH = ../esphome -ESPHOME_REF = dev +ESPHOME_REF = 2021.10.0b1 .PHONY: html html-strict cleanhtml deploy help webserver Makefile netlify netlify-api api netlify-dependencies svg2png copy-svg2png minify diff --git a/_static/version b/_static/version index 0b185088a..597c7733d 100644 --- a/_static/version +++ b/_static/version @@ -1 +1 @@ -2021.10.0-dev +2021.10.0b1 \ No newline at end of file diff --git a/conf.py b/conf.py index e886428b2..ef0fe381f 100644 --- a/conf.py +++ b/conf.py @@ -69,7 +69,7 @@ author = "Otto Winter" # The short X.Y version. version = "2021.10" # The full version, including alpha/beta/rc tags. -release = "2021.10.0-dev" +release = "2021.10.0b1" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 7839495c7847cc7cfc4eefb4bcb265e06efff922 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 13 Oct 2021 18:08:58 +1300 Subject: [PATCH 02/37] Update changelog for 2021.10.0b1 --- _static/changelog-2021.10.0.png | Bin 0 -> 106564 bytes changelog/2021.10.0.rst | 339 ++++++++++++++++++++++++++++++++ changelog/index.rst | 2 +- components/display/index.rst | 14 +- index.rst | 1 + 5 files changed, 349 insertions(+), 7 deletions(-) create mode 100644 _static/changelog-2021.10.0.png create mode 100644 changelog/2021.10.0.rst diff --git a/_static/changelog-2021.10.0.png b/_static/changelog-2021.10.0.png new file mode 100644 index 0000000000000000000000000000000000000000..ecfc0b4dca66a884a4ebd37ae92f04b85ab92bc1 GIT binary patch literal 106564 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 z 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 S9S8kx0e2TK=ci8LIe!80ntU4o literal 0 HcmV?d00001 diff --git a/changelog/2021.10.0.rst b/changelog/2021.10.0.rst new file mode 100644 index 000000000..c2594a8b4 --- /dev/null +++ b/changelog/2021.10.0.rst @@ -0,0 +1,339 @@ +ESPHome 2021.10.0 - 20th October 2021 +===================================== + +.. seo:: + :description: Changelog for ESPHome 2021.10.0. + :image: /_static/changelog-2021.10.0.png + :author: ESPHome + :author_twitter: @esphome_ + +.. imgtable:: + :columns: 3 + + AirThings Wave Mini, components/sensor/airthings_ble, airthings_logo.png + Current-Based Cover, components/cover/current_based, flash.svg + Daly BMS, components/sensor/daly_bms, daly_bms.png + EPEVER Tracer, cookbook/tracer-an, tracer-an.jpg + LTR390, components/sensor/ltr390, ltr390.jpg + Modbus Controller, components/modbus_controller, modbus.png + Safe Mode Switch, components/switch/safe_mode, restart-alert.svg + SCD4X, components/sensor/scd4x, scd4x.jpg + Tuya Cover, components/cover/tuya, tuya.png + + +ESP-IDF +------- + +A huge effort has been put into reorganising, restructuring and rewriting a whole lot of code +to allow ESP32 based boards to be compiled using ESP-IDF as the framework instead of Arduino. +This allows ESPHome to keep up with new features and support for new ESP32 based chips +that Espressif add to the ESP-IDF, such as the ESP32-C3 that a lot of people had been asking about. + +There are known issues and specific components that are missing support for ESP-IDF as those ones rely +on an Arduino library and need more time to be rewritten in a compatible way. + +If you come across an issue while switching to ESP-IDF, please file an +`issue on GitHub `__ +using the ``ESP32-IDF`` option as the platform. + +Dashboard Node Import +--------------------- + +To be written... + +Modbus Controller +----------------- + +Support for generic modbus device data has been added. This allows you as a user +to get data and control a modbus device without a native ESPHome component. Although a +native component is still better and preferred if it exists. + +- :doc:`Modbus Controller ` +- :doc:`Sensors ` +- :doc:`Binary Sensors ` +- :doc:`Text Sensors ` +- :doc:`Numbers ` +- :doc:`Switches ` +- :doc:`Outputs ` + +Text Sensor filters +------------------- + +``text_sensors`` now have ``filters`` that allow you to do string manipulation before the value is +given to the frontend. Check out the :ref:`docs here `. + +Lighting +-------- + +The Tuya light platform now supports RGB and HSV datapoints for those TuyaMCU based lights. + +Partitions now support adding non-addressable lights into the sequence. As an example you +could build a "fake" addressable light from regular rgb leds. + +Graphs +------ + +There is new :ref:`Graph ` building functions for displays that will allow you to +draw the history of sensors over time. See the docs for examples and images on what this looks like. + +``wait_until`` +-------------- + +The ``wait_until`` action now has an optional ``timeout`` option that lets you continue or cancel (using an +if action afterwards) your automations if the condition does not become true after a period of time. + + +Combination of MiScale 1 & 2 +---------------------------- + +:esphomepr:`2266` combines the two miscale platforms into one as the code was mostly the +same and autodetection could be done to detemine which one you are using. + +Float Output state changes +-------------------------- + +When using a float output with both invert and min/max values, prevously +the end resut value was being calculated incorrectly. :esphomepr:`2368` fixed this. + + +Full list of changes +-------------------- + +New Features +^^^^^^^^^^^^ + +- Added graphing component :esphomepr:`2109` by :ghuser:`synco` (new-integration) (new-feature) +- Add deep sleep wakeup from touch (#1238) :esphomepr:`2281` by :ghuser:`chrta` (new-feature) +- Allow non-addressable lights in light partitions :esphomepr:`2256` by :ghuser:`paulmonigatti` (new-feature) +- Add support for Waveshare 7.5 inch (C) bichromatic display (black-and-white only for now) :esphomepr:`1844` by :ghuser:`pixelspark` (new-feature) +- Wifi scan results :esphomepr:`1605` by :ghuser:`gpambrozio` (new-feature) +- Add SSD1305 support to SSD1306 integration along with few new options :esphomepr:`1902` by :ghuser:`zhangjingye03` (new-feature) (breaking-change) +- Adds light sensor support for b-parasites :esphomepr:`2391` by :ghuser:`rbaron` (new-feature) +- Tuya rgb support :esphomepr:`2278` by :ghuser:`irtimaled` (new-feature) +- add fan.cycle_speed action :esphomepr:`2329` by :ghuser:`WeekendWarrior1` (new-feature) +- Add cover toggle support :esphomepr:`1809` by :ghuser:`dtmuller` (new-feature) +- Support HSV-based color support on tuya light :esphomepr:`2400` by :ghuser:`irtimaled` (new-feature) +- String manipulation filters for text sensors! :esphomepr:`2393` by :ghuser:`WeekendWarrior1` (new-feature) +- Add optional timeout for wait_until action :esphomepr:`2282` by :ghuser:`jesserockz` (new-feature) + +New Components +^^^^^^^^^^^^^^ + +- Added graphing component :esphomepr:`2109` by :ghuser:`synco` (new-integration) (new-feature) +- Configurable Flash Write Interval :esphomepr:`2119` by :ghuser:`alexyao2015` (new-integration) +- Add support for Daly Smart BMS :esphomepr:`2156` by :ghuser:`s1lvi0` (new-integration) +- Add support for LTR390 :esphomepr:`1505` by :ghuser:`sjtrny` (new-integration) +- Modbus controller :esphomepr:`1779` by :ghuser:`martgras` (new-integration) +- Dashboard node import and render in browser :esphomepr:`2374` by :ghuser:`OttoWinter` (new-integration) +- Add Current based cover :esphomepr:`1439` by :ghuser:`djwmarcx` (new-integration) +- Add support for SCD4X :esphomepr:`2217` by :ghuser:`sjtrny` (new-integration) +- Add support for Airthing Wave Mini :esphomepr:`2440` by :ghuser:`ncareau` (new-integration) +- Add Safe Mode Restart Switch :esphomepr:`2437` by :ghuser:`paulmonigatti` (new-integration) +- Added heatpumpir support :esphomepr:`1343` by :ghuser:`rob-deutsch` (new-integration) + +Breaking Changes +^^^^^^^^^^^^^^^^ + +- Combine code of xiaomi_miscale and xiaomi_miscale2 :esphomepr:`2266` by :ghuser:`edenhaus` (breaking-change) +- Correctly invert the float output state :esphomepr:`2368` by :ghuser:`jesserockz` (breaking-change) +- Add SSD1305 support to SSD1306 integration along with few new options :esphomepr:`1902` by :ghuser:`zhangjingye03` (new-feature) (breaking-change) + +All changes +^^^^^^^^^^^ + +- Drop obsolete comments from CONTRIBUTING.md :esphomepr:`2271` by :ghuser:`oxan` +- Support inverting color temperature on tuya lights :esphomepr:`2277` by :ghuser:`irtimaled` +- Untangle core headers (part 1) :esphomepr:`2276` by :ghuser:`oxan` +- Compatibility with clang-tidy v14 :esphomepr:`2272` by :ghuser:`oxan` +- Store strings only used for logging in flash :esphomepr:`2274` by :ghuser:`oxan` +- Expose select on Frontend `web_server:` :esphomepr:`2245` by :ghuser:`ayufan` +- Fix devcontainer scripts on Windows :esphomepr:`2239` by :ghuser:`alexyao2015` +- Fix SM300D2 sensor component routines so they correctly read the sensor output :esphomepr:`2159` by :ghuser:`jamesbraid` +- Bump tzlocal from 2.1 to 3.0 :esphomepr:`2154` by :ghuser:`dependabot[bot]` +- Activate owning-memory clang-tidy check :esphomepr:`1891` by :ghuser:`OttoWinter` +- Fix issue #2054. PZEM004T Component doesn't set the module address. :esphomepr:`1784` by :ghuser:`0x3333` +- Convert st7735.h to use LF line endings :esphomepr:`2287` by :ghuser:`oxan` +- Add esphal.h include to inkplate6 component :esphomepr:`2286` by :ghuser:`oxan` +- Revert "Bump tzlocal from 2.1 to 3.0 (#2154)" :esphomepr:`2289` by :ghuser:`OttoWinter` +- Run clang-tidy against ESP32 :esphomepr:`2147` by :ghuser:`oxan` +- Run clang-tidy against Arduino 3 :esphomepr:`2146` by :ghuser:`oxan` +- Bump click from 7.1.2 to 8.0.1 :esphomepr:`1824` by :ghuser:`dependabot[bot]` +- Add stale/lock bots :esphomepr:`2299` by :ghuser:`OttoWinter` +- Use standard version of make_unique when available :esphomepr:`2292` by :ghuser:`oxan` +- Bug fix of NFC message & records becoming inaccessible in on_tag lambdas :esphomepr:`2309` by :ghuser:`JonasEr` +- Dsmr updates :esphomepr:`2157` by :ghuser:`glmnet` +- Support direct relay state feedback for tuya climate component :esphomepr:`1668` by :ghuser:`kroimon` +- ac_dimmer increase gate time for robotdyn :esphomepr:`1708` by :ghuser:`glmnet` +- Bump aioesphomeapi from 9.0.0 to 9.1.0 :esphomepr:`2306` by :ghuser:`dependabot[bot]` +- Bump black from 21.8b0 to 21.9b0 :esphomepr:`2305` by :ghuser:`dependabot[bot]` +- Add namespace to all PlatformIO library references :esphomepr:`2296` by :ghuser:`oxan` +- Allow transforms and flashes to not update remote_values :esphomepr:`2313` by :ghuser:`matthewmazzanti` +- Reduce stale/lock gh actions interval :esphomepr:`2341` by :ghuser:`OttoWinter` +- Add `esp8266_disable_ssl_support:` config option :esphomepr:`2236` by :ghuser:`ayufan` +- Bump pylint from 2.10.2 to 2.11.1 :esphomepr:`2334` by :ghuser:`dependabot[bot]` +- Add eco mode to tuya climate component :esphomepr:`1860` by :ghuser:`kroimon` +- Fix SPIDevice::write_byte16 to actually take a 16 bit argument :esphomepr:`2345` by :ghuser:`lgugelmann` +- Redo docker build system with buildkit+multi-stage and cache pio packages :esphomepr:`2338` by :ghuser:`OttoWinter` +- Calculating the AC only component of the samples :esphomepr:`1906` by :ghuser:`synco` +- Fix error reporting for DHT bit read loop :esphomepr:`2344` by :ghuser:`besteru` +- Also run docker CI when requirements change :esphomepr:`2347` by :ghuser:`OttoWinter` +- Added graphing component :esphomepr:`2109` by :ghuser:`synco` (new-integration) (new-feature) +- Properly calculate negative temperatures in sm300d2 :esphomepr:`2335` by :ghuser:`poptix` +- Fix docker release deploy push flag :esphomepr:`2348` by :ghuser:`OttoWinter` +- Add invert_colors option for st7735 :esphomepr:`2327` by :ghuser:`g5pw` +- Add deep sleep wakeup from touch (#1238) :esphomepr:`2281` by :ghuser:`chrta` (new-feature) +- Add ESPHOME_VERSION_CODE define :esphomepr:`2324` by :ghuser:`oxan` +- Install python requirements after apt ones for better caching :esphomepr:`2349` by :ghuser:`OttoWinter` +- Introduce call_dump_config() indirection :esphomepr:`2325` by :ghuser:`oxan` +- ESP-IDF support and generic target platforms :esphomepr:`2303` by :ghuser:`OttoWinter` +- CI cache only restore from direct matches :esphomepr:`2351` by :ghuser:`OttoWinter` +- fixes compilation error in rtttl :esphomepr:`2357` by :ghuser:`martgras` +- Fix MDNS not registered :esphomepr:`2359` by :ghuser:`OttoWinter` +- Fix src_filter in platformio.ini after src_dir change :esphomepr:`2353` by :ghuser:`OttoWinter` +- Fix duplicate defines and restore alphabetical order :esphomepr:`2352` by :ghuser:`oxan` +- Configurable Flash Write Interval :esphomepr:`2119` by :ghuser:`alexyao2015` (new-integration) +- Fix OTA password mismatch error. :esphomepr:`2363` by :ghuser:`mmakaay` +- Allow compilation against IDF from repository :esphomepr:`2355` by :ghuser:`oxan` +- Fix ESP8266 preferences not set up :esphomepr:`2362` by :ghuser:`OttoWinter` +- Fix ESP8266 preference loading :esphomepr:`2367` by :ghuser:`paulmonigatti` +- Allow non-addressable lights in light partitions :esphomepr:`2256` by :ghuser:`paulmonigatti` (new-feature) +- add = to default font glpyh list :esphomepr:`2361` by :ghuser:`WeekendWarrior1` +- Fix docker pio settings not applied :esphomepr:`2370` by :ghuser:`OttoWinter` +- Fix OTA crash during reading of new bin file. :esphomepr:`2366` by :ghuser:`mmakaay` +- Fix Dallas parent not being set :esphomepr:`2369` by :ghuser:`paulmonigatti` +- Discard SenseAir S8 commands echoes & fix calibration result check :esphomepr:`2358` by :ghuser:`nmaggioni` +- Add support for Daly Smart BMS :esphomepr:`2156` by :ghuser:`s1lvi0` (new-integration) +- Combine code of xiaomi_miscale and xiaomi_miscale2 :esphomepr:`2266` by :ghuser:`edenhaus` (breaking-change) +- Add support for Waveshare 7.5 inch (C) bichromatic display (black-and-white only for now) :esphomepr:`1844` by :ghuser:`pixelspark` (new-feature) +- ili9341: use larger SPI transfers :esphomepr:`1628` by :ghuser:`numo68` +- Correctly invert the float output state :esphomepr:`2368` by :ghuser:`jesserockz` (breaking-change) +- Add support for LTR390 :esphomepr:`1505` by :ghuser:`sjtrny` (new-integration) +- Allow sloppy Tuya datapoint message length :esphomepr:`1982` by :ghuser:`trvrnrth` +- Mqtt topics to support numeric fan speed :esphomepr:`1859` by :ghuser:`wifwucite` +- Wifi scan results :esphomepr:`1605` by :ghuser:`gpambrozio` (new-feature) +- Add SSD1305 support to SSD1306 integration along with few new options :esphomepr:`1902` by :ghuser:`zhangjingye03` (new-feature) (breaking-change) +- Fix broken compilation due to conflict between #1237 and IDF changes :esphomepr:`2372` by :ghuser:`oxan` +- Don't generate IDs with the name of loaded integrations :esphomepr:`2373` by :ghuser:`oxan` +- fix i2c scanning eror for Arduino :esphomepr:`2364` by :ghuser:`martgras` +- Bump tzlocal from 2.1 to 3.0 :esphomepr:`2294` by :ghuser:`dependabot[bot]` +- ledc: do not try to write_state to an uninitialized output :esphomepr:`1732` by :ghuser:`toelke` +- Fix two i2c error code return errors :esphomepr:`2375` by :ghuser:`OttoWinter` +- Fix ir_climate on ESP32-C3 :esphomepr:`2314` by :ghuser:`stintel` +- Fix ESP8266 ADC :esphomepr:`2376` by :ghuser:`paulmonigatti` +- Fix: Pin flags code generation returning FLAG_NONE :esphomepr:`2377` by :ghuser:`paulmonigatti` +- Add missing MockObj operators :esphomepr:`2378` by :ghuser:`OttoWinter` +- Fix esp-idf pinmask bit-shift overflow :esphomepr:`2380` by :ghuser:`chrta` +- Add i2c bus recovery during initialization :esphomepr:`2379` by :ghuser:`chrta` +- Bump voluptuous from 0.12.1 to 0.12.2 :esphomepr:`2381` by :ghuser:`dependabot[bot]` +- Read unencrypted DSMR telegrams in chunks :esphomepr:`2382` by :ghuser:`mmakaay` +- Fix clang-tidy header filter :esphomepr:`2385` by :ghuser:`OttoWinter` +- Fix InterruptLock on ESP-IDF :esphomepr:`2388` by :ghuser:`OttoWinter` +- Fix some issues with wifi driver after IDF refactor :esphomepr:`2387` by :ghuser:`OttoWinter` +- Fix arduino esp32 wifi v2 :esphomepr:`2389` by :ghuser:`OttoWinter` +- Misc fixes for esp-idf :esphomepr:`2386` by :ghuser:`OttoWinter` +- Adds light sensor support for b-parasites :esphomepr:`2391` by :ghuser:`rbaron` (new-feature) +- fix: Setting Tuya string DP value :esphomepr:`2394` by :ghuser:`irtimaled` +- Tuya rgb support :esphomepr:`2278` by :ghuser:`irtimaled` (new-feature) +- add fan.cycle_speed action :esphomepr:`2329` by :ghuser:`WeekendWarrior1` (new-feature) +- Modbus controller :esphomepr:`1779` by :ghuser:`martgras` (new-integration) +- Extend nfc ndef records with Text :esphomepr:`2191` by :ghuser:`JonasEr` +- Fix NDEF URI casing :esphomepr:`2397` by :ghuser:`jesserockz` +- Dashboard node import and render in browser :esphomepr:`2374` by :ghuser:`OttoWinter` (new-integration) +- ccs811: Skip reading data if it is not available/ready :esphomepr:`2404` by :ghuser:`chrta` +- Add missing include for component bme680_bsec :esphomepr:`2403` by :ghuser:`mmakaay` +- fix: stop tuya light state getting reset :esphomepr:`2401` by :ghuser:`irtimaled` +- Add Current based cover :esphomepr:`1439` by :ghuser:`djwmarcx` (new-integration) +- Add cover toggle support :esphomepr:`1809` by :ghuser:`dtmuller` (new-feature) +- Fix handling of timestamps in Teleinfo component. :esphomepr:`2392` by :ghuser:`0hax` +- bump dashboard to 20210927.0 :esphomepr:`2405` by :ghuser:`balloob` +- Add str_sprintf function that returns std::string :esphomepr:`2408` by :ghuser:`oxan` +- Fix lint issues in web_server_base :esphomepr:`2409` by :ghuser:`jesserockz` +- Fix uninitialised use of ESPPreferenceObject.backend :esphomepr:`2411` by :ghuser:`paulmonigatti` +- Add support for SCD4X :esphomepr:`2217` by :ghuser:`sjtrny` (new-integration) +- Support HSV-based color support on tuya light :esphomepr:`2400` by :ghuser:`irtimaled` (new-feature) +- Tuya: add cover component :esphomepr:`2279` by :ghuser:`marmarek` +- Fix tuya cover lint checks :esphomepr:`2414` by :ghuser:`OttoWinter` +- Bump debian base to 5.1.0 / 20210902 :esphomepr:`2413` by :ghuser:`OttoWinter` +- Remove default initializations from tuya cover :esphomepr:`2415` by :ghuser:`jesserockz` +- Move #ifdef to after header include :esphomepr:`2417` by :ghuser:`oxan` +- String manipulation filters for text sensors! :esphomepr:`2393` by :ghuser:`WeekendWarrior1` (new-feature) +- Update web_server.cpp :esphomepr:`2419` by :ghuser:`arallsopp` +- Fix default environment for clang-tidy :esphomepr:`2420` by :ghuser:`oxan` +- Replace std::move() with const references where possible :esphomepr:`2421` by :ghuser:`oxan` +- Fix line endings normalization :esphomepr:`2407` by :ghuser:`oxan` +- Option to ignore CRC for EFuse MAC address :esphomepr:`2399` by :ghuser:`mmakaay` +- Fix attach_interrupt(...) for esp-idf framework :esphomepr:`2416` by :ghuser:`mmakaay` +- Fix I2C recovery on Arduino :esphomepr:`2412` by :ghuser:`mmakaay` +- Fix ESP32 esp-idf OTA updates :esphomepr:`2424` by :ghuser:`mmakaay` +- Add local MAC address to WiFi info :esphomepr:`2428` by :ghuser:`cvwillegen` +- Thermostat publish state fix :esphomepr:`2427` by :ghuser:`kbx81` +- Convert time to use tzdata :esphomepr:`2425` by :ghuser:`OttoWinter` +- Hotfix for ESP8266 OTA issue: ERROR Error binary size :esphomepr:`2432` by :ghuser:`mmakaay` +- Disable dependency finder on ESP32 :esphomepr:`2435` by :ghuser:`agners` +- Use size_t to fix comparision using RISC-V toolchain :esphomepr:`2436` by :ghuser:`agners` +- Fix I2C recovery ESP32 esp-idf :esphomepr:`2438` by :ghuser:`mmakaay` +- Fix esp32 no longer has Hash internal lib :esphomepr:`2441` by :ghuser:`OttoWinter` +- Fix restoring globals :esphomepr:`2442` by :ghuser:`OttoWinter` +- Always upload using esptool :esphomepr:`2433` by :ghuser:`OttoWinter` +- Add support for Airthing Wave Mini :esphomepr:`2440` by :ghuser:`ncareau` (new-integration) +- Improved validation for Addressable Light Partition Segments :esphomepr:`2439` by :ghuser:`paulmonigatti` +- Bump pytest-cov from 2.12.1 to 3.0.0 :esphomepr:`2444` by :ghuser:`dependabot[bot]` +- Fix compilation error for shutdown component :esphomepr:`2447` by :ghuser:`martgras` +- Bump aioesphomeapi from 9.1.4 to 9.1.5 :esphomepr:`2449` by :ghuser:`dependabot[bot]` +- Only ping once every two seconds :esphomepr:`2448` by :ghuser:`alexiri` +- Bump esphome-dashboard to 20211006.0 :esphomepr:`2451` by :ghuser:`jesserockz` +- I2C re-introduce very verbose logging :esphomepr:`2446` by :ghuser:`OttoWinter` +- Add Safe Mode Restart Switch :esphomepr:`2437` by :ghuser:`paulmonigatti` (new-integration) +- Add id() for restoring global :esphomepr:`2454` by :ghuser:`jesserockz` +- Add timestamp to ESPHome dashboard/cli logs :esphomepr:`2455` by :ghuser:`alexiri` +- I2c fix :esphomepr:`2460` by :ghuser:`martgras` +- Correct I2C read() return val check in bh1750 component. :esphomepr:`2465` by :ghuser:`mmakaay` +- atm90e32: make the total_increasing class sensors actually be increasing totals. :esphomepr:`2459` by :ghuser:`davidmonro` +- Use enum for Tuya fan direction datapoint :esphomepr:`2471` by :ghuser:`rmounce` +- Fix MQTT cover state when position is supported :esphomepr:`2468` by :ghuser:`definitio` +- Sgp40 fix :esphomepr:`2462` by :ghuser:`natelust` +- EntityBase Refactor :esphomepr:`2418` by :ghuser:`paulmonigatti` +- Fix below freezing temperature for Inkbird sensors :esphomepr:`2466` by :ghuser:`nuttytree` +- Add configuration for cover topics :esphomepr:`2472` by :ghuser:`definitio` +- Add configuration for climate topics :esphomepr:`2473` by :ghuser:`definitio` +- Use arduino btStart for arduino framework :esphomepr:`2457` by :ghuser:`jesserockz` +- Bump click from 8.0.1 to 8.0.3 :esphomepr:`2481` by :ghuser:`dependabot[bot]` +- Bump flake8 from 3.9.2 to 4.0.1 :esphomepr:`2483` by :ghuser:`dependabot[bot]` +- Bump platformio from 5.2.0 to 5.2.1 :esphomepr:`2482` by :ghuser:`dependabot[bot]` +- Bump esphome-dashboard from 20211006.0 to 20211011.1 :esphomepr:`2484` by :ghuser:`dependabot[bot]` +- Replace deprecated COLOR_BLACK constant :esphomepr:`2487` by :ghuser:`davet2001` +- Fix color temperature persistence on CWWW lights :esphomepr:`2486` by :ghuser:`sairon` +- Fix reset on http_request without network connection :esphomepr:`2474` by :ghuser:`niklasweber` +- Consolidate CONF_RAW_DATA_ID to const.py :esphomepr:`2491` by :ghuser:`davet2001` +- Update Airthings BLE :esphomepr:`2453` by :ghuser:`jesserockz` +- Add on_open and on_closed triggers to cover :esphomepr:`2488` by :ghuser:`nuttytree` +- Fix LoadProhibited crash for logger baud_rate 0 on esp-idf :esphomepr:`2498` by :ghuser:`mmakaay` +- Added heatpumpir support :esphomepr:`1343` by :ghuser:`rob-deutsch` (new-integration) +- Reduce IRAM usage in test3 :esphomepr:`2499` by :ghuser:`oxan` +- Add optional timeout for wait_until action :esphomepr:`2282` by :ghuser:`jesserockz` (new-feature) +- Improves ct_clamp component accuracy :esphomepr:`2283` by :ghuser:`skasi7` +- Allow multiple pn532_spi entries :esphomepr:`2489` by :ghuser:`jesserockz` +- Add throttle_average sensor filter :esphomepr:`2485` by :ghuser:`sermayoral` + +Past Changelogs +--------------- + +.. toctree:: + :maxdepth: 1 + + 2021.9.0 + 2021.8.0 + v1.20.0 + v1.19.0 + v1.18.0 + v1.17.0 + v1.16.0 + v1.15.0 + v1.14.0 + v1.13.0 + v1.12.0 + v1.11.0 + v1.10.0 + v1.9.0 + v1.8.0 + v1.7.0 diff --git a/changelog/index.rst b/changelog/index.rst index eecc2c524..f8ffc1e7d 100644 --- a/changelog/index.rst +++ b/changelog/index.rst @@ -2,7 +2,7 @@ Changelog ========= .. redirect:: - :url: /changelog/2021.9.0.html + :url: /changelog/2021.10.0.html .. toctree:: :glob: diff --git a/components/display/index.rst b/components/display/index.rst index 567d26c93..b6d50e9f5 100644 --- a/components/display/index.rst +++ b/components/display/index.rst @@ -305,7 +305,7 @@ To display a text string from a ``text_sensor``, append ``.c_str()`` to the end # ... lambda: |- it.printf(0, 0, id(my_font), "Text to follow: %s", id(template_text).state.c_str()); - + The last printf tip for use in displays I will discuss here is how to display binary sensor values. You *could* of course just check the state with an ``if`` statement as the first few lines in the example below, but if you want to be efficient you can use an *inline if* too. With the ``%s`` print specifier you can tell it to @@ -370,6 +370,8 @@ Configuration variables: RGB displays use red, green, and blue, while grayscale displays may use white. +.. _display-graphs: + Graphs ****** @@ -414,7 +416,7 @@ Graph component with options for grids, border and line-types. line_type: DOTTED line_thickness: 2 color: my_green - + Configuration variables: - **id** (**Required**, :ref:`config-id`): The ID with which you will be able to reference the graph later @@ -425,7 +427,7 @@ Configuration variables: - **border** (*Optional*, boolean): Specifics if a border will be draw around the graph. Default is True. - **x_grid** (*Optional*): Specifies the time per division. If not specified, no vertical grid will be drawn. - **y_grid** (*Optional*, float): Specifics the number of units per division. If not specified, no horizontal grid will be drawn. -- **max_range** (*Optional*): Specifies the maximum Y-axis range. +- **max_range** (*Optional*): Specifies the maximum Y-axis range. - **min_range** (*Optional*): Specifies the minimum Y-axis range. - **max_value** (*Optional*): Specifies the maximum Y-axis value. - **min_value** (*Optional*): Specifies the minimum Y-axis value. @@ -453,7 +455,7 @@ And then later in code: lambda: |- // Draw the graph at position [x=10,y=20] it.graph(10, 20, id(multi_temperature_graph), my_yellow); - + color: - id: my_red red: 100% @@ -476,7 +478,7 @@ And then later in code: Here are some things to note: - Setting ``y_grid`` will expand any specified range to the nearest multiple of grid spacings. - Axis labels are currently not possible without manually placing them. - - The grid and border color is set with it.graph(), while the traces are defined separately. + - The grid and border color is set with it.graph(), while the traces are defined separately. Images ****** @@ -717,7 +719,7 @@ You can then switch between these with three different actions: - **to** (*Optional*, :ref:`config-id`): A page id. If set the automation is only triggered if changing to this page. Defaults to all pages. Additionally the old page will be given as the variable ``from`` and the new one as the variable ``to``. - + See Also -------- diff --git a/index.rst b/index.rst index 73254c360..183f76232 100644 --- a/index.rst +++ b/index.rst @@ -298,6 +298,7 @@ Light AM43, components/sensor/am43, am43.jpg, Lux APDS9960, components/sensor/apds9960, apds9960.jpg, Colour & Gesture BH1750, components/sensor/bh1750, bh1750.jpg, Lux + LTR390, components/sensor/ltr390, ltr390.jpg, Lux & UV TCS34725, components/sensor/tcs34725, tcs34725.jpg, Lux & RGB colour TSL2561, components/sensor/tsl2561, tsl2561.jpg, Lux TSL2591, components/sensor/tsl2591, tsl2591.jpg, Lux From 4a0f730a852b3bf09ef8d02e22acc00314716aa9 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 13 Oct 2021 18:09:20 +1300 Subject: [PATCH 03/37] Update supporters for 2021.10.0b1 --- guides/supporters.rst | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/guides/supporters.rst b/guides/supporters.rst index b5f839a26..20b9837f5 100644 --- a/guides/supporters.rst +++ b/guides/supporters.rst @@ -61,7 +61,7 @@ Contributors - `Andrzej (@andriej) `__ - `Andreas (@anduchs) `__ - `anekinloewe (@anekinloewe) `__ -- `Angel Nunez Mencias (@angelnu) `__ +- `Vegetto (@angelnu) `__ - `Sergey Anisimov (@anisimovsergey) `__ - `ankycooper (@ankycooper) `__ - `Nikolay Vasilchuk (@Anonym-tsk) `__ @@ -152,6 +152,7 @@ Contributors - `Dave Wongillies (@davewongillies) `__ - `David De Sloovere (@DavidDeSloovere) `__ - `David Beitey (@davidjb) `__ +- `davidmonro (@davidmonro) `__ - `David Zovko (@davidzovko) `__ - `dckiller51 (@dckiller51) `__ - `Debashish Sahu (@debsahu) `__ @@ -334,7 +335,7 @@ Contributors - `Jonathan Adams (@jonathanadams) `__ - `Jonathan Treffler (@JonathanTreffler) `__ - `JonnyaiR (@jonnyair) `__ -- `Joppy Furr (@JoppyFurr) `__ +- `Joppy (@JoppyFurr) `__ - `jsuanet (@jsuanet) `__ - `junnikokuki (@junnikokuki) `__ - `Justahobby01 (@Justahobby01) `__ @@ -369,7 +370,7 @@ Contributors - `Kodey Converse (@krconv) `__ - `krikk (@krikk) `__ - `KristopherMackowiak (@KristopherMackowiak) `__ -- `Stefan Rado (@kroimon) `__ +- `kroimon (@kroimon) `__ - `krunkel (@krunkel) `__ - `Kendell R (@KTibow) `__ - `Jakub Šimo (@kubik369) `__ @@ -469,6 +470,7 @@ Contributors - `n8detar (@n8detar) `__ - `Erik Näsström (@Naesstrom) `__ - `Oskar Napieraj (@napieraj) `__ +- `Nate Lust (@natelust) `__ - `ueno (@nayuta-ueno) `__ - `Nazar Mokrynskyi (@nazar-pc) `__ - `Bergont Nicolas (@nbergont) `__ @@ -480,7 +482,9 @@ Contributors - `nickrout (@nickrout) `__ - `Nick Whyte (@nickw444) `__ - `nicuh (@nicuh) `__ +- `Joakim Vindgard (@nigobo) `__ - `nikito7 (@nikito7) `__ +- `niklasweber (@niklasweber) `__ - `Zvonimir Haramustek (@nitko12) `__ - `Nikolay Kitanov (@nkitanov) `__ - `nldroid (@nldroid) `__ @@ -543,7 +547,7 @@ Contributors - `Leandro Puerari (@puerari) `__ - `puuu (@puuu) `__ - `Qc (@qc24) `__ -- `qqgg231 (@qqgg231) `__ +- `Karol Zlot (@qqgg231) `__ - `Tommy Jonsson (@quazzie) `__ - `Quinn Hosler (@quinnhosler) `__ - `r-jordan (@r-jordan) `__ @@ -590,6 +594,7 @@ Contributors - `ryanalden (@ryanalden) `__ - `Ryan Nazaretian (@ryannazaretian) `__ - `Silvio (@s1lvi0) `__ +- `Jan Čermák (@sairon) `__ - `samnewman86 (@samnewman86) `__ - `sascha lammers (@sascha432) `__ - `Sascha (@Scarbous) `__ @@ -613,6 +618,7 @@ Contributors - `Derek Hageman (@Sizurka) `__ - `Stephen Tierney (@sjtrny) `__ - `Niklas Wagner (@Skaronator) `__ +- `Rafael Treviño (@skasi7) `__ - `Luca Zimmermann (@soundstorm) `__ - `Sourabh Jaiswal (@sourabhjaiswal) `__ - `Philip Allgaier (@spacegaier) `__ @@ -692,7 +698,7 @@ Contributors - `Thorsten von Eicken (@tve) `__ - `Tyler Menezes (@tylermenezes) `__ - `tyomikh (@tyomikh) `__ -- `wuuker (@ukewea) `__ +- `ukewea (@ukewea) `__ - `Vc (@Valcob) `__ - `Nad (@valordk) `__ - `Víctor Ferrer García (@vicfergar) `__ @@ -733,4 +739,4 @@ Contributors - `ZTX18 (@ZTX18) `__ - `Christian Zufferey (@zuzu59) `__ -*This page was last updated October 7, 2021.* +*This page was last updated October 13, 2021.* From d4107badefadced863cb149f9a61be51ceb9df64 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 13 Oct 2021 21:34:59 +1300 Subject: [PATCH 04/37] Add temporary esp-idf example --- changelog/2021.10.0.rst | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/changelog/2021.10.0.rst b/changelog/2021.10.0.rst index c2594a8b4..4ff25072e 100644 --- a/changelog/2021.10.0.rst +++ b/changelog/2021.10.0.rst @@ -24,6 +24,18 @@ ESPHome 2021.10.0 - 20th October 2021 ESP-IDF ------- +Docs still to be written before release on how to use ESP-IDF, but here is a quick example: + +.. code-block:: yaml + + esphome: + name: livingroom + + esp32: + board: + framework: + type: esp-idf + A huge effort has been put into reorganising, restructuring and rewriting a whole lot of code to allow ESP32 based boards to be compiled using ESP-IDF as the framework instead of Arduino. This allows ESPHome to keep up with new features and support for new ESP32 based chips From 66bd523dacf431c5210763e718ae8e034d828586 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 13 Oct 2021 22:30:31 +1300 Subject: [PATCH 05/37] Bump version to 2021.10.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 790fcddee..d2d098591 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 = 2021.10.0b1 +PROJECT_NUMBER = 2021.10.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 c5288bc44..64de2f3f7 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ ESPHOME_PATH = ../esphome -ESPHOME_REF = 2021.10.0b1 +ESPHOME_REF = 2021.10.0b2 .PHONY: html html-strict cleanhtml deploy help webserver Makefile netlify netlify-api api netlify-dependencies svg2png copy-svg2png minify diff --git a/_static/version b/_static/version index 597c7733d..fc9196eb8 100644 --- a/_static/version +++ b/_static/version @@ -1 +1 @@ -2021.10.0b1 \ No newline at end of file +2021.10.0b2 \ No newline at end of file diff --git a/conf.py b/conf.py index ef0fe381f..d093afbdb 100644 --- a/conf.py +++ b/conf.py @@ -69,7 +69,7 @@ author = "Otto Winter" # The short X.Y version. version = "2021.10" # The full version, including alpha/beta/rc tags. -release = "2021.10.0b1" +release = "2021.10.0b2" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 1fa11f52460bc99c26dafb290af6d8aebfc89499 Mon Sep 17 00:00:00 2001 From: Nate Lust Date: Thu, 14 Oct 2021 16:39:29 -0400 Subject: [PATCH 06/37] Add new documentation to SGP40 component (#1515) --- components/sensor/sgp40.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/components/sensor/sgp40.rst b/components/sensor/sgp40.rst index 8ea7f92cc..cce91ab02 100644 --- a/components/sensor/sgp40.rst +++ b/components/sensor/sgp40.rst @@ -9,6 +9,14 @@ The ``sgp40`` sensor platform allows you to use your Sensirion SGP40 VOC sensor (`datasheet `__) with ESPHome. The :ref:`I²C Bus ` is required to be set up in your configuration for this sensor to work. +.. note:: + + This sensor need to be driven at a rate of 1Hz. Because of this, the + sensor will be read out on device once a second separately from the + update_interval. The state will be reported to other components, or + the front end at the update_interval, saving wifi power and network + communication. + .. figure:: images/sgp40.jpg :align: center :width: 80.0% From 8018d48e800ff6106915cdf247e871e646c92b7b Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Fri, 15 Oct 2021 09:42:46 +1300 Subject: [PATCH 07/37] Bump version to 2021.10.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 d2d098591..83b74a3b3 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 = 2021.10.0b2 +PROJECT_NUMBER = 2021.10.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 64de2f3f7..fb99509a9 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ ESPHOME_PATH = ../esphome -ESPHOME_REF = 2021.10.0b2 +ESPHOME_REF = 2021.10.0b3 .PHONY: html html-strict cleanhtml deploy help webserver Makefile netlify netlify-api api netlify-dependencies svg2png copy-svg2png minify diff --git a/_static/version b/_static/version index fc9196eb8..e559809c3 100644 --- a/_static/version +++ b/_static/version @@ -1 +1 @@ -2021.10.0b2 \ No newline at end of file +2021.10.0b3 \ No newline at end of file diff --git a/conf.py b/conf.py index d093afbdb..bcd462c40 100644 --- a/conf.py +++ b/conf.py @@ -69,7 +69,7 @@ author = "Otto Winter" # The short X.Y version. version = "2021.10" # The full version, including alpha/beta/rc tags. -release = "2021.10.0b2" +release = "2021.10.0b3" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From e03a7924c6f459d2bc7c6806ea2c2753e5657b1d Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Fri, 15 Oct 2021 09:45:23 +1300 Subject: [PATCH 08/37] Update changelog for 2021.10.0b3 --- changelog/2021.10.0.rst | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/changelog/2021.10.0.rst b/changelog/2021.10.0.rst index 4ff25072e..72ff32d19 100644 --- a/changelog/2021.10.0.rst +++ b/changelog/2021.10.0.rst @@ -150,6 +150,18 @@ Breaking Changes - Correctly invert the float output state :esphomepr:`2368` by :ghuser:`jesserockz` (breaking-change) - Add SSD1305 support to SSD1306 integration along with few new options :esphomepr:`1902` by :ghuser:`zhangjingye03` (new-feature) (breaking-change) +Beta Fixes +^^^^^^^^^^ + +- Fix light state remaining on after turn off with transition :esphomepr:`2509` by :ghuser:`oxan` +- Fix: Light flash not restoring previous LightState :esphomepr:`2383` by :ghuser:`paulmonigatti` +- Disallow using UART2 for logger on ESP-32 variants that lack it :esphomepr:`2510` by :ghuser:`oxan` +- Fix BME680_BSEC compilation issue with ESP32 :esphomepr:`2516` by :ghuser:`paulmonigatti` +- add missing include in sgp30 :esphomepr:`2517` by :ghuser:`dmitriy5181` +- Fix: Color modes not being correctly used in light partitions :esphomepr:`2513` by :ghuser:`paulmonigatti` +- Don't define UART_SELECTION_UART2 when UART2 is unavailable :esphomepr:`2512` by :ghuser:`oxan` +- Remove BME680_BSEC test :esphomepr:`2518` by :ghuser:`paulmonigatti` + All changes ^^^^^^^^^^^ @@ -326,6 +338,14 @@ All changes - Improves ct_clamp component accuracy :esphomepr:`2283` by :ghuser:`skasi7` - Allow multiple pn532_spi entries :esphomepr:`2489` by :ghuser:`jesserockz` - Add throttle_average sensor filter :esphomepr:`2485` by :ghuser:`sermayoral` +- Fix light state remaining on after turn off with transition :esphomepr:`2509` by :ghuser:`oxan` +- Fix: Light flash not restoring previous LightState :esphomepr:`2383` by :ghuser:`paulmonigatti` +- Disallow using UART2 for logger on ESP-32 variants that lack it :esphomepr:`2510` by :ghuser:`oxan` +- Fix BME680_BSEC compilation issue with ESP32 :esphomepr:`2516` by :ghuser:`paulmonigatti` +- add missing include in sgp30 :esphomepr:`2517` by :ghuser:`dmitriy5181` +- Fix: Color modes not being correctly used in light partitions :esphomepr:`2513` by :ghuser:`paulmonigatti` +- Don't define UART_SELECTION_UART2 when UART2 is unavailable :esphomepr:`2512` by :ghuser:`oxan` +- Remove BME680_BSEC test :esphomepr:`2518` by :ghuser:`paulmonigatti` Past Changelogs --------------- From e28689957d2aee63b3efef55cd4ba4e20d2c6560 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Fri, 15 Oct 2021 09:45:41 +1300 Subject: [PATCH 09/37] Update supporters for 2021.10.0b3 --- guides/supporters.rst | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/guides/supporters.rst b/guides/supporters.rst index 20b9837f5..3925d8241 100644 --- a/guides/supporters.rst +++ b/guides/supporters.rst @@ -165,6 +165,7 @@ Contributors - `dentra (@dentra) `__ - `Davide Depau (@Depau) `__ - `dependabot[bot] (@dependabot[bot]) `__ +- `Joeri Colman (@depuits) `__ - `Destix (@Destix) `__ - `Develo (@devyte) `__ - `Dezorian (@Dezorian) `__ @@ -177,6 +178,7 @@ Contributors - `djtef (@djtef) `__ - `Marcos Pérez Ferro (@djwmarcx) `__ - `Dan Mannock (@dmannock) `__ +- `Dmitriy Lopatko (@dmitriy5181) `__ - `dmkif (@dmkif) `__ - `Farzad E. (@dnetguru) `__ - `DrZoid (@docteurzoidberg) `__ @@ -556,6 +558,7 @@ Contributors - `Pär Stålberg (@rabbadab) `__ - `Radim Karniš (@radimkarnis) `__ - `Florian Ragwitz (@rafl) `__ +- `razorback16 (@razorback16) `__ - `rbaron (@rbaron) `__ - `Robert Cambridge (@rcambrj) `__ - `Ronald Dehuysser (@rdehuyss) `__ @@ -739,4 +742,4 @@ Contributors - `ZTX18 (@ZTX18) `__ - `Christian Zufferey (@zuzu59) `__ -*This page was last updated October 13, 2021.* +*This page was last updated October 15, 2021.* From e0f8fc55d27b6720ccde2c29d453b0cab7b8d054 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Sun, 17 Oct 2021 11:03:24 +1300 Subject: [PATCH 10/37] Add dashboard_import to sharing page (#1530) Co-authored-by: Paulus Schoutsen Co-authored-by: Oxan van Leeuwen --- guides/creators.rst | 15 +++++++++++---- index.rst | 2 +- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/guides/creators.rst b/guides/creators.rst index 9fec5da98..2da40be36 100644 --- a/guides/creators.rst +++ b/guides/creators.rst @@ -1,10 +1,10 @@ -Using ESPHome for your Project -============================== +Sharing ESPHome devices +======================= .. seo:: - :description: Information for creators when using ESPHome firmware. + :description: Information for creating and sharing devices using ESPHome firmware. -We have added configuration options to ESPHome to make it easier for creators +We have added configuration options to ESPHome to make it easier to create, configure, install and distribute devices running ESPHome. Example configuration @@ -24,6 +24,10 @@ Example configuration name: jesse.temperature_monitor version: "1.0" + # This should point to the public location of this yaml file. + dashboard_import: + package_import_url: github://jesserockz/dummy-esphome-configs@v1/temperature-monitor.yaml + wifi: # Set up a wifi access point ap: @@ -50,6 +54,9 @@ Relevant Documentation - ``wifi`` -> ``networks: []`` allows you to flash a device that will not contain any credentials and they must be set by the user via either the ``ap`` + ``captive_portal`` or the ``esp32_improv`` components. +- ``dashboard_import`` -> ``package_import_url`` - This should point to the public repository containing + the configuration for the device so that the user's ESPHome dashboard can autodetect this device and + create a minimal YAML using :ref:`config-git_packages`. See Also -------- diff --git a/index.rst b/index.rst index 183f76232..381b5ab8d 100644 --- a/index.rst +++ b/index.rst @@ -69,7 +69,7 @@ ESPHome is a system to control your ESP8266/ESP32 by simple yet powerful configu
  • - Creating a Project + Sharing ESPHome devices
  • From 3bade3380f8c27c0a5a401d8ae0b55415a7c361a Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Sun, 17 Oct 2021 20:34:10 +1300 Subject: [PATCH 11/37] Bump version to 2021.10.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 83b74a3b3..3d74164dd 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 = 2021.10.0b3 +PROJECT_NUMBER = 2021.10.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 fb99509a9..d12549efc 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ ESPHOME_PATH = ../esphome -ESPHOME_REF = 2021.10.0b3 +ESPHOME_REF = 2021.10.0b4 .PHONY: html html-strict cleanhtml deploy help webserver Makefile netlify netlify-api api netlify-dependencies svg2png copy-svg2png minify diff --git a/_static/version b/_static/version index e559809c3..f10158bda 100644 --- a/_static/version +++ b/_static/version @@ -1 +1 @@ -2021.10.0b3 \ No newline at end of file +2021.10.0b4 \ No newline at end of file diff --git a/conf.py b/conf.py index bcd462c40..9d70701c8 100644 --- a/conf.py +++ b/conf.py @@ -69,7 +69,7 @@ author = "Otto Winter" # The short X.Y version. version = "2021.10" # The full version, including alpha/beta/rc tags. -release = "2021.10.0b3" +release = "2021.10.0b4" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 0f5d51c7587e19e1196c979a027a1b426b2e8f50 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Sun, 17 Oct 2021 20:34:55 +1300 Subject: [PATCH 12/37] Update changelog for 2021.10.0b4 --- changelog/2021.10.0.rst | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/changelog/2021.10.0.rst b/changelog/2021.10.0.rst index 72ff32d19..c97f9141d 100644 --- a/changelog/2021.10.0.rst +++ b/changelog/2021.10.0.rst @@ -161,6 +161,13 @@ Beta Fixes - Fix: Color modes not being correctly used in light partitions :esphomepr:`2513` by :ghuser:`paulmonigatti` - Don't define UART_SELECTION_UART2 when UART2 is unavailable :esphomepr:`2512` by :ghuser:`oxan` - Remove BME680_BSEC test :esphomepr:`2518` by :ghuser:`paulmonigatti` +- Add pressure compensation during runtime :esphomepr:`2493` by :ghuser:`martgras` +- Fix Nextion HTTPClient error for ESP32 :esphomepr:`2524` by :ghuser:`kbx81` +- Fix bug in register name definition :esphomepr:`2526` by :ghuser:`martgras` +- Replace framework version_hint with source option :esphomepr:`2529` by :ghuser:`oxan` +- Fix bitshift on read in ADE7953 :esphomepr:`2537` by :ghuser:`oxan` +- Allow downloading all bin files from backend in dashboard :esphomepr:`2514` by :ghuser:`jesserockz` +- Bump dashboard to 20211015.0 :esphomepr:`2525` by :ghuser:`balloob` All changes ^^^^^^^^^^^ @@ -346,6 +353,13 @@ All changes - Fix: Color modes not being correctly used in light partitions :esphomepr:`2513` by :ghuser:`paulmonigatti` - Don't define UART_SELECTION_UART2 when UART2 is unavailable :esphomepr:`2512` by :ghuser:`oxan` - Remove BME680_BSEC test :esphomepr:`2518` by :ghuser:`paulmonigatti` +- Add pressure compensation during runtime :esphomepr:`2493` by :ghuser:`martgras` +- Fix Nextion HTTPClient error for ESP32 :esphomepr:`2524` by :ghuser:`kbx81` +- Fix bug in register name definition :esphomepr:`2526` by :ghuser:`martgras` +- Replace framework version_hint with source option :esphomepr:`2529` by :ghuser:`oxan` +- Fix bitshift on read in ADE7953 :esphomepr:`2537` by :ghuser:`oxan` +- Allow downloading all bin files from backend in dashboard :esphomepr:`2514` by :ghuser:`jesserockz` +- Bump dashboard to 20211015.0 :esphomepr:`2525` by :ghuser:`balloob` Past Changelogs --------------- From 68e35efbd31b45ff04825fc54ca76bde9fed937c Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Sun, 17 Oct 2021 20:35:14 +1300 Subject: [PATCH 13/37] Update supporters for 2021.10.0b4 --- guides/supporters.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/guides/supporters.rst b/guides/supporters.rst index 3925d8241..ce58b86e2 100644 --- a/guides/supporters.rst +++ b/guides/supporters.rst @@ -726,7 +726,6 @@ Contributors - `workingmanrob (@workingmanrob) `__ - `Wojtek Strzalka (@wstrzalka) `__ - `wutr (@wutr) `__ -- `xheronimo (@xheronimo) `__ - `Mike (@xsnoopy) `__ - `Yaroslav (@Yarikx) `__ - `Marcin Jaworski (@yawor) `__ @@ -739,7 +738,8 @@ Contributors - `zaluthar (@zaluthar) `__ - `ZJY (@zhangjingye03) `__ - `San (@zhujunsan) `__ +- `Zoltant7 (@Zoltant7) `__ - `ZTX18 (@ZTX18) `__ - `Christian Zufferey (@zuzu59) `__ -*This page was last updated October 15, 2021.* +*This page was last updated October 17, 2021.* From ee8a30b00adcb4af6de1cd967caee4ef680cab57 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Mon, 18 Oct 2021 15:31:02 +1300 Subject: [PATCH 14/37] Bump version to 2021.10.0b5 --- Doxygen | 2 +- Makefile | 2 +- _static/version | 2 +- conf.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Doxygen b/Doxygen index 3d74164dd..f5200e871 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 = 2021.10.0b4 +PROJECT_NUMBER = 2021.10.0b5 # 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 d12549efc..2bbc4abe2 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ ESPHOME_PATH = ../esphome -ESPHOME_REF = 2021.10.0b4 +ESPHOME_REF = 2021.10.0b5 .PHONY: html html-strict cleanhtml deploy help webserver Makefile netlify netlify-api api netlify-dependencies svg2png copy-svg2png minify diff --git a/_static/version b/_static/version index f10158bda..2be824f75 100644 --- a/_static/version +++ b/_static/version @@ -1 +1 @@ -2021.10.0b4 \ No newline at end of file +2021.10.0b5 \ No newline at end of file diff --git a/conf.py b/conf.py index 9d70701c8..d11e7022a 100644 --- a/conf.py +++ b/conf.py @@ -69,7 +69,7 @@ author = "Otto Winter" # The short X.Y version. version = "2021.10" # The full version, including alpha/beta/rc tags. -release = "2021.10.0b4" +release = "2021.10.0b5" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From f73fc4239dce6b6b9305361708002a2c095d76f5 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Mon, 18 Oct 2021 16:06:55 +1300 Subject: [PATCH 15/37] Update changelog for 2021.10.0b5 --- changelog/2021.10.0.rst | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/changelog/2021.10.0.rst b/changelog/2021.10.0.rst index c97f9141d..878b8197f 100644 --- a/changelog/2021.10.0.rst +++ b/changelog/2021.10.0.rst @@ -51,7 +51,12 @@ using the ``ESP32-IDF`` option as the platform. Dashboard Node Import --------------------- -To be written... +If you intend on creating and distributing devices preinstalled with ESPHome, check out :doc:`/guides/creators` +for more information and the best ways to give the end users the best experience. + +The newest feature of this set is the importing of devices found on the network. If the device is running +ESPHome 2021.10 or newer, it can be configured to broadcast a url via mDNS and the ESPHome dashboard will pick this up +and prompt the user to import the device and create a minimal configuration for it. Modbus Controller ----------------- @@ -168,6 +173,10 @@ Beta Fixes - Fix bitshift on read in ADE7953 :esphomepr:`2537` by :ghuser:`oxan` - Allow downloading all bin files from backend in dashboard :esphomepr:`2514` by :ghuser:`jesserockz` - Bump dashboard to 20211015.0 :esphomepr:`2525` by :ghuser:`balloob` +- Only show timestamp for dashboard access logs :esphomepr:`2540` by :ghuser:`OttoWinter` +- Fix const used for IDF recommended version :esphomepr:`2542` by :ghuser:`jesserockz` +- Fix Bluetooth setup_priorities :esphomepr:`2458` by :ghuser:`jesserockz` +- Autodetect ESP32 variant :esphomepr:`2530` by :ghuser:`oxan` All changes ^^^^^^^^^^^ @@ -360,6 +369,10 @@ All changes - Fix bitshift on read in ADE7953 :esphomepr:`2537` by :ghuser:`oxan` - Allow downloading all bin files from backend in dashboard :esphomepr:`2514` by :ghuser:`jesserockz` - Bump dashboard to 20211015.0 :esphomepr:`2525` by :ghuser:`balloob` +- Only show timestamp for dashboard access logs :esphomepr:`2540` by :ghuser:`OttoWinter` +- Fix const used for IDF recommended version :esphomepr:`2542` by :ghuser:`jesserockz` +- Fix Bluetooth setup_priorities :esphomepr:`2458` by :ghuser:`jesserockz` +- Autodetect ESP32 variant :esphomepr:`2530` by :ghuser:`oxan` Past Changelogs --------------- From 193cac78a604713806d5d1e3d0807f810f6b8879 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Mon, 18 Oct 2021 16:07:15 +1300 Subject: [PATCH 16/37] Update supporters for 2021.10.0b5 --- guides/supporters.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/supporters.rst b/guides/supporters.rst index ce58b86e2..24592dc04 100644 --- a/guides/supporters.rst +++ b/guides/supporters.rst @@ -742,4 +742,4 @@ Contributors - `ZTX18 (@ZTX18) `__ - `Christian Zufferey (@zuzu59) `__ -*This page was last updated October 17, 2021.* +*This page was last updated October 18, 2021.* From 0fea54597e817a435c8b5da23794770b68d04d79 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Mon, 18 Oct 2021 21:26:37 +1300 Subject: [PATCH 17/37] Bump version to 2021.10.0b6 --- Doxygen | 2 +- Makefile | 2 +- _static/version | 2 +- conf.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Doxygen b/Doxygen index f5200e871..68adefdaf 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 = 2021.10.0b5 +PROJECT_NUMBER = 2021.10.0b6 # 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 2bbc4abe2..399bde845 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ ESPHOME_PATH = ../esphome -ESPHOME_REF = 2021.10.0b5 +ESPHOME_REF = 2021.10.0b6 .PHONY: html html-strict cleanhtml deploy help webserver Makefile netlify netlify-api api netlify-dependencies svg2png copy-svg2png minify diff --git a/_static/version b/_static/version index 2be824f75..22b1632e6 100644 --- a/_static/version +++ b/_static/version @@ -1 +1 @@ -2021.10.0b5 \ No newline at end of file +2021.10.0b6 \ No newline at end of file diff --git a/conf.py b/conf.py index d11e7022a..7ac52de94 100644 --- a/conf.py +++ b/conf.py @@ -69,7 +69,7 @@ author = "Otto Winter" # The short X.Y version. version = "2021.10" # The full version, including alpha/beta/rc tags. -release = "2021.10.0b5" +release = "2021.10.0b6" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 301019afe9c1566d818869ed2738555ed2f461b0 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Mon, 18 Oct 2021 21:27:12 +1300 Subject: [PATCH 18/37] Update changelog for 2021.10.0b6 --- changelog/2021.10.0.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/changelog/2021.10.0.rst b/changelog/2021.10.0.rst index 878b8197f..20e982be8 100644 --- a/changelog/2021.10.0.rst +++ b/changelog/2021.10.0.rst @@ -177,6 +177,7 @@ Beta Fixes - Fix const used for IDF recommended version :esphomepr:`2542` by :ghuser:`jesserockz` - Fix Bluetooth setup_priorities :esphomepr:`2458` by :ghuser:`jesserockz` - Autodetect ESP32 variant :esphomepr:`2530` by :ghuser:`oxan` +- OTA firmware MD5 check + password support for esp-idf :esphomepr:`2507` by :ghuser:`mmakaay` (new-integration) All changes ^^^^^^^^^^^ @@ -373,6 +374,7 @@ All changes - Fix const used for IDF recommended version :esphomepr:`2542` by :ghuser:`jesserockz` - Fix Bluetooth setup_priorities :esphomepr:`2458` by :ghuser:`jesserockz` - Autodetect ESP32 variant :esphomepr:`2530` by :ghuser:`oxan` +- OTA firmware MD5 check + password support for esp-idf :esphomepr:`2507` by :ghuser:`mmakaay` (new-integration) Past Changelogs --------------- From 37d0516d8e599d26c0b3e997244561173fde0ffd Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 19 Oct 2021 15:47:32 +1300 Subject: [PATCH 19/37] Bump version to 2021.10.0b7 --- Doxygen | 2 +- Makefile | 2 +- _static/version | 2 +- conf.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Doxygen b/Doxygen index 68adefdaf..d0c2d0c72 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 = 2021.10.0b6 +PROJECT_NUMBER = 2021.10.0b7 # 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 399bde845..4411bda1b 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ ESPHOME_PATH = ../esphome -ESPHOME_REF = 2021.10.0b6 +ESPHOME_REF = 2021.10.0b7 .PHONY: html html-strict cleanhtml deploy help webserver Makefile netlify netlify-api api netlify-dependencies svg2png copy-svg2png minify diff --git a/_static/version b/_static/version index 22b1632e6..d3a4267ae 100644 --- a/_static/version +++ b/_static/version @@ -1 +1 @@ -2021.10.0b6 \ No newline at end of file +2021.10.0b7 \ No newline at end of file diff --git a/conf.py b/conf.py index 7ac52de94..29ebc0848 100644 --- a/conf.py +++ b/conf.py @@ -69,7 +69,7 @@ author = "Otto Winter" # The short X.Y version. version = "2021.10" # The full version, including alpha/beta/rc tags. -release = "2021.10.0b6" +release = "2021.10.0b7" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 86242c1fe68fe3c13159c99cc4bde06ec2d4dd29 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 19 Oct 2021 15:48:27 +1300 Subject: [PATCH 20/37] Update supporters for 2021.10.0b7 --- guides/supporters.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/supporters.rst b/guides/supporters.rst index 24592dc04..df448131d 100644 --- a/guides/supporters.rst +++ b/guides/supporters.rst @@ -742,4 +742,4 @@ Contributors - `ZTX18 (@ZTX18) `__ - `Christian Zufferey (@zuzu59) `__ -*This page was last updated October 18, 2021.* +*This page was last updated October 19, 2021.* From ffcd66ebe37003363027f1ed5edfc1556b21ab47 Mon Sep 17 00:00:00 2001 From: Otto Winter Date: Tue, 19 Oct 2021 21:53:24 +0200 Subject: [PATCH 21/37] GPIO Refactor docs (#1543) --- guides/configuration-types.rst | 46 ++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/guides/configuration-types.rst b/guides/configuration-types.rst index 402e4e4f1..c75032db6 100644 --- a/guides/configuration-types.rst +++ b/guides/configuration-types.rst @@ -75,39 +75,41 @@ In some places, ESPHome also supports a more advanced “pin schema”. pin: number: D0 inverted: true - mode: INPUT_PULLUP + mode: + input: true + pullup: true Configuration variables: - **number** (**Required**, pin): The pin number. - **inverted** (*Optional*, boolean): If all read and written values should be treated as inverted. Defaults to ``false``. -- **mode** (*Optional*, string): A pin mode to set for the pin at - startup, corresponds to Arduino’s ``pinMode`` call. +- **mode** (*Optional*, string or mapping): Configures the pin to behave in different + modes like input or output. The default value depends on the context. + Accepts either a shorthand string or a mapping where each feature can be individually + enabled/disabled: -Available Pin Modes: + - **input** (*Optional*, boolean): If true, configure the pin as an input. + - **output** (*Optional*, boolean): If true, configure the pin as an output. + - **pullup** (*Optional*, boolean): Activate internal pullup resistors on the pin. + - **pulldown** (*Optional*, boolean): Activate internal pulldown resistors on the pin. + - **open_drain** (*Optional*, boolean): Set the pin to open-drain (as opposed to push-pull). + The active pin state will then result in a high-impedance state. -- ``INPUT`` -- ``OUTPUT`` -- ``OUTPUT_OPEN_DRAIN`` -- ``ANALOG`` (only on ESP32) -- ``INPUT_PULLUP`` -- ``INPUT_PULLDOWN`` (only on ESP32) -- ``INPUT_PULLDOWN_16`` (only on ESP8266 and only on GPIO16) + For compatibility some shorthand modes can also be used. -More exotic Pin Modes are also supported, but rarely used: + - ``INPUT`` + - ``OUTPUT`` + - ``OUTPUT_OPEN_DRAIN`` + - ``ANALOG`` + - ``INPUT_PULLUP`` + - ``INPUT_PULLDOWN`` -- ``WAKEUP_PULLUP`` (only on ESP8266) -- ``WAKEUP_PULLDOWN`` (only on ESP8266) -- ``SPECIAL`` -- ``FUNCTION_0`` (only on ESP8266) -- ``FUNCTION_1`` -- ``FUNCTION_2`` -- ``FUNCTION_3`` -- ``FUNCTION_4`` -- ``FUNCTION_5`` (only on ESP32) -- ``FUNCTION_6`` (only on ESP32) +Advanced options: +- **drive_strength** (*Optional*, string): On ESP32s with esp-idf framework the pad drive strength, + i.e. the maximum amount of current can additionally be set. Defaults to ``20mA``. + Options are ``5mA``, ``10mA``, ``20mA``, ``40mA``. .. _config-time: From 06d245b3fac704d59a19bcdf8ff25b89453dd0f3 Mon Sep 17 00:00:00 2001 From: Maurice Makaay Date: Tue, 19 Oct 2021 22:00:25 +0200 Subject: [PATCH 22/37] Fix compile error for uptime sensor with esp-idf (#1534) Co-authored-by: Maurice Makaay --- components/sensor/uptime.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/components/sensor/uptime.rst b/components/sensor/uptime.rst index 04dc86209..58fbff2d0 100644 --- a/components/sensor/uptime.rst +++ b/components/sensor/uptime.rst @@ -56,10 +56,10 @@ with human readable output. int minutes = seconds / 60; seconds = seconds % 60; return ( - (days ? String(days) + "d " : "") + - (hours ? String(hours) + "h " : "") + - (minutes ? String(minutes) + "m " : "") + - (String(seconds) + "s") + (days ? to_string(days) + "d " : "") + + (hours ? to_string(hours) + "h " : "") + + (minutes ? to_string(minutes) + "m " : "") + + (to_string(seconds) + "s") ).c_str(); See Also From 2d1ca74d4f2f060378d53aea89ae58c71f0ebb9e Mon Sep 17 00:00:00 2001 From: Otto Winter Date: Tue, 19 Oct 2021 23:08:37 +0200 Subject: [PATCH 23/37] Document esp8266 & esp32 new platform components (#1540) Co-authored-by: Oxan van Leeuwen Co-authored-by: Guillermo Ruffino Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> --- components/esp32.rst | 90 ++++++++++++++++++++++++++++++ components/esp8266.rst | 44 +++++++++++++++ components/esphome.rst | 108 +++++------------------------------- components/http_request.rst | 8 +-- index.rst | 3 + 5 files changed, 152 insertions(+), 101 deletions(-) create mode 100644 components/esp32.rst create mode 100644 components/esp8266.rst diff --git a/components/esp32.rst b/components/esp32.rst new file mode 100644 index 000000000..9d70e2b05 --- /dev/null +++ b/components/esp32.rst @@ -0,0 +1,90 @@ +ESP32 Platform +============== + +.. seo:: + :description: Configuration for the ESP32 platform for ESPHome. + :image: esp32.png + +This component contains platform-specific options for the ESP32 platform. + +.. code-block:: yaml + + # Example configuration entry + esp32: + board: nodemcu-32s + +Configuration variables: +------------------------ + +- **board** (**Required**, string): The PlatformIO board ID that should + be used. Choose the appropriate board from + `this list `__. + *This only affects pin aliases, flash size and some internal settings*, if unsure choose a generic board. +- **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``. + +.. _esp32-arduino_framework: + +Arduino framework +----------------- + +This is the default framework for ESP32 chips at the moment. + +.. code-block:: yaml + + # Example configuration entry + esp32: + board: nodemcu-32s + framework: + type: arduino + version: 2.0.0 + +- **version** (*Optional*, string): The base framework version number to use, from + `ESP32 arduino releases `__. Defaults to ``recommended``. Additional values are: + + - ``dev``: Use the latest commit from https://github.com/espressif/arduino-esp32, note this may break at any time + - ``latest``: Use the latest *release* from https://github.com/espressif/arduino-esp32/releases, even if it hasn't been recommended yet. + - ``recommended``: Use the recommended framework version. + +- **source** (*Optional*, string): The PlatformIO package or repository to use for framework. This can be used to use a custom or patched version of the framework. +- **platform_version** (*Optional*, string): The version of the `platformio/espressif32 `__ package to use. + +.. _esp32-espidf_framework: + +ESP-IDF framework +----------------- + +This is an alternative base framework for ESP32 chips, and recommended for variants +of the ESP32 like ESP32S2, ESP32S3, ESP32C3 and single-core ESP32 chips. + +.. code-block:: yaml + + # Example configuration entry + esp32: + board: esp32-c3-devkitm-1 + framework: + type: esp-idf + version: recommended + # Custom sdkconfig options + sdkconfig_options: + CONFIG_COMPILER_OPTIMIZATION_SIZE: y + +- **version** (*Optional*, string): The base framework version number to use, from + `ESP32 ESP-IDF releases `__. Defaults to ``recommended``. Additional values are: + + - ``dev``: Use the latest commit from https://github.com/espressif/esp-idf, note this may break at any time + - ``latest``: Use the latest *release* from https://github.com/espressif/esp-idf/releases, even if it hasn't been recommended yet. + - ``recommended``: Use the recommended framework version. + +- **source** (*Optional*, string): The PlatformIO package or repository to use for the framework. This can be used to use a custom or patched version of the framework. +- **platform_version** (*Optional*, string): The version of the `platformio/espressif32 `__ package to use. +- **sdkconfig_options** (*Optional*, mapping): Custom sdkconfig options to set in the ESP-IDF project. + +See Also +-------- + +- :doc:`esphome` +- :ghedit:`Edit` diff --git a/components/esp8266.rst b/components/esp8266.rst new file mode 100644 index 000000000..be11a4b5d --- /dev/null +++ b/components/esp8266.rst @@ -0,0 +1,44 @@ +ESP8266 Platform +================ + +.. seo:: + :description: Configuration for the ESP8266 platform for ESPHome. + :image: esp8266.png + +This component contains platform-specific options for the ESP8266 platform. + +.. code-block:: yaml + + # Example configuration entry + esp8266: + board: nodemcuv2 + framework: + version: recommended + +Configuration variables: +------------------------ + +- **board** (**Required**, string): The PlatformIO board ID that should + be used. Choose the appropriate board from + `this list `__. + *This only affects pin aliases, flash size and some internal settings*, if unsure choose a generic board. +- **framework** (*Optional*): Options for the underlying framework used by ESPHome. + + - **version** (*Optional*, string): The base framework version number to use, from + `esp8266 arduino releases `__. Defaults to ``recommended``. Additional values + + - ``dev``: Use the latest commit from https://github.com/esp8266/Arduino, note this may break at any time + - ``latest``: Use the latest *release* from https://github.com/esp8266/Arduino/releases, even if it hasn't been recommended yet. + - ``recommended``: Use the recommended framework version. + + - **source** (*Optional*, string): The PlatformIO package or repository to use for the framework. This can be used to use a custom or patched version of the framework. + - **platform_version** (*Optional*, string): The version of the `platformio/espressif8266 `__ package to use. + +- **restore_from_flash** (*Optional*, boolean): Whether to store some persistent preferences in flash memory. Defaults to ``false``. +- **board_flash_mode** (*Optional*, string): The SPI mode of the flash chip. One of ``qio``, ``qout``, ``dio`` and ``dout``. Defaults to ``dout`` for compatibility with all chips. Note: on the next OTA update the actual flash mode is automatically detected and changed to the appropriate one. + +See Also +-------- + +- :doc:`esphome` +- :ghedit:`Edit` diff --git a/components/esphome.rst b/components/esphome.rst index 0217da043..5a413afa5 100644 --- a/components/esphome.rst +++ b/components/esphome.rst @@ -27,19 +27,9 @@ Configuration variables: - **name** (**Required**, string): This is the name of the node. It should always be unique in your ESPHome network. May only contain lowercase characters, digits and hyphens. See :ref:`esphome-changing_node_name`. -- **platform** (**Required**, string): The platform your board is using, - either ``ESP32`` or ``ESP8266``. -- **board** (**Required**, string): The PlatformIO board ID that should - be used. Choose the appropriate board from - `this list `__ for the ESP8266, and - `this list `__ 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. Advanced options: -- **arduino_version** (*Optional*): The version of the Arduino framework to link the project against. - See :ref:`esphome-arduino_version`. - **build_path** (*Optional*, string): Customize where ESPHome will store the build files for your node. By default, ESPHome puts all PlatformIO project files under a folder ``/``, but you can customize this behavior using this option. @@ -61,10 +51,20 @@ Advanced options: - **name** (**Required**, string): Name of the project - **version** (**Required**, string): Version of the project -ESP8266 Options: +Platform options that have been moved (now in platform-specific sections :doc:`esp32 ` and :doc:`esp8266 `): -- **esp8266_restore_from_flash** (*Optional*, boolean): Whether to save & restore data from flash on ESP8266s. - Defaults to ``no``. See :ref:`esphome-esp8266_restore_from_flash` for more info +- **platform** (**Required**, string): The type of platform. One of ``esp8266`` or ``esp32``. +- **board** (**Required**, string): The board that should be used. See + :doc:`esp32 ` and :doc:`esp8266 ` for more information. +- **arduino_version** (*Optional*): 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 `__ for the ESP8266, and + `this list `__ 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: @@ -75,86 +75,6 @@ Automations: - **on_loop** (*Optional*, :ref:`Automation `): An automation to perform on each ``loop()`` iteration. See :ref:`esphome-on_loop`. -.. _esphome-arduino_version: - -``arduino_version`` -------------------- - -ESPHome uses the Arduino framework internally to handle all low-level interactions like -initializing the WiFi driver and so on. Unfortunately, every Arduino framework version often -has its own quirks and bugs, especially concerning WiFi performance. With the ``arduino_version`` -option you can tell ESPHome which Arduino framework to use for compiling. - -.. code-block:: yaml - - # Example configuration entry - esphome: - # ... - # Default: use the recommended version, usually this equals - # the latest version. - arduino_version: recommended - - # Use the latest stable version - arduino_version: latest - - # Use the latest staged version from GitHub, try this if you have WiFi problems - arduino_version: dev - - # Use a specific version - arduino_version: 2.3.0 - -For the ESP8266, you currently can manually pin the Arduino version to these values (see the full -list of Arduino frameworks `here `__): - -* `3.0.1 `__ (not recommended yet) -* `3.0.0 `__ (not recommended yet) -* `2.7.4 `__ (default) -* `2.7.3 `__ -* `2.7.2 `__ -* `2.7.1 `__ -* `2.7.0 `__ -* `2.6.3 `__ -* `2.6.2 `__ -* `2.6.1 `__ -* `2.5.2 `__ -* `2.5.1 `__ -* `2.5.0 `__ -* `2.4.2 `__ -* `2.4.1 `__ -* `2.4.0 `__ -* `2.3.0 `__ - -For the ESP32, there are these Arduino `framework versions `__: - -- `1.0.6 `__ (default) -- `1.0.5 `__ -- `1.0.4 `__ -- `1.0.3 `__ -- `1.0.2 `__ -- `1.0.1 `__ -- `1.0.0 `__ - -.. _esphome-esp8266_restore_from_flash: - -``esp8266_restore_from_flash`` ------------------------------- - -With this option you can control where the state of certain components is kept on the ESP. -Components like ``light``, ``switch``, ``fan`` and ``globals`` can restore their state upon -boot. - -However, by default this data is stored in the "RTC memory" section of the ESP8266s. This memory -is cleared when the ESP8266 is disconnected from power. So by default the state cannot be recovered -after power loss. - -To still have these components restore their state upon power loss the state can additionally be -saved in *flash* memory by setting this option to ``true``. - -Beware: The flash has a limited number of write cycles (usually around 100 000), after that -the flash section will fail. So do not use this option when you have components that update rapidly. -These include GPIO switches that are used internally (disable restoring with the ``restore_mode`` option), -certain light effects like ``random`` and the ``on_value_range`` trigger. - .. _esphome-on_boot: ``on_boot`` @@ -304,7 +224,7 @@ results in fewer flash writes, preserving the flash health. This behavior can be disabled by setting ``flash_write_interval`` to ``0s`` to immediately commit the state to flash, however, be aware that this may lead to increased flash wearing and a shortened device lifespan! -For ESP8266, :ref:`esphome-esp8266_restore_from_flash` must also be set to true for states to be written to flash. +For :doc:`ESP8266 `, ``restore_from_flash`` must also be set to ``true`` for states to be written to flash. .. _esphome-changing_node_name: diff --git a/components/http_request.rst b/components/http_request.rst index 5a81090b9..107580cdb 100644 --- a/components/http_request.rst +++ b/components/http_request.rst @@ -7,13 +7,7 @@ HTTP Request :keywords: http, request -The ``http_request`` component lets you make HTTP/HTTPS requests. - -.. note:: - - This component works only with :ref:`arduino framework ` 2.5.0 or newer. - -First, you need to setup a component: +The ``http_request`` component lets you make HTTP/HTTPS requests. First, you need to setup a component: .. code-block:: yaml diff --git a/index.rst b/index.rst index 381b5ab8d..330bff03b 100644 --- a/index.rst +++ b/index.rst @@ -559,6 +559,9 @@ Misc Components .. imgtable:: + ESP8266, components/esp8266, esp8266.svg + ESP32, components/esp32, esp32.svg + Remote Receiver, components/remote_receiver, remote.svg Remote Transmitter, components/remote_transmitter, remote.svg Status LED, components/status_led, led-on.svg From d129180ced467573165ff3d787a28b1f5ddfe283 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 20 Oct 2021 10:14:35 +1300 Subject: [PATCH 24/37] Bump version to 2021.10.0b8 --- Doxygen | 2 +- Makefile | 2 +- _static/version | 2 +- conf.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Doxygen b/Doxygen index d0c2d0c72..bd12c6690 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 = 2021.10.0b7 +PROJECT_NUMBER = 2021.10.0b8 # 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 4411bda1b..6cc855e5f 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ ESPHOME_PATH = ../esphome -ESPHOME_REF = 2021.10.0b7 +ESPHOME_REF = 2021.10.0b8 .PHONY: html html-strict cleanhtml deploy help webserver Makefile netlify netlify-api api netlify-dependencies svg2png copy-svg2png minify diff --git a/_static/version b/_static/version index d3a4267ae..e56d4fc4d 100644 --- a/_static/version +++ b/_static/version @@ -1 +1 @@ -2021.10.0b7 \ No newline at end of file +2021.10.0b8 \ No newline at end of file diff --git a/conf.py b/conf.py index 29ebc0848..1835713fe 100644 --- a/conf.py +++ b/conf.py @@ -69,7 +69,7 @@ author = "Otto Winter" # The short X.Y version. version = "2021.10" # The full version, including alpha/beta/rc tags. -release = "2021.10.0b7" +release = "2021.10.0b8" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From b69756f0a7681a5e31009d9a462e2a8c86077599 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 20 Oct 2021 10:15:06 +1300 Subject: [PATCH 25/37] Update changelog for 2021.10.0b8 --- changelog/2021.10.0.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/changelog/2021.10.0.rst b/changelog/2021.10.0.rst index 20e982be8..3c96c5130 100644 --- a/changelog/2021.10.0.rst +++ b/changelog/2021.10.0.rst @@ -178,6 +178,8 @@ Beta Fixes - Fix Bluetooth setup_priorities :esphomepr:`2458` by :ghuser:`jesserockz` - Autodetect ESP32 variant :esphomepr:`2530` by :ghuser:`oxan` - OTA firmware MD5 check + password support for esp-idf :esphomepr:`2507` by :ghuser:`mmakaay` (new-integration) +- Fix ADC pin validation on ESP32-C3 :esphomepr:`2551` by :ghuser:`oxan` +- ignore exception when not waiting for a response :esphomepr:`2552` by :ghuser:`martgras` All changes ^^^^^^^^^^^ @@ -375,6 +377,8 @@ All changes - Fix Bluetooth setup_priorities :esphomepr:`2458` by :ghuser:`jesserockz` - Autodetect ESP32 variant :esphomepr:`2530` by :ghuser:`oxan` - OTA firmware MD5 check + password support for esp-idf :esphomepr:`2507` by :ghuser:`mmakaay` (new-integration) +- Fix ADC pin validation on ESP32-C3 :esphomepr:`2551` by :ghuser:`oxan` +- ignore exception when not waiting for a response :esphomepr:`2552` by :ghuser:`martgras` Past Changelogs --------------- From 0eb098c493cecd449416686a097e900783494b44 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 20 Oct 2021 10:15:24 +1300 Subject: [PATCH 26/37] Update supporters for 2021.10.0b8 --- guides/supporters.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/supporters.rst b/guides/supporters.rst index df448131d..4100fbae2 100644 --- a/guides/supporters.rst +++ b/guides/supporters.rst @@ -742,4 +742,4 @@ Contributors - `ZTX18 (@ZTX18) `__ - `Christian Zufferey (@zuzu59) `__ -*This page was last updated October 19, 2021.* +*This page was last updated October 20, 2021.* From 6f5da19fb7b2d0b274f18c366f34a78b298037c7 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 20 Oct 2021 11:00:03 +1300 Subject: [PATCH 27/37] Bump version to 2021.10.0b9 --- Doxygen | 2 +- Makefile | 2 +- _static/version | 2 +- conf.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Doxygen b/Doxygen index bd12c6690..de2148af8 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 = 2021.10.0b8 +PROJECT_NUMBER = 2021.10.0b9 # 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 6cc855e5f..5e3c69387 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ ESPHOME_PATH = ../esphome -ESPHOME_REF = 2021.10.0b8 +ESPHOME_REF = 2021.10.0b9 .PHONY: html html-strict cleanhtml deploy help webserver Makefile netlify netlify-api api netlify-dependencies svg2png copy-svg2png minify diff --git a/_static/version b/_static/version index e56d4fc4d..2137057f9 100644 --- a/_static/version +++ b/_static/version @@ -1 +1 @@ -2021.10.0b8 \ No newline at end of file +2021.10.0b9 \ No newline at end of file diff --git a/conf.py b/conf.py index 1835713fe..da73a7e55 100644 --- a/conf.py +++ b/conf.py @@ -69,7 +69,7 @@ author = "Otto Winter" # The short X.Y version. version = "2021.10" # The full version, including alpha/beta/rc tags. -release = "2021.10.0b8" +release = "2021.10.0b9" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From be25cdaec645bdbe72ed1f67909df7df0197e696 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 20 Oct 2021 16:39:25 +1300 Subject: [PATCH 28/37] Bump version to 2021.10.0b10 --- Doxygen | 2 +- Makefile | 2 +- _static/version | 2 +- conf.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Doxygen b/Doxygen index de2148af8..8435f5d31 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 = 2021.10.0b9 +PROJECT_NUMBER = 2021.10.0b10 # 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 5e3c69387..9c57c3d60 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ ESPHOME_PATH = ../esphome -ESPHOME_REF = 2021.10.0b9 +ESPHOME_REF = 2021.10.0b10 .PHONY: html html-strict cleanhtml deploy help webserver Makefile netlify netlify-api api netlify-dependencies svg2png copy-svg2png minify diff --git a/_static/version b/_static/version index 2137057f9..658604753 100644 --- a/_static/version +++ b/_static/version @@ -1 +1 @@ -2021.10.0b9 \ No newline at end of file +2021.10.0b10 \ No newline at end of file diff --git a/conf.py b/conf.py index da73a7e55..07ec24d91 100644 --- a/conf.py +++ b/conf.py @@ -69,7 +69,7 @@ author = "Otto Winter" # The short X.Y version. version = "2021.10" # The full version, including alpha/beta/rc tags. -release = "2021.10.0b9" +release = "2021.10.0b10" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From aa64823b64405ce07c80a21050d29e9e98b0a1a4 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 20 Oct 2021 16:39:46 +1300 Subject: [PATCH 29/37] Update changelog for 2021.10.0b10 --- changelog/2021.10.0.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/changelog/2021.10.0.rst b/changelog/2021.10.0.rst index 3c96c5130..7e88a0ca5 100644 --- a/changelog/2021.10.0.rst +++ b/changelog/2021.10.0.rst @@ -180,6 +180,7 @@ Beta Fixes - OTA firmware MD5 check + password support for esp-idf :esphomepr:`2507` by :ghuser:`mmakaay` (new-integration) - Fix ADC pin validation on ESP32-C3 :esphomepr:`2551` by :ghuser:`oxan` - ignore exception when not waiting for a response :esphomepr:`2552` by :ghuser:`martgras` +- Fix HA addon so it does not have logout button :esphomepr:`2558` by :ghuser:`jesserockz` All changes ^^^^^^^^^^^ @@ -379,6 +380,7 @@ All changes - OTA firmware MD5 check + password support for esp-idf :esphomepr:`2507` by :ghuser:`mmakaay` (new-integration) - Fix ADC pin validation on ESP32-C3 :esphomepr:`2551` by :ghuser:`oxan` - ignore exception when not waiting for a response :esphomepr:`2552` by :ghuser:`martgras` +- Fix HA addon so it does not have logout button :esphomepr:`2558` by :ghuser:`jesserockz` Past Changelogs --------------- From 4ee9703f8f05df1c27fe8a873c40984c663f72b8 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 21 Oct 2021 07:32:28 +1300 Subject: [PATCH 30/37] Bump version to 2021.10.0b11 --- Doxygen | 2 +- Makefile | 2 +- _static/version | 2 +- conf.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Doxygen b/Doxygen index 8435f5d31..acdb4f32e 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 = 2021.10.0b10 +PROJECT_NUMBER = 2021.10.0b11 # 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 9c57c3d60..f87b03541 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ ESPHOME_PATH = ../esphome -ESPHOME_REF = 2021.10.0b10 +ESPHOME_REF = 2021.10.0b11 .PHONY: html html-strict cleanhtml deploy help webserver Makefile netlify netlify-api api netlify-dependencies svg2png copy-svg2png minify diff --git a/_static/version b/_static/version index 658604753..c84992159 100644 --- a/_static/version +++ b/_static/version @@ -1 +1 @@ -2021.10.0b10 \ No newline at end of file +2021.10.0b11 \ No newline at end of file diff --git a/conf.py b/conf.py index 07ec24d91..fa9fb1d82 100644 --- a/conf.py +++ b/conf.py @@ -69,7 +69,7 @@ author = "Otto Winter" # The short X.Y version. version = "2021.10" # The full version, including alpha/beta/rc tags. -release = "2021.10.0b10" +release = "2021.10.0b11" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 53b76e2e4693b41f457237a6ab33c2aca19d3a41 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 21 Oct 2021 07:32:53 +1300 Subject: [PATCH 31/37] Update changelog for 2021.10.0b11 --- changelog/2021.10.0.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/changelog/2021.10.0.rst b/changelog/2021.10.0.rst index 7e88a0ca5..88ebcb116 100644 --- a/changelog/2021.10.0.rst +++ b/changelog/2021.10.0.rst @@ -181,6 +181,10 @@ Beta Fixes - Fix ADC pin validation on ESP32-C3 :esphomepr:`2551` by :ghuser:`oxan` - ignore exception when not waiting for a response :esphomepr:`2552` by :ghuser:`martgras` - Fix HA addon so it does not have logout button :esphomepr:`2558` by :ghuser:`jesserockz` +- A few esp32_ble_server/improv fixes :esphomepr:`2562` by :ghuser:`jesserockz` +- Bump esphome-dashboard to 20211021.0 :esphomepr:`2564` by :ghuser:`jesserockz` +- Move running process log line to debug level :esphomepr:`2565` by :ghuser:`OttoWinter` +- Revert nextion clang-tidy changes :esphomepr:`2566` by :ghuser:`OttoWinter` All changes ^^^^^^^^^^^ @@ -381,6 +385,10 @@ All changes - Fix ADC pin validation on ESP32-C3 :esphomepr:`2551` by :ghuser:`oxan` - ignore exception when not waiting for a response :esphomepr:`2552` by :ghuser:`martgras` - Fix HA addon so it does not have logout button :esphomepr:`2558` by :ghuser:`jesserockz` +- A few esp32_ble_server/improv fixes :esphomepr:`2562` by :ghuser:`jesserockz` +- Bump esphome-dashboard to 20211021.0 :esphomepr:`2564` by :ghuser:`jesserockz` +- Move running process log line to debug level :esphomepr:`2565` by :ghuser:`OttoWinter` +- Revert nextion clang-tidy changes :esphomepr:`2566` by :ghuser:`OttoWinter` Past Changelogs --------------- From da888756edf4ab83488ae62f345a6cf326f21652 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 21 Oct 2021 07:33:11 +1300 Subject: [PATCH 32/37] Update supporters for 2021.10.0b11 --- guides/supporters.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/guides/supporters.rst b/guides/supporters.rst index 4100fbae2..91835ece7 100644 --- a/guides/supporters.rst +++ b/guides/supporters.rst @@ -504,6 +504,7 @@ Contributors - `obrain17 (@obrain17) `__ - `Ockert Marais (@OckertM) `__ - `Dave Walker (@oddsockmachine) `__ +- `Andrey Ganzevich (@odya) `__ - `Olivér Falvai (@ofalvai) `__ - `Omar Ghader (@omarghader) `__ - `Ömer Şiar Baysal (@omersiar) `__ @@ -725,7 +726,6 @@ Contributors - `Rick van Hattem (@WoLpH) `__ - `workingmanrob (@workingmanrob) `__ - `Wojtek Strzalka (@wstrzalka) `__ -- `wutr (@wutr) `__ - `Mike (@xsnoopy) `__ - `Yaroslav (@Yarikx) `__ - `Marcin Jaworski (@yawor) `__ @@ -742,4 +742,4 @@ Contributors - `ZTX18 (@ZTX18) `__ - `Christian Zufferey (@zuzu59) `__ -*This page was last updated October 20, 2021.* +*This page was last updated October 21, 2021.* From 3aa94de4182f5a7bae07f53d87ccbdfdafaf2941 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 21 Oct 2021 07:57:11 +1300 Subject: [PATCH 33/37] Bump version to 2021.10.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 acdb4f32e..a99cd2d5f 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 = 2021.10.0b11 +PROJECT_NUMBER = 2021.10.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 f87b03541..d2f627fb4 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ ESPHOME_PATH = ../esphome -ESPHOME_REF = 2021.10.0b11 +ESPHOME_REF = 2021.10.0 .PHONY: html html-strict cleanhtml deploy help webserver Makefile netlify netlify-api api netlify-dependencies svg2png copy-svg2png minify diff --git a/_static/version b/_static/version index c84992159..f42e1452d 100644 --- a/_static/version +++ b/_static/version @@ -1 +1 @@ -2021.10.0b11 \ No newline at end of file +2021.10.0 \ No newline at end of file diff --git a/conf.py b/conf.py index fa9fb1d82..db97bab06 100644 --- a/conf.py +++ b/conf.py @@ -69,7 +69,7 @@ author = "Otto Winter" # The short X.Y version. version = "2021.10" # The full version, including alpha/beta/rc tags. -release = "2021.10.0b11" +release = "2021.10.0" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 973e79c2ebe7985e452b5bbe20ddc21e02e439b2 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 21 Oct 2021 08:03:15 +1300 Subject: [PATCH 34/37] Update changelog for 2021.10.0 --- changelog/2021.10.0.rst | 31 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/changelog/2021.10.0.rst b/changelog/2021.10.0.rst index 88ebcb116..42adac4e9 100644 --- a/changelog/2021.10.0.rst +++ b/changelog/2021.10.0.rst @@ -24,18 +24,6 @@ ESPHome 2021.10.0 - 20th October 2021 ESP-IDF ------- -Docs still to be written before release on how to use ESP-IDF, but here is a quick example: - -.. code-block:: yaml - - esphome: - name: livingroom - - esp32: - board: - framework: - type: esp-idf - A huge effort has been put into reorganising, restructuring and rewriting a whole lot of code to allow ESP32 based boards to be compiled using ESP-IDF as the framework instead of Arduino. This allows ESPHome to keep up with new features and support for new ESP32 based chips @@ -44,6 +32,8 @@ that Espressif add to the ESP-IDF, such as the ESP32-C3 that a lot of people had There are known issues and specific components that are missing support for ESP-IDF as those ones rely on an Arduino library and need more time to be rewritten in a compatible way. +The new documentation is here at :doc:`/components/esp32`. + If you come across an issue while switching to ESP-IDF, please file an `issue on GitHub `__ using the ``ESP32-IDF`` option as the platform. @@ -147,6 +137,7 @@ New Components - Add support for Airthing Wave Mini :esphomepr:`2440` by :ghuser:`ncareau` (new-integration) - Add Safe Mode Restart Switch :esphomepr:`2437` by :ghuser:`paulmonigatti` (new-integration) - Added heatpumpir support :esphomepr:`1343` by :ghuser:`rob-deutsch` (new-integration) +- OTA firmware MD5 check + password support for esp-idf :esphomepr:`2507` by :ghuser:`mmakaay` (new-integration) Breaking Changes ^^^^^^^^^^^^^^^^ @@ -164,11 +155,12 @@ Beta Fixes - Fix BME680_BSEC compilation issue with ESP32 :esphomepr:`2516` by :ghuser:`paulmonigatti` - add missing include in sgp30 :esphomepr:`2517` by :ghuser:`dmitriy5181` - Fix: Color modes not being correctly used in light partitions :esphomepr:`2513` by :ghuser:`paulmonigatti` +- Add pressure compensation during runtime :esphomepr:`2493` by :ghuser:`martgras` - Don't define UART_SELECTION_UART2 when UART2 is unavailable :esphomepr:`2512` by :ghuser:`oxan` - Remove BME680_BSEC test :esphomepr:`2518` by :ghuser:`paulmonigatti` -- Add pressure compensation during runtime :esphomepr:`2493` by :ghuser:`martgras` - Fix Nextion HTTPClient error for ESP32 :esphomepr:`2524` by :ghuser:`kbx81` - Fix bug in register name definition :esphomepr:`2526` by :ghuser:`martgras` +- OTA firmware MD5 check + password support for esp-idf :esphomepr:`2507` by :ghuser:`mmakaay` (new-integration) - Replace framework version_hint with source option :esphomepr:`2529` by :ghuser:`oxan` - Fix bitshift on read in ADE7953 :esphomepr:`2537` by :ghuser:`oxan` - Allow downloading all bin files from backend in dashboard :esphomepr:`2514` by :ghuser:`jesserockz` @@ -177,10 +169,12 @@ Beta Fixes - Fix const used for IDF recommended version :esphomepr:`2542` by :ghuser:`jesserockz` - Fix Bluetooth setup_priorities :esphomepr:`2458` by :ghuser:`jesserockz` - Autodetect ESP32 variant :esphomepr:`2530` by :ghuser:`oxan` -- OTA firmware MD5 check + password support for esp-idf :esphomepr:`2507` by :ghuser:`mmakaay` (new-integration) +- Bump dashboard to 20211019.0 :esphomepr:`2549` by :ghuser:`jesserockz` - Fix ADC pin validation on ESP32-C3 :esphomepr:`2551` by :ghuser:`oxan` - ignore exception when not waiting for a response :esphomepr:`2552` by :ghuser:`martgras` +- Bump dashboard to 20211020.0 :esphomepr:`2556` by :ghuser:`jesserockz` - Fix HA addon so it does not have logout button :esphomepr:`2558` by :ghuser:`jesserockz` +- Bump esphome-dashboard to 20211020.1 :esphomepr:`2559` by :ghuser:`jesserockz` - A few esp32_ble_server/improv fixes :esphomepr:`2562` by :ghuser:`jesserockz` - Bump esphome-dashboard to 20211021.0 :esphomepr:`2564` by :ghuser:`jesserockz` - Move running process log line to debug level :esphomepr:`2565` by :ghuser:`OttoWinter` @@ -296,7 +290,7 @@ All changes - bump dashboard to 20210927.0 :esphomepr:`2405` by :ghuser:`balloob` - Add str_sprintf function that returns std::string :esphomepr:`2408` by :ghuser:`oxan` - Fix lint issues in web_server_base :esphomepr:`2409` by :ghuser:`jesserockz` -- Fix uninitialised use of ESPPreferenceObject.backend :esphomepr:`2411` by :ghuser:`paulmonigatti` +- Fix uninitialised use of ESPPreferenceObject.backend_ :esphomepr:`2411` by :ghuser:`paulmonigatti` - Add support for SCD4X :esphomepr:`2217` by :ghuser:`sjtrny` (new-integration) - Support HSV-based color support on tuya light :esphomepr:`2400` by :ghuser:`irtimaled` (new-feature) - Tuya: add cover component :esphomepr:`2279` by :ghuser:`marmarek` @@ -368,11 +362,12 @@ All changes - Fix BME680_BSEC compilation issue with ESP32 :esphomepr:`2516` by :ghuser:`paulmonigatti` - add missing include in sgp30 :esphomepr:`2517` by :ghuser:`dmitriy5181` - Fix: Color modes not being correctly used in light partitions :esphomepr:`2513` by :ghuser:`paulmonigatti` +- Add pressure compensation during runtime :esphomepr:`2493` by :ghuser:`martgras` - Don't define UART_SELECTION_UART2 when UART2 is unavailable :esphomepr:`2512` by :ghuser:`oxan` - Remove BME680_BSEC test :esphomepr:`2518` by :ghuser:`paulmonigatti` -- Add pressure compensation during runtime :esphomepr:`2493` by :ghuser:`martgras` - Fix Nextion HTTPClient error for ESP32 :esphomepr:`2524` by :ghuser:`kbx81` - Fix bug in register name definition :esphomepr:`2526` by :ghuser:`martgras` +- OTA firmware MD5 check + password support for esp-idf :esphomepr:`2507` by :ghuser:`mmakaay` (new-integration) - Replace framework version_hint with source option :esphomepr:`2529` by :ghuser:`oxan` - Fix bitshift on read in ADE7953 :esphomepr:`2537` by :ghuser:`oxan` - Allow downloading all bin files from backend in dashboard :esphomepr:`2514` by :ghuser:`jesserockz` @@ -381,10 +376,12 @@ All changes - Fix const used for IDF recommended version :esphomepr:`2542` by :ghuser:`jesserockz` - Fix Bluetooth setup_priorities :esphomepr:`2458` by :ghuser:`jesserockz` - Autodetect ESP32 variant :esphomepr:`2530` by :ghuser:`oxan` -- OTA firmware MD5 check + password support for esp-idf :esphomepr:`2507` by :ghuser:`mmakaay` (new-integration) +- Bump dashboard to 20211019.0 :esphomepr:`2549` by :ghuser:`jesserockz` - Fix ADC pin validation on ESP32-C3 :esphomepr:`2551` by :ghuser:`oxan` - ignore exception when not waiting for a response :esphomepr:`2552` by :ghuser:`martgras` +- Bump dashboard to 20211020.0 :esphomepr:`2556` by :ghuser:`jesserockz` - Fix HA addon so it does not have logout button :esphomepr:`2558` by :ghuser:`jesserockz` +- Bump esphome-dashboard to 20211020.1 :esphomepr:`2559` by :ghuser:`jesserockz` - A few esp32_ble_server/improv fixes :esphomepr:`2562` by :ghuser:`jesserockz` - Bump esphome-dashboard to 20211021.0 :esphomepr:`2564` by :ghuser:`jesserockz` - Move running process log line to debug level :esphomepr:`2565` by :ghuser:`OttoWinter` From 7298bde4512801d54bd691cbaa02b523b570237e Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 21 Oct 2021 08:17:31 +1300 Subject: [PATCH 35/37] Fix changelog --- changelog/2021.10.0.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog/2021.10.0.rst b/changelog/2021.10.0.rst index 42adac4e9..0d782ca4d 100644 --- a/changelog/2021.10.0.rst +++ b/changelog/2021.10.0.rst @@ -290,7 +290,7 @@ All changes - bump dashboard to 20210927.0 :esphomepr:`2405` by :ghuser:`balloob` - Add str_sprintf function that returns std::string :esphomepr:`2408` by :ghuser:`oxan` - Fix lint issues in web_server_base :esphomepr:`2409` by :ghuser:`jesserockz` -- Fix uninitialised use of ESPPreferenceObject.backend_ :esphomepr:`2411` by :ghuser:`paulmonigatti` +- Fix uninitialised use of ESPPreferenceObject.backend :esphomepr:`2411` by :ghuser:`paulmonigatti` - Add support for SCD4X :esphomepr:`2217` by :ghuser:`sjtrny` (new-integration) - Support HSV-based color support on tuya light :esphomepr:`2400` by :ghuser:`irtimaled` (new-feature) - Tuya: add cover component :esphomepr:`2279` by :ghuser:`marmarek` From 57155f384a2ef4b87fa8d16270ac5f66a26748f3 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 21 Oct 2021 10:07:59 +1300 Subject: [PATCH 36/37] Embed release party video in release notes (#1550) Co-authored-by: Paulus Schoutsen --- changelog/2021.10.0.rst | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/changelog/2021.10.0.rst b/changelog/2021.10.0.rst index 0d782ca4d..437e41cbf 100644 --- a/changelog/2021.10.0.rst +++ b/changelog/2021.10.0.rst @@ -21,6 +21,16 @@ ESPHome 2021.10.0 - 20th October 2021 Tuya Cover, components/cover/tuya, tuya.png +Learn from the creators about the new encryption, support for any ESP32 variant and how Otto came up with ESPHome + +.. raw:: html + + + ESP-IDF ------- From 0ba5dfdd240fa1473d6b4959bb543d87496cb3f6 Mon Sep 17 00:00:00 2001 From: Stefan <37924749+stefanroelofs@users.noreply.github.com> Date: Thu, 21 Oct 2021 11:53:08 +0200 Subject: [PATCH 37/37] Switch the words 'prefix' and 'suffix' (#1551) I could be wrong, but I think the words 'prefix' and 'suffix' are used in the wrong place. When you append a string, you add text to the end. So the text you add you call a suffix, right? When you prepend a string, you add text to the beginning. So the text you add you call a prefix, right? --- components/text_sensor/index.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/components/text_sensor/index.rst b/components/text_sensor/index.rst index 7911a29a2..dc354e67f 100644 --- a/components/text_sensor/index.rst +++ b/components/text_sensor/index.rst @@ -62,8 +62,8 @@ Filters are processed in the order they are defined in your configuration. filters: - to_upper: - to_lower: - - append: "_prefix" - - prepend: "suffix_" + - append: "_suffix" + - prepend: "prefix_" - substitute: - "suf -> foo" - "pre -> bar" @@ -106,7 +106,7 @@ Adds a string to the end of the current string. - platform: template # ... filters: - - append: "_prefix" + - append: "_suffix" ``prepend`` *********** @@ -119,7 +119,7 @@ Adds a string to the start of the current string. - platform: template # ... filters: - - prepend: "suffix_" + - prepend: "prefix_" ``substitute`` **************