From 3105bb5e90134db604d5bbfa2f823992a4f63ed1 Mon Sep 17 00:00:00 2001 From: Geoff Davis Date: Wed, 9 Jun 2021 19:05:48 -0700 Subject: [PATCH 01/43] Update supported epaper models (#1205) --- components/display/waveshare_epaper.rst | 7 ++++--- devices/images/sonoff_t1_uk_3g_backplate_v1.1.jpg | Bin devices/images/sonoff_t1_uk_3g_touchpads_v1.1.jpg | Bin 3 files changed, 4 insertions(+), 3 deletions(-) mode change 100644 => 100755 devices/images/sonoff_t1_uk_3g_backplate_v1.1.jpg mode change 100644 => 100755 devices/images/sonoff_t1_uk_3g_touchpads_v1.1.jpg diff --git a/components/display/waveshare_epaper.rst b/components/display/waveshare_epaper.rst index f3c898f7a..145c8f3aa 100644 --- a/components/display/waveshare_epaper.rst +++ b/components/display/waveshare_epaper.rst @@ -77,6 +77,7 @@ Configuration variables: - **model** (**Required**): The model of the E-Paper display. Options are: - ``1.54in`` + - ``1.54inv2`` - ``2.13in`` (not tested) - ``2.13in-ttgo`` (T5_V2.3 tested. Also works for Wemos D1 Mini ePaper Shield 2.13 1.0.0 "LOLIN") - ``2.13in-ttgo-b73`` (T5_V2.3 with B73 display tested) @@ -98,9 +99,9 @@ Configuration variables: - **full_update_every** (*Optional*, int): E-Paper displays have two modes of switching to the next image: A partial update that only changes the pixels that have changed and a full update mode that first clears the entire display and then re-draws the image. The former is much quicker and nicer, but every so often a full update needs to happen - because artifacts accumulate. On the ``1.54in``, ``2.13in``, ``2.90in``, and ``2.90inv2`` models you have the option - to switch only do a full-redraw every x-th time using this option. Defaults to ``30`` on the described models and a - full update for all other models. + because artifacts accumulate. On the ``1.54in``, ``1.54inv2``, ``2.13in``, ``2.90in`` and ``2.90inv2`` models you have the option to switch only + do a full-redraw every x-th time using this option. Defaults to ``30`` on the described models and a full update for + all other models. - **lambda** (*Optional*, :ref:`lambda `): The lambda to use for rendering the content on the display. See :ref:`display-engine` for more information. - **update_interval** (*Optional*, :ref:`config-time`): The interval to re-draw the screen. Defaults to ``10s``, use ``never`` to only manually update the screen via ``component.update``. diff --git a/devices/images/sonoff_t1_uk_3g_backplate_v1.1.jpg b/devices/images/sonoff_t1_uk_3g_backplate_v1.1.jpg old mode 100644 new mode 100755 diff --git a/devices/images/sonoff_t1_uk_3g_touchpads_v1.1.jpg b/devices/images/sonoff_t1_uk_3g_touchpads_v1.1.jpg old mode 100644 new mode 100755 From 92a0fba463e89c0ec2dbf60f3f118dd5d8eceafe Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Sat, 12 Jun 2021 08:31:35 +1200 Subject: [PATCH 02/43] Split ble server docs (#1234) --- components/esp32_ble.rst | 16 ++++------------ components/esp32_ble_server.rst | 32 ++++++++++++++++++++++++++++++++ components/esp32_improv.rst | 5 +---- 3 files changed, 37 insertions(+), 16 deletions(-) create mode 100644 components/esp32_ble_server.rst diff --git a/components/esp32_ble.rst b/components/esp32_ble.rst index 39e5d0348..07def025d 100644 --- a/components/esp32_ble.rst +++ b/components/esp32_ble.rst @@ -5,30 +5,22 @@ BLE Component :description: Instructions for setting up Bluetooth LE in ESPHome. :image: bluetooth.svg -The ``esp32_ble`` component in ESPHome sets up a simple BLE GATT server that exposes the device name, -manufacturer and board. This component allows other components to create their own services to expose -data and control. +The ``esp32_ble`` component in ESPHome sets up the Bluetooth LE stack on the device so that a :doc:`esp32_ble_server` +can run. .. code-block:: yaml # Example configuration esp32_ble: - server: -Configuration variables: ------------------------- - -- **server** (*Optional*): Starts the BLE GATT server - - - **manufacturer** (*Optional*, string): The name of the manufacturer/firmware creator. Defaults to ``ESPHome``. - - **model** (*Optional*, string): The model name of the device. Defaults to the friendly name of the ``board`` chosen - in the :ref:`core configuration `. +No configuration variables. See Also -------- +- :doc:`esp32_ble_server` - :doc:`esp32_improv` - :apiref:`esp32_ble/ble.h` - :ghedit:`Edit` diff --git a/components/esp32_ble_server.rst b/components/esp32_ble_server.rst new file mode 100644 index 000000000..4d9748c52 --- /dev/null +++ b/components/esp32_ble_server.rst @@ -0,0 +1,32 @@ +BLE Server +========== + +.. seo:: + :description: Instructions for setting up Bluetooth LE GATT Server in ESPHome. + :image: bluetooth.svg + +The ``esp32_ble_server`` component in ESPHome sets up a simple BLE GATT server that exposes the device name, +manufacturer and board. This component allows other components to create their own services to expose +data and control. + +.. code-block:: yaml + + # Example configuration + + esp32_ble_server: + + +Configuration variables: +------------------------ + +- **manufacturer** (*Optional*, string): The name of the manufacturer/firmware creator. Defaults to ``ESPHome``. +- **model** (*Optional*, string): The model name of the device. Defaults to the friendly name of the ``board`` chosen + in the :ref:`core configuration `. + +See Also +-------- + +- :doc:`esp32_ble` +- :doc:`esp32_improv` +- :apiref:`esp32_ble/ble.h` +- :ghedit:`Edit` diff --git a/components/esp32_improv.rst b/components/esp32_improv.rst index d0405c872..f9a2589c2 100644 --- a/components/esp32_improv.rst +++ b/components/esp32_improv.rst @@ -8,7 +8,7 @@ Improv The ``esp32_improv`` component in ESPHome implements the open `Improv standard `__ for configuring Wi-Fi on an ESP32 device by using Bluetooth Low Energy to receive the credentials. -The ``esp32_improv`` component requires the :doc:`BLE Server ` to be set up. +The ``esp32_improv`` component will automatically set up the :doc:`BLE Server `. .. code-block:: yaml @@ -17,9 +17,6 @@ The ``esp32_improv`` component requires the :doc:`BLE Server ` to be wifi: # ... - esp32_ble: - server: # A BLE server is required - esp32_improv: authorizer: binary_sensor_id From 72d86eb74d7a968a6a36fa5deb909bee6af47161 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Fri, 11 Jun 2021 16:00:07 -0700 Subject: [PATCH 03/43] Update dashboard guide (#1233) Co-authored-by: Franck Nijhof --- guides/getting_started_hassio.rst | 90 +++++++++++------------- guides/images/dashboard.png | Bin 20629 -> 24324 bytes guides/images/hassio_addons_section.png | Bin 8471 -> 0 bytes guides/images/hassio_repo.png | Bin 35144 -> 0 bytes 4 files changed, 41 insertions(+), 49 deletions(-) delete mode 100644 guides/images/hassio_addons_section.png delete mode 100644 guides/images/hassio_repo.png diff --git a/guides/getting_started_hassio.rst b/guides/getting_started_hassio.rst index 00ff0e28d..6228030a6 100644 --- a/guides/getting_started_hassio.rst +++ b/guides/getting_started_hassio.rst @@ -2,36 +2,26 @@ Getting Started with ESPHome and Home Assistant =============================================== .. seo:: - :description: Getting Started guide for installing ESPHome as a Home Assistant add-on and creating a basic configuration. + :description: Getting Started guide for installing ESPHome Dashboard as a Home Assistant add-on and creating a basic configuration. :image: home-assistant.png ESPHome is the perfect solution for creating custom firmware for your ESP8266/ESP32 boards. In this guide we’ll go through how to setup a -basic "node" by use of the Home Assistant add-on. +basic "node" using the ESPHome Dashboard, installed as a Home Assistant add-on. But first, here's a very quick introduction to how ESPHome works: -ESPHome is a *tool* which reads in a YAML configuration file (just like Home Assistant) -and creates a custom firmware binary. The tool also has many helpers that simplify flashing devices (uploading the new binary file) -and aim to make managing your ESP boards as simple as possible. Once you have added devices -or sensors in ESPHome's configuration, they will even automatically show up in Home -Assistant's UI. +ESPHome is a *tool* which aims to make managing your ESP boards as simple as possible. It reads in a YAML configuration file (just like Home Assistant) and creates custom firmware which it installs on your ESP device. Devices or sensors added in ESPHome's configuration will automatically show up in Home Assistant's UI. -Installation ------------- +Installing ESPHome Dashboard +---------------------------- -Installing the ESPHome Home Assistant add-on is easy. Navigate to the Supervisor -panel in your Home Assistant frontend, then enter ``ESPHome`` in the searchbar of the "Add-on Store" -tab. +The ESPHome Dashboard can be installed as a Home Assistant add-on, which you can find in the add-on store in the Supervisor panel. Open it using the following button then click on INSTALL: -.. figure:: images/hassio_repo.png +.. raw:: html -Click on ESPHome, then INSTALL. + Open your Home Assistant instance and show the dashboard of a Supervisor add-on. -.. figure:: images/hassio_addons_section.png - -After that, wait a bit until the add-on is installed (this can take a while) and -go to the add-on page. Start the add-on and then click "Open Web UI". If you see "502: Bad Gateway" the -addon is currently starting, and you can refresh the page after a couple of seconds. +After that, wait a bit until it is installed (this can take a while). Click "Start" and then click "Open Web UI". If you see "502: Bad Gateway" it is currently starting, and you can refresh the page after a couple of seconds. .. figure:: images/hassio_addon.png :align: center @@ -44,11 +34,29 @@ creating your first configuration. :align: center :width: 95.0% +The wizard will guide you through creating your first configuration and, depending on your browser, install it on your ESP device. You will need to name your configuration and enter your wireless network settings so that the ESP device can come online and can communicate with Home Assistant. + +.. raw:: html + + + +.. note:: + + The most difficult part of setting up a new ESPHome device is the initial installation. Installation requires that your ESP device is connected with a cable to a computer. Later updates can be installed wirelessly. + + If you use `Microsoft Edge `_ or `Google Chrome `_, you will be able to install the initial configuration by connecting your ESP device to the computer that you're using to view the ESPHome Dashboard. If you use another browser, you will have to connect the ESP devices to the machine running the ESPHome Dashboard and Home Assistant. + + If the serial port is not showing up, you might not have the required drivers installed. These drivers work for most ESP devices: + + * CP2102 (square chip): `driver `__ + * CH341: `driver `__ + + Dashboard Interface ------------------- Assuming you created your first configuration file with the wizard, let's take a quick -tour of the ESPHome dashboard interface. +tour of the ESPHome Dashboard interface. .. figure:: images/dashboard.png :align: center @@ -57,34 +65,19 @@ tour of the ESPHome dashboard interface. On the front page you will see all configurations for nodes you created. For each file, there are three basic actions you can perform: -- **UPLOAD**: This compiles the firmware for your node and uploads it using any connected - USB device or, if no USB devices are connected, over-the-air using the :doc:`/components/ota`. - - .. warning:: - - The Home Assistant add-on is currently not capable of discovering new USB ports after the - add-on has started due to some docker restrictions. Please go to the add-on details page - and restart the add-on if a new USB device is not automatically found. If the USB device - is still not found, try changing the USB cable and restarting the add-on. +- **INSTALL**: This compiles the firmware for your node and installs it. Installation happens wirelessy if you have enabled the :doc:`/components/ota` in your configuration. Alternatively you can install it from your browser or via a device connected to the machine running the ESPHome Dashboard. - **SHOW LOGS**: With this command you can view all the logs the node is outputting. If a USB device is connected, it will attempt to use the serial connection. Otherwise it will use the built-in OTA logs. - **COMPILE**: This command compiles the firmware and gives you the option of downloading the generated - binary so that you can upload it yourself from your computer. - - .. note:: - - If you're having problems with flashing over USB, you can always download the firmware using the - ``COMPILE`` button and flash the firmware using :ref:`ESPHome-flasher `. + binary so that you can install it yourself from your computer using :ref:`ESPHome-flasher `. The configuration files for ESPHome can be found and edited under ``/esphome/``. For example the configuration for the node in the picture above can be found in ``/config/esphome/livingroom.yaml``. -Now go ahead and use one of the :ref:`devices guides ` to extend your configuration for the device you -intend to flash an ESPHome firmware onto. Then proceed with uploading the first firmware using the -upload button. +Now go ahead and use one of the :ref:`devices guides ` to extend your configuration. Adding some (basic) features ---------------------------- @@ -106,8 +99,12 @@ anything really, for example lights) and is connected to the pin ``GPIO5``. Connecting your device to Home Assistant ---------------------------------------- -Now when you go to the Home Assistant "Integrations" screen (under "Configuration" panel), you -should see the ESPHome device show up in the discovered section (although this can take up to 5 minutes). +Once your configuration is installed on your ESP device and is online, it will be automatically discovered by Home Assistant and offered to set up on your integrations screen: + +.. raw:: html + + Open your Home Assistant instance and start setting up a new integration. + Alternatively, you can manually add the device by clicking "CONFIGURE" on the ESPHome integration and entering ".local" as the host. @@ -115,9 +112,8 @@ and entering ".local" as the host. :align: center :width: 75.0% -After the first upload, you will probably never need to use the USB +After the first installation, you will probably never need to use the USB cable again, as all features of ESPHome are enabled remotely as well. -No more opening hidden boxes stowed in places hard to reach. Yay! Adding A Binary Sensor ---------------------- @@ -136,12 +132,8 @@ Sensor `. inverted: True mode: INPUT_PULLUP -This is an advanced feature of ESPHome, almost all pins can -optionally have a more complicated configuration schema with options for -inversion and pinMode - the :ref:`Pin Schema `. - -This time when uploading, you don’t need to have the device plugged in -through USB again. The upload will magically happen :doc:`"over the air" `. +This time when installing, you don’t need to have the device plugged in +through USB again. The upload will happen wirelessly (:doc:`"over the air" `). .. figure:: /components/binary_sensor/images/gpio-ui.png :align: center @@ -151,7 +143,7 @@ Where To Go Next ---------------- Great 🎉! You’ve now successfully setup your first ESPHome project -and uploaded your first ESPHome custom firmware to your node. You’ve +and installed your first ESPHome custom firmware to your node. You’ve also learned how to enable some basic components via the configuration file. diff --git a/guides/images/dashboard.png b/guides/images/dashboard.png index 73f2f37b5aee5780e93563a2e20c8afbb4b25a29..00b6d8f8ffe07bbdd7cda3d155a38162f8179e2d 100644 GIT binary patch literal 24324 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 KrbgZ}{C@!@&)@g} literal 20629 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 diff --git a/guides/images/hassio_repo.png b/guides/images/hassio_repo.png deleted file mode 100644 index b0387621010b0293ef0614bc04f9f2c8a894286e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35144 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 Date: Sat, 12 Jun 2021 13:45:54 +0200 Subject: [PATCH 04/43] Document reversed option for light partitions (#1219) --- components/light/partition.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/components/light/partition.rst b/components/light/partition.rst index d245d8fd6..f08c06fb3 100644 --- a/components/light/partition.rst +++ b/components/light/partition.rst @@ -88,6 +88,7 @@ Configuration variables: - **from** (**Required**, int): The first LED to address in the segment. Counting starts with 0, so first LED is 0. - **to** (**Required**, int): The index of the last LED to address in this segment. + - **reversed** (**Required**, int): Whether to reverse the LEDs in this segment. - **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation. - **effects** (*Optional*, list): A list of :ref:`light effects ` to use for this light. From c1ee850ea0ac6ea3d06ee69db2521b50424840eb Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 15 Jun 2021 15:39:41 +1200 Subject: [PATCH 05/43] Add creator page (#1241) Co-authored-by: Franck Nijhof Co-authored-by: Paulus Schoutsen --- guides/creators.rst | 57 +++++++++++++++++++++++++++++++++++++++++++++ index.rst | 1 + 2 files changed, 58 insertions(+) create mode 100644 guides/creators.rst diff --git a/guides/creators.rst b/guides/creators.rst new file mode 100644 index 000000000..9fec5da98 --- /dev/null +++ b/guides/creators.rst @@ -0,0 +1,57 @@ +Using ESPHome for your Project +============================== + +.. seo:: + :description: Information for creators when using ESPHome firmware. + +We have added configuration options to ESPHome to make it easier for creators +to create, configure, install and distribute devices running ESPHome. + +Example configuration +--------------------- + +.. code-block:: yaml + + esphome: + ... + # Automatically add the mac address to the name + # so you can use a single firmware for all devices + name_add_mac_suffix: true + + # This will allow for (future) project identification, + # configuration and updates. + project: + name: jesse.temperature_monitor + version: "1.0" + + wifi: + # Set up a wifi access point + ap: + ssid: jesses_temperature_monitor + password: 12345678 + + # In combination with the `ap` this allows the user + # to provision wifi credentials to the device. + captive_portal: + + # Sets up Bluetooth LE (Only on ESP32) to allow the user + # to provision wifi credentials to the device. + esp32_improv: + authorizer: none + + +Relevant Documentation +---------------------- + +- ``name_add_mac_suffix`` - :ref:`esphome-mac_suffix` +- ``project`` - :ref:`esphome-creators_project` +- ``esp32_improv`` - :doc:`/components/esp32_improv` +- ``captive_portal`` - :doc:`/components/captive_portal` +- ``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. + +See Also +-------- + +- :ghedit:`Edit` diff --git a/index.rst b/index.rst index 3ce494959..ef29c084b 100644 --- a/index.rst +++ b/index.rst @@ -40,6 +40,7 @@ Guides DIY Examples, guides/diy, earth.svg Configuration types, guides/configuration-types, puzzle.svg + Creating a Project, guides/creators, puzzle.svg .. _devices: From 0422278ec26a3b071150b62c86a8fc523a65f82b Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Thu, 17 Jun 2021 20:54:52 -0500 Subject: [PATCH 06/43] Update docs for Samsung variable bits enhancement (#1259) --- components/remote_receiver.rst | 1 + components/remote_transmitter.rst | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/components/remote_receiver.rst b/components/remote_receiver.rst index b075a37a7..2a767b3e4 100644 --- a/components/remote_receiver.rst +++ b/components/remote_receiver.rst @@ -156,6 +156,7 @@ Remote code selection (exactly one of these has to be included): - **samsung**: Trigger on a decoded Samsung remote code with the given data. - **data** (**Required**, int): The data to trigger on, see dumper output for more info. + - **nbits** (*Optional*, int): The number of bits of the remote code. Defaults to ``32``. - **samsung36**: Trigger on a decoded Samsung36 remote code with the given data. diff --git a/components/remote_transmitter.rst b/components/remote_transmitter.rst index 8f2529a4e..e8838dfe0 100644 --- a/components/remote_transmitter.rst +++ b/components/remote_transmitter.rst @@ -200,22 +200,29 @@ Configuration variables: ********************************************** This :ref:`action ` sends a Samsung infrared remote code to a remote transmitter. +It transmits codes up to 64 bits in length in a single packet. .. code-block:: yaml on_...: - remote_transmitter.transmit_samsung: data: 0x1FEF05E4 + # additional example for 48-bit codes: + - remote_transmitter.transmit_samsung: + data: 0xB946F50A09F6 + nbits: 48 Configuration variables: - **data** (**Required**, int): The data to send, see dumper output for more details. +- **nbits** (*Optional*, int): The number of bits to send. Defaults to ``32``. - All other options from :ref:`remote_transmitter-transmit_action`. ``remote_transmitter.transmit_samsung36`` Action ************************************************ This :ref:`action ` sends a Samsung36 infrared remote code to a remote transmitter. +It transmits the ``address`` and ``command`` in two packets separated by a "space". .. code-block:: yaml From 1234b08773062667c00975f7c3c16b2c2bb87e55 Mon Sep 17 00:00:00 2001 From: bazuchan Date: Mon, 28 Jun 2021 22:26:45 +0300 Subject: [PATCH 07/43] Climate component for Ballu air conditioners with remote model YKR-K/002E (#1279) --- components/climate/ir_climate.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/components/climate/ir_climate.rst b/components/climate/ir_climate.rst index 232920c5e..65a86c174 100755 --- a/components/climate/ir_climate.rst +++ b/components/climate/ir_climate.rst @@ -19,6 +19,8 @@ request so it will be added (see FAQ). | Name | Platform name | Supports receiver | | | | | +=======================================+=====================+======================+ +| Ballu | ``ballu`` | yes | ++---------------------------------------+---------------------+----------------------+ | Coolix | ``coolix`` | yes | +---------------------------------------+---------------------+----------------------+ | Daikin | ``daikin`` | yes | @@ -157,6 +159,7 @@ See Also - :doc:`/components/climate/index` - :doc:`/components/remote_transmitter` +- :apiref:`ballu.h `, - :apiref:`coolix.h `, :apiref:`daikin.h ` :apiref:`fujitsu_general.h `, From debf4f775be4bf0a4ea9fbd4fd1fe48b2ec4c128 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adri=C3=A1n=20Panella?= Date: Sun, 4 Jul 2021 18:09:16 -0500 Subject: [PATCH 08/43] hlw8012: add constants by sensor model (#1282) --- components/sensor/hlw8012.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/components/sensor/hlw8012.rst b/components/sensor/hlw8012.rst index 5773159cc..ada0e1bd3 100644 --- a/components/sensor/hlw8012.rst +++ b/components/sensor/hlw8012.rst @@ -67,6 +67,9 @@ Advanced Options: Defaults to the Sonoff POW's value ``0.001 ohm``. - **voltage_divider** (*Optional*, float): The value of the voltage divider on the board as ``(R_upstream + R_downstream) / R_downstream``. Defaults to the Sonoff POW's value ``2351``. +- **model** (*Optional*, string): The sensor model on the board, to set internal constant factors to convert pulses to measurements. + Possible values are ``HLW8012``, ``CSE7759``, ``BL0937``. Defaults to ``HLW8012``. + CSE7759 uses same constants and it also works with default. Must be set for BL0937 to be able to calibrate all three measurements at the same time. - **change_mode_every** (*Optional*, int): After how many updates to cycle between the current/voltage measurement mode. Note that the first value after switching is discarded because it is often inaccurate. Defaults to ``8``. - **initial_mode** (*Optional*, string): The initial measurement mode. Defaults to ``VOLTAGE``. From fd58a833d20fa2f7895ebfa4a224f5dfa0b32c13 Mon Sep 17 00:00:00 2001 From: buxtronix Date: Mon, 5 Jul 2021 09:59:18 +1000 Subject: [PATCH 09/43] Anova component docs (#1140) Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> --- components/climate/anova.rst | 53 +++++++++++++++++++++++++++++++++++ images/anova.png | Bin 0 -> 6194 bytes index.rst | 1 + 3 files changed, 54 insertions(+) create mode 100644 components/climate/anova.rst create mode 100644 images/anova.png diff --git a/components/climate/anova.rst b/components/climate/anova.rst new file mode 100644 index 000000000..e907479d1 --- /dev/null +++ b/components/climate/anova.rst @@ -0,0 +1,53 @@ +Anova Cooker +============= + +.. seo:: + :description: Instructions for setting up an Anova sous-vide cooker. + :image: anova.png + +The ``anova`` climate platform creates a climate device which can be used +to control a BLE Anova sous-vide stick. Whilst not strictly a climate +device, the concept of keeping something to a set temperature applies +equally here. + +This component supports the following functionality: + +- Turn the stick on or off +- Set the desired temperature +- Show the current temperature + +The timer is not currently supported, you can use automations to achieve +similar functionality. + +This platform uses the BLE peripheral on an ESP32, so you also need to enable +this component. Please see the BLE Client docs for how to discover the MAC +address of your Anova device. +You cannot use the Anova app over BLE whilst this component is connected, you +should disconnect it first. To setup a (dis-)connect switch, see :doc:`/components/switch/ble_client`. + +.. code-block:: yaml + + ble_client: + - mac_address: 11:22:33:aa:bb:cc + id: my_anova + + climate: + - platform: anova + name: "My Anova stick" + ble_client_id: my_anova + +Configuration variables: +------------------------ + +- **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation. +- **name** (**Required**, string): The name of the climate device. +- **ble_client_id** (**Required**, :ref:`config-id`): The ID of the BLE Client. +- All other options from :ref:`Climate `. + +See Also +-------- + +- :doc:`/components/ble_client` +- :doc:`/components/climate/index` +- :apiref:`anova/anova.h` +- :ghedit:`Edit` diff --git a/images/anova.png b/images/anova.png new file mode 100644 index 0000000000000000000000000000000000000000..87ac67c7472eb83593de0300bbd1a1b6b80c94b2 GIT binary patch literal 6194 zcmb_g^;Z<$)7}LnTpDE+kXWUcmXKOfsYOJVF6r)Ofki}8x*L^Rkd!5)y9K3NL27}e zJHCAWhW9=9%$_2}-B$U_;fNVG}}A|iSc>+{wpj> z=oE%%`Yfu4cXHC9A9!SCFfMW*ntItJY5z!JydT_a&vTGv=I@6t9Qy}(AZ!k-8qxlZ z)*4v&f!-0@Q+}oz!3$8ilYG7a>(DT8L9%H0y zA^12WGgH16Ui91Y)0{>pUjTu#L0bLchL&MbJ+Bh9!PAPm;C09 z@T2=391_XD$F+Q-B2*D3gu($E7JIymPQh)rA2y4do3lqo)C=L6YoIVG)V0FuVL3Ji z=!O3=sip-zi;qkiwp!xvX(DVQmBfjS^k{K)|Lu-?ENu6{I@?n_H=xU`YDcT~4I-An z@4{wsv(brrFC5$W@Ul-emABx>4+$2?C-lW|OOFmhM`1SjQuRy(s{dW7DX{4DWgeQY z28w;Wyk1*di&!rOnwu{AOwqiV$qi=IQ6S3t8ub!0ponWS2-QQCkK97IJsgy@&-lD0z1Bx5AVkhF~Ya8HvTiAq9xg8!J_VD!FdD7Mdm;-*A2rnVM zkFR>b8Y@}@Bk$c`Nc3n=6HlKA=4I>vn12YDOi?d-b)NB#8IK38e{_0`ow`&L>U!k< zWbdizB{14tHwR^47M*S$9RYS1)+`y1f*jNrbzgQEw^ga8K&w)C3??i3ADb(&C6?({ zeWp!&cqW)~998{XM#NuPsogt6z^Z;l3{jAa7OET>q{xTwSGC!`OAnvVR0ixW4KbUF zBCg@$*^Fcw%1k`W#lP5df^K~E_4WUv{Wx71Lx_OofRSC*`UT|SaHx~4M%>1gE>y(r zV732Yx}ml8`g7(!j~}ebD%ZkL^Yfiwn@2WO=kNMTwn?(?Ybb-?wLR9g^6#o>D3O6H zVPe0`2zl(Q%Uh5Y&%EO&K4wNZiuP=ePfz!$@-;s%rt`Tt+6?b&hq!U(l0%h>e*ZXq znMK2W>~%#YIE0Y{(>5h;B6%-H1+J)fE3A@TuBQ@c}|(*Q@ho_yX`e#MYfik3#^V|;Q2oUh0@Wz zIgE1A?_6L{GS>r@b8h@Z?K0grb90QlUzHP)JWYf?tV+7{=IZq;F%o_c3EzFM5GWk+ zT&Uq}IgPf|6J<;6kIg|I^p6JkJB{B@~Jhz zIGmFo<@m0?3SHShOJ=!fq~3Tf*BjAx19Z%BH#!xd`cv6S4%)74ZhrE!V-2ARux)!UpiaE; zSyh3z+R*7!F2H{&t8AJir0@x=I^E(_q)sE(>eEsd4V>dW#CUE$v<=2wizX8!bvvS^@xA) zz{|km!p-e!f3vvssaJ^tYefGDWVrJ3Pbnw?s>ro~t&*YvM)t)1N{>xVIyySz=-!n? z#b+GE2oK{N+8ZT>_YUSjUf$;hcT+I8NGTyYtQEiRf!$=>lDWjs_Y9M<|1Mo?Z3^v3 zp*0Uaypuuae*FQ)wY*@I5&A-y85~w>C!Vd&g!$xaAWY*&ue=DB)|{9F{s#j2VT}4G zl6Re~Jv=iyy2n*1xE#L_H5=RitVD~;T5nRHYUa`CRDMrdCs4cG@Uhqw1|t$Jkb=%( z?0^N#x@NJ1gzfu0XYkJgVX5BH0&7DmztxTdOp~9rKNe_r^^Jc4Nbs{BMO21IYfeaf z63E?W-MRyTQY$%s{W4x=u|vT#1hnMRNtSC&I62rH zlo=5`LN43bdXMu4I4-4;S@z}dx(D5znTdi?Lkh;8e!sj@i1m>)o^Z%?5HSFcuJTZw zS0ZG@$<$C(w0^mYU!wT0)KU)|sYFROg$I_A=3IX} z*e19j!N*J|srpAheWC$4Uub&sPa_+AYiA77VfA4I$4>>jqrh^~hh)q<>rLd4`8X@X z7cIWUA++7guZpo)tY}1^Bg@)Wu^rso+dFrSM}{|5l{%|_Utf~3weu9$*>)O_@Kg_9 z6D`y%0iz~@$H`xvg^3Q#;L64EornE%z_5GsQcSUZq*dXUABd@ijsyZ<{baB3J%xp|)Fla~4-uHE$uQvn-lcXN9~=IBq!(Myaz_T!y%d|j-?U}B z1M}V0iF+o^ldX=^F2U)aGfy_1u`q`b#o1H1WDaf2AMIne#1F>C&3;P(sF%t_s%kNq z1eF3~f)PFz)bH)aU5ng}i^R0spOJWMja&+c74+sY+i>P`y_&+82zJV*&VBCXPn8`4 z@k(ddpl9cJq_RrAW&++5XhaKT3ok)413AO^UD)w99^H?0*V#vXNkDGB!7*f}%hnMT z0nE<*)=CM1i0 zP-GA{^YAqo4i0jjuKeS&+=sG;0Vc&`Xc~DFgCbQBKk>XsZ31C?^GTd<#V)sN_L1Ax z@&q*+6D4G1WKE}w{<#pcEcf8;k+u)06g?MQe3WSOdDZ0Ng@J^|6`&HEBjdd;?WT-D ze^|S$!8n?*L%?B3D7oQ3Yx_{Lj4ST;YD~iXU&@Sq`#`f-{{9koywLLe;Gb|?|7sNI zL1$1@pL|Y((LiHRyXS)Wd)qXLJH~d2k!}gUf+$F?D3}km1j1`%txcQ7KN=?Bui6I} zhIK7k4^<7qHYF}^w`khiq4y$mq++Z1cZM-Lv@l&NJP9BuT7b1cK42h3_n|yj^1-qX8b;F7~JD=`Ocezf)0Z<+k*(T>i|+xBfpB zjCAX`QM_d(TxooyzRl3jY3=mX&gXGhiC^e3_P>*5{331Myz6Ly~&1Z0RlHJMt)lF(^$KczcPqTd1_LTp5La20T4$Lt$u|;SNlCF+1bow_idq<}H2bBzX zTq`>wz;;(`BopFBSIM&a<<;@gks*$CL1*woIZGb3A}lWN{(29He0+(xiD~qzv@?w2 zwh`M11C1T4%wd)|yOB8}j&wa~&05F)vT`EvN<+a{B^8Uyms{uyf^&vVvqzu6M?0IF zk9`PJ(gTefC7!y(vwG22WlVkN{5V89om^#yK@rZt@EU~1w=1*Na4$2l=z+FC@jP#i z%N<>)mlkoyA-n*GwhPj9ey{mB?CmODyqiWGLL_?mdNScp>h~(gOHR3Yr7GXUH3USE zZO=T)5JAhcez+VmJFjPAa(h6+o<-@iHHg`1#j7Lo&;vya^^o$NKG2&XEjzq+tE!Sh zGO?lvQw2M=;`JK%-^;R`Qnq*Zo|vijmH-6JP46%H-Wy31v>dR9xJh=$&OQuWpLK(8 zRGIfWk?;$_xFJuuuXAqp9=u5U`%fh`6kE~C_;Z}B)8nb!_l7~w1z4&+uSjD5_Gh$p znCWs5QT@@czw7MxhyK+1r0aLjLk~plNul_IYORK4{)Dn5|IDON<5Ew-DH(G)tS_bc zUzGJVE%DXe9*#)-yv;c+*#bRGJ8+}wPu4$|Llk|iG@UHjI^6WgFpuGEfg8pVAC-km zQZpmNfGeK_g#VQp-6EHLx7AwGbgRrv^pbv9tgVfPF(2QLE1@43l6}9M`Xa^fRGO3@ z3Asx>??G7YhWxds(1EM7#wuA}5sub7vM zQ7?n6renNQ$8qYuI_$aAEWmc?lZe6oSuHS=4ciHvzt?pZalB<`YfABx;7a2V>6Xoh{by*v^jFrZe4U3-`S7Jk2e=TfmE=A3kqgQhE7-KS}z zIX*tl$9kUcILrmkSC{2Ej{RvNF;QveO#;I$XIccS(BU z&ptT)@++#Jsh#WdzlDAqOaXPFLy5jvwz~UoxaipQ^x0eUAsbUo;U4OE33&_VosGs_ zaq}UjJ}`ffqJlKB#0T^)F)|)0d$}M#f?bq*&qKtmU6xl`S~^!U<@gfSdbX=Q zEfL*}kvE!p0%rbd_*%??!&CF-x-G?W*wyGX7`0ZTZ(sl(pPEY5s`?BigH8cxf5`GO z+jq~(eRiTkmGge%DrzlwRGb!V^^)R?47q%52fe?K^O zb_O{Ye*;1s&&CCDqt0cdfT3IWhpp!@x!X9=ro9f3a)BlqZ6B;T7|XTyVMXjG?SGUV z$@IPscFP87<@#RV(Gd$3eg0gMgW5v5+MYL6qHf$(#mdxZ3^( zUR;ez>>HazSTkkB6JudsTc6C}m-6!R`I|zYmUluD)NJ@nCs`n%vj?&Yytvr&d5|&w zE=NePfeOpj9V?ifoi$tKn*&8U!A$2)aG(`NR>cYF7PGY?mW*42l9i;PHaAyxzw2o+ zr@eXk=6!>IRDDpsUs85O{voxMNZH{HkIKdK>#wAN@Vw*Pjd z)bZiR_2bCt5dL-dn`Cb;hFi7y!$ViZD)3X2OjUG1&cL^hbBmgrG1#rGNqoMPy}o3C z{bU)ZEyI*2dwn^*7Vn94udDIVx3U}NcqOF5O})cdS`weu78YA)hl}K|6#4i2q32+Q z49Od9zShlaS3iq%tJyM!i$Sq)f0)g_gtXChq?Ol|II7T_>A}E>bNOlco>-`hH)-fd zs29V!*8y0!RX}Oz@|EdloV&LE89d{;Ey#r)*s#KA?8>n2gxX)}4P)%(Ml!8cpEJqd zIyLUatFakT`J%4gbeWx13#<{N?!==30sfR!yE(T>f>8nBmW9;kpIgEa17!}<+Bd+; z&u8`es=bBJP}4!?l^ShbuM>ZIlFj2&dc+KDn1HI+mn z!wVs#P$5iSl-D=bpdfhLNusBe(C*w&+yH;&&>}cP=O3uF% zA#AM7=45Nz?wUo^_sT0O*{e!Rc+Y$W(=2SdDmD_biX~-IZ2`=$5Fms&7np*WbSZ`a zF}2XrG1shhT3$mX@$7P4%Wga#MR#|hehat6a011{C93$^(ETvxGpkDU2-(;b9g0Ps zE0Hj#-y%)Yx7yD&gn4Qu><(2sv6#^ejR$pJkc`ru%-}M{`LkTb7I=5n^$FkTgy%DK z=LWYFysJC%x}dI$gX)C|!h2&!Z?L+$N_TrgMSY4d!Afs(p&YxbdNUe)k{@79!u{yi z=5zEGlQZ&pwmNK=HDNrWkAtcNA38Nm1T?RjW`B+p$y7x6OF3EVrLa+x)Ya6~$Sa7T z?drmhrZGDgR!)wNJc;bD%Of-ROw+jgn9guKQ?u0Zr_e#aA4vfwC`76D#D7e==-25c z4^@0wc#{_8-j?W9?V}fNt2B4tNJ(A90?t=EkolMcH0-|2O$N$oGmV Y{D*S_?X_~yow^TDR#aCgmot6;Kb;H@MF0Q* literal 0 HcmV?d00001 diff --git a/index.rst b/index.rst index 298369206..3b2593fe3 100644 --- a/index.rst +++ b/index.rst @@ -398,6 +398,7 @@ Climate Components IR Remote Climate, components/climate/ir_climate, air-conditioner-ir.svg Tuya Climate, components/climate/tuya, tuya.png Midea Air Conditioner, components/climate/midea_ac, midea.svg + Anova Cooker, components/climate/anova, anova.png Misc Components --------------- From 9f24bb6018e8ab607c2846def539998ea8c636f9 Mon Sep 17 00:00:00 2001 From: Oxan van Leeuwen Date: Thu, 8 Jul 2021 11:37:53 +0200 Subject: [PATCH 10/43] Documentation for white channel changes (#1272) --- components/light/index.rst | 34 +++++++++++++++++++++++++++------- components/light/rgbw.rst | 14 +++++++------- 2 files changed, 34 insertions(+), 14 deletions(-) diff --git a/components/light/index.rst b/components/light/index.rst index 2286b8240..cb04a8168 100644 --- a/components/light/index.rst +++ b/components/light/index.rst @@ -48,7 +48,7 @@ Configuration variables: - **on_turn_off** (*Optional*, :ref:`Action `): An automation to perform when the light is turned off. See :ref:`light-on_turn_on_off_trigger`. -Additional Configuration variables for addressable lights: +Additional configuration variables for addressable lights: - **color_correct** (*Optional*, list of float): Apply a color correction to each color channel. This defines the maximum brightness of each channel. For example ``[100%, 50%, 100%]`` would set the @@ -129,15 +129,19 @@ Configuration variables: - **transition_length** (*Optional*, :ref:`config-time`, :ref:`templatable `): The length of the transition if the light supports it. - **brightness** (*Optional*, percentage, :ref:`templatable `): The brightness of the light. Must be in range - ``0%`` to ``100%`` or ``0.0`` to ``1.0``. Defaults to not changing brightness. + ``0%`` to ``100%`` or ``0.0`` to ``1.0``. This is a master brightness that applies to all channels (both color and white) of the + light. Defaults to not changing brightness. +- **color_brightness** (*Optional*, percentage, :ref:`templatable `): The brightness of the color lights. Must + be in range ``0%`` to ``100%`` or ``0.0`` to ``1.0``. Useful to control brightness of colored and white lights separately for + RGBW lights. Defaults to not changing brightness. - **red** (*Optional*, percentage, :ref:`templatable `): The red channel of the light. Must be in range - ``0%`` to ``100%`` or ``0.0`` to ``1.0``. Defaults to not changing red. + ``0%`` to ``100%`` or ``0.0`` to ``1.0``. Defaults to not changing red channel. - **green** (*Optional*, percentage, :ref:`templatable `): The green channel of the light. Must be in range ``0%`` to ``100%`` or ``0.0`` to ``1.0``. Defaults to not changing green channel. - **blue** (*Optional*, percentage, :ref:`templatable `): The blue channel of the light. Must be in range ``0%`` to ``100%`` or ``0.0`` to ``1.0``. Defaults to not changing blue channel. -- **white** (*Optional*, percentage, :ref:`templatable `): The white channel value of RGBW lights. Must be in range - ``0%`` to ``100%`` or ``0.0`` to ``1.0``. Defaults to not changing white value. +- **white** (*Optional*, percentage, :ref:`templatable `): The brightness of the white lights. Must be in range + ``0%`` to ``100%`` or ``0.0`` to ``1.0``. Defaults to not changing white channel. - **color_temperature** (*Optional*, float, :ref:`templatable `): The white color temperature value (in `mireds `__ or Kelvin) for CWWW / RGBWW lights. Defaults to not changing the color temperature value. - **flash_length** (*Optional*, :ref:`config-time`, :ref:`templatable `): If set, will flash the given color for this period of time and then go back to the previous state. @@ -163,7 +167,21 @@ Configuration variables: The ``red``, ``green`` and ``blue`` values only control the color of the light, not its brightness! If you assign ``50%`` to all RGB channels it will be interpreted as 100% on. - Only use ``brightness`` to control the brightness of the light. + Only use ``brightness`` or ``color_brightness`` to control the brightness of the light. + +.. note:: + + The master brightness (``brightness``) and separate brightness controls for the color and + white channels (``color_brightness`` and ``white``) are multiplied together. Thus, this will + result in color at 40% brightness and white at 60% brightness: + + .. code-block:: yaml + + - light.turn_on: + id: light_1 + brightness: 80% + color_brightness: 50% + white: 75% .. _light-turn_off_action: @@ -295,13 +313,15 @@ Configuration variables: - **range_to** (*Optional*, :ref:`templatable `, int): The end of the range of LEDs to control - this is a half-open interval. 0-based indexing. Defaults to the end of the strip (``num_leds``). +- **color_brightness** (*Optional*, :ref:`templatable `, percentage): The brightness to + set the color channel to. - **red** (*Optional*, :ref:`templatable `, percentage): The value to set the red channel to. - **green** (*Optional*, :ref:`templatable `, percentage): The value to set the green channel to. - **blue** (*Optional*, :ref:`templatable `, percentage): The value to set the blue channel to. -- **white** (*Optional*, :ref:`templatable `, percentage): The value to +- **white** (*Optional*, :ref:`templatable `, percentage): The brightness to set the white channel to. .. _light-is_on_condition: diff --git a/components/light/rgbw.rst b/components/light/rgbw.rst index 91d6f31ea..4df4e6b61 100644 --- a/components/light/rgbw.rst +++ b/components/light/rgbw.rst @@ -62,14 +62,14 @@ Configuration variables: Color Interlock *************** -With some LED bulbs, setting the RGB channels to maximum whilst wanting a white light will have an undesired -hue affect. Additionally, the brightness command may not work as expected depending upon configuration, -leaving users to adjust the white component level separately. For these cases a new configration variable -has been added: color_interlock. +With some LED bulbs, it is not possible to enable the RGB leds at the same time as the white leds, or setting +the RGB channels to maximum whilst wanting a white light will have an undesired hue effect. For these cases a +configuration variable is available that prevents the RGB leds and white leds from being turned on at the same +time: ``color_interlock``. -Setting this variable to True will turn off RGB leds when white value is above 0 (or if they are to 255,255,255) -and turn off white leds if color is not set to 255,255,255. This also allows the brightness parameter to -control the intensity of the white leds. +Setting this variable to ``True`` will automatically turn off the RGB leds when the white value is non-zero, or +when the color is set to white (equal values for red, green and blue). When a different color is set, or the +color brightness is raised above 0%, the white leds are automatically turned off. See Also -------- From 8c8c6b5433eba12dbc764a7d9427c84f25a42ceb Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Fri, 9 Jul 2021 00:39:44 +1200 Subject: [PATCH 11/43] Update docs for WiFi AP using device name. (#1294) --- components/wifi.rst | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/components/wifi.rst b/components/wifi.rst index 44a349845..366a7c97e 100644 --- a/components/wifi.rst +++ b/components/wifi.rst @@ -51,7 +51,8 @@ Configuration variables: - **ap** (*Optional*): Enable an access point mode on the node. - - **ssid** (**Required**, string): The name of the access point to create. + - **ssid** (*Optional*, string): The name of the access point to create. Leave empty to use + the device name. - **password** (*Optional*, string): The password for the access point. Leave empty for no password. - **channel** (*Optional*, int): The channel the AP should operate on from 1 to 14. @@ -95,6 +96,20 @@ to the WiFi router can be made. ssid: "Livingroom Fallback Hotspot" password: "W1PBGyrokfLz" +You can also create a simple ``ap`` config which will set up the access point to have the +devices name as the ssid with no password. + +.. code-block:: yaml + + wifi: + ap: {} + + # or if you still want the ap to have a password + + wifi: + ap: + password: "W1PBGyrokfLz" + .. _wifi-manual_ip: Manual IPs From bd2268a2bfbd2c561b83fd70bd702e4743b31f5f Mon Sep 17 00:00:00 2001 From: Maurice Makaay Date: Sat, 10 Jul 2021 21:52:41 +0200 Subject: [PATCH 12/43] Added documentation for ota automation triggers. (#1263) Co-authored-by: Maurice Makaay --- components/ota.rst | 124 +++++++++++++++++++++++++++++++++++++++++ guides/automations.rst | 3 + 2 files changed, 127 insertions(+) diff --git a/components/ota.rst b/components/ota.rst index b51b722ce..24a11f961 100644 --- a/components/ota.rst +++ b/components/ota.rst @@ -36,6 +36,16 @@ Configuration variables: - **reboot_timeout** (*Optional*, :ref:`time `): The amount of time to wait before rebooting when in safe mode. Defaults to ``5min``. - **num_attempts** (*Optional*, int): The number of attempts to wait before entering safe mode. Defaults to ``10``. +- **on_begin** (*Optional*, :ref:`Automation`): An action to be + performed when an OTA update is started. See :ref:`ota-on_begin`. +- **on_progress** (*Optional*, :ref:`Automation`): An action to be + performed (multiple times) during an OTA update. See :ref:`ota-on_progress`. +- **on_end** (*Optional*, :ref:`Automation`): An action to be + performed after a successful OTA update. See :ref:`ota-on_end`. +- **on_error** (*Optional*, :ref:`Automation`): An action to be + performed after a failed OTA update. See :ref:`ota-on_error`. +- **on_state_change** (*Optional*, :ref:`Automation`): An action to be + performed when an OTA update state change happens. See :ref:`ota-on_state_change`. .. note:: @@ -46,6 +56,120 @@ Configuration variables: very likely that power-cycling the ESP module is required once after the serial upload. +OTA Automation +-------------- + +The OTA component provides various automations that can be used to provide feedback +during an OTA update. There are a few things to consider when making use of the +provided automation triggers: + +- An OTA update blocks the main loop during its operation. This means that you + won't be able to represent state changes using components that update their + output only from within their ``loop()`` method. Explained differently: if you + try to display the OTA progress using component X, but the update only appears + after the OTA update finished, then component X cannot be used for providing + OTA update feedback. + +- Make sure that your automation actions do not take too much time, to prevent + them from blocking the OTA update code for too long. + +.. _ota-on_begin: + +``on_begin`` +************ + +This automation will be triggered when an OTA update is started. + +.. code-block:: yaml + + ota: + on_begin: + then: + - logger.log: "OTA start" + +.. _ota-on_progress: + +``on_progress`` +*************** + +Using this automation, it is possible to report on the OTA update progress. +It will be triggered multiple times during the OTA update. You can get the actual +progress percentage (a value between 0 and 100) from the trigger with variable ``x``. + +.. code-block:: yaml + + ota: + on_progress: + then: + - logger.log: + format: "OTA progress %0.1f%%" + args: ["x"] + +.. _ota-on_end: + +``on_end`` +********** + +This automation will be triggered when an OTA update has completed sucessfully, +right before the device is rebooted. + +Because the update has completed, you can safely use an automation action that +takes some time to complete. This can for example be useful if you want to flash +a LED or so, in which case a pause would be required to make the LED light up +for long enough, before the reboot turns it off. + +.. code-block:: yaml + + ota: + on_end: + then: + - logger.log: "OTA end" + +.. _ota-on_error: + +``on_error`` +************ + +This automation will be triggered when an OTA update has failed. You can get +the internal error code with variable ``x``. + +Just like for :ref:`ota-on_end`, you can safely use an automation that +takes some time to complete, because the OTA update is no longer busy. + +.. code-block:: yaml + + ota: + on_error: + then: + - logger.log: + format: "OTA update error %d" + args: ["x"] + +.. _ota-on_state_change: + +``on_state_change`` +******************* + +This automation will be triggered on every state change. You can get the actual +state with variable ``state``, which will contain one of values for the OTAState +enum. These values are: + +- ``ota::OTA_STARTED`` +- ``ota::OTA_IN_PROGRESS`` (will be called multiple times during the update) +- ``ota::OTA_COMPLETED`` +- ``ota::OTA_ERROR`` + +.. code-block:: yaml + + ota: + on_state_change: + then: + - if: + condition: + lambda: return state == ota::OTA_STARTED + then: + - logger.log: "OTA start" + Updating the password: ---------------------- diff --git a/guides/automations.rst b/guides/automations.rst index bf94a8962..7a0c3aafb 100644 --- a/guides/automations.rst +++ b/guides/automations.rst @@ -334,6 +334,9 @@ All Triggers - :ref:`switch.on_turn_on/off ` - :ref:`sim800l.on_sms_received ` - :ref:`rf_bridge.on_code_received ` +- :ref:`ota.on_begin ` / :ref:`ota.on_progress ` / + :ref:`ota.on_end ` / :ref:`ota.on_error ` / + :ref:`ota.on_state_change ` All Actions ----------- From cb69e404d5194ab5e7a5fe91a2c89e8c2f360b46 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 13 Jul 2021 07:20:18 +1200 Subject: [PATCH 13/43] Add number and template number docs (#1283) Co-authored-by: Franck Nijhof --- components/index.rst | 1 + components/number/index.rst | 188 +++++++++++++++++++++++++++++++++ components/number/template.rst | 52 +++++++++ guides/automations.rst | 3 + index.rst | 8 ++ 5 files changed, 252 insertions(+) create mode 100644 components/number/index.rst create mode 100644 components/number/template.rst diff --git a/components/index.rst b/components/index.rst index 6c3dbfdbb..0292a19ae 100644 --- a/components/index.rst +++ b/components/index.rst @@ -9,6 +9,7 @@ Components cover/index fan/index light/index + number/index output/index sensor/index switch/index diff --git a/components/number/index.rst b/components/number/index.rst new file mode 100644 index 000000000..bea7c472d --- /dev/null +++ b/components/number/index.rst @@ -0,0 +1,188 @@ +Number Component +================ + +.. seo:: + :description: Instructions for setting up number components in ESPHome. + :image: folder-open.png + +ESPHome has support for components to create a number entity. A number entity is +like a sensor that can read a value from a device, but is useful when that value +can be set by the user/frontend. + +.. note:: + + Home Assistant Core 2021.7 or higher is required for ESPHome number entities to work. + +.. _config-number: + +Base Number Configuration +------------------------- + +All numbers in ESPHome have a name and an optional icon. + +.. code-block:: yaml + + # Example number configuration + name: Livingroom Volume + + # Optional variables: + icon: "mdi:volume-high" + +Configuration variables: + +- **name** (**Required**, string): The name for the number. +- **icon** (*Optional*, icon): Manually set the icon to use for the number in the frontend. +- **internal** (*Optional*, boolean): Mark this component as internal. Internal components will + not be exposed to the frontend (like Home Assistant). Only specifying an ``id`` without + a ``name`` will implicitly set this to true. + +Automations: + +- **on_value** (*Optional*, :ref:`Automation `): An automation to perform + when a new value is published. See :ref:`number-on_value`. +- **on_value_range** (*Optional*, :ref:`Automation `): An automation to perform + when a published value transition from outside to a range to inside. See :ref:`number-on_value_range`. + +MQTT Options: + +- All other options from :ref:`MQTT Component `. + +Number Automation +----------------- + +You can access the most recent state of the number in :ref:`lambdas ` using +``id(number_id).state``. + +.. _number-on_value: + +``on_value`` +************ + +This automation will be triggered when a new value is published. In :ref:`Lambdas ` +you can get the value from the trigger with ``x``. + +.. code-block:: yaml + + number: + - platform: template + # ... + on_value: + then: + - light.turn_on: + id: light_1 + red: !lambda "return x/255;" + +Configuration variables: See :ref:`Automation `. + +.. _number-on_value_range: + +``on_value_range`` +****************** + +With this automation you can observe if a number value passes from outside +a defined range of values to inside a range. +This trigger will only trigger when the new value is inside the range and the previous value +was outside the range. On startup, the last state before reboot is restored and if the value crossed +the boundary during the boot process, the trigger is also executed. + +Define the range with ``above`` and ``below``. If only one of them is defined, the interval is half-open. +So for example ``above: 5`` with no below would mean the range from 5 to positive infinity. + +.. code-block:: yaml + + number: + - platform: template + # ... + on_value_range: + above: 5 + below: 10 + then: + - switch.turn_on: relay_1 + +Configuration variables: + +- **above** (*Optional*, float): The minimum for the trigger. +- **below** (*Optional*, float): The maximum for the trigger. +- See :ref:`Automation `. + +.. _number-in_range_condition: + +``number.in_range`` Condition +***************************** + +This condition passes if the state of the given number is inside a range. + +Define the range with ``above`` and ``below``. If only one of them is defined, the interval is half-open. +So for example ``above: 5`` with no below would mean the range from 5 to positive infinity. + +.. code-block:: yaml + + # in a trigger: + on_...: + if: + condition: + number.in_range: + id: my_number + above: 50.0 + then: + - script.execute: my_script + +Configuration variables: + +- **above** (*Optional*, float): The minimum for the condition. +- **below** (*Optional*, float): The maximum for the condition. + +.. _number-set_action: + +``number.set`` Action +********************* + +This is an :ref:`Action ` for setting a number state. + +.. code-block:: yaml + + - number.set: + id: my_number + value: 42 + +Configuration variables: + +- **id** (**Required**, :ref:`config-id`): The ID of the number to set. +- **value** (**Required**, float, :ref:`templatable `): + The value to set the number to. + +.. _number-lambda_calls: + +lambda calls +************ + +From :ref:`lambdas `, you can call several methods on all numbers to do some +advanced stuff (see the full API Reference for more info). + +- ``make_call()``: Set the number value. + + .. code-block:: cpp + + // Within lambda, push a value of 42 + auto call = id(my_number).make_call(); + call.set_value(42); + call.perform(); + +- ``.state``: Retrieve the current value of the number. Is ``NAN`` if no value has been read or set. + + .. code-block:: cpp + + // For example, create a custom log message when a value is received: + ESP_LOGI("main", "Value of my number: %f", id(my_number).state); + +See Also +-------- + +- :apiref:`number/number.h` +- :ghedit:`Edit` + +.. toctree:: + :maxdepth: 1 + :glob: + + * diff --git a/components/number/template.rst b/components/number/template.rst new file mode 100644 index 000000000..7c4b4d846 --- /dev/null +++ b/components/number/template.rst @@ -0,0 +1,52 @@ +Template Number +=============== + +.. seo:: + :description: Instructions for setting up template numbers with ESPHome. + :image: description.png + +The ``template`` number platform allows you to create a number with templated values +using :ref:`lambdas `. + +.. code-block:: yaml + + # Example configuration entry + number: + - platform: template + name: "Template number" + update_interval: never + min_value: 0 + max_value: 100 + step: 1 + +Configuration variables: +------------------------ + +- **name** (**Required**, string): The name of the number. +- **min_value** (**Required**, float): The minimum value this number can be. +- **max_value** (**Required**, float): The maximum value this number can be. +- **step** (**Required**, float): The granularity with which the number can be set. +- **lambda** (*Optional*, :ref:`lambda `): + Lambda to be evaluated every update interval to get the new value of the number. +- **set_action** (*Optional*, :ref:`Action `): The action that should + be performed when the remote (like Home Assistant's frontend) requests to set the number value. +- **update_interval** (*Optional*, :ref:`config-time`): The interval to check the + number. Defaults to ``60s``. +- **optimistic** (*Optional*, boolean): Whether to operate in optimistic mode - when in this mode, + any command sent to the template number will immediately update the reported state. + Defaults to ``false``. +- **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation. +- All other options from :ref:`Sensor `. + +``number.set`` Action +---------------------------------- + +You can also publish a state to a template number from elsewhere in your YAML file +with the :ref:`number-set_action`. + +See Also +-------- + +- :ref:`automation` +- :apiref:`template/number/template_number.h` +- :ghedit:`Edit` diff --git a/guides/automations.rst b/guides/automations.rst index 7a0c3aafb..09e8161ee 100644 --- a/guides/automations.rst +++ b/guides/automations.rst @@ -379,6 +379,7 @@ All Actions - :ref:`rf_bridge.learn ` - :ref:`ds1307.read_time ` / :ref:`ds1307.write_time ` - :ref:`cs5460a.restart ` +- :ref:`number.set ` .. _config-condition: @@ -399,6 +400,7 @@ All Conditions - :ref:`text_sensor.state ` - :ref:`light.is_on ` / :ref:`light.is_off ` - :ref:`display.is_displaying_page ` +- :ref:`number.in_range ` All Lambda Calls ---------------- @@ -410,6 +412,7 @@ All Lambda Calls - :ref:`Cover ` - :ref:`Text Sensor ` - :ref:`Stepper ` +- :ref:`Number ` .. _delay_action: diff --git a/index.rst b/index.rst index 3b2593fe3..966c2614a 100644 --- a/index.rst +++ b/index.rst @@ -400,6 +400,14 @@ Climate Components Midea Air Conditioner, components/climate/midea_ac, midea.svg Anova Cooker, components/climate/anova, anova.png +Number Components +----------------- + +.. imgtable:: + + Number Core, components/number/index, folder-open.svg + Template Number, components/number/template, description.svg + Misc Components --------------- From e3e5d9c76ae1093902a4ba8b753c225d95ff49ca Mon Sep 17 00:00:00 2001 From: Mikko Tervala Date: Mon, 12 Jul 2021 23:55:57 +0300 Subject: [PATCH 14/43] Add support for IBS-TH1 External Sensor (#1289) Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> --- components/sensor/inkbird_ibsth1_mini.rst | 41 +++++++++++++++-------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/components/sensor/inkbird_ibsth1_mini.rst b/components/sensor/inkbird_ibsth1_mini.rst index 03cc6bfb2..a84e12331 100644 --- a/components/sensor/inkbird_ibsth1_mini.rst +++ b/components/sensor/inkbird_ibsth1_mini.rst @@ -1,16 +1,21 @@ -Inkbird IBS-TH1 Mini BLE Sensor -=============================== +Inkbird IBS-TH1 and IBS-TH1 Mini BLE Sensor +=========================================== .. seo:: - :description: Instructions for setting up Inkbird IBS-TH1 Mini Bluetooth-based temperature and humidity sensors in ESPHome. + :description: Instructions for setting up Inkbird IBS-TH1 Bluetooth-based temperature and humidity sensors in ESPHome. :image: inkbird_isbth1_mini.jpg :keywords: Inkbird, BLE, Bluetooth, IBS-TH1 -The ``inkbird_ibsth1_mini`` sensor platform lets you track the output of Inkbird IBS-TH1 Mini Bluetooth +The ``inkbird_ibsth1_mini`` sensor platform lets you track the output of Inkbird IBS-TH1 and IBS-TH1 Mini Bluetooth Low Energy devices using the :doc:`/components/esp32_ble_tracker`. This component will track the -temperature, humidity and the battery level of the IBS-TH1 Mini device every time the +temperature, external temperature (non mini only), humidity and the battery level of the IBS-TH1 device every time the sensor sends out a BLE broadcast. Note that contrary to other implementations, ESPHome can track as -many IBS-TH1 Mini devices at once as you want. +many IBS-TH1 devices at once as you want. + +.. note:: + + If an external temperature sensor is connected to the IBS-TH1, measurement from the internal sensor is not sent. + Only one sensor will work at a time. .. figure:: images/inkbird_isbth1_mini-full.jpg :align: center @@ -31,22 +36,30 @@ many IBS-TH1 Mini devices at once as you want. - platform: inkbird_ibsth1_mini mac_address: 38:81:D7:0A:9C:11 temperature: - name: "Inkbird IBS-TH1 Mini Temperature" + name: "Inkbird IBS-TH1 Temperature" + external_temperature: + name: "Inkburd IBS-TH1 External Temperature" humidity: - name: "Inkbird IBS-TH1 Mini Humidity" + name: "Inkbird IBS-TH1 Humidity" battery_level: - name: "Inkbird IBS-TH1 Mini Battery Level" + name: "Inkbird IBS-TH1 Battery Level" Configuration variables: ------------------------ -- **mac_address** (**Required**, MAC Address): The MAC address of the Inkbird IBS-TH1 Mini device. +- **mac_address** (**Required**, MAC Address): The MAC address of the Inkbird IBS-TH1 device. - **temperature** (*Optional*): The information for the temperature sensor. - **name** (**Required**, string): The name for the temperature sensor. - **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. - All other options from :ref:`Sensor `. +- **external_temperature** (*Optional*): The information for the external temperature sensor. + + - **name** (**Required**, string): The name for the external temperature sensor. + - **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. + - All other options from :ref:`Sensor `. + - **humidity** (*Optional*): The information for the humidity sensor - **name** (**Required**, string): The name for the humidity sensor. @@ -63,7 +76,7 @@ Configuration variables: Setting Up Devices ------------------ -To set up Inkbird IBS-TH1 Mini devices you first need to find their MAC Address so that ESPHome can +To set up Inkbird IBS-TH1 devices you first need to find their MAC Address so that ESPHome can identify them. So first, create a simple configuration without any ``inkbird_ibsth1_mini`` entries like so: @@ -71,7 +84,7 @@ like so: esp32_ble_tracker: -After uploading the ESP32 will immediately try to scan for BLE devices such as the Inkbird IBS-TH1 Mini. +After uploading the ESP32 will immediately try to scan for BLE devices such as the Inkbird IBS-TH1. When it detects these sensors, it will automatically parse the BLE message print a message like this one: @@ -82,7 +95,7 @@ message like this one: [13:36:43][D][esp32_ble_tracker:567]: Name: 'sps' Note that it can sometimes take some time for the first BLE broadcast to be received. Please note that address type -should say 'PUBLIC' and the device name should be 'sps', this is how you find the Inkbird IBS-TH1 Mini among all the +should say 'PUBLIC' and the device name should be 'sps', this is how you find the Inkbird IBS-TH1 among all the other devices. Then just copy the address (``38:81:D7:0A:9C:11``) into a new ``sensor.inkbird_ibsth1_mini`` platform @@ -90,7 +103,7 @@ entry like in the configuration example at the top. .. note:: - The ESPHome Inkbird IBS-TH1 Mini integration listens passively to packets the device sends by itself. + The ESPHome Inkbird IBS-TH1 integration listens passively to packets the device sends by itself. ESPHome therefore has no impact on the battery life of the device. See Also From 95e9ef4055adc0ba6a79541833728ca3411ad94d Mon Sep 17 00:00:00 2001 From: Huub Eikens Date: Mon, 12 Jul 2021 23:22:00 +0200 Subject: [PATCH 15/43] Updated documentation for the SGP30 sensor improvements. (#982) Co-authored-by: Umberto73 --- components/sensor/sgp30.rst | 47 +++++++++++++++++++++++++++---------- 1 file changed, 34 insertions(+), 13 deletions(-) diff --git a/components/sensor/sgp30.rst b/components/sensor/sgp30.rst index 33c74c72f..06100a5fb 100644 --- a/components/sensor/sgp30.rst +++ b/components/sensor/sgp30.rst @@ -24,8 +24,9 @@ The :ref:`I²C Bus ` is required to be set up in your configuration for thi tvoc: name: "Workshop TVOC" accuracy_decimals: 1 + store_baseline: yes address: 0x58 - update_interval: 5s + update_interval: 1s Configuration variables: ------------------------ @@ -42,19 +43,34 @@ Configuration variables: - **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. - All other options from :ref:`Sensor `. +- **store_baseline** (*Optional*, boolean): Store the sensor baselines persistently when calculated or updated. + Defaults to yes. + - **address** (*Optional*, int): Manually specify the I²C address of the sensor. Defaults to ``0x58``. - **update_interval** (*Optional*, :ref:`config-time`): The interval to check the - sensor. Defaults to ``60s``. + sensor. Defaults to ``1s``. Advanced: - **baseline** (*Optional*): The block containing baselines for calibration purposes. See :ref:`sgp30-calibrating` for more info. - - **eco2_baseline** (**Required**, int): The eCO2 baseline for calibration purposes. + - **eco2_baseline** (**Required**, int): The eCO2 baseline for calibration purposes. After OTA, this value is used to calibrate the sensor. - - **tvoc_baseline** (**Required**, int): The TVOC baseline for calibration purposes. + - **tvoc_baseline** (**Required**, int): The TVOC baseline for calibration purposes. After OTA, this value is used to calibrate the sensor. + +- **eco2_baseline** (*Optional*): The information for the CO₂eq. sensor baseline value. Baseline value is published in decimals. + + - **name** (**Required**, string): The name for the CO₂eq baseline value sensor. + - **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. + - All other options from :ref:`Sensor `. + +- **tvoc_baseline** (*Optional*): The information for the TVOC baseline value sensor. Baseline value is published in in decimals. + + - **name** (**Required**, string): The name for the TVOC baseline value sensor. + - **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. + - All other options from :ref:`Sensor `. - **compensation** (*Optional*): The block containing sensors used for compensation. @@ -69,15 +85,21 @@ Advanced: Calibrating Baseline -------------------- -The SGP30 sensor will re-calibrate its baseline each time it is powered on. During the first power-up this can take up to 12 hours. +The SGP30 sensor will re-calibrate its baseline each time it is powered on. During the first power-up this will take up to 12 hours. +Exposing to outside air for at least 10 minutes cumulative time is advised during the calibration period. -For best performance and faster startup times, the current **baseline** needs to be persistently stored on the device before shutting it down and set again accordingly after boot up -that also means that if the sensor reboots at a time when the air is less clean than normal, -the values will have a constant offset and cannot be compared to the values before the last -boot. +For best performance and faster startup times, the current **baseline** needs to be persistently stored on the device before shutting it down and set again accordingly after boot up. +It implies that if the sensor reboots at a time when the air is less clean than normal, the values will have a constant offset and cannot be compared to the values before the last boot. -To do this, let the sensor boot up with no baseline set and let the sensor calibrate itself. After around 12 hours you can then view the remote logs on the ESP. The next -time the sensor is read out, you will see a log message with something like ``Current eCO2 baseline: 0x86C5, TVOC baseline: 0x8B38``. +Using the **store_baseline** option will automatically store the baseline values after calibration or when it is updated during operation. When booting up, the stored values will then be +(re)applied in the sensor. Stored baselines are cleared after OTA. + +Another method is to manually specify the baseline values in the configuration file. To do this, let the sensor boot up with no baseline set and let the sensor calibrate itself. +After around 12 hours you can then view the remote logs on the ESP. The nexttime the sensor is read out, you will see a log message with something like +``Current eCO2 baseline: 0x86C5, TVOC baseline: 0x8B38``. + +Another way to obtain the baseline values is to configure the eco2 and TVOC baseline value sensors. Values will be published to your Home Automation system. +Convert the decimal value to hex value before use (e.g. 37577 --> 0x92C9) Now set the baseline property in your configuration file like so with the value you got via the logs: @@ -94,8 +116,7 @@ via the logs: The next time you upload the code, the SGP30 will be continue its operation with this baseline and you will get consistent values. -Please note that Sensirion recommends that after around 7 days, the baseline will need to be -re-calibrated because the internal sensor has a slight value drift over time. +Please note while the sensor is off, baseline values are valid for a maximum of seven days. See Also -------- From 800e92273787843a5b2bc6fc220faef5a26229d0 Mon Sep 17 00:00:00 2001 From: Sourabh Jaiswal Date: Wed, 14 Jul 2021 06:36:00 +0530 Subject: [PATCH 16/43] Documentation for Havells solar (#1291) Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> --- components/sensor/havells_inverter.rst | 184 +++++++++++++++++++ components/sensor/images/havellsgti5000d.jpg | Bin 0 -> 25912 bytes images/havellsgti5000d_s.jpg | Bin 0 -> 38760 bytes index.rst | 1 + 4 files changed, 185 insertions(+) create mode 100644 components/sensor/havells_inverter.rst create mode 100644 components/sensor/images/havellsgti5000d.jpg create mode 100644 images/havellsgti5000d_s.jpg diff --git a/components/sensor/havells_inverter.rst b/components/sensor/havells_inverter.rst new file mode 100644 index 000000000..5c865107a --- /dev/null +++ b/components/sensor/havells_inverter.rst @@ -0,0 +1,184 @@ +Havells Inverter +================ + +.. seo:: + :description: Instructions for setting up Havells inverter reading on modbus. + :image: images/havellsgti5000d.jpg + :keywords: Havells Enviro, Havells GTI + +The ``Havells Inverter`` sensor platform allows you to use Havells inverter data reading on modbus +(`website `__) +with ESPHome. + +.. figure:: images/havellsgti5000d.jpg + :align: center + :width: 50.0% + + Havells On Grid Solar Inverter. + +The communication with this integration is done over a :ref:`UART bus ` using :ref:`Modbus `. +You must therefore have a ``uart:`` entry in your configuration with both the TX and RX pins set +to some pins on your board and the baud rate set to 9600. + +.. code-block:: yaml + + # Example configuration entry + uart: + - id: uart1 + baud_rate: 9600 + tx_pin: GPIO1 + rx_pin: GPIO3 + + + modbus: + uart_id: uart1 + flow_control_pin: GPIO4 + + sensor: + - platform: havells_solar + update_interval: 60s + phase_a: + voltage: + name: "HAVELLS Phase A Voltage" + current: + name: "HAVELLS Phase A Current" + phase_b: + voltage: + name: "HAVELLS Voltage Phase B" + current: + name: "HAVELLS Current Phase B" + phase_c: + voltage: + name: "HAVELLS Voltage Phase C" + current: + name: "HAVELLS Current Phase C" + pv1: + voltage: + name: "HAVELLS PV1 Voltage" + current: + name: "HAVELLS PV1 Current" + active_power: + name: "HAVELLS PV1 Active Power" + voltage_sampled_by_secondary_cpu: + name: "HAVELLS PV1 Voltage Sampled By Slave CPU" + insulation_of_p_to_ground: + name: "HAVELLS PV1 Insulation Of +VE To Ground" + pv2: + voltage: + name: "HAVELLS PV2 Voltage" + current: + name: "HAVELLS PV2 Current" + active_power: + name: "HAVELLS PV2 Active Power" + voltage_sampled_by_secondary_cpu: + name: "HAVELLS PV2 Voltage Sampled By Slave CPU" + insulation_of_p_to_ground: + name: "HAVELLS PV2 Insulation Of +VE To Ground" + active_power: + name: "HAVELLS Active Power" + reactive_power: + name: "HAVELLS Reactive Power" + frequency: + name: "HAVELLS Frequency" + energy_production_day: + name: "HAVELLS Today's Generation" + total_energy_production: + name: "HAVELLS Total Energy Production" + total_generation_time: + name: "HAVELLS Total Generation Time" + today_generation_time: + name: "HAVELLS Today Generation Time" + inverter_module_temp: + name: "HAVELLS Inverter Module Temp" + inverter_inner_temp: + name: "HAVELLS Inverter Inner Temp" + inverter_bus_voltage: + name: "HAVELLS Inverter BUS Voltage" + insulation_of_pv_n_to_ground: + name: "HAVELLS Insulation Of PV- To Ground" + gfci_value: + name: "HAVELLS GFCI Value" + dci_of_r: + name: "HAVELLS DCI Of R" + dci_of_s: + name: "HAVELLS DCI Of S" + dci_of_t: + name: "HAVELLS DCI Of T" + + + +Configuration variables: +------------------------ + +- **phase_a** (*Optional*): The group of exposed sensors for Phase A/1. + + - **current** (*Optional*): Use the current value of the sensor in amperes. All options from + :ref:`Sensor `. + - **voltage** (*Optional*): Use the voltage value of the sensor in volts. + All options from :ref:`Sensor `. + +- **phase_b** (*Optional*): The group of exposed sensors for Phase B/2 on applicable inverters. + + - All options from **phase_a** + +- **phase_c** (*Optional*): The group of exposed sensors for Phase C/3 on applicable inverters. + + - All options from **phase_a** + +- **pv1** (*Optional*): The group of exposed sensors for Photo Voltaic 1. + + - **current** (*Optional*): Use the current value of the sensor in amperes. All options from + :ref:`Sensor `. + - **voltage** (*Optional*): Use the voltage value of the sensor in volts. + All options from :ref:`Sensor `. + - **active_power** (*Optional*): Use the (active) power value of the sensor in watts. All options + from :ref:`Sensor `. + - **voltage_sampled_by_secondary_cpu** (*Optional*): Use the photo voltiac's voltage sampled by + slave CPU value of the sensor in volts. All options from :ref:`Sensor `. + - **insulation_of_p_to_ground** (*Optional*): Use the insulation of photo voltiac's +ve terminal to + ground value of the sensor in kilo ohms. All options from :ref:`Sensor `. + +- **pv2** (*Optional*): The group of exposed sensors for Photo Voltaic 2. + + - All options from **pv1** + +- **active_power** (*Optional*): Use the (active) power value of the sensor in watts. All options + from :ref:`Sensor `. +- **reactive_power** (*Optional*): Use the reactive power value of the sensor in VAR. All + options from :ref:`Sensor `. +- **frequency** (*Optional*): Use the frequency value of the sensor in hertz. + All options from :ref:`Sensor `. +- **energy_production_day** (*Optional*): Use the export active energy value for same day of the + sensor in kilo watt hours. All options from :ref:`Sensor `. +- **total_energy_production** (*Optional*): Use the total exported energy value of the sensor in + kilo watt hours. All options from :ref:`Sensor `. +- **total_generation_time** (*Optional*): Use the total generation time value of the sensor in + hours. All options from :ref:`Sensor `. +- **today_generation_time** (*Optional*): Use the day generation time value for same day of the + sensor in minutes. All options from :ref:`Sensor `. +- **inverter_module_temp** (*Optional*): Use the inverter module temperature value of the sensor in + degree celcius. All options from :ref:`Sensor `. +- **inverter_inner_temp** (*Optional*): Use the inverter inner temperature value of the sensor in + degree celcius. All options from :ref:`Sensor `. +- **inverter_bus_voltage** (*Optional*): Use the inverter bus voltage value of the sensor in volts. + All options from :ref:`Sensor `. +- **insulation_of_pv_n_to_ground** (*Optional*): Use the insulation of photo voltiacs's + -ve terminal to ground value of the sensor in kilo ohms. All options from :ref:`Sensor `. +- **gfci_value** (*Optional*): Use the GFCI value of the sensor. + All options from :ref:`Sensor `. +- **dci_of_r** (*Optional*): Use the DCI of R value of the sensor. + All options from :ref:`Sensor `. +- **dci_of_s** (*Optional*): Use the DCI of S value of the sensor. + All options from :ref:`Sensor `. +- **dci_of_t** (*Optional*): Use the DCI of T value of the sensor. + All options from :ref:`Sensor `. +- **update_interval** (*Optional*, :ref:`config-time`): The interval to check the + sensor. Defaults to ``60s``. +- **address** (*Optional*, int): The address of the sensor if multiple sensors are attached to + the same UART bus. You will need to set the address of each device manually. Defaults to ``1``. + +See Also +-------- + +- :ref:`sensor-filters` +- :ghedit:`Edit` diff --git a/components/sensor/images/havellsgti5000d.jpg b/components/sensor/images/havellsgti5000d.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ed2a9f702b84c4e2fae6543facb95e7fdb2adec8 GIT binary patch literal 25912 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 literal 0 HcmV?d00001 diff --git a/images/havellsgti5000d_s.jpg b/images/havellsgti5000d_s.jpg new file mode 100644 index 0000000000000000000000000000000000000000..967ac55911440949d0fe72c2101e56380f1f5ea3 GIT binary patch literal 38760 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ЗY!WH;7AZ;iR^sMaDb3^K*dWSAMHjK`-pxQ< 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 literal 0 HcmV?d00001 diff --git a/index.rst b/index.rst index 966c2614a..4ef1d9951 100644 --- a/index.rst +++ b/index.rst @@ -169,6 +169,7 @@ Sensor Components Duty Cycle, components/sensor/duty_cycle, percent.svg ESP32 Hall Sensor, components/sensor/esp32_hall, magnet.svg EZO sensor circuits, components/sensor/ezo, ezo-ph-circuit.png + Havells Inverter, components/sensor/havells_inverter, havellsgti5000d_s.jpg HDC1080, components/sensor/hdc1080, hdc1080.jpg HLW8012, components/sensor/hlw8012, hlw8012.svg HMC5883L, components/sensor/hmc5883l, hmc5883l.jpg From 5bbd3195284b0a57b075ec43b42237e3cc11880e Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 15 Jul 2021 07:45:05 +1200 Subject: [PATCH 17/43] Bump version to v1.20.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 388b0496f..8b953976f 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 = 1.20.0-dev +PROJECT_NUMBER = 1.20.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 52927d8d3..e3415f21f 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ ESPHOME_PATH = ../esphome -ESPHOME_REF = dev +ESPHOME_REF = v1.20.0b1 .PHONY: html html-strict cleanhtml deploy help webserver Makefile netlify netlify-api api netlify-dependencies svg2png copy-svg2png diff --git a/_static/version b/_static/version index 734375f89..a7f7583ca 100644 --- a/_static/version +++ b/_static/version @@ -1 +1 @@ -1.20.0-dev +1.20.0b1 \ No newline at end of file diff --git a/conf.py b/conf.py index 550f1f538..65ed66fda 100644 --- a/conf.py +++ b/conf.py @@ -69,7 +69,7 @@ author = "Otto Winter" # The short X.Y version. version = "1.20" # The full version, including alpha/beta/rc tags. -release = "1.20.0-dev" +release = "1.20.0b1" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 183b8cd19df8294f72214511b09738a1deb4fe29 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 15 Jul 2021 08:03:07 +1200 Subject: [PATCH 18/43] Update changelog for 1.20.0b1 --- _static/changelog-1.20.0.png | Bin 0 -> 35238 bytes changelog/index.rst | 2 +- changelog/v1.20.0.rst | 152 +++++++++++++++++++++++++++++++++++ 3 files changed, 153 insertions(+), 1 deletion(-) create mode 100644 _static/changelog-1.20.0.png create mode 100644 changelog/v1.20.0.rst diff --git a/_static/changelog-1.20.0.png b/_static/changelog-1.20.0.png new file mode 100644 index 0000000000000000000000000000000000000000..ee53c7d11725607d96ac799f490fcc39b92c0e71 GIT binary patch literal 35238 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 literal 0 HcmV?d00001 diff --git a/changelog/index.rst b/changelog/index.rst index e22bbbd61..46162d129 100644 --- a/changelog/index.rst +++ b/changelog/index.rst @@ -2,7 +2,7 @@ Changelog ========= .. redirect:: - :url: /changelog/v1.19.0.html + :url: /changelog/v1.20.0.html .. toctree:: :glob: diff --git a/changelog/v1.20.0.rst b/changelog/v1.20.0.rst new file mode 100644 index 000000000..66d2c83da --- /dev/null +++ b/changelog/v1.20.0.rst @@ -0,0 +1,152 @@ +Changelog - Version 1.20.0 - 14th July 2021 +=========================================== + +.. seo:: + :description: Changelog for ESPHome version 1.20.0. + :image: /_static/changelog-1.20.0.png + :author: ESPHome + :author_twitter: @esphome_ + +.. imgtable:: + :columns: 2 + + Number Core, components/number/index, folder-open.svg + Template Number, components/number/template, description.svg + Havells Inverter, components/sensor/havells_inverter, havellsgti5000d_s.jpg + Anova Cooker, components/climate/anova, anova.png + +Write some more notes here.... + +Number Entities +--------------- + +Creating ``number`` entities in Home Assistant from ESPHome is now supported. This basically replaces +creating an ``input_number`` and then importing that sensor into ESPHome as a sensor with +``platform: homeassistant``. The state of the number can also be updated directly on the ESPHome device +and will be reflected in Home Assistant. + +I would like to see what other platforms people can come up with for the number component, +I have a few ideas myself. + + +Light Changes +------------- + +Unfortunately, some breaking changes had to be made: + +- For addressable RGBW lights, the brightness now also applies to the white channel (this was already the case for + non-addressable RGBW lights). If you want to control only the brightness of the color channel, use the new ``color_brightness`` option. +- For RGBW lights, the white channel is no longer normalized by the color intensity in the ``light.turn_on`` and + ``light.control`` actions. In previous versions, if the red value was set to 60% and the white value to 30%, this + would result in the white channel being at 50% brightness. Starting with this version, this will result in the + white channel being set to 30%, as expected. + +Full list of changes +-------------------- + +New Features +^^^^^^^^^^^^ + +- Allow WiFi AP to use device name :esphomepr:`1990` by :ghuser:`jesserockz` (new-feature) +- Add Number entities (from Home Assistant) :esphomepr:`1971` by :ghuser:`jesserockz` (new-feature) (new-integration) (notable-change) + +New Integrations +^^^^^^^^^^^^^^^^ + +- Climate component for Ballu air conditioners with remote model YKR-K/002E :esphomepr:`1939` by :ghuser:`bazuchan` (new-integration) +- Anova ble component :esphomepr:`1752` by :ghuser:`buxtronix` (new-integration) +- Add Number entities (from Home Assistant) :esphomepr:`1971` by :ghuser:`jesserockz` (new-feature) (new-integration) (notable-change) +- Added support for havells_solar sensor :esphomepr:`1988` by :ghuser:`sourabhjaiswal` (new-integration) + +Breaking Changes +^^^^^^^^^^^^^^^^ + +- remote_receiver use config parent receiver for registering dumpers :esphomepr:`1980` by :ghuser:`jesserockz` (breaking-change) +- Change color model to fix white channel issues :esphomepr:`1895` by :ghuser:`oxan` (breaking-change) +- Remove a whole bunch of deprecated/removed stuff :esphomepr:`1981` by :ghuser:`jesserockz` (breaking-change) +- catch 0.0 in float set_level pre-adjustment :esphomepr:`2013` by :ghuser:`WeekendWarrior1` (breaking-change) + +Notable Changes +^^^^^^^^^^^^^^^ + +- Add Number entities (from Home Assistant) :esphomepr:`1971` by :ghuser:`jesserockz` (new-feature) (new-integration) (notable-change) + +All changes +^^^^^^^^^^^ + +- Update ambiguous command :esphomepr:`1889` by :ghuser:`jesserockz` +- Configure clang-format for consistent pointer alignment :esphomepr:`1890` by :ghuser:`OttoWinter` +- Activate some clang-tidy checks :esphomepr:`1884` by :ghuser:`OttoWinter` +- Avoid non-const globals and enable clang-tidy check :esphomepr:`1892` by :ghuser:`agners` +- Convert st7735.cpp to use Unix line separators :esphomepr:`1894` by :ghuser:`oxan` +- Split files in light component :esphomepr:`1893` by :ghuser:`oxan` +- Fix CI by avoiding non-const global :esphomepr:`1907` by :ghuser:`oxan` +- Adds support cpp to vscode :esphomepr:`1828` by :ghuser:`dentra` +- Support ESP8266 Arduino 3.0.0 :esphomepr:`1897` by :ghuser:`agners` +- Run script/setup in devcontainer instead of pip install :esphomepr:`1913` by :ghuser:`OttoWinter` +- Fix typo in test3.yaml :esphomepr:`1928` by :ghuser:`loongyh` +- Fix error print in script/helpers.py :esphomepr:`1935` by :ghuser:`agners` +- Add variable bit width for Samsung protocol :esphomepr:`1927` by :ghuser:`kbx81` +- Add data sizes to log message :esphomepr:`1938` by :ghuser:`jesserockz` +- Update generation script to add const :esphomepr:`1945` by :ghuser:`jesserockz` +- Bump dashboard to 20210621.0 :esphomepr:`1946` by :ghuser:`balloob` +- Improve DHT read timings :esphomepr:`1901` by :ghuser:`agners` +- More VSCode devcontainer improvements :esphomepr:`1934` by :ghuser:`agners` +- Validate color temperature values for RGBWW/CWWW lights :esphomepr:`1957` by :ghuser:`oxan` +- Fix on_multi_click min_length :esphomepr:`1960` by :ghuser:`jesserockz` +- Climate component for Ballu air conditioners with remote model YKR-K/002E :esphomepr:`1939` by :ghuser:`bazuchan` (new-integration) +- Simplify initializing glyph_data :esphomepr:`1970` by :ghuser:`gladhorn` +- Add device_class support for MQTT integration :esphomepr:`1832` by :ghuser:`definitio` +- Rename master branch to release :esphomepr:`1976` by :ghuser:`OttoWinter` +- Fix tuya fan speed send :esphomepr:`1978` by :ghuser:`trvrnrth` +- Time Based Cover: Fixed apparent race condition on ESP32 chips :esphomepr:`1984` by :ghuser:`pdoidge` +- Fix invalid escape sequences in regex (fix pytest warning) :esphomepr:`1814` by :ghuser:`oxan` +- Bump hypothesis from 5.21.0 to 5.49.0 :esphomepr:`1753` by :ghuser:`mweinelt` +- Bump pytest-mock from 3.5.1 to 3.6.1 :esphomepr:`1754` by :ghuser:`dependabot[bot]` +- hlw8012: fix constants for BL0937 :esphomepr:`1973` by :ghuser:`ianchi` +- Anova ble component :esphomepr:`1752` by :ghuser:`buxtronix` (new-integration) +- Add stepper.set_acceleration and stepper.set_deceleration to stepper component :esphomepr:`1977` by :ghuser:`WeekendWarrior1` +- remote_receiver use config parent receiver for registering dumpers :esphomepr:`1980` by :ghuser:`jesserockz` (breaking-change) +- Don't try compat parsing for "esphome version" :esphomepr:`1966` by :ghuser:`oxan` +- Change color model to fix white channel issues :esphomepr:`1895` by :ghuser:`oxan` (breaking-change) +- Allow WiFi AP to use device name :esphomepr:`1990` by :ghuser:`jesserockz` (new-feature) +- Support custom fan modes in mqtt_climate :esphomepr:`1989` by :ghuser:`mgorven` +- Bump protobuf from 3.17.0 to 3.17.3 :esphomepr:`1986` by :ghuser:`dependabot[bot]` +- Bump pytest-cov from 2.11.1 to 2.12.1 :esphomepr:`1855` by :ghuser:`dependabot[bot]` +- Bump pytest-asyncio from 0.14.0 to 0.15.1 :esphomepr:`1793` by :ghuser:`dependabot[bot]` +- Improve climate mode code docs :esphomepr:`1995` by :ghuser:`OttoWinter` +- Climate modes COOL and HEAT are auto modes :esphomepr:`1994` by :ghuser:`carstenschroeder` +- Add state callback to ota component :esphomepr:`1816` by :ghuser:`mmakaay` +- Fix deprecation message for old climate swing mode methods :esphomepr:`2003` by :ghuser:`oxan` +- Add Number entities (from Home Assistant) :esphomepr:`1971` by :ghuser:`jesserockz` (new-feature) (new-integration) (notable-change) +- Fixed lolin32 lite key :esphomepr:`2001` by :ghuser:`monkeyclass` +- Add support for IBS-TH1 External Sensor :esphomepr:`1983` by :ghuser:`MikkoTervala` +- Bang bang climate new mode meanings :esphomepr:`1996` by :ghuser:`OttoWinter` +- Sgp30 sensor improvements :esphomepr:`1510` by :ghuser:`huubeikens` +- Color brightness fixes :esphomepr:`2008` by :ghuser:`oxan` +- Bump black from 21.5b1 to 21.6b0 :esphomepr:`2011` by :ghuser:`dependabot[bot]` +- Added support for havells_solar sensor :esphomepr:`1988` by :ghuser:`sourabhjaiswal` (new-integration) +- Remove a whole bunch of deprecated/removed stuff :esphomepr:`1981` by :ghuser:`jesserockz` (breaking-change) +- catch 0.0 in float set_level pre-adjustment :esphomepr:`2013` by :ghuser:`WeekendWarrior1` (breaking-change) +- Introduce clamp as a template function :esphomepr:`1953` by :ghuser:`agners` +- [Teleinfo] do not stop parsing frame if there is only a CRC error on … :esphomepr:`1999` by :ghuser:`St4n` + +Past Changelogs +--------------- + +.. toctree:: + :maxdepth: 1 + + 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 From a2d950047e487346775803a678f864dd7000c594 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 15 Jul 2021 08:03:26 +1200 Subject: [PATCH 19/43] Update supporters for 1.20.0b1 --- guides/supporters.rst | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/guides/supporters.rst b/guides/supporters.rst index c90dee740..d6ec7583c 100644 --- a/guides/supporters.rst +++ b/guides/supporters.rst @@ -70,6 +70,7 @@ Contributors - `Paulus Schoutsen (@balloob) `__ - `Andrew Zaborowski (@balrog-kun) `__ - `Rutger Nijhuis (@BananaPukeh) `__ +- `bazuchan (@bazuchan) `__ - `J. Nick Koston (@bdraco) `__ - `Ben Suffolk (@bensuffolk) `__ - `Bierchermuesli (@Bierchermuesli) `__ @@ -89,6 +90,7 @@ Contributors - `bwente (@bwente) `__ - `Carlos Gustavo Sarmiento (@carlos-sarmiento) `__ - `Carlos Garcia Saura (@CarlosGS) `__ +- `carstenschroeder (@carstenschroeder) `__ - `cbialobos (@cbialobos) `__ - `Ciprian Constantinescu (@cciprian5) `__ - `Marco (@cdrfun) `__ @@ -127,6 +129,7 @@ Contributors - `dckiller51 (@dckiller51) `__ - `Debashish Sahu (@debsahu) `__ - `declanshanaghy (@declanshanaghy) `__ +- `definitio (@definitio) `__ - `deftdawg (@deftdawg) `__ - `Christiaan Blom (@Deinara) `__ - `Rsan (@deltazerorsan) `__ @@ -223,6 +226,7 @@ Contributors - `Guyohms (@Guyohms) `__ - `h0-- (@h0--) `__ - `haade (@haade-administrator) `__ +- `Peter van Dijk (@Habbie) `__ - `Boris Hajduk (@hajdbo) `__ - `Gavin Mogan (@halkeye) `__ - `Charles Thompson (@haryadoon) `__ @@ -232,6 +236,7 @@ Contributors - `HepoH3 (@HepoH3) `__ - `Hamish Moffatt (@hmoffatt) `__ - `MoA (@honomoa) `__ +- `Huub Eikens (@huubeikens) `__ - `Petr Urbánek (@HyperReap) `__ - `Adrián Panella (@ianchi) `__ - `Ian Leeder (@ianleeder) `__ @@ -292,6 +297,7 @@ Contributors - `Klarstein (@Klarstein) `__ - `klenaers (@klenaers) `__ - `Kevin Lewis (@kll) `__ +- `Koen Vervloesem (@koenvervloesem) `__ - `korellas (@korellas) `__ - `Kevin Pelzel (@kpelzel) `__ - `Karl Q. (@kquinsland) `__ @@ -330,6 +336,7 @@ Contributors - `Major Péter (@majorpeter) `__ - `Manuel Díez (@manutenfruits) `__ - `Marcel van der Veldt (@marcelveldt) `__ +- `Marc (@MarcHagen) `__ - `Marc Teale (@marcteale) `__ - `marecabo (@marecabo) `__ - `Marvin Gaube (@margau) `__ @@ -351,9 +358,11 @@ Contributors - `MeIchthys (@meichthys) `__ - `meijerwynand (@meijerwynand) `__ - `Marco (@Melkor82) `__ +- `Michael Gorven (@mgorven) `__ - `mhentschke (@mhentschke) `__ - `micw (@micw) `__ - `Pauline Middelink (@middelink) `__ +- `Mikko Tervala (@MikkoTervala) `__ - `mikosoft83 (@mikosoft83) `__ - `Minideezel (@minideezel) `__ - `mipa87 (@mipa87) `__ @@ -367,6 +376,7 @@ Contributors - `mnaz (@mnaz) `__ - `Michael Nieß (@mniess) `__ - `Matt N. (@mnoorenberghe) `__ +- `monkeyclass (@monkeyclass) `__ - `Moritz Glöckl (@moritzgloeckl) `__ - `Matthew Pettitt (@mpettitt) `__ - `Ryan Matthews (@mrrsm) `__ @@ -374,6 +384,7 @@ Contributors - `mtl010957 (@mtl010957) `__ - `Murilo (@murilobaliego) `__ - `Michiel van Turnhout (@mvturnho) `__ +- `Martin Weinelt (@mweinelt) `__ - `Mynasru (@Mynasru) `__ - `Niels Ulrik Andersen (@myplacedk) `__ - `Kevin Uhlir (@n0bel) `__ @@ -414,6 +425,7 @@ Contributors - `Paul Deen (@PaulAntonDeen) `__ - `Paul Nicholls (@pauln) `__ - `Bartłomiej Biernacki (@pax0r) `__ +- `Paul Doidge (@pdoidge) `__ - `peq123 (@peq123) `__ - `per1234 (@per1234) `__ - `perjury (@perjury) `__ @@ -433,6 +445,7 @@ Contributors - `Peter Tatrai (@ptatrai) `__ - `Leandro Puerari (@puerari) `__ - `puuu (@puuu) `__ +- `Karol Zlot (@qqgg231) `__ - `Tommy Jonsson (@quazzie) `__ - `Quinn Hosler (@quinnhosler) `__ - `r-jordan (@r-jordan) `__ @@ -493,6 +506,7 @@ Contributors - `Stephen Tierney (@sjtrny) `__ - `Niklas Wagner (@Skaronator) `__ - `Luca Zimmermann (@soundstorm) `__ +- `Sourabh Jaiswal (@sourabhjaiswal) `__ - `Philip Allgaier (@spacegaier) `__ - `spattinson (@spattinson) `__ - `spilin (@spilin) `__ @@ -501,6 +515,7 @@ Contributors - `sredfern (@sredfern) `__ - `srg74 (@srg74) `__ - `Samuel Sieb (@ssieb) `__ +- `St4n (@St4n) `__ - `starwolf73 (@starwolf73) `__ - `Steve Baxter (@stevebaxter) `__ - `stubs12 (@stubs12) `__ @@ -592,4 +607,4 @@ Contributors - `San (@zhujunsan) `__ - `Christian Zufferey (@zuzu59) `__ -*This page was last updated June 24, 2021.* +*This page was last updated July 15, 2021.* From ad27ba42e813dc6dcbc84842304fe02052cd3a09 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 15 Jul 2021 08:04:01 +1200 Subject: [PATCH 20/43] Fix date --- changelog/v1.20.0.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog/v1.20.0.rst b/changelog/v1.20.0.rst index 66d2c83da..7151592dc 100644 --- a/changelog/v1.20.0.rst +++ b/changelog/v1.20.0.rst @@ -1,4 +1,4 @@ -Changelog - Version 1.20.0 - 14th July 2021 +Changelog - Version 1.20.0 - 21th July 2021 =========================================== .. seo:: From 48f1dafe88dcc1fe59532fd318147f4f17b442df Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 15 Jul 2021 08:14:27 +1200 Subject: [PATCH 21/43] Fix date (again) --- changelog/v1.20.0.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog/v1.20.0.rst b/changelog/v1.20.0.rst index 7151592dc..5d2c3ee2c 100644 --- a/changelog/v1.20.0.rst +++ b/changelog/v1.20.0.rst @@ -1,4 +1,4 @@ -Changelog - Version 1.20.0 - 21th July 2021 +Changelog - Version 1.20.0 - 21st July 2021 =========================================== .. seo:: From e015aca5cad20186b06ee97f2f30aae6c2550094 Mon Sep 17 00:00:00 2001 From: SenexCrenshaw <35600301+SenexCrenshaw@users.noreply.github.com> Date: Wed, 14 Jul 2021 20:51:30 -0400 Subject: [PATCH 22/43] Nextion update (#934) Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Co-authored-by: Samuel Sieb --- components/binary_sensor/nextion.rst | 159 +++++++++++++++++++-- components/display/nextion.rst | 197 +++++++++++++++++++++++++-- components/sensor/images/nextion.jpg | Bin 0 -> 6221 bytes components/sensor/nextion.rst | 178 ++++++++++++++++++++++++ components/switch/nextion.rst | 143 +++++++++++++++++++ components/text_sensor/nextion.rst | 138 +++++++++++++++++++ index.rst | 6 +- 7 files changed, 798 insertions(+), 23 deletions(-) create mode 100644 components/sensor/images/nextion.jpg create mode 100644 components/sensor/nextion.rst create mode 100644 components/switch/nextion.rst create mode 100644 components/text_sensor/nextion.rst diff --git a/components/binary_sensor/nextion.rst b/components/binary_sensor/nextion.rst index 08be47c00..b7d978b7f 100644 --- a/components/binary_sensor/nextion.rst +++ b/components/binary_sensor/nextion.rst @@ -1,13 +1,14 @@ -Nextion Touch Component -======================= +.. _nextion_binary_sensor: + +Nextion Binary Sensor Component +=============================== .. seo:: - :description: Instructions for setting up Nextion touch binary sensors. + :description: Instructions for setting up Nextion binary sensor. :image: nextion.jpg -The ``nextion`` binary sensor platform lets you track when a component on the display is -touched or not. The binary sensor will turn on when the component with the given component and page id is -pressed on, and will turn off as soon as the finger is released. +The ``nextion`` binary sensor platform supports the many switched components in the Nextion as well as integer variables (>0 == True). It can be a component or variable in the Nextion display. +It is best to set the components vscope to global in the Nextion Editor. This way the component will be available if the page is shown or not. See :doc:`/components/display/nextion` for setting up the display @@ -16,27 +17,159 @@ See :doc:`/components/display/nextion` for setting up the display # Example configuration entry display: - platform: nextion + id: nextion1 # ... binary_sensor: - platform: nextion page_id: 0 - component_id: 2 - name: "Nextion Component 2 Touch" + component_id: 8 + component_name: page0.mode # Only needed to support changing colors + id: mode + - platform: nextion + id: r0_binary_sensor + name: "Radio 0 Binary Sensor" + component_name: page0.r0 # r0 is a global component in the Nextion Editor on page 0 + update_interval: 4s + - platform: nextion + id: darkmode + name: "Is Darkmode Set" + variable_name: darkmode Configuration variables: ------------------------ -- **name** (**Required**, string): The name of the binary sensor. -- **page_id** (**Required**, int): The ID of the page the component is on. Use ``0`` for the default page. -- **component_id** (**Required**, int): The ID (the number, not name!) of the component to track. -- **nextion_id** (*Optional*, :ref:`config-id`): Manually specify the ID of the Nextion display. +- **name** (**Required**, string): The name of the sensor. +- **nextion_id** (*Optional*, :ref:`config-id`): The ID of the Nextion display. +- **component_name** (*Optional*, string): The name of the Nextion component. +- **variable_name** (*Optional*, string): The name of the Nextion variable. Any value over ``0`` is considered to be **on** +- **page_id** (*Optional*, string): The ID of the page the component is on. Use ``0`` for the default page. +- **component_id** (*Optional*, string): The ID (the number, not name!) of the component to track. +- **update_interval** (*Optional*, :ref:`config-time`): The duration to update the sensor. If using a :ref:`nextion_custom_binary_sensor_protocol` this should not be used +- **background_color** (*Optional*, :ref:`config-color`): The background color +- **background_pressed_color** (*Optional*, :ref:`config-color`): The background color when pressed +- **foreground_color** (*Optional*, :ref:`config-color`): The foreground color +- **foreground_pressed_color** (*Optional*, :ref:`config-color`): The foreground color when pressed +- **visible** (*Optional*, boolean ): Visible or not - All other options from :ref:`Binary Sensor `. +**Touch Sensor:** +The Nextion will send a **page_id** and **component_id** when the *Send Component ID* check box is selected for the component. To enable +this native event **page_id** and **component_id** are required. No :ref:`nextion_custom_binary_sensor_protocol` is required. If **page_id** and **component_id** are set then the component will only react to touch events from the Nextion. Setting **component_name** will allow setting options like forground color. + + .. note:: + + ``background_color(s)`` , ``foreground_color(s)`` and ``visible`` do not retain their state on page change. :ref:`Binary Sensor Settings `. + A :ref:`Nextion Sensor ` with a custom protocol sending the current page can be used to execute the API call :ref:`Update Components By Prefix ` to update all the components for that page + + +Example: + +.. code-block:: yaml + + - platform: nextion + id: current_page + nextion_id: nextion1 + name: current_page + variable_name: current_page + on_value: + lambda: |- + id(nextion1).update_components_by_page_prefix("page"+x+"."); + + + +See :ref:`nextion_binary_sensor_how_things_update` for additional information + +Globals +******* +The Nextion does not retain data on Nextion page changes. Additionally if a page is changed and the **nextion_component_name** does not exist on that page then +nothing will be updated. To get around this the Nextion components can be changed to have a vscope of ``global``. If this is set then the **nextion_component_name** +should be prefixed with the page name (page0/page1). + +*Example* + +``nextion_component_name: page0.r0`` + +.. _nextion_binary_sensor_lambda_calls: + +Lambda Calls +************ + +From :ref:`lambdas `, you can call several methods to access some +more advanced functions (see the full :apiref:`nextion/binary_sensor/nextion_binarysensor.h` for more info). + +.. _nextion_binary_sensor_set_state: + +- ``set_state(bool value, bool publish, bool send_to_nextion)``: Set the state to **value**. Publish the new state to HASS. Send_to_Nextion is to publish the state to the Nextion. + +.. _nextion_binary_sensor_update: + +- ``update()``: Poll from the Nextion + +.. _nextion_binary_sensor_settings: + +- ``set_background_color(Color color)``: Sets the background color to **Color** +- ``set_background_pressed_color(Color color)``: Sets the background color to **Color** +- ``set_foreground_color(Color color)``: Sets the background color to **Color** +- ``set_foreground_pressed_color(Color color)``: Sets the background color to **Color** +- ``set_visible(bool visible)`` : Sets visible or not. If set to false, no updates will be sent to the component + + +.. _nextion_binary_sensor_how_things_update: + +How things Update +----------------- +A Nextion component with an integer value (.val) or Nextion variable will be automatically polled if **update_interval** is set. +To have the Nextion send the data you can use the :ref:`nextion_custom_binary_sensor_protocol` for this. Add the :ref:`nextion_custom_binary_sensor_protocol` to the +component or function you want to trigger the send. Typically this is in *Touch Press Event* but some components, like a slider, should have it +set in the *Touch Release Event* to capture all the changes. Since this is a custom protocol it can be sent from anywhere (timers/functions/componenets) +in the Nextion. + +.. note:: + + There is no need to check the *Send Component ID* for the *Touch Press Event* or *Touch Release Event* + for an integer value component since this will be sending the real value to esphome, + but make sure you have both checked for a touch sensor. + + +Using the above yaml example: + - "mode" is a touch sensor and will trigger when a user presess the component with ID ``8`` in page ``0`` + - "Radio 0 Binary Sensor" will poll the Nextion for the ``r0.val`` value and set the state accordingly. + - "Is Darkmode Set" will NOT poll the Nextion. Either the Nextion will need to use the :ref:`nextion_custom_binary_sensor_protocol` or use a lambda: + + - :ref:`Lambda Calls `. + +.. note:: + + No updates will be sent to the Nextion if it is sleeping. Once it wakes the components will be updated. If a component is invisible , :code:`visible(false)` , then it wont update until it is set to be visible. + +.. _nextion_custom_binary_sensor_protocol: + +Nextion Custom Binary Sensor Protocol +------------------------------------- +All lines are required + +.. code-block:: c++ + + printh 93 + prints "r0",0 + printh 00 + prints r0.val,0 + printh FF FF FF + +*Explanation* + +- ``printh 93`` Tells the library this is a binary sensor bool/integer data +- ``prints "r0",0`` Sends the name that matches **nextion_component_name** or **nextion_variable_name** +- ``printh 00`` Sends a NULL +- ``prints r0.val,0`` The actual value to send. For a variable use the Nextion variable name ``r0`` with out ``.val`` +- ``printh FF FF FF`` Nextion command ack + + See Also -------- - :doc:`/components/display/nextion` - :doc:`index` -- :apiref:`nextion/nextion.h` +- :apiref:`nextion/binary_sensor/nextion_binarysensor.h` - :ghedit:`Edit` diff --git a/components/display/nextion.rst b/components/display/nextion.rst index 3e5590914..43459b5fb 100644 --- a/components/display/nextion.rst +++ b/components/display/nextion.rst @@ -17,19 +17,36 @@ with ESPHome. As the communication with the Nextion LCD display is done using UART, you need to have an :ref:`UART bus ` in your configuration with ``rx_pin`` both the ``tx_pin`` set to the respective pins on the display. -Additionally, you need to set the baud rate to 9600. +The Nextion uses a baud rate of 9600 by default. It may be configured to use a faster speed by adding (for +example) + +.. code-block:: c++ + + baud=115200 // Sets the baud rate to 115200 + bkcmd=0 // Tells the Nextion to not send responses on commands. This is the current default but can be set just in case + + + +to the ``program.s`` source file (in the Nextion Editor) before the ``page`` line. +This permits faster communication with the Nextion display and it is highly recommended when using :ref:`uart-hardware_uarts`. Without a hardware uart make sure to set the baud rate to 9600. + + +The below example configures a UART for the Nextion display to use .. code-block:: yaml # Example configuration entry uart: - rx_pin: D0 - tx_pin: D1 - baud_rate: 9600 + id: uart_2 + rx_pin: GPIO16 + tx_pin: GPIO17 + baud_rate: 115200 display: - platform: nextion + id: nextion1 + uart_id: uart_2 lambda: |- it.set_component_value("gauge", 50); it.set_component_text("textview", "Hello World!"); @@ -41,10 +58,17 @@ Configuration variables: Use this if you want to use multiple UART buses at once. - **brightness** (*Optional*, percentage): Set display brightness in %. Defaults to ``100%`` - **lambda** (*Optional*, :ref:`lambda `): The lambda to use for rendering the content on the nextion display. - See :ref:`display-nextion_lambda` for more information. + See :ref:`display-nextion_lambda` for more information. This is typically empty. The individual components for the Nextion will handle almost all features needed for updating - **update_interval** (*Optional*, :ref:`config-time`): The interval to call the lambda to update the display. Defaults to ``5s``. - **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation. +- **tft_url** (*Optional*, string): The URL to download the TFT file from for updates. See :ref:`Nextion Upload `. +- **on_sleep** (*Optional*, :ref:`Action `): An automation to perform when the Nextion goes to sleep. +- **on_wake** (*Optional*, :ref:`Action `): An automation to perform when the Nextion wakes up. +- **touch_sleep_timeout** (*Optional*, int): Sets internal No-touch-then-sleep timer in seconds. +- **wake_up_page** (*Optional*, int): Sets the page to display after waking up +- **auto_wake_on_touch** (*Optional*, boolean): Sets if Nextion should auto-wake from sleep when touch press occurs. + .. _display-nextion_lambda: @@ -54,9 +78,9 @@ Rendering Lambda With Nextion displays, a dedicated chip on the display itself does the whole rendering. ESPHome can only send *instructions* to the display to tell it *how* to render something and *what* to render. -First, you need to use the `Nextion Editor `__ to -create a display file and insert it using the SD card slot. Then, in the rendering ``lambda``, you have 3 main methods -you can call to populate data on the display: +First, you need to use the `Nextion Editor `__ to +create a display file and insert it using the SD card slot. Then, in the rendering ``lambda``, you can use the various API calls +to populate data on the display: .. code-block:: yaml @@ -74,16 +98,171 @@ you can call to populate data on the display: // set the text of a component with formatting it.set_component_text_printf("textview", "The uptime is: %.1f", id(uptime_sensor).state); +.. note:: + + Although you can use the rendering lambda most, if not all, updates to the Nextion can be handled by the individual Nextion components. **See Below** Please see :ref:`display-printf` for a quick introduction into the ``printf`` formatting rules and :ref:`display-strftime` for an introduction into the ``strftime`` time formatting. +Lambda Calls +************ + +Several methods are available for use within :ref:`lambdas ` ; these permit advanced functionality beyond simple +display updates. See the full :apiref:`nextion/nextion.h` for more info. + +.. _nextion_upload_tft: + +- ``upload_tft``: Start the upload process. See :ref:`nextion_upload_tft_file` + +The developer tools in Home Assistant can be used to trigger the update. The below code block is an example on how to set this up. + .. code-block:: yaml + + api: + services: + - service: update_nextion + then: + - lambda: 'id(nextion1)->upload_tft();' + +.. _nextion_update_all_components: + +- ``update_all_components()``: All the components will publish their states. + + .. code-block:: c++ + + id(nextion1).update_all_components(); + +.. _update_components_by_prefix: + +- ``update_components_by_prefix(std::string page)``: This will send the current state of any **component_name** matching the prefix. Some settings like background color need to be resent on page change. This is a good hook for that. + + .. code-block:: c++ + + id(nextion1).update_components_by_prefix("page0."); + +.. _set_nextion_sensor_state: + +- ``set_nextion_sensor_state(NextionQueueType queue_type, std::string name, float state);`` : Sets the sensor state. See :ref:`Queue Types ` +- ``set_nextion_sensor_state(int queue_type, std::string name, float state);`` : Sets the sensor state. See :ref:`Queue Types ` + +- ``set_nextion_text_state(std::string name, std::string state);`` : Sets the text sensor state + +.. note:: + + Below is a method for HASS to send updates to the Nextion by code. + + .. code-block:: yaml + + # Enable Home Assistant API + api: + services: + - service: set_nextion_sensor + variables: + nextion_type: int + name: string + state: float + then: + - lambda: |- + id(nextion1).set_nextion_sensor_state(nextion_type,name,state); + - service: set_nextion_text + variables: + name: string + state: string + then: + - lambda: |- + id(nextion1).set_nextion_text_state(name,state); + +.. _nextion_queue_types: + + Queue Types: + - SENSOR 0 + - BINARY_SENSOR 1 + - SWITCH 2 + - TEXT_SENSOR 3 + - WAVEFORM_SENSOR 4 + - NO_RESULT 5 + +.. _nextion_upload_tft_file: + +Uploading A TFT File +-------------------- +This will download the file from the tft_url and will transfer it over the UART to the Nextion. +Once completed both the ESP and Nextion will reboot. During the upload process esphome will be +unresponsive and no logging will take place. This uses the same protocol as the Nextion editor and +only updates the changes of the TFT file. If HTTPS/SSL is enabled it will be about 1kB/sec. + +.. warning:: + + If :ref:`uart-hardware_uarts` are not available then inconsistent results WILL occur. Lowering the speed to 9600 baud may help. + + +To host the TFT file you can use Home Assistant itself or any other web server. HTTPS, while always recommended on any network, will greatly reduce the upload speed. + +Home Assistant +************** +To host the TFT file from Home Assistant, create a www directory if it doesn't exist in your config +directory. You can create a subdirectory for those files as well. + +For example if the file is located +under your configuration directory ``www/tft/default.tft`` the URL to access it will be +``http(s)://your_home_assistant_url:port/local/tft/default.tft`` + +NGINX +***** + +`NGINX `__ + +The below NGINX example configuration will serve files out of the /var/www/nextion directory. + +.. code-block:: nginx + + server { + listen 80; + access_log /var/log/nginx/nextion_access.log; + error_log /var/log/nginx/nextion_error.log; + root /var/www/nextion; + } + + + +Components +---------- +This library supports a few different components allowing communication back and forth from HA <-> MCU <-> Nextion. + +.. note:: + + If the Nextion is sleeping or if the component was set to be hidden, it will not update its components even if updates are sent. + After the Nextion wakes up, all components will send their states to the Nextion to get around this. + +With the exception of the :doc:`../binary_sensor/nextion` that has the ``page_id``/``component_id`` options configured, the example below illustrates: + - Polling the Nextion for updates + - Dynamic updates sent from the Nextion to the ESP device + + .. code-block:: yaml + + sensor: + - platform: nextion + nextion_id: nextion1 + name: "n0" + component_name: n0 + - platform: nextion + id: current_page + name: "current_page" + variable_name: dp + update_interval: 1s + + +Note that the first one requires a custom protocol to be included in the Nextion display's code/configuration. See the individual components for more detail. See Also -------- - :doc:`index` -- :doc:`/components/binary_sensor/nextion` +- :doc:`../binary_sensor/nextion` +- :doc:`../sensor/nextion` +- :doc:`../switch/nextion` +- :doc:`../text_sensor/nextion` +- :doc:`../uart` - :apiref:`nextion/nextion.h` - `Simple Nextion Library `__ by `Bentley Born `__ - `Official Nextion Library `__ by `iTead `__ diff --git a/components/sensor/images/nextion.jpg b/components/sensor/images/nextion.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0029825e8877aea3643ee25a523da253f6aa9a75 GIT binary patch literal 6221 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 B-Ut8y literal 0 HcmV?d00001 diff --git a/components/sensor/nextion.rst b/components/sensor/nextion.rst new file mode 100644 index 000000000..e936f9541 --- /dev/null +++ b/components/sensor/nextion.rst @@ -0,0 +1,178 @@ +.. _nextion_sensor: + +Nextion Sensor Component +======================== + +.. seo:: + :description: Instructions for setting up Nextion sensor. + :image: nextion.jpg + +The ``nextion`` sensor platform supports integers or floats (Xfloat). It can be a component, a variable or a waveform in the Nextion display. +It is best to set the component's vscope to global in the Nextion Editor. This way the component will be available +if the page is shown or not. + +.. note:: + + The Nextion can receive an integer but it can only send 3 bytes for a negative integer. The range if using the :ref:`nextion_custom_sensor_protocol` is: + -16777215 to 4294967295 + +See :doc:`/components/display/nextion` for setting up the display + +.. code-block:: yaml + + # Example configuration entry + display: + - platform: nextion + id: nextion1 + # ... + + sensor: + - platform: nextion + name: "Current Humidity" + component_name: humidity # pageX.humidity for a global + nextion_precision: 1 + update_interval: 4s + - platform: nextion + nextion_id: nextion1 + name: "Current Temperature" + variable_name: temperature + hass_component_name: sensor.temperature + - platform: nextion + id: s01 + component_id: 2 + wave_channel_id: 0 + wave_max_value: 100 + waveform_send_last_value: "true" + wave_max_length: 400 + update_interval: 1s + - platform: nextion + id: s02 + component_id: 2 + wave_channel_id: 1 + wave_max_value: 100 + update_interval: 1s + +Configuration variables: +------------------------ + +- **name** (**Required**, string): The name of the sensor. +- **nextion_id** (*Optional*, :ref:`config-id`): Manually specify the ID of the Nextion display. +- **component_name** (*Optional*, string): Manually specify the name of the Nextion component. +- **variable_name** (*Optional*, string): Manually specify the name of the Nextion variable. +- **update_interval** (*Optional*, :ref:`config-time`): The duration to update the sensor +- **nextion_precision** (*Optional*, uint8_t): This is for Nextion float components. This sets + the precision that the component is set to. This typically is the ``vvs1`` setting of the component. +- **background_color** (*Optional*, :ref:`config-color`): The background color +- **foreground_color** (*Optional*, :ref:`config-color`): The foreground color +- **visible** (*Optional*, boolean ): Visible or not + +Waveform Settings +***************** +- **wave_channel_id** (*Optional*, uint8_t): The waveform ID in a range of 0-3 +- **wave_max_value** (*Optional*, uint8_t): The max value. Set ``dis`` to the height of the component in the Nextion editor + and this to the max value that will be sent. This will set up the proper scaling. +- **waveform_send_last_value** (*Optional*, uint8_t): This will send the last value set during an update interval. Setting to true will give a timeseries style graph +- **wave_max_length** (*Optional*, int): How many data points to store. Typically this is the width of the component in the Nextion +- **update_interval** (*Optional*, :ref:`config-time`): The duration to update the sensor. This typically should be set for waveforms to send periodic updates. + +- All other options from :ref:`Sensor `. + +**Only one** *component_name* **or** *variable_name* **can be set** + + .. note:: + + ``background_color`` , ``foreground_color`` and ``visible`` do not retain their state on page change. :ref:`Sensor Settings`. + A :ref:`Nextion Sensor ` with a custom protocol sending the current page can be used to execute the API call :ref:`Update Components By Prefix ` to update all the components for that page + + +See :ref:`nextion_sensor_how_things_update` for additional information + +Globals +******* +The Nextion does not retain data on Nextion page changes. Additionally if a page is changed and the **component_name** does not exist on that page then +nothing will be updated. To get around this the Nextion components can be changed to have a vscope of ``global``. If this is set then the **component_name** +should be prefixed with the page name (page0/page1 or whatever you have changed it to). + +*Example* + +``component_name: page0.humidity`` + +.. _nextion_sensor_lambda_calls: + +Lambda Calls +************ + +From :ref:`lambdas `, you can call several methods to access +some more advanced functions (see the full :apiref:`nextion/sensor/nextion_sensor.h` for more info). + +.. _nextion_sensor_set_state: + +- ``set_state(bool value, bool publish, bool send_to_nextion)``: Set the state to **value**. Publish the new state to HASS. Send_to_Nextion is to publish the state to the Nextion. + +.. _nextion_sensor_update: + +- ``update()``: Poll from the Nextion + +.. _nextion_sensor_settings: + +- ``set_background_color(Color color)``: Sets the background color to **Color** +- ``set_foreground_color(Color color)``: Sets the background color to **Color** +- ``set_visible(bool visible)`` : Sets visible or not. If set to false, no updates will be sent to the component + + +.. _nextion_sensor_how_things_update: + +How things Update +----------------- +A Nextion component with an integer value (.val) or Nextion variable will be automatically polled if **update_interval** is set. +To have the Nextion send the data you can use the :ref:`nextion_custom_sensor_protocol` for this. Add the :ref:`nextion_custom_sensor_protocol` to the +component or function you want to trigger the send. Typically this is in *Touch Press Event* but some components, like a slider, should have it +set in the *Touch Release Event* to capture all the changes. Since this is a custom protocol it can be sent from anywhere (timers/functions/componenets) +in the Nextion. + +.. note:: + + There is no need to check the *Send Component ID* for the *Touch Press Event* or *Touch Release Event* + since this will be sending the real value to esphome. + +Using the above yaml example: + - "Current Humidity" will poll the Nextion for the ``humidity.val`` value and set the sensor accordingly. + - "Current Temperature" will NOT poll the Nextion. Either the Nextion will need to use the :ref:`nextion_custom_sensor_protocol` or use a lambda: + + - :ref:`Lambda Calls `. + +.. note:: + + No updates will be sent to the Nextion if it is sleeping. Once it wakes, the components will be updated. If a component is invisible, :code:`visible(false)`, then it won't update until it is set to be visible. + + +.. _nextion_custom_sensor_protocol: + +Nextion Custom Sensor Protocol +------------------------------ +All lines are required + +.. code-block:: c++ + + printh 91 + prints "temperature",0 + printh 00 + prints temperature.val,0 + printh FF FF FF + +*Explanation* + +- ``printh 91`` Tells the library this is a sensor (int) data +- ``prints "temperature",0`` Sends the name that matches **component_name** or **variable_name** +- ``printh 00`` Sends a NULL +- ``prints temperature.val,0`` The actual value to send. For a variable use the Nextion variable name ``temperature`` with out ``.val`` +- ``printh FF FF FF`` Nextion command ack + + +See Also +-------- + +- :doc:`/components/display/nextion` +- :doc:`index` +- :apiref:`nextion/sensor/nextion_sensor.h` +- :ghedit:`Edit` diff --git a/components/switch/nextion.rst b/components/switch/nextion.rst new file mode 100644 index 000000000..9801946e4 --- /dev/null +++ b/components/switch/nextion.rst @@ -0,0 +1,143 @@ +.. _nextion_switch: + +Nextion Switch Component +=============================== + +.. seo:: + :description: Instructions for setting up Nextion Switch. + :image: nextion.jpg + +The ``nextion`` switch platform supports the many switched components in the Nextion as well as integer variables. It can be a component or variable in the Nextion display. +It is best to set the components vscope to global in the Nextion Editor. This way the component will be available if the page is shown or not. + +See :doc:`/components/display/nextion` for setting up the display + +.. code-block:: yaml + + # Example configuration entry + display: + - platform: nextion + id: nextion1 + # ... + + switch: + - platform: nextion + id: r0_switch + name: "Radio 0 Switch" + component_name: r0 # pageX.r0 for a global + update_interval: 4s + - platform: nextion + id: darkmode + name: "Is Darkmode Set" + variable_name: darkmode + +Configuration variables: +------------------------ + +- **name** (**Required**, string): The name of the sensor. +- **nextion_id** (*Optional*, :ref:`config-id`): The ID of the Nextion display. +- **component_name** (*Optional*, string): The name of the Nextion component. +- **variable_name** (*Optional*, string): The name of the Nextion variable. Any value over ``0`` is considerd to be **on** +- **update_interval** (*Optional*, :ref:`config-time`): The duration to update the sensor. If using a :ref:`nextion_custom_switch_protocol` this should not be used +- **background_color** (*Optional*, :ref:`config-color`): The background color +- **background_pressed_color** (*Optional*, :ref:`config-color`): The background color when pressed +- **foreground_color** (*Optional*, :ref:`config-color`): The foreground color +- **foreground_pressed_color** (*Optional*, :ref:`config-color`): The foreground color when pressed +- **visible** (*Optional*, boolean ): Visible or not +- All other options from :ref:`Switch `. + +**Only one** *component_name* **or** *variable_name* **can be set** + +See :ref:`nextion_switch_how_things_update` for additional information + +Globals +******* +The Nextion does not retain data on Nextion page changes. Additionally, if a page is changed and the **component_name** does not exist on that page then +nothing will be updated. To get around this, the Nextion components can be changed to have a vscope of ``global``. If this is set then the **component_name** +should be prefixed with the page name (page0/page1 or whatever you have changed it to). + +*Example* + +``component_name: page0.r0`` + +.. _nextion_switch_lambda_calls: + +Lambda Calls +************ + +From :ref:`lambdas `, you can call several methods to access +some more advanced functions (see the full :apiref:`nextion/nextion_switch.h` for more info). + +.. _nextion_switch_set_state: + +- ``set_state(bool value, bool publish, bool send_to_nextion)``: Set the state to **value**. Publish the new state to HASS. Send_to_Nextion is to publish the state to the Nextion. + +.. _nextion_switch_update: + +- ``update()``: Poll from the Nextion + +.. _nextion_switch_settings: + +- ``set_background_color(Color color)``: Sets the background color to **Color** +- ``set_background_pressed_color(Color color)``: Sets the background color to **Color** +- ``set_foreground_color(Color color)``: Sets the background color to **Color** +- ``set_foreground_pressed_color(Color color)``: Sets the background color to **Color** +- ``set_visible(bool visible)`` : Sets visible or not. If set to false, no updates will be sent to the component + + +.. _nextion_switch_how_things_update: + +How things Update +----------------- +A Nextion component with an integer value (.val) or Nextion variable will be automatically polled if **update_interval** is set. +To have the Nextion send the data you can use the :ref:`nextion_custom_switch_protocol` for this. Add the :ref:`nextion_custom_switch_protocol` to the +component or function you want to trigger the send. Typically this is in *Touch Press Event* but some components, like a slider, should have it +set in the *Touch Release Event* to capture all the changes. Since this is a custom protocol it can be sent from anywhere (timers/functions/componenets) +in the Nextion. + +.. note:: + + There is no need to check the *Send Component ID* for the *Touch Press Event* or *Touch Release Event* + since this will be sending the real value to esphome. + +Using the above yaml example: + - "Radio 0 switch" will poll the Nextion for the ``r0.val`` value and set the state accordingly. + - "Is Darkmode Set" will NOT poll the Nextion. Either the Nextion will need to use the :ref:`nextion_custom_switch_protocol` or use a lambda: + + - :ref:`Lambda Calls `. + +.. note:: + + No updates will be sent to the Nextion if it is sleeping. Once it wakes, the components will be updated. If a component is invisible, :code:`visible(false)`, then it won't update until it is set to be visible. + + +.. _nextion_custom_switch_protocol: + +Nextion Custom Switch Protocol +------------------------------ +All lines are required + +.. code-block:: c++ + + printh 90 + prints "r0",0 + printh 00 + prints r0.val,0 + printh FF FF FF + +*Explanation* + +- ``printh 90`` Tells the library this is a switch bool/integer data +- ``prints "r0",0`` Sends the name that matches **component_name** or **variable_name** +- ``printh 00`` Sends a NULL +- ``prints r0.val,0`` The actual value to send. For a variable use the Nextion variable name ``r0`` with out ``.val`` +- ``printh FF FF FF`` Nextion command ack + + +See Also +-------- + +- :doc:`/components/display/nextion` +- :doc:`index` +- :apiref:`nextion/switch/nextion_switch.h` +- :ghedit:`Edit` diff --git a/components/text_sensor/nextion.rst b/components/text_sensor/nextion.rst new file mode 100644 index 000000000..d4891d7e2 --- /dev/null +++ b/components/text_sensor/nextion.rst @@ -0,0 +1,138 @@ +.. _nextion_text_sensor: + +Nextion Text Sensor Component +=============================== + +.. seo:: + :description: Instructions for setting up Nextion text sensor. + :image: nextion.jpg + +The ``nextion`` text sensor platform supports text strings. It can be a component or variable in the Nextion display. +It is best to set the components vscope to global in the Nextion Editor. This way the component will be available +if the page is shown or not. + +See :doc:`/components/display/nextion` for setting up the display + +.. code-block:: yaml + + # Example configuration entry + display: + - platform: nextion + id: nextion1 + # ... + + text_sensor: + - platform: nextion + nextion_id: nextion1 + name: text0 + id: text0 + update_interval: 4s + component_name: text0 + +Configuration variables: +------------------------ + +- **name** (**Required**, string): The name of the sensor. +- **nextion_id** (*Optional*, :ref:`config-id`): The ID of the Nextion display. +- **component_name** (*Optional*, string): The name of the Nextion component. +- **variable_name** (*Optional*, string): The name of the Nextion variable. Any value over ``0`` is considerd to be **on** +- **update_interval** (*Optional*, :ref:`config-time`): The duration to update the sensor. If using a :ref:`nextion_custom_text_sensor_protocol` this should not be used +- **background_color** (*Optional*, :ref:`config-color`): The background color +- **foreground_color** (*Optional*, :ref:`config-color`): The foreground color +- **font_id** (*Optional*, uint8_t): The font id for the component +- **visible** (*Optional*, boolean ): Visible or not +- All other options from :ref:`Text Sensor `. + +**Only one** *component_name* **or** *variable_name* **can be set** + +See :ref:`nextion_text_sensor_how_things_update` for additional information + +Globals +******* +The Nextion does not retain data on Nextion page changes. Additionally, if a page is changed and the **component_name** does not exist on that page then +nothing will be updated. To get around this, the Nextion components can be changed to have a vscope of ``global``. If this is set, then the **component_name** +should be prefixed with the page name (page0/page1 or whatever you have changed it to). + +*Example* + +``component_name: page0.text0`` + +.. _nextion_text_sensor_lambda_calls: + +Lambda Calls +************ + +From :ref:`lambdas `, you can call several methods to access +some more advanced functions (see the full :apiref:`nextion/text_sensor/nextion_textsensor.h` for more info). + +.. _nextion_text_sensor_set_state: + +- ``set_state(bool value, bool publish, bool send_to_nextion)``: Set the state to **value**. Publish the new state to HASS. Send_to_Nextion is to publish the state to the Nextion. + +.. _nextion_text_sensor_update: + +- ``update()``: Poll from the Nextion + +.. _nextion_text_sensor_settings: + +- ``set_background_color(Color color)``: Sets the background color to **Color** +- ``set_foreground_color(Color color)``: Sets the background color to **Color** +- ``set_visible(bool visible)`` : Sets visible or not. If set to false, no updates will be sent to the component + +.. _nextion_text_sensor_how_things_update: + +How things Update +----------------- +A Nextion component with an integer value (.val) or Nextion variable will be automatically polled if **update_interval** is set. +To have the Nextion send the data you can use the :ref:`nextion_custom_text_sensor_protocol` for this. Add the :ref:`nextion_custom_text_sensor_protocol` to the +component or function you want to trigger the send. Typically this is in *Touch Press Event* but some components, like a slider, should have it +set in the *Touch Release Event* to capture all the changes. Since this is a custom protocol it can be sent from anywhere (timers/functions/componenets) +in the Nextion. + +.. note:: + + There is no need to check the *Send Component ID* for the *Touch Press Event* or *Touch Release Event* + since this will be sending the real value to esphome. + +Using the above yaml example: + - "text0" will poll the Nextion for ``text0.txt`` value and set the state accordingly. + + - :ref:`Lambda Calls `. + +.. note:: + + No updates will be sent to the Nextion if it is sleeping. Once it wakes, the components will be updated. If a component is invisible, :code:`visible(false)`, then it won't update until it is set to be visible. + + +.. _nextion_custom_text_sensor_protocol: + +Nextion Custom Text Sensor Protocol +----------------------------------- +All lines are required + +.. code-block:: c++ + + printh 92 + prints "text0",0 + printh 00 + prints text0.txt,0 + printh 00 + printh FF FF FF + +*Explanation* + +- ``printh 92`` Tells the library this is text sensor +- ``prints "text0",0`` Sends the name that matches **component_name** or **variable_name** +- ``printh 00`` Sends a NULL +- ``prints text0.txt,0`` The actual text to send. For a variable use the Nextion variable name ``text0`` with out ``.txt`` +- ``printh 00`` Sends a NULL +- ``printh FF FF FF`` Nextion command ack + + +See Also +-------- + +- :doc:`/components/display/nextion` +- :doc:`index` +- :apiref:`nextion/text_sensor/nextion_textsensor.h` +- :ghedit:`Edit` diff --git a/index.rst b/index.rst index 4ef1d9951..55f1ad49e 100644 --- a/index.rst +++ b/index.rst @@ -193,6 +193,7 @@ Sensor Components MPU6050, components/sensor/mpu6050, mpu6050.jpg MQTT Subscribe, components/sensor/mqtt_subscribe, mqtt.png MS5611, components/sensor/ms5611, ms5611.jpg + Nextion, components/sensor/nextion, nextion.jpg NTC Thermistor, components/sensor/ntc, ntc.jpg PMSX003, components/sensor/pmsx003, pmsx003.svg Pulse Counter, components/sensor/pulse_counter, pulse.svg @@ -253,7 +254,7 @@ Binary Sensor Components ESP32 BLE Presence, components/binary_sensor/ble_presence, bluetooth.svg ESP32 Touch Pad, components/binary_sensor/esp32_touch, touch.svg MPR121 Capacitive Touch Sensor, components/binary_sensor/mpr121, mpr121.jpg - Nextion Touch, components/binary_sensor/nextion, nextion.jpg + Nextion Binary Sensor, components/binary_sensor/nextion, nextion.jpg Template Binary Sensor, components/binary_sensor/template, description.svg PN532, components/binary_sensor/pn532, pn532.jpg RC522, components/binary_sensor/rc522, rc522.jpg @@ -325,6 +326,7 @@ Switch Components Custom Switch, components/switch/custom, language-cpp.svg Tuya Switch, components/switch/tuya, tuya.png BLE Client Switch, components/switch/ble_client, bluetooth.svg + Nextion Switch, components/switch/nextion, nextion.jpg Fan Components -------------- @@ -385,6 +387,8 @@ Text Sensor Components BLE Scanner, components/text_sensor/ble_scanner, bluetooth.svg Template Text Sensor, components/text_sensor/template, description.svg Custom Text Sensor, components/text_sensor/custom, language-cpp.svg + Custom UART Text Sensor, components/text_sensor/uart, language-cpp.svg + Nextion Text Sensor, components/text_sensor/nextion, nextion.jpg Climate Components ------------------ From 687e51e2622b1ac7c0b54e45f87231c43f404017 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 15 Jul 2021 13:56:01 +1200 Subject: [PATCH 23/43] Bump version to v1.20.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 8b953976f..49566a795 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 = 1.20.0b1 +PROJECT_NUMBER = 1.20.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 e3415f21f..df4a5af9e 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ ESPHOME_PATH = ../esphome -ESPHOME_REF = v1.20.0b1 +ESPHOME_REF = v1.20.0b2 .PHONY: html html-strict cleanhtml deploy help webserver Makefile netlify netlify-api api netlify-dependencies svg2png copy-svg2png diff --git a/_static/version b/_static/version index a7f7583ca..23619ff05 100644 --- a/_static/version +++ b/_static/version @@ -1 +1 @@ -1.20.0b1 \ No newline at end of file +1.20.0b2 \ No newline at end of file diff --git a/conf.py b/conf.py index 65ed66fda..fd51e3c03 100644 --- a/conf.py +++ b/conf.py @@ -69,7 +69,7 @@ author = "Otto Winter" # The short X.Y version. version = "1.20" # The full version, including alpha/beta/rc tags. -release = "1.20.0b1" +release = "1.20.0b2" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 5c9d544d48de489a530fdbecf1ffe9672bd423a7 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 15 Jul 2021 13:56:57 +1200 Subject: [PATCH 24/43] Update changelog for 1.20.0b2 --- changelog/v1.20.0.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/changelog/v1.20.0.rst b/changelog/v1.20.0.rst index 5d2c3ee2c..5aa1106d8 100644 --- a/changelog/v1.20.0.rst +++ b/changelog/v1.20.0.rst @@ -49,6 +49,7 @@ New Features - Allow WiFi AP to use device name :esphomepr:`1990` by :ghuser:`jesserockz` (new-feature) - Add Number entities (from Home Assistant) :esphomepr:`1971` by :ghuser:`jesserockz` (new-feature) (new-integration) (notable-change) +- Nextion upload and sensors :esphomepr:`1464` by :ghuser:`SenexCrenshaw` (new-feature) (notable-change) New Integrations ^^^^^^^^^^^^^^^^ @@ -70,6 +71,7 @@ Notable Changes ^^^^^^^^^^^^^^^ - Add Number entities (from Home Assistant) :esphomepr:`1971` by :ghuser:`jesserockz` (new-feature) (new-integration) (notable-change) +- Nextion upload and sensors :esphomepr:`1464` by :ghuser:`SenexCrenshaw` (new-feature) (notable-change) All changes ^^^^^^^^^^^ @@ -130,6 +132,7 @@ All changes - catch 0.0 in float set_level pre-adjustment :esphomepr:`2013` by :ghuser:`WeekendWarrior1` (breaking-change) - Introduce clamp as a template function :esphomepr:`1953` by :ghuser:`agners` - [Teleinfo] do not stop parsing frame if there is only a CRC error on … :esphomepr:`1999` by :ghuser:`St4n` +- Nextion upload and sensors :esphomepr:`1464` by :ghuser:`SenexCrenshaw` (new-feature) (notable-change) Past Changelogs --------------- From 62753b8ee0d6e507c92ccf60268ebc87cdadaddf Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Mon, 19 Jul 2021 08:28:59 +1200 Subject: [PATCH 25/43] Bump version to v1.20.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 49566a795..6be47200c 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 = 1.20.0b2 +PROJECT_NUMBER = 1.20.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 df4a5af9e..d0abc81a9 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ ESPHOME_PATH = ../esphome -ESPHOME_REF = v1.20.0b2 +ESPHOME_REF = v1.20.0b3 .PHONY: html html-strict cleanhtml deploy help webserver Makefile netlify netlify-api api netlify-dependencies svg2png copy-svg2png diff --git a/_static/version b/_static/version index 23619ff05..d4293facc 100644 --- a/_static/version +++ b/_static/version @@ -1 +1 @@ -1.20.0b2 \ No newline at end of file +1.20.0b3 \ No newline at end of file diff --git a/conf.py b/conf.py index fd51e3c03..329d539c6 100644 --- a/conf.py +++ b/conf.py @@ -69,7 +69,7 @@ author = "Otto Winter" # The short X.Y version. version = "1.20" # The full version, including alpha/beta/rc tags. -release = "1.20.0b2" +release = "1.20.0b3" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 48d7b768bee1958dab9f1318cccf3d1c80696635 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Mon, 19 Jul 2021 08:29:56 +1200 Subject: [PATCH 26/43] Update changelog for 1.20.0b3 --- changelog/v1.20.0.rst | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/changelog/v1.20.0.rst b/changelog/v1.20.0.rst index 5aa1106d8..59b3df3e1 100644 --- a/changelog/v1.20.0.rst +++ b/changelog/v1.20.0.rst @@ -73,6 +73,15 @@ Notable Changes - Add Number entities (from Home Assistant) :esphomepr:`1971` by :ghuser:`jesserockz` (new-feature) (new-integration) (notable-change) - Nextion upload and sensors :esphomepr:`1464` by :ghuser:`SenexCrenshaw` (new-feature) (notable-change) +Beta fixes +^^^^^^^^^^ + +- Fix ethernet component hostname handling :esphomepr:`2010` by :ghuser:`flacjacket` +- Refactor docker build system and workflows :esphomepr:`2023` by :ghuser:`OttoWinter` +- GH Actions CI use GHCR :esphomepr:`2027` by :ghuser:`OttoWinter` +- Dashboard disable assets caching :esphomepr:`2025` by :ghuser:`OttoWinter` +- Improve external components error messages :esphomepr:`2026` by :ghuser:`OttoWinter` + All changes ^^^^^^^^^^^ @@ -133,6 +142,11 @@ All changes - Introduce clamp as a template function :esphomepr:`1953` by :ghuser:`agners` - [Teleinfo] do not stop parsing frame if there is only a CRC error on … :esphomepr:`1999` by :ghuser:`St4n` - Nextion upload and sensors :esphomepr:`1464` by :ghuser:`SenexCrenshaw` (new-feature) (notable-change) +- Fix ethernet component hostname handling :esphomepr:`2010` by :ghuser:`flacjacket` +- Refactor docker build system and workflows :esphomepr:`2023` by :ghuser:`OttoWinter` +- GH Actions CI use GHCR :esphomepr:`2027` by :ghuser:`OttoWinter` +- Dashboard disable assets caching :esphomepr:`2025` by :ghuser:`OttoWinter` +- Improve external components error messages :esphomepr:`2026` by :ghuser:`OttoWinter` Past Changelogs --------------- From 846687dd945df975b71bae4058a05ff6eb2a364c Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Mon, 19 Jul 2021 08:30:11 +1200 Subject: [PATCH 27/43] Update supporters for 1.20.0b3 --- guides/supporters.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/guides/supporters.rst b/guides/supporters.rst index d6ec7583c..b0c73c958 100644 --- a/guides/supporters.rst +++ b/guides/supporters.rst @@ -189,6 +189,7 @@ Contributors - `C W (@fake-name) `__ - `Christian Ferbar (@ferbar) `__ - `fkirill (@fkirill) `__ +- `Sean Vig (@flacjacket) `__ - `Diego Elio Pettenò (@Flameeyes) `__ - `foxsam21 (@foxsam21) `__ - `Fractal147 (@Fractal147) `__ @@ -607,4 +608,4 @@ Contributors - `San (@zhujunsan) `__ - `Christian Zufferey (@zuzu59) `__ -*This page was last updated July 15, 2021.* +*This page was last updated July 19, 2021.* From 195cb77e834d1eb5a71afd59394233cea5fd5d0c Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 20 Jul 2021 08:22:56 +1200 Subject: [PATCH 28/43] Add initial_value to template number (#1314) --- components/number/template.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/components/number/template.rst b/components/number/template.rst index 7c4b4d846..ac6ec9a20 100644 --- a/components/number/template.rst +++ b/components/number/template.rst @@ -34,7 +34,9 @@ Configuration variables: number. Defaults to ``60s``. - **optimistic** (*Optional*, boolean): Whether to operate in optimistic mode - when in this mode, any command sent to the template number will immediately update the reported state. - Defaults to ``false``. + Defaults to ``false``. Cannot be used with ``lambda``. +- **initial_value** (*Optional*, float): The value to use if no ``lambda`` is used or no value + stored in RTC/flash at setup time. - **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation. - All other options from :ref:`Sensor `. From a1c2bb163cafd2abe1324eae0bdc13c415874ec9 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 20 Jul 2021 10:28:25 +1200 Subject: [PATCH 29/43] Bump version to v1.20.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 6be47200c..bcea34505 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 = 1.20.0b3 +PROJECT_NUMBER = 1.20.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 d0abc81a9..aee29c15a 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ ESPHOME_PATH = ../esphome -ESPHOME_REF = v1.20.0b3 +ESPHOME_REF = v1.20.0b4 .PHONY: html html-strict cleanhtml deploy help webserver Makefile netlify netlify-api api netlify-dependencies svg2png copy-svg2png diff --git a/_static/version b/_static/version index d4293facc..2591498d3 100644 --- a/_static/version +++ b/_static/version @@ -1 +1 @@ -1.20.0b3 \ No newline at end of file +1.20.0b4 \ No newline at end of file diff --git a/conf.py b/conf.py index 329d539c6..5ad1580ce 100644 --- a/conf.py +++ b/conf.py @@ -69,7 +69,7 @@ author = "Otto Winter" # The short X.Y version. version = "1.20" # The full version, including alpha/beta/rc tags. -release = "1.20.0b3" +release = "1.20.0b4" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From a198e86c21348829ab7db02caac7314fe817b21b Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 20 Jul 2021 10:29:31 +1200 Subject: [PATCH 30/43] Update changelog for 1.20.0b4 --- changelog/v1.20.0.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/changelog/v1.20.0.rst b/changelog/v1.20.0.rst index 59b3df3e1..09bb3a067 100644 --- a/changelog/v1.20.0.rst +++ b/changelog/v1.20.0.rst @@ -42,7 +42,7 @@ Unfortunately, some breaking changes had to be made: white channel being set to 30%, as expected. Full list of changes --------------------- +--------------------s New Features ^^^^^^^^^^^^ @@ -81,6 +81,7 @@ Beta fixes - GH Actions CI use GHCR :esphomepr:`2027` by :ghuser:`OttoWinter` - Dashboard disable assets caching :esphomepr:`2025` by :ghuser:`OttoWinter` - Improve external components error messages :esphomepr:`2026` by :ghuser:`OttoWinter` +- Number and Template Number updates :esphomepr:`2036` by :ghuser:`jesserockz` All changes ^^^^^^^^^^^ @@ -147,6 +148,7 @@ All changes - GH Actions CI use GHCR :esphomepr:`2027` by :ghuser:`OttoWinter` - Dashboard disable assets caching :esphomepr:`2025` by :ghuser:`OttoWinter` - Improve external components error messages :esphomepr:`2026` by :ghuser:`OttoWinter` +- Number and Template Number updates :esphomepr:`2036` by :ghuser:`jesserockz` Past Changelogs --------------- From ccdbb9d2ad16c6f253ffdd9e344972cadb9f0575 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 20 Jul 2021 10:29:45 +1200 Subject: [PATCH 31/43] Update supporters for 1.20.0b4 --- guides/supporters.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/supporters.rst b/guides/supporters.rst index b0c73c958..01abe299a 100644 --- a/guides/supporters.rst +++ b/guides/supporters.rst @@ -608,4 +608,4 @@ Contributors - `San (@zhujunsan) `__ - `Christian Zufferey (@zuzu59) `__ -*This page was last updated July 19, 2021.* +*This page was last updated July 20, 2021.* From 7a8833dcd85c16bb7a9061e3bf644a79ff4d67aa Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 20 Jul 2021 15:40:43 +1200 Subject: [PATCH 32/43] Add restore_value to template number docs (#1319) --- components/number/template.rst | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/components/number/template.rst b/components/number/template.rst index ac6ec9a20..c29914498 100644 --- a/components/number/template.rst +++ b/components/number/template.rst @@ -34,9 +34,12 @@ Configuration variables: number. Defaults to ``60s``. - **optimistic** (*Optional*, boolean): Whether to operate in optimistic mode - when in this mode, any command sent to the template number will immediately update the reported state. - Defaults to ``false``. Cannot be used with ``lambda``. -- **initial_value** (*Optional*, float): The value to use if no ``lambda`` is used or no value - stored in RTC/flash at setup time. + Cannot be used with ``lambda``. Defaults to ``false``. +- **restore_value** (*Optional*, boolean): Saves and loads the state to RTC/Flash. + Cannot be used with ``lambda``. Defaults to ``false``. +- **initial_value** (*Optional*, float): The value to set the state to on setup if not + restored with ``restore_value``. + Cannot be used with ``lambda``. Defaults to ``min_value``. - **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation. - All other options from :ref:`Sensor `. From b6c86613d5ae1c010ee1bfec3a385bb3463625f5 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 20 Jul 2021 17:10:00 +1200 Subject: [PATCH 33/43] Bump version to v1.20.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 bcea34505..175bcf916 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 = 1.20.0b4 +PROJECT_NUMBER = 1.20.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 aee29c15a..bfe003069 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ ESPHOME_PATH = ../esphome -ESPHOME_REF = v1.20.0b4 +ESPHOME_REF = v1.20.0b5 .PHONY: html html-strict cleanhtml deploy help webserver Makefile netlify netlify-api api netlify-dependencies svg2png copy-svg2png diff --git a/_static/version b/_static/version index 2591498d3..5de57fb6e 100644 --- a/_static/version +++ b/_static/version @@ -1 +1 @@ -1.20.0b4 \ No newline at end of file +1.20.0b5 \ No newline at end of file diff --git a/conf.py b/conf.py index 5ad1580ce..3fd3c222f 100644 --- a/conf.py +++ b/conf.py @@ -69,7 +69,7 @@ author = "Otto Winter" # The short X.Y version. version = "1.20" # The full version, including alpha/beta/rc tags. -release = "1.20.0b4" +release = "1.20.0b5" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From a54940106fd571010b5592ce14abc93ed161f7c3 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 20 Jul 2021 17:17:33 +1200 Subject: [PATCH 34/43] Update changelog for 1.20.0b5 --- changelog/images/online-indicator.png | Bin 0 -> 17312 bytes changelog/v1.20.0.rst | 24 +++++++++++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 changelog/images/online-indicator.png diff --git a/changelog/images/online-indicator.png b/changelog/images/online-indicator.png new file mode 100644 index 0000000000000000000000000000000000000000..049cbddad2f2c9366d2886372fd88ffd0e583e64 GIT binary patch literal 17312 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 literal 0 HcmV?d00001 diff --git a/changelog/v1.20.0.rst b/changelog/v1.20.0.rst index 09bb3a067..fea85207b 100644 --- a/changelog/v1.20.0.rst +++ b/changelog/v1.20.0.rst @@ -41,8 +41,20 @@ Unfortunately, some breaking changes had to be made: would result in the white channel being at 50% brightness. Starting with this version, this will result in the white channel being set to 30%, as expected. + +ESPHome Dashboard +----------------- + +Thanks :ghuser:`balloob` for making a small, but very significant change to the dashboard cards so now people who suffer from color-blindness +will know whether or not the node is online. + +.. figure:: image/online-indicator.png + :align: center + :width: 50.0% + + Full list of changes ---------------------s +-------------------- New Features ^^^^^^^^^^^^ @@ -82,6 +94,11 @@ Beta fixes - Dashboard disable assets caching :esphomepr:`2025` by :ghuser:`OttoWinter` - Improve external components error messages :esphomepr:`2026` by :ghuser:`OttoWinter` - Number and Template Number updates :esphomepr:`2036` by :ghuser:`jesserockz` +- Add restore_value to template number :esphomepr:`2041` by :ghuser:`jesserockz` +- midea_ac: Fix turbo boost mode. Preset PRESET_BOOST. :esphomepr:`2029` by :ghuser:`dudanov` +- Bump dashboard to 20210719.0 :esphomepr:`2043` by :ghuser:`balloob` +- Correct ADS1115 handling of multiple sensors in continuous mode :esphomepr:`2016` by :ghuser:`flacjacket` +- ESP32 ADC use esp-idf :esphomepr:`2024` by :ghuser:`OttoWinter` All changes ^^^^^^^^^^^ @@ -149,6 +166,11 @@ All changes - Dashboard disable assets caching :esphomepr:`2025` by :ghuser:`OttoWinter` - Improve external components error messages :esphomepr:`2026` by :ghuser:`OttoWinter` - Number and Template Number updates :esphomepr:`2036` by :ghuser:`jesserockz` +- Add restore_value to template number :esphomepr:`2041` by :ghuser:`jesserockz` +- midea_ac: Fix turbo boost mode. Preset PRESET_BOOST. :esphomepr:`2029` by :ghuser:`dudanov` +- Bump dashboard to 20210719.0 :esphomepr:`2043` by :ghuser:`balloob` +- Correct ADS1115 handling of multiple sensors in continuous mode :esphomepr:`2016` by :ghuser:`flacjacket` +- ESP32 ADC use esp-idf :esphomepr:`2024` by :ghuser:`OttoWinter` Past Changelogs --------------- From 125caaaed10017b1b989863f82369e44d5593ea2 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 20 Jul 2021 17:19:54 +1200 Subject: [PATCH 35/43] Fix image path --- changelog/v1.20.0.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog/v1.20.0.rst b/changelog/v1.20.0.rst index fea85207b..5a4877654 100644 --- a/changelog/v1.20.0.rst +++ b/changelog/v1.20.0.rst @@ -48,7 +48,7 @@ ESPHome Dashboard Thanks :ghuser:`balloob` for making a small, but very significant change to the dashboard cards so now people who suffer from color-blindness will know whether or not the node is online. -.. figure:: image/online-indicator.png +.. figure:: images/online-indicator.png :align: center :width: 50.0% From 38588587d1695b0ff6a5977832fd9cf91698a55b Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 21 Jul 2021 09:20:24 +1200 Subject: [PATCH 36/43] Add last_reset_type lines to sensor code docs (#1316) --- components/sensor/index.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/components/sensor/index.rst b/components/sensor/index.rst index 9cab2a00a..a153977b3 100644 --- a/components/sensor/index.rst +++ b/components/sensor/index.rst @@ -48,6 +48,9 @@ Configuration variables: - **state_class** (*Optional*, string): The state class for the sensor. See https://developers.home-assistant.io/docs/core/entity/sensor/#available-state-classes for a list of available options. Set to ``""`` to remove the default state class of a sensor. +- **last_reset_type** (*Optional*, string): The last reset type to use for the sensor. + Currently there is no gain in overriding this string in YAML and it should be set in the platform code. + Set to ``""`` to remove the default last reset type of a sensor. - **icon** (*Optional*, icon): Manually set the icon to use for the sensor in the frontend. The icon set here is ignored by Home Assistant, if a device class is already set. - **accuracy_decimals** (*Optional*, int): Manually set the accuracy of decimals to use when reporting values. From 554ecdbecf0babbb74d21fb69cc3831d524bd39f Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 21 Jul 2021 10:52:50 +1200 Subject: [PATCH 37/43] Bump version to v1.20.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 175bcf916..a76867e7e 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 = 1.20.0b5 +PROJECT_NUMBER = 1.20.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 bfe003069..a4ff25a28 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ ESPHOME_PATH = ../esphome -ESPHOME_REF = v1.20.0b5 +ESPHOME_REF = v1.20.0b6 .PHONY: html html-strict cleanhtml deploy help webserver Makefile netlify netlify-api api netlify-dependencies svg2png copy-svg2png diff --git a/_static/version b/_static/version index 5de57fb6e..6af8a36a3 100644 --- a/_static/version +++ b/_static/version @@ -1 +1 @@ -1.20.0b5 \ No newline at end of file +1.20.0b6 \ No newline at end of file diff --git a/conf.py b/conf.py index 3fd3c222f..de75ed5f6 100644 --- a/conf.py +++ b/conf.py @@ -69,7 +69,7 @@ author = "Otto Winter" # The short X.Y version. version = "1.20" # The full version, including alpha/beta/rc tags. -release = "1.20.0b5" +release = "1.20.0b6" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 5f430183c91a497ca09927afea2e706778cc913d Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 21 Jul 2021 11:04:12 +1200 Subject: [PATCH 38/43] Update changelog for 1.20.0b6 --- changelog/v1.20.0.rst | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/changelog/v1.20.0.rst b/changelog/v1.20.0.rst index 5a4877654..16ec2d9ca 100644 --- a/changelog/v1.20.0.rst +++ b/changelog/v1.20.0.rst @@ -53,6 +53,12 @@ will know whether or not the node is online. :width: 50.0% +Nextion +------- + +Need to write something about the nextion changes here... + + Full list of changes -------------------- @@ -62,6 +68,7 @@ New Features - Allow WiFi AP to use device name :esphomepr:`1990` by :ghuser:`jesserockz` (new-feature) - Add Number entities (from Home Assistant) :esphomepr:`1971` by :ghuser:`jesserockz` (new-feature) (new-integration) (notable-change) - Nextion upload and sensors :esphomepr:`1464` by :ghuser:`SenexCrenshaw` (new-feature) (notable-change) +- Adding last_reset_type to sensors that should support it. :esphomepr:`2039` by :ghuser:`jesserockz` (new-feature) New Integrations ^^^^^^^^^^^^^^^^ @@ -99,6 +106,9 @@ Beta fixes - Bump dashboard to 20210719.0 :esphomepr:`2043` by :ghuser:`balloob` - Correct ADS1115 handling of multiple sensors in continuous mode :esphomepr:`2016` by :ghuser:`flacjacket` - ESP32 ADC use esp-idf :esphomepr:`2024` by :ghuser:`OttoWinter` +- Fix white value transition for addressable lights :esphomepr:`2045` by :ghuser:`oxan` +- Adding last_reset_type to sensors that should support it. :esphomepr:`2039` by :ghuser:`jesserockz` (new-feature) +- Remove superfluous polling on ADS1115 :esphomepr:`2015` by :ghuser:`flacjacket` All changes ^^^^^^^^^^^ @@ -171,6 +181,9 @@ All changes - Bump dashboard to 20210719.0 :esphomepr:`2043` by :ghuser:`balloob` - Correct ADS1115 handling of multiple sensors in continuous mode :esphomepr:`2016` by :ghuser:`flacjacket` - ESP32 ADC use esp-idf :esphomepr:`2024` by :ghuser:`OttoWinter` +- Fix white value transition for addressable lights :esphomepr:`2045` by :ghuser:`oxan` +- Adding last_reset_type to sensors that should support it. :esphomepr:`2039` by :ghuser:`jesserockz` (new-feature) +- Remove superfluous polling on ADS1115 :esphomepr:`2015` by :ghuser:`flacjacket` Past Changelogs --------------- From c2781be41a1bd860360669f9e1d6b03c5a5d0919 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 21 Jul 2021 11:04:27 +1200 Subject: [PATCH 39/43] Update supporters for 1.20.0b6 --- guides/supporters.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/supporters.rst b/guides/supporters.rst index 01abe299a..8ed84dfca 100644 --- a/guides/supporters.rst +++ b/guides/supporters.rst @@ -608,4 +608,4 @@ Contributors - `San (@zhujunsan) `__ - `Christian Zufferey (@zuzu59) `__ -*This page was last updated July 20, 2021.* +*This page was last updated July 21, 2021.* From a1b574ee5ced14fab6bdadc1fe86ac9def3de087 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 22 Jul 2021 07:55:49 +1200 Subject: [PATCH 40/43] Bump version to v1.20.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 a76867e7e..55389a2ea 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 = 1.20.0b6 +PROJECT_NUMBER = 1.20.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 a4ff25a28..fc59d5cec 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ ESPHOME_PATH = ../esphome -ESPHOME_REF = v1.20.0b6 +ESPHOME_REF = v1.20.0 .PHONY: html html-strict cleanhtml deploy help webserver Makefile netlify netlify-api api netlify-dependencies svg2png copy-svg2png diff --git a/_static/version b/_static/version index 6af8a36a3..f1e7f0650 100644 --- a/_static/version +++ b/_static/version @@ -1 +1 @@ -1.20.0b6 \ No newline at end of file +1.20.0 \ No newline at end of file diff --git a/conf.py b/conf.py index de75ed5f6..5dee33564 100644 --- a/conf.py +++ b/conf.py @@ -69,7 +69,7 @@ author = "Otto Winter" # The short X.Y version. version = "1.20" # The full version, including alpha/beta/rc tags. -release = "1.20.0b6" +release = "1.20.0" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 40c9d108199a3afc0949caf2cec561a572d6c300 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 22 Jul 2021 08:06:55 +1200 Subject: [PATCH 41/43] Update changelog for 1.20.0 --- changelog/v1.20.0.rst | 92 ++++++++++++++++++++++++------------------- 1 file changed, 52 insertions(+), 40 deletions(-) diff --git a/changelog/v1.20.0.rst b/changelog/v1.20.0.rst index 16ec2d9ca..a6c479b8e 100644 --- a/changelog/v1.20.0.rst +++ b/changelog/v1.20.0.rst @@ -15,7 +15,10 @@ Changelog - Version 1.20.0 - 21st July 2021 Havells Inverter, components/sensor/havells_inverter, havellsgti5000d_s.jpg Anova Cooker, components/climate/anova, anova.png -Write some more notes here.... + +Here's to another timely release bringing a few new components and a whole bunch of changes under +the hood to existing ones. + Number Entities --------------- @@ -56,7 +59,15 @@ will know whether or not the node is online. Nextion ------- -Need to write something about the nextion changes here... +The Nextion component has had a major rewrite this release bringing many more features to those that use the displays. +I am not sure how to describe the changes except for listing the main change points from the PR and linking to the docs +for you to read yourself. :doc:`components/display/nextion` + +- Sensors/binary sensors/switch/text sensors and touch have all been added. +- Over the air TFT file upload +- Polling has been added to all the components +- Display on_wake/on_sleep +- Many API helpers (get_string/get_int) have been added Full list of changes @@ -67,11 +78,11 @@ New Features - Allow WiFi AP to use device name :esphomepr:`1990` by :ghuser:`jesserockz` (new-feature) - Add Number entities (from Home Assistant) :esphomepr:`1971` by :ghuser:`jesserockz` (new-feature) (new-integration) (notable-change) -- Nextion upload and sensors :esphomepr:`1464` by :ghuser:`SenexCrenshaw` (new-feature) (notable-change) -- Adding last_reset_type to sensors that should support it. :esphomepr:`2039` by :ghuser:`jesserockz` (new-feature) +- Nextion upload and sensors :esphomepr:`1464` by :ghuser:`SenexCrenshaw` (cherry-picked) (new-feature) (notable-change) +- Adding last_reset_type to sensors that should support it. :esphomepr:`2039` by :ghuser:`jesserockz` (cherry-picked) (new-feature) -New Integrations -^^^^^^^^^^^^^^^^ +New Components +^^^^^^^^^^^^^^ - Climate component for Ballu air conditioners with remote model YKR-K/002E :esphomepr:`1939` by :ghuser:`bazuchan` (new-integration) - Anova ble component :esphomepr:`1752` by :ghuser:`buxtronix` (new-integration) @@ -86,29 +97,30 @@ Breaking Changes - Remove a whole bunch of deprecated/removed stuff :esphomepr:`1981` by :ghuser:`jesserockz` (breaking-change) - catch 0.0 in float set_level pre-adjustment :esphomepr:`2013` by :ghuser:`WeekendWarrior1` (breaking-change) +Beta Fixes +^^^^^^^^^^ + +- Nextion upload and sensors :esphomepr:`1464` by :ghuser:`SenexCrenshaw` (cherry-picked) (new-feature) (notable-change) +- Fix ethernet component hostname handling :esphomepr:`2010` by :ghuser:`flacjacket` (cherry-picked) +- Refactor docker build system and workflows :esphomepr:`2023` by :ghuser:`OttoWinter` (cherry-picked) +- GH Actions CI use GHCR :esphomepr:`2027` by :ghuser:`OttoWinter` (cherry-picked) +- Dashboard disable assets caching :esphomepr:`2025` by :ghuser:`OttoWinter` (cherry-picked) +- Improve external components error messages :esphomepr:`2026` by :ghuser:`OttoWinter` (cherry-picked) +- Number and Template Number updates :esphomepr:`2036` by :ghuser:`jesserockz` (cherry-picked) +- Add restore_value to template number :esphomepr:`2041` by :ghuser:`jesserockz` (cherry-picked) +- midea_ac: Fix turbo boost mode. Preset PRESET_BOOST. :esphomepr:`2029` by :ghuser:`dudanov` (cherry-picked) +- Bump dashboard to 20210719.0 :esphomepr:`2043` by :ghuser:`balloob` (cherry-picked) +- Correct ADS1115 handling of multiple sensors in continuous mode :esphomepr:`2016` by :ghuser:`flacjacket` (cherry-picked) +- ESP32 ADC use esp-idf :esphomepr:`2024` by :ghuser:`OttoWinter` (cherry-picked) +- Fix white value transition for addressable lights :esphomepr:`2045` by :ghuser:`oxan` (cherry-picked) +- Adding last_reset_type to sensors that should support it. :esphomepr:`2039` by :ghuser:`jesserockz` (cherry-picked) (new-feature) +- Remove superfluous polling on ADS1115 :esphomepr:`2015` by :ghuser:`flacjacket` (cherry-picked) + Notable Changes ^^^^^^^^^^^^^^^ - Add Number entities (from Home Assistant) :esphomepr:`1971` by :ghuser:`jesserockz` (new-feature) (new-integration) (notable-change) -- Nextion upload and sensors :esphomepr:`1464` by :ghuser:`SenexCrenshaw` (new-feature) (notable-change) - -Beta fixes -^^^^^^^^^^ - -- Fix ethernet component hostname handling :esphomepr:`2010` by :ghuser:`flacjacket` -- Refactor docker build system and workflows :esphomepr:`2023` by :ghuser:`OttoWinter` -- GH Actions CI use GHCR :esphomepr:`2027` by :ghuser:`OttoWinter` -- Dashboard disable assets caching :esphomepr:`2025` by :ghuser:`OttoWinter` -- Improve external components error messages :esphomepr:`2026` by :ghuser:`OttoWinter` -- Number and Template Number updates :esphomepr:`2036` by :ghuser:`jesserockz` -- Add restore_value to template number :esphomepr:`2041` by :ghuser:`jesserockz` -- midea_ac: Fix turbo boost mode. Preset PRESET_BOOST. :esphomepr:`2029` by :ghuser:`dudanov` -- Bump dashboard to 20210719.0 :esphomepr:`2043` by :ghuser:`balloob` -- Correct ADS1115 handling of multiple sensors in continuous mode :esphomepr:`2016` by :ghuser:`flacjacket` -- ESP32 ADC use esp-idf :esphomepr:`2024` by :ghuser:`OttoWinter` -- Fix white value transition for addressable lights :esphomepr:`2045` by :ghuser:`oxan` -- Adding last_reset_type to sensors that should support it. :esphomepr:`2039` by :ghuser:`jesserockz` (new-feature) -- Remove superfluous polling on ADS1115 :esphomepr:`2015` by :ghuser:`flacjacket` +- Nextion upload and sensors :esphomepr:`1464` by :ghuser:`SenexCrenshaw` (cherry-picked) (new-feature) (notable-change) All changes ^^^^^^^^^^^ @@ -169,21 +181,21 @@ All changes - catch 0.0 in float set_level pre-adjustment :esphomepr:`2013` by :ghuser:`WeekendWarrior1` (breaking-change) - Introduce clamp as a template function :esphomepr:`1953` by :ghuser:`agners` - [Teleinfo] do not stop parsing frame if there is only a CRC error on … :esphomepr:`1999` by :ghuser:`St4n` -- Nextion upload and sensors :esphomepr:`1464` by :ghuser:`SenexCrenshaw` (new-feature) (notable-change) -- Fix ethernet component hostname handling :esphomepr:`2010` by :ghuser:`flacjacket` -- Refactor docker build system and workflows :esphomepr:`2023` by :ghuser:`OttoWinter` -- GH Actions CI use GHCR :esphomepr:`2027` by :ghuser:`OttoWinter` -- Dashboard disable assets caching :esphomepr:`2025` by :ghuser:`OttoWinter` -- Improve external components error messages :esphomepr:`2026` by :ghuser:`OttoWinter` -- Number and Template Number updates :esphomepr:`2036` by :ghuser:`jesserockz` -- Add restore_value to template number :esphomepr:`2041` by :ghuser:`jesserockz` -- midea_ac: Fix turbo boost mode. Preset PRESET_BOOST. :esphomepr:`2029` by :ghuser:`dudanov` -- Bump dashboard to 20210719.0 :esphomepr:`2043` by :ghuser:`balloob` -- Correct ADS1115 handling of multiple sensors in continuous mode :esphomepr:`2016` by :ghuser:`flacjacket` -- ESP32 ADC use esp-idf :esphomepr:`2024` by :ghuser:`OttoWinter` -- Fix white value transition for addressable lights :esphomepr:`2045` by :ghuser:`oxan` -- Adding last_reset_type to sensors that should support it. :esphomepr:`2039` by :ghuser:`jesserockz` (new-feature) -- Remove superfluous polling on ADS1115 :esphomepr:`2015` by :ghuser:`flacjacket` +- Nextion upload and sensors :esphomepr:`1464` by :ghuser:`SenexCrenshaw` (cherry-picked) (new-feature) (notable-change) +- Fix ethernet component hostname handling :esphomepr:`2010` by :ghuser:`flacjacket` (cherry-picked) +- Refactor docker build system and workflows :esphomepr:`2023` by :ghuser:`OttoWinter` (cherry-picked) +- GH Actions CI use GHCR :esphomepr:`2027` by :ghuser:`OttoWinter` (cherry-picked) +- Dashboard disable assets caching :esphomepr:`2025` by :ghuser:`OttoWinter` (cherry-picked) +- Improve external components error messages :esphomepr:`2026` by :ghuser:`OttoWinter` (cherry-picked) +- Number and Template Number updates :esphomepr:`2036` by :ghuser:`jesserockz` (cherry-picked) +- Add restore_value to template number :esphomepr:`2041` by :ghuser:`jesserockz` (cherry-picked) +- midea_ac: Fix turbo boost mode. Preset PRESET_BOOST. :esphomepr:`2029` by :ghuser:`dudanov` (cherry-picked) +- Bump dashboard to 20210719.0 :esphomepr:`2043` by :ghuser:`balloob` (cherry-picked) +- Correct ADS1115 handling of multiple sensors in continuous mode :esphomepr:`2016` by :ghuser:`flacjacket` (cherry-picked) +- ESP32 ADC use esp-idf :esphomepr:`2024` by :ghuser:`OttoWinter` (cherry-picked) +- Fix white value transition for addressable lights :esphomepr:`2045` by :ghuser:`oxan` (cherry-picked) +- Adding last_reset_type to sensors that should support it. :esphomepr:`2039` by :ghuser:`jesserockz` (cherry-picked) (new-feature) +- Remove superfluous polling on ADS1115 :esphomepr:`2015` by :ghuser:`flacjacket` (cherry-picked) Past Changelogs --------------- From 1f8436fba8bc29282712b942af776fa3749b4ac0 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 22 Jul 2021 08:07:11 +1200 Subject: [PATCH 42/43] Update supporters for 1.20.0 --- guides/supporters.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/supporters.rst b/guides/supporters.rst index 8ed84dfca..8f02e8a81 100644 --- a/guides/supporters.rst +++ b/guides/supporters.rst @@ -608,4 +608,4 @@ Contributors - `San (@zhujunsan) `__ - `Christian Zufferey (@zuzu59) `__ -*This page was last updated July 21, 2021.* +*This page was last updated July 22, 2021.* From 05920c0a9c038868844f5094b1935315f63466ea Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 22 Jul 2021 08:11:56 +1200 Subject: [PATCH 43/43] Fix link --- changelog/v1.20.0.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog/v1.20.0.rst b/changelog/v1.20.0.rst index a6c479b8e..7ea77a59f 100644 --- a/changelog/v1.20.0.rst +++ b/changelog/v1.20.0.rst @@ -61,7 +61,7 @@ Nextion The Nextion component has had a major rewrite this release bringing many more features to those that use the displays. I am not sure how to describe the changes except for listing the main change points from the PR and linking to the docs -for you to read yourself. :doc:`components/display/nextion` +for you to read yourself. :doc:`/components/display/nextion` - Sensors/binary sensors/switch/text sensors and touch have all been added. - Over the air TFT file upload