From 61d1c79b67cc57fedd4e258a348fd6d5b8c46003 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 13 Oct 2022 09:18:47 +1300 Subject: [PATCH 01/67] Bump version to 2022.11.0-dev --- Doxygen | 2 +- _static/version | 2 +- conf.py | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Doxygen b/Doxygen index 03b72da52..b489df92e 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 = 2022.10.0-dev +PROJECT_NUMBER = 2022.11.0-dev # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a diff --git a/_static/version b/_static/version index 26257e6ba..17d938bba 100644 --- a/_static/version +++ b/_static/version @@ -1 +1 @@ -2022.10.0-dev \ No newline at end of file +2022.11.0-dev \ No newline at end of file diff --git a/conf.py b/conf.py index 19fb5dd39..e5785efc3 100644 --- a/conf.py +++ b/conf.py @@ -66,9 +66,9 @@ author = "ESPHome" # built documents. # # The short X.Y version. -version = "2022.10" +version = "2022.11" # The full version, including alpha/beta/rc tags. -release = "2022.10.0-dev" +release = "2022.11.0-dev" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 44689b9d699884d9c1513c00d43b6bbcb106d45b Mon Sep 17 00:00:00 2001 From: Frank Riley Date: Wed, 12 Oct 2022 16:59:10 -0700 Subject: [PATCH 02/67] Add min/max_interval and measured_power to esp32_ble_beacon (#2337) --- components/esp32_ble_beacon.rst | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/components/esp32_ble_beacon.rst b/components/esp32_ble_beacon.rst index dac949dee..79e350c7a 100644 --- a/components/esp32_ble_beacon.rst +++ b/components/esp32_ble_beacon.rst @@ -32,6 +32,18 @@ Advanced options: the BLE receiver doesn't use it. Defaults to ``10167``. - **minor** (*Optional*, int): The iBeacon minor identifier of this beacon. Usually used to identify beacons within an iBeacon group. Defaults to ``61958``. +- **min_interval** (*Optional*, :ref:`config-time`): The iBeacon minimum transmit interval in milliseconds from 20 to 10240. + Setting this less than ``max_interval`` gives the BLE hardware a better chance to avoid + collisions with other BLE transmissions. Defaults to the iBeacon specification's defined interval: ``100ms``. +- **max_interval** (*Optional*, :ref:`config-time`): The iBeacon maximum transmit interval in milliseconds from 20 to 10240. + Setting this greater than ``min_interval`` gives the BLE hardware a better chance to avoid + collisions with other BLE transmissions. Defaults to the iBeacon specification's defined interval: ``100ms``. +- **measured_power** (*Optional*, int): The RSSI of the iBeacon as measured 1 meter from the device. + This is used to calibrate the ranging calculations in iOS. The procedure for setting this value can + be found in Apple's `Getting Started with iBeacon PDF `__ + under the heading *Calibrating iBeacon*. Between -128 to 0. Defaults to ``-59``. +- **tx_power** (*Optional*, int): The transmit power of the iBeacon in dBm. + One of -12, -9, -6, -3, 0, 3, 6, 9. Defaults to ``3dBm``. Setting Up ---------- From 4237b1dd315db7984c92cb84120b39e2d54410ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Thu, 13 Oct 2022 21:58:46 +0200 Subject: [PATCH 03/67] Add docs for keep_user_credentials (#2301) --- components/captive_portal.rst | 11 +++++++++-- guides/creators.rst | 3 +++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/components/captive_portal.rst b/components/captive_portal.rst index e9c4a741e..dfc6d5974 100644 --- a/components/captive_portal.rst +++ b/components/captive_portal.rst @@ -16,7 +16,7 @@ After 1 minute of unsuccessful WiFi connection attempts, the ESP will start a Wi :width: 70.0% In this web interface, you can manually override the WiFi settings of the device (please note -this will be overwritten by any subsequent upload, so make sure to also update your YAML configuration). +this will be overwritten by any subsequent upload (unless ``keep_user_credentials`` is enabled) so make sure to also update your YAML configuration). Additionally, you can upload a new firmware file. @@ -34,9 +34,16 @@ manually in your browser. password: !secret wifi_ap_password captive_portal: + # Set to true to preserve captive_portal credentials over OTA updates + # Note that you can't set STA credentials in YAML if you're using this + keep_user_credentials: false -No configuration variables. +Configuration variables: +------------------------ + +- **keep_user_credentials** (*Optional*, boolean): Do not erase WiFi credentials entered using :doc:`captive_portal` over subsequent OTA updates. + Note: WiFi STA credentials cannot be set in YAML when using this. See Also -------- diff --git a/guides/creators.rst b/guides/creators.rst index c5be31e35..e41e9ac2b 100644 --- a/guides/creators.rst +++ b/guides/creators.rst @@ -49,6 +49,9 @@ Example configuration # In combination with the `ap` this allows the user # to provision wifi credentials to the device. captive_portal: + # Optionally, preserve provisioned credentials + # over subsequent OTA updates. + keep_user_credentials: true # Sets up Bluetooth LE (Only on ESP32) to allow the user # to provision wifi credentials to the device. From 6764a47089eda8be739eac70fdcffc7c95994816 Mon Sep 17 00:00:00 2001 From: Marcel Hoppe Date: Wed, 19 Oct 2022 02:44:30 +0200 Subject: [PATCH 04/67] Add support for wl-134 (#2137) Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> --- components/text_sensor/wl_134.rst | 32 +++++++++++++++++++++++++++++++ index.rst | 1 + 2 files changed, 33 insertions(+) create mode 100644 components/text_sensor/wl_134.rst diff --git a/components/text_sensor/wl_134.rst b/components/text_sensor/wl_134.rst new file mode 100644 index 000000000..a8bfe6c33 --- /dev/null +++ b/components/text_sensor/wl_134.rst @@ -0,0 +1,32 @@ +WL-134 Pet Tag Sensor +===================== + +.. seo:: + :description: Instructions for setting up WL-134 text sensors. + :image: fingerprint.svg + +The ``wl_134`` text sensor platform exposes the last read pet tag as text sensor. + +.. code-block:: yaml + + # Example configuration entry + uart: + rx_pin: GPIO17 + baud_rate: 9600 + + text_sensor: + - platform: wl_134 + name: Transponder Code + reset: true + +Configuration variables: +------------------------ + +- **reset** (*Optional*, boolean): Reset the text sensor state back to "" 1s after reading a tag. Defaults to ``false``. +- All options from :ref:`Text Sensor `. + +See Also +-------- + +- :apiref:`wl_134/wl_134.h` +- :ghedit:`Edit` diff --git a/index.rst b/index.rst index e60884275..796c21299 100644 --- a/index.rst +++ b/index.rst @@ -600,6 +600,7 @@ Text Sensor Components Custom Text Sensor, components/text_sensor/custom, language-cpp.svg Nextion Text Sensor, components/text_sensor/nextion, nextion.jpg Tuya Text Sensor, components/text_sensor/tuya, tuya.png + WL-134 Pet Tag Sensor , components/text_sensor/wl_134, fingerprint.svg Climate Components ------------------ From e306940c09ee6fe79a7df1930fd21ca1fe3073c8 Mon Sep 17 00:00:00 2001 From: Jadson Santos <42282908+gtjadsonsantos@users.noreply.github.com> Date: Tue, 18 Oct 2022 21:44:58 -0300 Subject: [PATCH 05/67] Add ethernet_info docs (#2300) --- components/text_sensor/ethernet_info.rst | 30 ++++++++++++++++++++++++ index.rst | 1 + 2 files changed, 31 insertions(+) create mode 100644 components/text_sensor/ethernet_info.rst diff --git a/components/text_sensor/ethernet_info.rst b/components/text_sensor/ethernet_info.rst new file mode 100644 index 000000000..fde771542 --- /dev/null +++ b/components/text_sensor/ethernet_info.rst @@ -0,0 +1,30 @@ +Ethernet Info Text Sensor +========================= + +.. seo:: + :description: Instructions for setting up Ethernet info text sensors. + :image: ethernet.svg + +The ``ethernet_info`` text sensor platform exposes different Ethernet information +via text sensors. + +.. code-block:: yaml + + # Example configuration entry + text_sensor: + - platform: ethernet_info + ip_address: + name: ESP IP Address + + +Configuration variables: +------------------------ + +- **ip_address** (*Optional*): Expose the IP Address of the ESP as a text sensor. All options from + :ref:`Text Sensor `. + +See Also +-------- + +- :apiref:`ethernet_info/ethernet_info_text_sensor.h` +- :ghedit:`Edit` diff --git a/index.rst b/index.rst index 796c21299..955839905 100644 --- a/index.rst +++ b/index.rst @@ -594,6 +594,7 @@ Text Sensor Components MQTT Subscribe Text, components/text_sensor/mqtt_subscribe, mqtt.png Version, components/text_sensor/version, new-box.svg WiFi Info, components/text_sensor/wifi_info, network-wifi.svg + Ethernet Info, components/text_sensor/ethernet_info, ethernet.svg BLE Scanner, components/text_sensor/ble_scanner, bluetooth.svg Modbus Text Sensor, components/text_sensor/modbus_controller, modbus.png Template Text Sensor, components/text_sensor/template, description.svg From c8a99994ec13cc9a43aaa67ac3e587c546df5f4c Mon Sep 17 00:00:00 2001 From: Carlos Gustavo Sarmiento Date: Tue, 18 Oct 2022 22:13:22 -0500 Subject: [PATCH 06/67] Documentation for Atlas Scientific Peristaltic Pump (#2115) --- components/ezo_pmp.rst | 571 ++++++++++++++++++++++++++++++++++ components/images/ezo-pmp.jpg | Bin 0 -> 8384 bytes images/ezo-pmp.jpg | Bin 0 -> 8384 bytes 3 files changed, 571 insertions(+) create mode 100644 components/ezo_pmp.rst create mode 100644 components/images/ezo-pmp.jpg create mode 100644 images/ezo-pmp.jpg diff --git a/components/ezo_pmp.rst b/components/ezo_pmp.rst new file mode 100644 index 000000000..d373e7e71 --- /dev/null +++ b/components/ezo_pmp.rst @@ -0,0 +1,571 @@ +Atlas Scientific Peristaltic Pump +================================= + +.. seo:: + :description: Instructions for setting up an Atlas Scientific Peristaltic Pump in ESPHome + :image: ezo-pmp.jpg + :keywords: pump, peristaltic, atlas, ezo + +The ``ezo_pmp`` component allows you to use an Atlas Scientific Peristaltic Pump with ESPHome. +Both the EZO-PMP (`datasheet `__) +and EZO-PMP-L (`datasheet `__) are supported. +The :ref:`I²C Bus ` is required to be set up in your configuration for this sensor to work. + +.. note:: + + This component will not be directly controllable in the Home Assistant front-end automatically because + Home Assistant doesn't have support for pumps. In order to control the pump from the frontend you will need to use + templates to offer access to the actions you need. Please see :ref:`ezo-pmp-ha-config`. + +.. figure:: images/ezo-pmp.jpg + :align: center + :width: 80.0% + +.. code-block:: yaml + + ezo_pmp: + id: ezo_pmp + address: 103 # Default Address for the EZO-PMP. + update_interval: 60s + +Configuration variables: + +- **id** (**Required**, :ref:`config-id`): Specify the ID of the pump so that you can control it. +- **address** (*Optional*, int): Specify the I²C address of the sensor. Defaults to 103. +- **update_interval** (*Optional*, :ref:`config-time`): The interval to check the + sensor. Defaults to ``60s``. + +Sensors +----------------------------- + +Since the EZO-PMP offers a large number of sensors and each sensor needs to be polled individually, the code has been +optimized not to update a sensor that is not defined in the config. If you need very quick updates from the pump (under 3 seconds) +only enable the sensors that you actually need. + +.. _ezo_pmp-current_volume_dosed_sensor: + +``current_volume_dosed`` +----------------------------- + +This sensor indicates the volume (in milliliters) that has been dosed in the currently running or last ran dosing command. + +.. code-block:: yaml + + sensor: + - platform: ezo_pmp + current_volume_dosed: + id: current_volume_dosed + name: Current Volume Dosed + +Configuration variables: + +- **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. +- All other options from :ref:`Sensor `. + +.. _ezo_pmp-total_volume_dosed_sensor: + +``total_volume_dosed`` +----------------------------- + +This sensor indicates total volume (in milliliters) that has been dosed since the last time the pump was turned on. Could be a +negative number if the pump has been run in reverse. + +.. code-block:: yaml + + sensor: + - platform: ezo_pmp + total_volume_dosed: + id: total_volume_dosed + name: Total Volume Dosed + +Configuration variables: + +- **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. +- All other options from :ref:`Sensor `. + +.. _ezo_pmp-absolute_total_volume_dosed_sensor: + +``absolute_total_volume_dosed`` +------------------------------- + +This sensor indicates the absolute total volume (in milliliters) that has been dosed since the last time the pump was turned on. + +.. code-block:: yaml + + sensor: + - platform: ezo_pmp + absolute_total_volume_dosed: + id: absolute_total_volume_dosed + name: Absolute Total Volume Dosed + +Configuration variables: + +- **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. +- All other options from :ref:`Sensor `. + +.. _ezo_pmp-last_volume_requested_sensor: + +``last_volume_requested`` +----------------------------- + +Indicates the total volume (in milliliters) that is being dosed (or was if the pump has already finished) by a dose Action. When +using dosing actions that have a duration, the sensor will have the right calculation for total volume. + +.. code-block:: yaml + + sensor: + - platform: ezo_pmp + last_volume_requested: + id: last_volume_requested + name: Last Volume Requested + +Configuration variables: + +- **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. +- All other options from :ref:`Sensor `. + +.. _ezo_pmp-max_flow_rate_sensor: + +``max_flow_rate`` +----------------------------- + +The pump provides its own calculation of the maximum flow rate it can provide (in ml/minute). Dosing requests that exceed this rate +will fail. When using the :ref:`Dose Continuously ` Action, this is the volume the pump will +dose every minute. This value will get updated after the pump is calibrated (see :ref:`ezo_pmp-set_calibration_volume_action`). + +.. code-block:: yaml + + sensor: + - platform: ezo_pmp + max_flow_rate: + id: max_flow_rate + name: Max Flow Rate + +Configuration variables: + +- **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. +- All other options from :ref:`Sensor `. + +.. _ezo_pmp-pump_voltage_sensor: + +``pump_voltage`` +----------------------------- + +The current voltage of the power supply that powers the pump. Not to be confused with the voltage that powers the electronics on the pump. + +.. code-block:: yaml + + sensor: + - platform: ezo_pmp + pump_voltage: + id: pump_voltage + name: Pump Voltage + +Configuration variables: + +- **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. +- All other options from :ref:`Sensor `. + +Binary Sensors +----------------------------- + +.. _ezo_pmp-pump_state_binary_sensor: + +``pump_state`` +----------------------------- + +Indicates if the pump is currently running or not. + +.. code-block:: yaml + + binary_sensor: + - platform: ezo_pmp + pump_state: + id: pump_state + name: Pump State + +Configuration variables: + +- **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. +- All other options from :ref:`Binary Sensor `. + +.. _ezo_pmp-is_paused_binary_sensor: + +``is_paused`` +----------------------------- + +Indicates if a dosing action is currently paused. + +.. code-block:: yaml + + binary_sensor: + - platform: ezo_pmp + is_paused: + id: is_paused + name: Is Paused + +Configuration variables: + +- **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. +- All other options from :ref:`Binary Sensor `. + + +Text Sensors +----------------------------- + +.. _ezo_pmp-dosing_mode_text_sensor: + +``dosing_mode`` +----------------------------- + +Indicates the dosing mode the pump is currently running as. Can be any of `Volume`, `Volume/Time`, `Constant Flow Rate`, `Continuous`, `None`. + +.. code-block:: yaml + + text_sensor: + - platform: ezo_pmp + dosing_mode: + id: dosing_mode + name: Dosing Mode + +Configuration variables: + +- **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. +- All other options from :ref:`Text Sensor `. + +.. _ezo_pmp-calibration_status_text_sensor: + +``calibration_status`` +----------------------------- + +Indicates calibration status of the pump. Can be any of `Fixed Volume`, `Volume/Time`, `Fixed Volume & Volume/Time` or `Uncalibrated`. + +.. code-block:: yaml + + text_sensor: + - platform: ezo_pmp + calibration_status: + id: calibration_status + name: Calibration Status + +Configuration variables: + +- **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. +- All other options from :ref:`Text Sensor `. + +Actions +----------------------------- + +.. _ezo_pmp-dose_continuously_action: + +``ezo_pmp.dose_continuously`` Action +------------------------------------ + +Use this action in an :ref:`automations ` to have the peristaltic pump dose continuously +at the :ref:`Maximum Flow Rate `. The pump will automatically stop after 20 days +of running in continuous mode. + +.. code-block:: yaml + + on_...: + then: + - ezo_pmp.find: + id: ezo_pmp + +Configuration options: + +- **id** (**Required**, :ref:`config-id`): The ID of the pump. + + +.. _ezo_pmp-dose_volume_action: + +``ezo_pmp.dose_volume`` Action +------------------------------ + +Use this action in an :ref:`automations ` to have the peristaltic pump dose an specific volume (in milliliters) +at the :ref:`Maximum Flow Rate `. If the volume is negative the pump will run backwards. + +.. code-block:: yaml + + on_...: + then: + - ezo_pmp.dose_volume: + id: ezo_pmp + volume: 10 + + # Templated + - ezo_pmp.dose_volume: + id: ezo_pmp + volume: !lambda |- + return id(some_volume_sensor).state; + +Configuration options: + +- **id** (**Required**, :ref:`config-id`): The ID of the pump. +- **volume** (**Required**, float, :ref:`templatable `): The volume to dose in milliliters. If negative, pump will run in reverse. + +.. _ezo_pmp-dose_volume_over_time_action: + +``ezo_pmp.dose_volume_over_time`` Action +---------------------------------------- + +Use this action in an :ref:`automations ` to have the peristaltic pump dose an specific `volume` (in milliliters) +over the provided `duration` (in minutes). At the end of the time period the pump will have dosed the specified `volume`. +If the volume is negative the pump will run backwards. + +.. code-block:: yaml + + on_...: + then: + - ezo_pmp.dose_volume_over_time: + id: ezo_pmp + volume: 23.4 + duration: 2 + + # Templated + - ezo_pmp.dose_volume_over_time: + id: ezo_pmp + volume: !lambda |- + return id(some_volume_sensor).state; + duration: !lambda |- + return id(some_duration_sensor).state; + +Configuration options: + +- **id** (**Required**, :ref:`config-id`): The ID of the pump. +- **volume** (**Required**, float, :ref:`templatable `): The volume to dose in milliliters. If negative, pump will run in reverse. +- **duration** (**Required**, int, :ref:`templatable `): The time (in minutes) the pump will take to dose the volume requested. + + +.. _ezo_pmp-dose_with_constant_flow_rate_action: + +``ezo_pmp.dose_with_constant_flow_rate`` Action +----------------------------------------------- + +Use this action in an :ref:`automations ` to have the peristaltic pump dose an specific `volume` (in milliliters) every minute +for the provided `duration` (in minutes). At the end of the time period the pump will have dosed the specified `volume` times the `duration`. +If the volume is negative the pump will run backwards. + +.. code-block:: yaml + + on_...: + then: + - ezo_pmp.dose_with_constant_flow_rate: + id: ezo_pmp + volume_per_minute: 10.2 + duration: 2 + + # Templated + - ezo_pmp.dose_with_constant_flow_rate: + id: ezo_pmp + volume_per_minute: !lambda |- + return id(some_volume_sensor).state; + duration: !lambda |- + return id(some_duration_sensor).state; + +Configuration options: + +- **id** (**Required**, :ref:`config-id`): The ID of the pump. +- **volume_per_minute** (**Required**, float, :ref:`templatable `): The volume to dose in milliliters every minute. If negative, pump will run in reverse. +- **duration** (**Required**, int, :ref:`templatable `): The time (in minutes) the pump will dose the volume requested every minute. + +.. _ezo_pmp-pause_dosing_action: + +``ezo_pmp.pause_dosing`` Action +------------------------------- + +Use this action to pause a Dosing command that was previously issued. To determine if the dosing is paused or not, you can use the :ref:`Is Paused ` sensor. +If the pump is currently paused, issuing this action again will unpause it. + +.. code-block:: yaml + + on_...: + then: + - ezo_pmp.pause_dosing: + id: ezo_pmp + +Configuration options: + +- **id** (**Required**, :ref:`config-id`): The ID of the pump. + +.. _ezo_pmp-stop_dosing_action: + +``ezo_pmp.stop_dosing`` Action +------------------------------ + +Use this action to stop the current Dosing command. + +.. code-block:: yaml + + on_...: + then: + - ezo_pmp.stop_dosing: + id: ezo_pmp + +Configuration options: + +- **id** (**Required**, :ref:`config-id`): The ID of the pump. + +.. _ezo_pmp-clear_total_volume_dosed_action: + +``ezo_pmp.clear_total_volume_dosed`` Action +------------------------------------------- + +Clear the values of the :ref:`Current Volume Dosed `, :ref:`Total Volume Dosed ` +and :ref:`Absolute Total Volume Dosed ` sensors. + +.. code-block:: yaml + + on_...: + then: + - ezo_pmp.clear_total_volume_dosed: + id: ezo_pmp + +Configuration options: + +- **id** (**Required**, :ref:`config-id`): The ID of the pump. + +.. _ezo_pmp-set_calibration_volume_action: + +``ezo_pmp.set_calibration_volume`` Action +----------------------------------------- + +Use this action to calibrate the peristaltic pump. The EZO-PMP needs two forms of calibration: absolute volume and volume over time. You can check +the calibration status by using the :ref:`Calibration Status` sensor. For the procedure on calibrating the pump +check the datasheet. + +.. code-block:: yaml + + on_...: + then: + - ezo_pmp.set_calibration_volume: + id: ezo_pmp + volume: 10.01 + + # Templated + - ezo_pmp.set_calibration_volume: + id: ezo_pmp + volume: !lambda |- + return id(some_volume_sensor).state; + +Configuration options: + +- **id** (**Required**, :ref:`config-id`): The ID of the pump. +- **volume** (**Required**, float, :ref:`templatable `): The volume measured as part of the calibration process. + + +.. _ezo_pmp-clear_calibration_action: + +``ezo_pmp.clear_calibration`` Action +------------------------------------ + +Clear the calibration values stored in the pump. You can check the calibration status by using the +:ref:`Calibration Status` sensor. + +.. code-block:: yaml + + on_...: + then: + - ezo_pmp.clear_calibration: + id: ezo_pmp + +Configuration options: + +- **id** (**Required**, :ref:`config-id`): The ID of the pump. + +.. _ezo_pmp-find_action: + +``ezo_pmp.find`` Action +----------------------- + +Use this action to make the LED on the Pump control board to blink for a minute. The pump will not respond to any other action while the LED is blinking. + +.. code-block:: yaml + + on_...: + then: + - ezo_pmp.find: + id: ezo_pmp + +Configuration options: + +- **id** (**Required**, :ref:`config-id`): The ID of the pump. + +.. _ezo_pmp-change_i2c_address_action: + +``ezo_pmp.change_i2c_address`` Action +------------------------------------------- + +Changes the i2c address of the pump to the provided value. After the address is changed you must upload a new version of the ESPHome firmware with the updated I2C +address for the pump to work. + +.. code-block:: yaml + + on_...: + then: + - ezo_pmp.change_i2c_address: + id: ezo_pmp + address: 100 + +Configuration options: + +- **id** (**Required**, :ref:`config-id`): The ID of the pump. +- **address** (**Required**, int, :ref:`templatable `): The new I2C address for the pump. + +.. _ezo-pmp-ha-config: + +Home Assistant Configuration +---------------------------- + +In order to provide control of the pump from the home assistant frontend it is important to expose the actions +as components that have UI rendering. This could be done using templates in ESPHome. Here is an example using a +`Template Button` and `Template Number` to dose a certain volume over time. + +.. code-block:: yaml + + i2c: + + ezo_pmp: + id: ezo_pmp + + number: + - platform: template + id: volume + name: "Volume" + optimistic: true + min_value: 0 + max_value: 100 + step: 0.01 + - platform: template + id: duration + name: "Duration" + optimistic: true + min_value: 0 + max_value: 100 + step: 1 + + button: + - platform: template + name: "Dose Over Time" + on_press: + - ezo_pmp.dose_volume_over_time: + id: ezo_pump + volume: !lambda |- + return id(volume).state; + duration: !lambda |- + return id(duration).state; + +.. _ezo_pmp-lambda_calls: + +lambda calls +------------ + +From :ref:`lambdas `, you can also access the actions on the peristaltic pump to do some +advanced stuff (see the full API Reference for more info). The name of the functions is the same as the name +of the actions in YAML config. + +See Also +-------- + +- :apiref:`ezo_pmp/ezo_pmp.h` +- :ghedit:`Edit` diff --git a/components/images/ezo-pmp.jpg b/components/images/ezo-pmp.jpg new file mode 100644 index 0000000000000000000000000000000000000000..de1f85ea0fc45ca8f6151676b6db6e91cfa620f6 GIT binary patch literal 8384 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 literal 0 HcmV?d00001 diff --git a/images/ezo-pmp.jpg b/images/ezo-pmp.jpg new file mode 100644 index 0000000000000000000000000000000000000000..de1f85ea0fc45ca8f6151676b6db6e91cfa620f6 GIT binary patch literal 8384 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 literal 0 HcmV?d00001 From bb0900058b497db2ae17cf480f814c52c250ddbe Mon Sep 17 00:00:00 2001 From: Maximilian <43999966+DeerMaximum@users.noreply.github.com> Date: Wed, 19 Oct 2022 06:06:26 +0200 Subject: [PATCH 07/67] Add docs from adc128s102 sensor (#2308) Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> --- components/sensor/adc128s102.rst | 66 ++++++++++++++++++++++++ components/sensor/images/adc128s102.png | Bin 0 -> 118414 bytes images/adc128s102.png | Bin 0 -> 16631 bytes index.rst | 1 + 4 files changed, 67 insertions(+) create mode 100644 components/sensor/adc128s102.rst create mode 100644 components/sensor/images/adc128s102.png create mode 100644 images/adc128s102.png diff --git a/components/sensor/adc128s102.rst b/components/sensor/adc128s102.rst new file mode 100644 index 000000000..779997910 --- /dev/null +++ b/components/sensor/adc128s102.rst @@ -0,0 +1,66 @@ +ADC128S102 8-Channel 12-Bit A/D Converter +========================================== + +.. seo:: + :description: Instructions for setting up ADC128S102 12 Bit Analog to Digital Converter in ESPHome. + :keywords: ADC128S102 + :image: adc128s102.png + +The ADC128S102 is a low-power, eight-channel CMOS 12-bit analog-to-digital converter specified for conversion +throughput rates of 500 ksps to 1 MSPS. The converter is based on a successive-approximation register architecture +with an internal track-and-hold circuit. + +.. figure:: images/adc128s102.png + :align: center + :width: 50.0% + +.. _adc128s102-component: + +Component/Hub +------------- + +The ADC128S102 component allows you to use ADC128S102 8-Channel 12-Bit A/D Converter +(`datasheet `__, +`Texas Instruments `__) in ESPHome. +It uses the :ref:`SPI Bus ` for communication. + +Once configured, you can use any of the 8 pins as +sensors for your projects. + +.. code-block:: yaml + + # Example configuration entry + adc128s102: + cs_pin: GPIO15 + id: my_adc + + sensor: + - platform: adc128s102 # Attached to pin 0 of the ADC128S102. + update_interval: 1s + adc128s102_id: my_adc + id: freezer_temp_source + channel: 0 # ADC128S102 channel + +Configuration variables: +- **id** (**Required**, :ref:`config-id`): The id to use for this ADC128S102 component. +- **cs_pin** (**Required**, int): The SPI cable select pin to use + +Sensor +------ + +The ``adc128s102`` sensor allows you to use your ADC128S102 12-Bit A/D Converter sensors with ESPHome. +First, setup a :ref:`ADC128S102 Hub ` for your ADC128S102 sensor and then use this +sensor platform to create individual sensors that will report the voltage to Home Assistant. + +Configuration variables: + +- **adc128s102_id** (**Required**, :ref:`config-id`): The id of the parent ADC128S102 component. +- **channel** (**Required**, int): The channel of the ADC128S102 to use. +- **update_interval** (*Optional*, :ref:`config-time`): The interval to check the sensor. Defaults to ``60s``. + +See Also +-------- + +- :ref:`spi` +- :apiref:`adc128s102/adc128s102.h` +- :ghedit:`Edit` diff --git a/components/sensor/images/adc128s102.png b/components/sensor/images/adc128s102.png new file mode 100644 index 0000000000000000000000000000000000000000..0bd81d0551119a1b3a4a7191f10abbcc6fb37628 GIT binary patch literal 118414 zcmdpd^+VI&_y0zX9-(xn3esJpq(emsX;4DCdyJ3}2|>CAK}15j8Qrab4%ldv?veY9 z*Zccde1F<=+w*y!=bn4waUS>F*r$5xWW)@_004kYQ$zJR0DzCZ#F-?-#eSfR9>2zZ zOgz({k)b(xu&`T6;A zadGZU<>BdxkB`sC$45j&#L3CY!^897!2?%US0N#xh=>SQ zR@Ru980;WAIyy2kG6n_)o}Qi`KYsM}^$iUT4Gau)baccHn3|SGPEM|p1wY;01ONaqN1WLZEY9~W@K!v(e_-`pn2yVD>#91KQsQGU~`^@W7Sq@_w; zko9%a>y+Yb=~-I^D4N~yyYUa3zW4X}{=c~x`1gCJ))Fe6h+)P~>@*R#lUCp2swIFD zW7_-v{&qe-w6o2XkHZQ(@mu!O>+d8`N}w(FM)2F)rS{vp@s-eYtV(XE8Q|I36Ktp% zG%F8QH=&ro79^xsVR`u&ZTa61S275Qn&PiobpG8}3?AUx42;%Rh2K5AxQ!1uND(gx zMQL)W4q)F}Ww|+#4+R3w^JODdMRe}oy@EPF*-4+=_xWZm%OAL{o;dB-5y}zR*U+8X@+d$Oq z;8A-#Ur4v@9m()qtdurEK}v=`LN;pK8eG@@w>4o+eB16~;Z?1E;zw&m zP%sQ8_W>Ok#Q1yiPK1b&UYA9gC>?vrD|Hq3QZl*ON%?yArZ}h@vMu2FHsoF})+e?T zD{B3sX9d5?C1j;_I5x+@b87!4`s(UxB(x86c{irY_7lZ+T=I^f z^ARvF#Z!5d%7JZ=U!4cu0T2(#0^dLK3=CkkN8Q=S4?t7sjUx$qZ(c6wmg}qRAKbxh zL26S)&>D(Ln1Rl-MSS0%RH_WXCwYhz(vZj1zut9UNOcIYzU0deuSrhZZC%PY^Hw*$0 zhcpx*D>H=?#3OO+av2m3?1hD z&XoM#UbDGg`6tgF_0(o7It2_yh4rrX#s0V`Y$G!SsrIc#TLt%AsRQUT|MLVr)Oj2p ziz=Mf5(gfVj(7Y=kHemKb7OXGcqLKsxK+MG8V~e`q4U7^Lc&7n&d=k!_W%AC>}^ln ze?=%KD?QPma?m=igg*UiAcW@{70PqqkGZ{xE;^zAro=)HKTl`nxG#hCTV#U;-DOCf z-}S)>388<`47*CBOrkAw)_O=?t|i}rl*~^Bpwl})jfxn! z{zmQuXY8^xTJ-h$=5fM|LI9xYN=T2N%&g3)t6aghWc2xM2;QCBhj;-NqSr0AfRH?y zNICf?GatBqTUya*hnI9N!2#~IuKo~W+$!e4dTAf*i>HXP{NGa`K-=HXmT-72_3=)` zK|>Xl-{9tcN6~I-+wL_T;4a7)=cmlTrzGu(xkTtiqLBTr^+!pU9m)$z z0f^lznj2DJ;t*mIxYS_+PEUCf%7%A+a62|}7+P^>#HFV@*CYT!3*>;xv3))Sa{4$Q z?A9thC22$SHM>83-Gu`uVUCZDEl?4Fy2>D-!Wt=t^g0h4vQ|A@qNhHc@3ZK4vFbA` z=P?;H?k2vMCI8vsn7(+l`VhbrFR85P1T3NvxC^cH=!?MfL-ZNHnGdT(=(i%~xnstn z(~!@u2v!$H%V0I6?BdNf9$?8e7FO#^Mko89=3YMgt$h%5et56;_chs>o z-_I0&qs!a1Dn*;bVg%aB*7Ivs!rWfp0|erkfqCP?gsp8rbXZBN2q0|vOYK+wFVwH< z;$VwUP(vyjQurh{%x}A66;+D=X&xyz(7a2UoSlM5+i~jqp zuC1N<*IVG`Ti`0;omUIuqI4TCNcIyy4+Ip{%gy63j9j4otw&$ z-0Z3n$mSZ-!?F4sZB-8gz^`}@LlJlOLkV#EvsASUfUrO!>n@jOkxz&dZ!~=nUifIO zMS_#odqewQyMU+d5hh?%<0)!$y0vw?bpm4`PYp112Bz0a+oQmVfCIT(eP*mQ`apL~ z3*ri&Fc`YR_zEw$U{^lX!jT-rD$|wvqOl#~>h2!YnqPkG<>=uT5)$I$a~j}zTx*J} zmG7@ya%zUV>Y7OWOcEW8RZd28z&$$`RdHYcYSQTv^2^J z3{yhPK9WoD$+Bm`oW(_AL)bp?fuGN5=YTBy=IcW;0O%w#zzZ8#e|f&Zf}Ql62Z?dm z5p4l&0q0x99~xJKw`k1)!5Nk(?`RIH$$ahk!w5HXZAd*4xCYK*Xcdrp@4sb4B>eHnM^Dr}{XZf-wjH3|6Cl zaDG@kbKJFc!hX4{&lJ9Xpe#JX>}vrj&Iz$ zzv)K6#Vlm*c(5oB+c zs#}HxT@{i*X=#mUJM#eWC!!2hfwg_F#VZ-ZEs~|dq2pg}bN?uAQVLNOVXY~?Or6Oaog{&G1sAQ#*Rqy2os{L}$SyDQ#xugF7I zH)SD-zARVIx35H?FE}%JUfzMA+gTrq#v7WYggAsy)>|_4UJCia;!v0`@;w3v9kv=Q zmzbX20)r|oHe6od0XiHJkb2mFjG|B>a!)NIFokQvynj~T2{P7UVndjrj`!jI_I`Y* zIf}%mEt7<#Jv-5yq2NbO;;~vcLp2HXoOks>mrKc5?N1k$YYCQGi##0ob~!no#myCR z0B|rC{8D0f0dYg&o>WQ^VpzHQSjzBwr;B{ZBCvx7FHzEK!X@JTa`J*%YFxdLgDb1RxxWBGK3WaWTxoxX2MNXzS@$1UZesMmj=~>7wE*tAwAlSHr ztCv?esIl8c`&aPQl?GOeulQJ-S6t-DLYD3002+o;4TypTkxZtN3idxupEf>2dieO< zghIeirq5}N7HJOtA$yLaQAV2&!^p}Z@cfy=o+9hFlj@}2532=Vn#S;c``;2a0Q`>+ zr>G7ZQ=AkNY8BxCDD(T{Lz<+s$wn|7?DKPlIHLiR#0pQWzqy9|k_HNeDB`tsus}#q zjmD|XPIJL#`){(mE|w0_Bl;o(aoBhWd|u_HNqvq@@i#6&Au}LDiKrvOAa^xAR$_nSK0?1i+rYlT?Q;gcJ57mJmCp zW%YP|-i_zVXX}3!mB7%TldDzQmS+7v7k}9VYW?b8t-&v5B-J~B2D=@(Z+9y_p0Qlm ze{Ly~I5@6#$}dK)2+(~lAT4>kXj zgMBQ-*=2hfeO!+5V30(?EBoB=r56P=eij+@!r zvhM@&4bmA`6KC8wnj-c%iL@2d{VV}%Bc5lGK$72({)cyF&x8ivTvu7@CBR|u z?8N-c@J{z>A-o-8Iaj2dv^Xwu4+$}BJk7s#5B|2uOIy*9p2|dxyV@5gHZ)RmI6sFP z-9|KUohzo{9)I}xxkOMjSyWbO2E${`9aGvzz(qFc!JF}%mgzqSAVA;rU(!(=L^f_x z=Xsx3$r>dgI|9kR?p1Lfpxr;sb#Hy9un3^=C!NsqhFxuR*R>m}dnz;u2aEEJ3`;@- zruX*$C{PZVDz*aF&JL%5k(LTZX=Q}>` z{sAvg7xEDK$vs`<@{}N<+@AjSvTG?ecwvIR;qnWckd6Vf%E~<^Y+ccrhxZd}Zcsu6jE(3y z-HoEBf&yMNT+$ore52vfA@|X&w`m07xOJ_wXm}mC^Q+BCjv-7CdP$1TZO{3@S5#}9 zQVN!?cL~tTjV4+k&krNb9lFLJ%xrGkrSPEFWZtyhArTF?V);*Z06>RpDN+yY-@Ufq z7cbo=2UqxYh+E@K>B?G$C`sSX&vj&9SbA`o|H*7=>|`8!DYen?xc8Ey?x zF!SU-+)0`e!7kSt^1xO0%Px!s?F%94N*#7>?byo2fsd_{A8baWBp)3wybPEdSa)x6 z*|ehVw_-ET`cmd{?&(CEYmxkJ54@XC^7=2AW;5;D=F0`#{`aT6`+yKZT8e{7oV?Gc z^0hSB+D^}N{Z{*NL6gwNKdN4rnbn~u-T_Pcp17TGH+mMOdj!m6VCI5*EEq&M()mT) zOis&LhjvpBl@K_-pg?HSV)C}0L&}d$k=K#u!t`L!GnlK^OEarPDgk{yb%$3VAs~OR zWB2PDErC(onM*<5#xnfis!8nl218G#!$_o&>@x58KTy4p{08;?LhdO=5pY_V3Xfs5hN7kvWvvU zyM8Zjg`O-cEiI6kpY=O++1F=i+hO6Ry$L$map?4K-8WfPcM&9~EKeWt$W`2&;xOKW zfOlwv^Xd?Afk#o4#3z?!T6Iqpic))fULW9;NzyKjY7ok?DKSv~PuFO}n3RNE2A8DaqFeQ`hR_QbjT;^f% zop;o2+ONm4i}Kcw*@sEU}0$e#7s2LT12eNe%#U z&k2>25fN?KS^+@6u6&}|lTQFoo^3F>3jh6vq+XW>Yj;)?cn55O*x!tN?;0`vs!E$N zy(JjrE~DwO=UzrOY;ChaS^UIcLHQtg^oazPlnJFn|47L9Uf=hu4LyH&d*iE&C=o~9 zdbqD6B=_@k^1_f73NISR(gYKgMfqd+yrH(cX*QD(i12v9uK7GFG!brp+pA+BiSkCJEhu%h(t`voxX=5NM^egpn0&5;& zuYywN42_Y}z2F%jBsmAkbdz^nJGJR zQCv46WM!pg4HjtN`xbcV)c-6*u1YGZ!a$vMO|4D|x#Ah8+m$T7usLjDa$x|o+%<)W z`ID(5+c*x^9}nmop@a_K3Mo)nB%cjuGZEOBM~VKh-12$qK7D`k3sa!znV&Ol^Mhi7 zanuAQL^OR^n&<2ejwmp*C4DCevGY0IIZ>Dh&SU+CaCObg$;zDqvdBRGA*}vf@2FNa zBliiRARoj_Pn&YT)`=>XuZYS@C=?G`RP%Oi%M7@A^o=pXYRzEd4U=&^4< z3*+rrk0oc=XVDJQZ-kM`ha&JH&vO#XgF*oSy>fDN;dBbX*pf*ukAB4(YCLf>FUyqr z`f~Z-_EC-2_d}|cW1sG){nN4LkHbCHOGrMyZ?NwS8J>`CYi`Q|hy5QS_FQ;ncd%_IKzm6LDT<&@` z`ZOrx2M~sc{@1XwXM{<-nn~<9E@wOok#a8pom8j)tyn*T`K@8 zOj_^ICG(2JAKJD!okzF`@id0pC~1@MO1ry0r}#*0UQN0NjyG_}YC!ugY$G;HP=a38 zu4nl?Mo{a3rcR71;;D<=xAEtt-{Afd1+~xeR{+p1rEjs$^=ky4oET!@bI_? zD04Nn%xI8&XXNuX*~TBq99 zgg6QsM=B9UQgdS(k~sB)Li9J*y(PX`S(IrBH>?E|D{UeopRqFRF{9$89%CNT@=#>6 zMjI(W$g=a*jFupf+dzmYEf_U{Q6PZ*>>jIha7I1YtzfubxnHE|3?Qg_64ap;&zcrK zuHUyiEjR(zhPSQvXLyg{2;g470Sor9Zy9~c_{JAAZkAeX1>Mlb_qwJEbly+ww8EqYq($$te(7|{pY?tYIZ7x`C1KU!pB}>-62nZ( z$mmZq-I)Dprz~9-QnssWfxL|vN*lK#9xSAvELD<@Wtqa#7yE(T9lNKcvT!8y%74WT z8JC@%(9~FTAmu^8UbTK}?Yv*L5r#w28YNk3T`t&?2UqL@mId`sxtnOoyo)dIj1Kc|_*NZbqj7oL8zMj*Z!E4Tzh7+F3 zR8BNpl*{;j{i`x#P#Z{2Ub@Akk`9V6m{+lv@rGY%9jb@jj=ss4wx;(Wm`kdYPqE_O zvSbxx$7%;Tt$BV(!Jm8_o4t1o%3OCttPPJCq!Ct29^@j~z9RY&Em}}{a#+Vd!+C2x zLCmHX3JV|Boz2qX6Ic}Gz@fK|8WXw(Z>a<*oho~(@Z5Y!E6FQZA?4kBiDV|OGahMi zlPl!v6m$f{13Kb44{>vUY{AtkPkUi{6`k77i|UHHec}DwbQ7jwTNu`=OqDqI(EO|TdtM(yDXLfyy!id1WU}J9t5JxgU9GQ4Sw&udJ z@d$2#PoX-psYF4>y3bBV-l|I%!B=rKOuAd(^tkFM0TE(F(BevvENvs*RqzEca%j>G zW(lhu6=V6-(>#kF?w)qJpYfbe$J6Sca)*pj_`!tdC~<675|)U&qHrcR0^Z0BrP^CE zgu5Z-G%6zz828ilb!Wo@s+Wn<=;hX(_kLZ z{fB~PxQ6jff{(Y?4=TmsZy!zuoU&c3GW6fQ%4Q>d`SEd&+spJO=W1XtV2ASi>wfj3A~%(L&d$xz)P!Y% z(iN81d<(!|S#4i%HtYyjk0Lk(hH(4WyF~lzn==B^>LWAxg>AHj2By2DszF3vRCp2R z-%|@~Ri!!cZ6Jg%KBV6*pnWdnf~#`Z=@q=RpnCyg=$n(|O94oaUeNlrsIQLsAqN;2 zZ0SmkIY86rBK=L%{@n~GyRh!DI^Vkgdm~DCSTz({9`yo}ryg8tFKI>Aq4}#zf@1~u zuXgt#1t~x`+~f-tJgW_ zMRw?uJ2py|yz7dS0)2TgMB^TMyiDzah+gHHKu7ic>e*_D3&nV!Y)1SEw$8Q8`aJV( zc-O&n?$l5lVr8}Z1FX}jhMq(H5IJ|qP$a_H$IZI+P^_H9J7P&rVM(cDRQOKX6GnHC zQFCaZGZ5imwP;Tt`ZJb*9M_Wv-eayZY!#u;fA%~8^XBt-hOJ?cv`2r=#)8?w17#X^ z)t(<9tZY~0T?2t|12aVj#1b^iEWnpa7(~0cpmi-n3=^a~QF9dRMtrMTavk#O&(05I z4B_`;R{T~|=6ySMA)ce>MfLg6pEK}-2?tjg`C{FW+b&tgh$6{F_0=G7%j#x@D{RD! zBtE*F(AoS*6}XidtN2`ci~9Qc-^kn%kMqf|Bg@9liV`WAgTDgJm2@@!tNoa_hsJI< zya@dtH60naWaF{$l2y8v&?Xik5;|^4xfm1LbzkD%OkP=URq%1-S5M+v{j~&8u`wu4 z-@?y&6et`tKrg(mN!&I-iyDkMyt!f&U>RM+j){$FH@?karw;$|LVXnM^O+`Hbi!l( zSfAIj*{9l0K@?{B^(QlDflvC!sd3&6 zp-qvdzhgj%w;+P0RF28v>B$z%X+N9`_}_ln>9c*$YLF zy!t+;H=SyE9(5fYbSo!LN*V&rj8kaoS6ii#+9+06_N2_-JDz6W$R5l9*YijGrI&i0 z?pKSjV8++cQonRQ;leT^c9o6LA2}h>4c+r)Rl@gT|%qkX3H9RT%P0qHPS^2+8}y zbh%$p=O-^iD3?IcIJCqjn-hi~mOX$ve_ONMW!uVqMzn#JJ_NIpk!YVm9Y8mm_u4%K zw=Cb9=Rdx5uBqrgRdFQ@tp0dC_KuT~BL(lBF3ATIV``aq7*8?o%Jq$S{d&gT950bK z#0ap>zcKNFVf-k$3?0qP04*flbL$5@dh3P5V%Bm4+CM}a#LzGg?9Tpn5Lp)#r^7`S zvU93&C@burTV%VFS=acok@<~;_F}fipV{ZumHiVfxt4A_jGdF0%V*k=Dz&_qaS9Z8 z*~60WL1jVEk5 zhpz1*P{2(TH9C^Xuka6=dS&=@X=4qhzk2=Y(u((fjO~Ov30{>9 zsWnfr8zVJ~@v^!4d)f8aB5RmPZAAVgJk$Ks0{cTz~zzGgD?Orlm zv~=t|G5jMV<802t!u>K2+xl^T7=7e5x2slPqc`V(P^V5{z4me zni0P_OBMj%h}Il?Bi!%bVUm#i72VaN6d7xe%WhoM-e*QLqO9X8USO>sg|-Z7}Zr;VlkbxTrE(?v(V~|9BrPMXSQp3lIv^F zCdCN$FVf(T@W+~e@F9wEE#ABPKiBmf)iyp9^s%Q1zKfAqx9e6M?LF$%N{xBFTCG0L zvHH8`d9v8WKfDj1d47ri<=LMp(Zl4X1bNj`?->H`6DeZ=ktJnORW{3u9YBkkkzz!dYl!m>Gz>ut_QiJR`(`4{n+V;iZXp+ z99zw za;7j%5FKfmQc|KW3E{*$X4fw}3@P{NY|l4hwJQ}>ztASEXUXSrb-uB+?Lh#=J&YWX z)oW+D285G}PJeB!0IQ=s5w5pZmqv#apVz>xr|(Hr2nsTUQ<-58iDrZ2ysDFx8M1)y z4|&t-tdbY4XWC=D)5DnqkFDv>=p5|Oa`Sf6w<4=;V?-O?IsZ1S%N39$G#j7R`SHx1 zR9(@}rTZN&zr=uky6S0h%Q{37b%8r=Bn6NT2ipdR+x1)O&f24e1 zO_$RY_d&K^J%Z&6hA<(`q%BUe7Y^gCx@-!jh&k_CrEpOicD_{8j=xGW7GWEQJJVdM z1-y~GIiD$SAzBDw|?@c zYi|egg)*%+G-`K0y9(J^vJ*3dxoB6@|@_49w+~+Y3G;3RM)j@jwh7vwW{u) zoa$v4Z<#i9uCL^gpeNKHLsRiCL9jn<$a($?MI{?`(oeXUYSdr}0blojxmot!w9;P4 zrljrLDiFjoC#Y2I&yB8^$1lpp3veGNK-F`-e8{ft_xG3p)7%hg%=GpSn@?;Z)}b41l0zG!G;ArxdnA%jAn|Pef;Zu;!By~xvg8OUE@2v-Akf|` zh+q66LJ&XV)wnf@!?z?@_RnamZC*9jR>{vc4x|QNTH;8D5lj*(7v;$pGd??-oVDix z+S?S)&%9WwBr()?n=o!>P2mfsn{xz47U}AkO5yb)*8m}aGGO%Hshgtg~g|=t=-ASMw#L`zq;Py1ze-n zaZ5j{vIysLTg~v;*qo)RB}l-OsOLn0UgGW&%BI!XwTwi+Co-Qa)xk%;dw4}^KP?Q{ z`{FSES+$o==k(K*z4AeejdC@Qs==UvN0@-fzdO=u<6Yz^7_}yTyKl@2`i z!enlVS@?S$*mD{vy0JAXfD5zv zxOBNi+8GEghW~pi9RQ;_467WlokS)b*=4zhS>g z9v9RrOsz1R|NZ!h0%5GQrtIUZKQw~k9UopW2ewy_n;m-WDV7=)x1{3{kb*g0q%^^T znPLrYdk15%Xozu66kW*UXMUpMzU~2ty!YC7>XP9>i%916_0cc)HWQ^~i6wNJo2-S~ zL*G?8(ug2T;S1iTR5Y0<*j!nQAFm$BkKog&P|9e992C+ABsjS)y3-neyyj37lYvkF zY0FW~NIul)+EJ85nJLoAfxlAz&GXiMJh#!=T%6i5boA2`+55$Jx=UJ`sn`th<{$o; zl9F1OT9|L9a^g=rn&OUo3k-HPgBh}K-@2B?W<+M@8anXLe_y@ZvTVf1A`gXT=$4DS z#{%-b&KA_+x_Gx@cxq4*%7;9T-PY+C`TBa(9)y}26m#QTW|a~;k|$KR@+g?X9ma_= zN-Drz3MYMFlp!*8qq5_mwaOM+o{WM`j9CtXB$6#TgB*gNWl9^`G+L2_745gnqM0Hy zrHak89@-SYS(N%fw&j`o_Wt$qmR;(*x+DpnUb@Hl_$==)e zo;s1yf&bbX((qL>vTn>IJI=)@4{l!#rQQnquNOMks?C&s^m`o)Il7%BC%$dq!2Jhs z-v1G>FbpVf&`U~g^aaOkaTa$^orB4RH(~?@yx$pChaY-rwuo*bRGl5Dn@mJvx-tWm z;>X&e@W`S^WZ5;DXK+PT#-`V-Lh@S<9=C1cWOQ6oVb z%A9l;swsFb9fYYzkfX}wt{z4qLAKN&c)(EP$1@Jv5BU$7({#9q&Mi5+GjI*RNlT^l zrDh1!G>gbbH;vWAs->sD2giUrDEY;RO! zzkX=~*6#PJP|9>3+I?s|)Nsr39{7iL1`^)v)0m@-XWWK~VbQ5aAG;Mtyrl zx|Q|8UH~LaA$bG?k~|I5kPa134o$k67CJLpWRVCb^Ll)|Kn~Yk+UOK7Id!<{&X=+{(UJnp^8eU)-%~8~E1m%kFQVqC0q8SN34%ToT5uxF35l0*5LCxQPJAwr z5#Vyw$m}%J$PC=_CokJhAnbJpnD*y4+a3a@U*yEzk4%uWTCuj6IUz2pVvYd@Ie>TN z7PuX`_px zr_4X0dBO|om}7rizBzOM6WDWaiz0wYQ&(ax&$gQB!yWX(`W=)OK)-wz3c=W@`s=9m z$}PzCubvvuH~xNmD}H%A>t5BMPKr@8%?|5|Ej#=^)`5`8foVoo@)g~@d_^GfJmlvW z=`OA>LyCXmEqZjV!n=%dnu?wIDJzFm5cb5$NzX;4w?-`E5Q>-^Rps9{e~X@!#!+N^ z`bf!)mH3+|7&haJ*CCX$IiaCM2u=Cr-`qXF-6}uY$#T`tC}cTFv=Voil?5j2^>K%< zpyFg>c$O-NLzZU4VNRkEj*ddZm;y!}+gDa%QF55ixWzf~RE^17pviJ7-ToRF`{2tp zq9by%dT40CUJIVXab&-8A|QQT;^5E2$bLf;DR&J(`k%TT?{(C2TGjJM?%yI};Sfqgx)JeRJ7*s-tck4LnrV8lTH>On{80^ z_UT(Gvv?x!@-e&G*~`SvdQvkl+6TuG@z_$2)^;EX7R>4K`C&{spGA1U#k}EB*esXX z!}|%FmR=fGo9QV#MxHmID?Vpn3Prf;6Ctx7C^F_hkc-YbsIiNP*;4c6+s!%Yi$JE) zdu!Hb_&U|3g2i5Ovw_|X&jkm|1!W-!*7svMZz{~im@A7<4jhcoVMg|L5>Zj^jvPcW z-X1(z)J8IWhwZWQcZC=sz|Hl{O%@$ZkN(FIdI`9uVY!fCxt4=plz{8f58u~qk`W5A z5KHFx;NDjg74#Pp=dsdM5<4Fz{WB<30^_{RWDGZfi`A30fB6D5xSkc`9@XW`iDI;} zGI>a!pdz%^CDi%oZ^BEP-Y1ax@#duN)PTlQFYtp&%?x+24sG?R!}9k4$y8Z|LxK8v zuXRhF4KfXN#XJe`gDSph=v-z~9uqSs^!&;o{CXx>$R;)QUMTKA zdiGfuQHUvQo{4QT)YC=BA>7hU+{`8Ts*$A<+Z@>1cAronsm(>|_8*|_M`B56EjQb) z*fTl}+n{x?!J5BV+IW+b1S1WG_-gizWkbQO|HX4;V zyQ1`G%z}ePM|q)GUu?bWmX~Ha9UWQ_9;*!>6{)et?m*K#(SBjijPk+mYG$G&Ey*R@ zPv6#?9j-0&BH1%Sv)LJBb-Idvy&r6(_h328|9JGAk>VdA>9A<8hv{)d!|NnZCwjKi zuiw3|57^X|Nnf&gs*w2#bulyGiugjw+5x|Ds4i9CIgXCt2U=b9I&4M{FdHDd@6Y?l zb}onr<+jrTFH!ir&Zo2*u;zC+B4eDI#kd<&k~1axb(^XkMmsdQPJ-6_CW#hXP-+F;Lc}KB(<@srVqAe z>N7=J|J(LP7NA_K+li+wFp_bN^QXmK)Oi*J#8iJ%iK$+wP;J-dA5_tnO~$7_OyRz@D2XFmgC$jKTPZt2A61!WkR&?$6L>^5R zehfdQyyO?ghoREA0=4cdsri3-H>pU}MWi*}vIw84RyV9Te@AOCf1z5rmrGyC@DsQ6 zc>tRfc_Pj8plWj+RCYnTwY6dS6BMC73^%SKiqv4eB#7h{O3p!vJR!6OQXM-# z)Pb)>A?vesnO)37GCoTA@&p3551>h2dQJDhh_;RPi+=SwKdxrE>=B9XecqJdmXcT5 zn=z4iPX#!pl`AamUML0FPd$pmJeuN$V5idHP5`w`lq)%Yq!4FKW1Cc5_j_f5tAR=)1N4St`Hp6C{3)m2Y-)iC=?SYCjvBu(9Lw$ zwu&hVx}g{v&n#?qBUT$T6z?PP#->QKHTER|u!n-kb4l%w_B z{8f|u&zh&Cnf^qv_qR>&g)j3^ha+7j+jA23?Q-ve+h$GduN_~7|-?2($b!lITKi>R47ua$0>4Efc- zf5jelDeyDN38Ck#OP#;DeJKQj+Q*_USjtZW+ZQG=R-!C{4~mIh*Mi{UdhjALFzZ|3 zz-q<3pk4I08IZcAFb+2c)q|tpVcsx$L-4CDSM%OmD-?8oP2q0^7``-lrcoU!Tn;Z05zs*?^NOjW@Ny(cZ<4s7+um75p#G6A z8leo#!@UZ5zYNB2qQ_~Yl2OeK0TL{{8_D?($;`W$9~y+!i~W3T6m@p=G8I%;v*vyL z6j64X$IubEl}@?iPpnxl^hqJZR>CoiYq3{b1AA!TO)ls5^^GYEdAnf;;WuYD*J$~B zk><7<1g{@ZVp6U?H+Ad1OrbHa>4AYoo2BXaAilXyr!b%?|{2mQfA(k8W?9UN^cv#jxT-1*J?h;2tHa?q1#o#)v!cw_t0JA@UCquzvtUHRsMIf06z zZPQA)6@~kpBum;q2kA4T<`Oul-~Hh}f>}R`A+^egeAr#U_xj!aO4iKob@ZkdrE-5g zk5%n2PtE_xB}~cqEA(;xsQf5bSrlqJSlW~aEn&lS*bYS;>hUgFe!bXu89#Hk?bJl<`(`F^xtv8?tY~R;Fizon26W_-hc6~+U z`9n(bG(u_9PAv=L_rwjtbMNlyJYn|{|ckmLd^N>rUQ6!5(BQydrDDP1U z*^<*pJsp&3q;|~-N11cp#jDK|&(rh@K|`&4I&+0jlHX^mtEn}gX*laJ>HOFG8fq{B z48A?z-OWBvSIHpb!na3le`Z!6x=H=8Y=nTMwG+P5m7oxvkY-piUeKkJ5)JzC6-wSxW%13`-4bjf*5o8 zVIe$8>r;CP^zO%ApT&JI+83S8C$1%locvm}&gmrT0}7=&oPn)L4La{MvIz3aM_VAK zI7fd*p6ZIHW>%nybw{pco=9fC{fW=ObH+Pu#iNUZK9oJWJ9+D~jXjnGy}j7E2$jI? z3<-rWk8UzDnPl(my;nIfmuIYWylG^xxrlB6$H6H>eyDW;2#g(;CTwL`=}1bVxE~pX zZsCMQbGG7)++)?Xa%@R@%v_*yucWQOE56MJ_xYY-))wtHB%@QTu0ww<87|zYwT8bK zZt8wJ^3FM66Oi1vL@2g*3=tL&x7_$s$K`qZ{0mPr|AY<`Z{xS#vw%-sWsY^h;H;JC zEpPG$ff&Wt6b>CG4akvj{cdxHYpd?0oGEii?cuz@up5sFUsb_W~Mz19x+QRlY*4#Q? zoo?TQ#Sf$xsGv8VNfqHMqa=JMfh;&Td>LUZOh6Zgvrey7+*f$+Lt~aIluWt#j)6&& zlur%O8!%KTr$qa`Rc`Gg^5Y3-Yr>E5W&pC&aC)|~2{VS_Tj}-b#5BROurJT!MS%Jn z?fBSoWX$g7_iG806CTqk-rJfOg};7~!@|TzLN0E|*;EnE9R7*zj6YD>1+#@?&;xvm z2Y;LektOq@iaPYFd|Dj2F{yW?WRvl3XAX2UhaT7N1b2Kt4!%ka<;(kwzi=)OaOEE8 zW6*t(v29bA@f1fLv~^0n--n)|ldFj@$T?7vV8Z<G1IoN-bd{WH&p1@br3A3Y6C>L$(Ud=!V z%V1Hkk5;475s0QW`ECDhjnkyM2An0$9bin+G7kf;i-^i-?9x4t5#3_#*!-z# zR{|b)_AimrtF7LrxER1X*C}}KIxuA@SRwz!uGYk@CS#1I-K47VMB~TpAw()-VLVXf z{{W;wTfc7M$iK_eJ9$JG+j(!j9O44J<`sk<(71(&0&T%?K>&>Ak7O8{B8;~|7$QEP za)3k2CkV7eBpE>)Big^DscLz@=<314hrCZYr9&jg%#TVQ2#H>r+ij!jBp>O~>|g+$ zx0l{F7cOT~kqk_oHHOfti4~I>d4;xpx%e)vO(1(gO}Z|m_Zr_%E(l!Zr5%qyxm?LI z(8gfPij&&Sw|D3klQ3WxMG{ET+%u9en53<;4m`t%fU*98;P*d^UT^Nl-ri#3@o(-S zaN!%kK3uKlqbez9XJ3B?*}uUJn6T3%KtK+`*LT@^!T6&M&7ffhD0}>^XnV2S_NvH&3rMpLMUu%s`R!hn^Gi3>?57%ndZDY~HvAn(16bZ}Lr9*ZU$q82ml~vBhun>_(IJFA zV7{JhHmfytalC!7?^{6$jF5C@#Ay#mZs5jj5Vral)WE_%OGL72n&t*M`+A+C{9ce zV!?3O5*CNuAtz{^iVM3vXK@c0>mLPv%gLfYSS)%IG=1~MVm_FA(8CpMK(;Vzd!h${ro?(<*Yy7&F8b3 zZ~qp%xd%bt3wqQW7#J>Q6W<8-CL7-ojlXIQh!*hn%}9QG(Bd*wEp3fq<{kmZYs){! ztPAUx%_w*Pj<x%-_(;#NkoQv7EAP*)9TSDTjU{0qLHh@{t z4%TTHiqRdWcla@}2aNT1uIEoZ_)QiAKl-xa8w@5B^ne(D{m?tdSM%Ot*7t}wS$Y5* zZknX-ebpN9sh@xc3RGjCMQ8cM)_~V{n;yb3+4*gPCCu8=kL(5lQ$Q*~w$Q~fBGYDI z6Txu+F3lnk;g`6$;1QiZwv}9AS{JOUVk4M`JYd9N!ubzZ5&x_L-AvpIc3@J;>_x1; zGB@fA)6`q(M`rV}VWauvqm46UbaXZVJZ5Uago8YY@D!|*aHg49wyD?((hE?ir-n`a zqB=m0(i)jF5&GEV6_UG|HGUdAuXy%N!i}RS2z!N5YO*4rVG+z@iV&77rJ!?URC#dDmV=Y}74^ z)&`3#m?FSqW(mUT{&WYL52!?%1hto~+zy~V_rhrkKMy_+&= zzHSZp^s=O-3f}TIEKPjqE02In1R<#dTwALLhv?Bro>*%JV+!@^tq}vc3>5MOPyE1* zW+wiJB|I1aeX&E$_rb@y;e2<96-n%R*#wt@+dxyn#y!jbaeG69x= z%}M4~WY+KDsw@Be)U>C#UurgX>nq`sJ12whVdV#W5%P)B0)m9Ql1EPxc#E@Gx{Gk zfn?*@10|P|Arz!+bO34cLk=A7!c4_XXb_VeETH{EHqVL}XeznZ3XpScL+Nj>%Lf_H zPJ2PeCNXnuOURv`4#vUCO4w?#zO9wLqJd4gM$^Fdlv@-w&^kpXG5EvezXyg(MpYec zQeBanaUh3jC)$lLw3UPu8P6ff=zpHazdW)224imzAUEC32fO|p$T!&e0T_%wk8Oj# z2RiVb@f!bd4_iSH0(<=#K7%R*r;y&VPV##26@Mk3Et@MWQ9FX*mI^oKFEd(P0OL* zGmCs8V5T1wy2Pl8i}iQt{QNvS81T|NA1ro*-40z~e=q>?Wez+XVD1G(PH+S1qXqPH zF&Hp?PQpUL$z(Y62>3N?!1GBS>{Bcx$T+wb5ptKTXAr<`*1-j9EML?Srr_umUu(cJM1YjcJ;Ij_JsH|i^hQ#U91hXC2B@eWup5zBRcCin}`fU z3oVVWN(fF9J9}{4B?uM)Qrj_B_he^A3Pr0Lxl6M#q!c^Q8y5`}x3ke0^WL0U)p6C);_kfb7>-uTRRKpNn^X7Ty5~33@Y+j1z$4vgcdG z-f}S;`wnUJ;>&+@zqHGMb6Q?ya$B-3;FW?hHw;A5yi4MT&92BWR}2BPC(N z@)=&xxO#91CKp=-0aL;luX@5}3_C5y`0vU;VxYRHL1nWR4-C%@Yb=;oS$C@V~ zouF;DcNT%}e-$3$!g(YoK#`y#7NA+88bvzOsh1l+2AC@kj`^8744Xk!>SX$-O<&R) zW+^#X3p{tQbx9A#F+mDkLy z9?^EY`%B;W^``d&pdJ=|9^(e+0I~n`v#`gzg&5BRjKo;~EeCxxh7<4rmy^kYMCi$a zAGdi^_P!{IJAYMM!{nrG2qRZvbm*&e-0M*X%mc^>2_fTcFhSjf81zx=j#Y1KgTuNu z8Ju~)@SXAgboVVK!V?*Wc_3TdeMyPtRE$$c$xRsHNY`-uP^CH|1!HkPj7MxJ-t}tFr7Hn7TX~{!Kpr#{r7BnF#_J9!qWBs){zn7#p z@1`?9>|Rc%zVY+D9B#iJ{T6-nf^%rx2D<(N>jqGKO#JKpmvguP&bSElA16S+S-&@g zElh6>>fHQ`Yrt2dDlElXu>mT*ySu)lCNAAf{0O{SLkfaZh<1Ql31aFc8PM{74FgLv z2`s|_xHL1EGJH~nO`v@6x%ML&uxa@(mB`Q(z*Pwb;@s$p37CK-z^uwDF=FVJB?ko2 zU>FJKT=2niWWEUVlB7+4Bh?ShUv>!0X}uD{mA6u!j#(s9B zz7X>gTMZ&8gl1ZJZ6V9&f)`;LAcPUPu*F`{5rSyBm#N3&EsE!0&cq_g@Nlez^g@OT zVpYpMa2pXY)?Wks`m^DD${X+HV2;ZN)_xua=jiRGxPjY0B60We|@jF@cmz}w_5pTus8B}Q2+cT0Q8tusi_HnD}{f42EMa3V7=Uo z6#phQ2u9(J`2cb@-h@+#vHgto5o>7T_RQU6== z3R0RQDnxsE$UnljHpu?qpv#S4qkQ1JLwE@$sA&>RPc5e8{^a!xo!?}*0LTpnJKQ@Kz6G4^`cop^ZnyIT@M4PV zuOEa5i#}dDoAnn{$$tBoc|BPAUeCX9vcN$Yhu=vLLSWx7dI(%BmmUR|TMrhSFRTGy z07;kY3-iigS1YqL;j=B1))d?akUGZ=uihy|! zt`rHvhHz^>T)gtuG(sRBhSRSddx?P3d^EBHG|65fbZqq>SRUpg0OlDU30A3z{9pV_ z&B`iE#Bes(0}}qs6_upE!gLqr>@4OB$;yf4nzv^R0HKs=AfuRWS6=rz2g?&M)6R|# z3fk9YMbf!{7*fhHfq)vi@zz5yEjm+gL4#D2j%21w!9Q9=z*v7~@ca4YVlf+f+#5`J z?wwCB`@HDxF#k>fdV|?y$JHNh9Xk(bGfccQIG_$VDtiRn$q8WsC#>0GGFbuxhtSH+ zD2MA!hC>QMum*hgWdN)buKiN3{sQ<30J#P%M!nIRq-WV8Fdvg4An*a)1`|}$p0|<$ z8|(!E@OEniz}jdqwHAQr>Dpjm@&ZYSu5txpR$BWd!of;j_zC>~@{oh6luQ6(Bg(Vc zVTJS~^9M8!=qzP8lFl4#<#hI7>RXn{>58s?Tn5S_Aq#QjbaN&phInbcmuW<#r;|7Y zU|EFEIV&5U893ghcZqtpqV>tANX~cOVn;i<1DbVUU;<*8F2at`ew$BVaL0-W80*gp zetqAy?WR-k{Q3)ze}1GLK#5a7iIlsVaaJC%Imc3RqP55J4$Z04t6-vUmSt5KCSqmygEmnE4i zu26CLNBqODYpemU7?e340_vy=HtgFF3%9K%#Ox0a76|ML(fo~QhfrDquMli7O0 zSU#qiV&N8yC11|lZqk%VNe6rg_3!7fa%!2IN3qxX==i^JfWh@R4-XB z$5Wkwx&D*rEHM(ZQJ518ue5NYfR1#74l0jCN?ry7XU=?I*tU_PS0t_9DYkyJ`ZL3P z{fHvD!w)UOLN7SwTUX963Zi8&P-uOkMW0Dq&sA<4<0T~4p9}opVmh7sVRzt1UkE&) z^zd-!Ct=?U`bT{Sh!Y6D^v`er9tLE!Pl%jF^nR z8Mj&JG6US20lvUckT-_vLq_>@z@i7BB_h!tW?Kd|92LR2&cS{vuE_+X&;##F`1?`! zmdF*AMyQoJ{NVtM{ht3-IhX^&94kr6g8_^Iqp~l-`h)uwwIIwmrzv1VcPpnH%uId- z7Nsd6Tw){?Ed8L}NQ*nOJ$3Hj)NEEQT}ofV+XV%^pE-2) z*fygIj*VV_G8pXU_%3yRK)%JIw}S&da1lbd9uB|@6uy}Cmct(B-ih!2d=EJ6Er!G8 z7>IGoE$;bbqy?R>zhU=x*ABp#fjtJ|6pZ!XW+XxI_z;M>HE%$oUEQ{QBXMBrkyd`_ z4+V9#`ahd^#em`A7tSyK`CJbD)cyhjn*>2fB_lCC?&%rEA~kuq`F7gB5C&}6$CTgf z0EA=%NhLB z^!9i6zPa0Z2=u6TIlyP^1a0-lwI9hZ9uqIA2%gFGc|HMC5J)&9$*&Jne4yTB!RxPo zm`K>``>%Vw`HE^_|HN{*^fw!C@#>4a2c1#ZOo9X6 zZD{yXkL86*V?eoMk@ZrF06i+h&?_Ev7=-PMs&4VnlF;b_UC9fkv9NSx9+4vrGt`FO zSR9QTUV&TFXFG^A%D&`1B(;bm8Q<{i3!=1wFf)rhPsn}=5)e{nqykCI+)thej>29N zW@PR{&p}yOF*Zc8m*xO%BW*^Y>U4%#nuY^OrdaelqXvp=U9ibCPyC_{gDcFPAw zg-jQ+PVijxhKcoukG+e&$1)Fp9|nZJ{&dmr`*yF-u@?Zhqt zFeP$;KNzCsd97mz7=aj%50=o?LGQ)@ILy7yu#YK8+W$G3=VwNg$?`S>GY=m6iQROa z89ry`d+&mgjQD=UFr8;J#i$!y&-8;FkagG14EBgy=IbY#U~6H zcKx{~-~lIKIJ}_S!wCe}5DdB zaeh+9GO#yX4VRncx=fn##2WDBN&r>oq4m?-mHEM32?VdNiV^wHWIt>5H>L&PHi&^s zx*&u*FehL@;8u%2eB_`jZ~VHcWrj*C{K~$7`lDew9jSoQ!qEZ&vu{IXFukiOjtiKk ztfMLzd$~kx7p5E?Y*Jl-$JQ$=$M!BybstvNIZ4svL#N`sWQv0$f@vBx+Okswl1%V< zDQV4L#EA(6y%26LG?aZ+nzcD0X>d0+DO{U-RJ2d9O%0z>09Ujacy~AshlY_lmWY6{ ze$RT2*xuf(-$!?M>GA6lW3LB1Z2Wfc_w)T9+0Vc~-`N4`=1{;<1BcX)sVuO3&o=<; zc`>06G>s5&62UjX`~cg)#e6vf@z4JT54txSVk$=Gx8!g<_wCJegBwyl|%QlV5kSs6;6UgC`OggnBYscUsRk(iZ`P1pB9A7z)ZOaGyt+=hf8(p4dOKI+bBUxl$;)DFU(5fiZBz$MO_~_fwE8y zvFC9AOT)1k$CH9WICIQmYOtK~wM#5g3s}d`0%u*{Ms*y2qEstX>%|^0*6-5!{rC#n zj1M0!cObZU5#RD_V{Cm&Q?g2NTWazK;>vJHut)mD0t+Q5%m z;HD2n-C42_UKQLh$k^j)vRZ54G35+qIsrisJSf}6I9m3D8y|ZRe_J160 zdF0I$_$C)r-Vsay%$`pfaA^1n5uP)iZOy@1=2|w*W~Spc&lepw5*IwI)LFKTp&SeX z$0kkNAaobzU8g&WWuxm4xf4UMXfxullawjH8BK>M?JAKiHwG z8%(E{zQfy1cfdSQ{V?Tv#Pj_j!#;eo2LQZ>0FDLj^J37~(RaR^E~bFJ2~#g;-2TDm zV1`sA9D92cSOnr4-0RaA%Yz)q&^Q76=ZC`uR)@YP^j+X^<@>?0$BOdRF=wowhO5axAKIh@=a>svNV4fwRpOM zunkP;br1H7G;q@XN(0PfxZES8h=E|kBt%IC8J9TwR^|vDLVtrVzFGb=$=u2E)VUS~ zod#y}duHq!P>NeTf~2}U93SA7AUAy2|5?9>#bA=i$(|=*45)W)Q)Yu{V(CVONjkz{ zYmJ|O>dwR;rU?!KBfOT#cPp{>&wTL{EdX^_F3eoIu(?|P`7VzL80-6uy)R!aJw&~k zg2_DfPrzz~k|zwonl1La^`CWDL-=)=zmz*aqs- z3soF_Ppdjl%DQQc0|P@CKJ1~4?;8xdcx_TL8M7uJYUjrbFj_^LV>M=kD$Boc3(1)l z++^gy5c6_t0<+KvvMHk+BsED~CNDpytFKu%t3_mIR>=Ov^dC&vH0y*r&9;Rzd#m;) z5v-oG)UL{D8+A^-N!zrgMw_u-vJKJzn?k;m9%BBve*9X!063P!h8u!VG0r?qRXym=^e4jV(gB9(2 zKioJLz9*c4Bq$GP_yR)b+n>!QNJ8>0-x8+J=m;mvo^KT=%gJ&m3k2|^mpx=8Ex`et z`N!8oYy^E5P7;nn z#}1KUI_49j0Sm|2fIopSvywYYW#HGnfe8IBgooA2;xD0tlkwlEHbX33 zKWa|FdfNtLe71gD7yyFz%#S*WY!wOz&(sPX! z=mIgo8s;^fbzsuw1-mx)Gqow11Qwzid{21=A<3DBSV{q5!^TTSLG=i)#?DgQLa&wv zZ-dsQ>W(L2Glj`I)E2z_PJ|fp07Kqo0aJVV!-(JFTBp;ZyB|CRgB0nVF`xtbWp`$2 zW-fyCUD!qhjP>on@8zpmZ!rPv4SWwbz}dt1ck|sn&c43&^YbvL-hO{NznorD0Wzf! z1m0Iz{Pj8EQv5r`o%m8bK)eJr=m~Bekp9vVdeHB|3lQ<>FiZs+4!8!yyo)IqX&_5@ zz)aZu^}z(>)Z1IkVTuYy_H2n>aSR;z_59c!c)ePiRY7%k-BALg>m&MI7$5NZx?Ix{ zaLeHH))EWuFw((|$^IMh^gH4SSVs5S{o$lhfeFY)4^9Ua5D{N6>VxE%ieSumB)o5o z0%I3n(ExKf;KLkH(=M*PNl?Sd0$=T+63{7EBPGQ;K*fXb z^bE>*Lxz|&10=b=e;3FkOGGa;JGI3mz!!TTEOiqmIBD74y zALT^8cIGHkgn`>|l-ol7IWCU~80#B#evBj<++W^bPN$q^Fa5|1BdeXqx+(O%xPweD zFFoiDd~@fK@Dh*qNrR>?#P@x`%o&d$3s_+-E-Cyp^5kHszL8dHU8X$yB zB!wCUV|&^hxR&x#w8>F{0myp@^&Xm(NtnLl^$os<-7-S zA863i2^+x0Tpp;)1pv>tgNtQ$#RL;=M}aG zG!9@U@4q4mW-tmxGJktAUTjC082`CQ4}52lpp~2+gl}0eTeUReqHQG6e8wIy)_(FmeH{1@rDbt*tHjM|#FqJU@6?|So@>b@# zIl?psg$h67lk|Ni66(@x8JQGIsPf@S28y|MxqOY({rr?oig7N zi+Mx;r!y>`v2aQkTn^Zi;b$t-TwbZP2Fy(AYce{sbPfJj|Xx&()gERMNi)xQkaIF6v{LWzNGP(DF=LcOZ{YYp5m6>^N z;5p;59nQTTweENC{jFI(Qc;_L}fB(Ha|N1)$&)q4eeiw=wB@JeESFI1G1rsi?ihr{#nGp;Q}TwGDgLhz1eDro)AKj z&2WU~>9cFVpZtit*{nAf(wp)QeD#0}-L`;0z;d;b{rz~;1_IL-ChY%8Zu>$aCf`#4 ztXs&|5KzpQ8tq+(K*AlQ&SiMzAIp^mLMQwNw_yLi%*pTjf9#zJd*kSJr6-QJIO8~p zGZ6{^iG?IqqDYE_1KQoeFwFn|O>@sV_XDXeRd;)yEOsopOAAG*s@sol-Q}G3_?6dL z`02t#rKp7=N3oheMS?{5h%9ItIXLc8`>c%2*cXMVq%d@62o9}s2DE+}&{&kg(0)PI zLF%!V;Tr6EXq_vPd>K!@8;l=4nhU6xsaex9tR_Or# zvP)`KV$b}zgnYdGk)0pfD>QorXIluIN1Q%p7CC#ozTI20U04lU>jWWm9y{Xx#$kjL z1e#}-NTCb{%)G!t*8l;sAtdk~uLtyd8B1PE9$;H%fB;qnr{M-n{1uYVAq&hXdTH^$ zHe2;pA5j(YSc8|=dcOvREA@25djQU z3=z$lBjpA4Vo6_K=8Z~7uW}ld-9h~Afg6IdgK&(HNLzcQU4+5AVD5Ru1k<`!YA7KYP z@On1-Q$R=_PSJ_HC;1~w(|X>IDfr{%k0^dC-ZilBgU18EFyLCVH{%~0hi7Z)1}^z* z=w;2bk~Om}B>Dx{VN#!GSmaO!VGLPS_X`gH$@3eqS824+0log|B1`%~%y7)a z8$=a7%3xBCv_cr9$s$uuVfd2#MUg!hI1_qG=2pFsZ zaVQ=!=T;eM&@6xU%`gVzHr#;v%rO@rn5G$9tp9*V?J9)70fzvKaMQpFjLSy`8*tg8 z`Ll_51@&{cIzl3IJe56%U@L%SdD?-H^4=QoZ;m@FfV=Z~BPhME0Y5)20iUK|d-!@@ zZ8j$l1lg(L2@7)&27x`H+Cc99c>E17o(`f5@YWZA%tN9Jgm0AzjHo1LA&Cii-Ck2B zTsjRp#DVD65zv6wXpuUjjyWNL>$}K9kkUlwV7yX}ZyYv+Da#jU;e=n|dXji?ZU~T? zJe9WG(SNB985*P`)u=cmq~oNL$9|{~ZGnAU$}!lLEomMKU>ZCi9C0T%`qFrU{1(;S zC~`bj$P3Ox^$d%{L|G;uQ}D;j4-~(`CQ0l3?%)^{SpGrcd?(Z(?D0?%ZNe=^%3BDuKqTM9gT0CggFP>&`V*AH-Cpi2tPVF`uPC8 zGsoaHq=Cf2PyuaI@Ik>x;qDR94jiclih`if4{ZP)`n(Q2gr_{X;D?h4n!7>b5OgU{ zNQ0&%TA`MTsf8Q3M1A^4^(zhe!E(pZ{t++v=u%|o&-&@a7mH!&&L`sZKN!&;FW=kwHB~VT_nP)x z=>0~fl~cYl3{dgW^ag?f)_Ab<7Iz(ZaUrg0g~N4&8bOpx;!w$erWI}^9(n-uWo$d^ z_t-nO1&3f%TELy{A-d%{W?^;^PFF-;A^kG5h7Wxo&L3C`Rt$c#H!Ft2@%Uk-v&1lr zq4!u;tc9gDfu|!5!~L;5Q#SI>Pr^U#(ElOuV@m|zH4a9QcRIjNjEOs)HXe&y7snu6)+~(70okqtBwuetz?TD)LA}QTW@d zOu^Un1O4}?e^3*$WefITpiRZUiYbD@StOAMIHKtmTR{(sP1YC>Qr2jugrU z5UEyyAyS>f7iVMTA=5mlToU21RMR-!x-^CuX{`uTuKz@P&e`J0>K0)7-rh}%doI|K zU2C0)U+wIK=tB+j@$!}8XC0Pxa6>W7Jn?3Px?l?ka0{*;^?g8*Ylm!x)7NTYTLZ442alYMxC2eTHuYu&x%jIJ^)IU= zgGTF@jS#&s8Lmf9n6*8HGT@)m69*+s$4I0SyFzUIa0q7AJDz$JKCB1v&k+~X^OtMD zpPY7QPrKZ+&AR5#kswbUV7P=t7t!%A5&_ZxqAVmee3$)3NPL=rF(a$(lLdG$g$!N6 zDsoB$<`G0?&ubs&;kDx6Ia9E-}E zhX;C)Yl=d-CVL>2;Y^!7?%eWZdXg_o>zugW*+I^cT)$!{sCQ&@_^|b+;r8p*YkBLP z-|~QRkVO8Q^2sM|{MmIPiJXh?eCYgfGtR?7ICcHahcEc!<%{C?o7TFgcE)yZ9Oijs z^~2kGfP)vHtKkN|DKvfsCR3H zItJ&Du4&2>+CM0xA%p#CU11sQGe%B-dh#W+*mVuk5$b8tGi(&`#Eb!f5AOt5cCDnMi^?X=^Lw7;Air#Iwc?h^UTFy zfms+2!T8oe6`eJlgZrvw>8oG>;jaogbLbR-e(5VZ;Glkn?yvKb*OleD?4bd)YKYz6 zs>C&i#x+M?>oZELHSYMNb#t zi->^C#^fUKpm=nYKpTVC;RbRA@pS8;7cuhf&$A`<4}nMQ`1V&J|00h^O4$jLi>29D z%D!~Lzler~Q}15knAYB{*9wM{zYU>pJpGdNr`C`zIxkXOOLh71M5H8t zm^d7P8Yk}6NEca5^5omi6Q{{Y+hPq}5Vf$oiyvrJ!4z^8OK%~QWXh9e{Dn3;c~D~V z{K-i2(F1x#oInOEmo3Xe!m56kG5E0f(j|a5hvH^TJL)Mb?i3js^ zBq8I9$O1RV`S-v?9AK$lp{SRk=}mE&LeYCIOx>5}BxjAkGO(d^;k!(aAR|6sDi-Qi za&?Y*z(!AA<`NGYS)k8xV9n&==;5pw!WWhvFnC9j$CV|C4j&cpFZ%`IZPm)E%y737 z23mpDxcNSi=xn`SG2D2~z;ru|^PPM@B)iodgE<1DDWnaUC*GPZBb0*tkbFO8UNRoe zsv+@L8M#^P326dG#s^}K7<*J(msgRGU{9UGnT?STCT_;%Tp`Jj~?(Zy7>L%uYQ9Q0z->z^o5@92IXEo z3`22);iE2i?X7hP!3hLTIFg_7mU)-DlN5EQRPzDa7!;L9PK@j4p!yay1&zTwK^WH0!Gu9L-4OJo6rJo_d2IeOaJ$s9#9WY(XLc7 zCRwO{^konTU2&iw`1{%daw>LKKDs&v1!MbnxY81$4p4}!tBNqPLOk#zk_QAQkgZB0 zgD%&?pYD|e%(|v02lR6s`3f*Wn;627H2S9ESxqUl#`1c|+D5gr2+_C(r)i)Ukn9qL z4B+(P-*ukLqKfvW&@ahi6{Pv3!)~Z~X_~}~YHzt>EU~}o0>Y0MyKfxG31KjHLtOaU zMN<7_ol62MfBn$|{$&C6LIrEZX zO(4FAh^vuHKP!y`c7r${cHqx(Y{z-?0~4Gyb6M8YxjttK9!0wIRk z=oL1C6+1v!KbUYt1PncJ6$av#JQ(ZyP!!Sofecf6O~m=*+^<*?OKtxujK`>e<=HCX z1x~RqEOEd1=RkS}xtY1U@!|yjatg*AJgv_s8a^)G2_Ck1V^wc|*=(f?+@c2V-TB68 z87C0kL7a!L^M}VH@zE~+nqC5x&qvUBR=+vy-zmdqRflD(bOIc0R>xUZVFR%Fh z)o-%Ct?S#jR_)sQ+nc6XTyE>^R=8bvMnh<=-Jm+B;daJSZyr<@srd6Tn5t-8e7QF) znpRb;sSC*YI5u00SGPO_1M5aPPrzib|s959Z%3Q_wN_ZX-^?NJ;XoU!){Vn1LM+&8IxByn%>CS{8NC5<(}b zBk$SA#jY|@DsYHL_kJ#Mp$y+=)UMO|l11c_E*rnF?u$c4N4UdE{-G zAyyfS+s&$3J##;o&2spn`

8<#Law-+A=_lT9|*m);kbpF1czZropA%^$IJ&|qlekKVE&QSNMRA6eu2XS^D;Ze74Qgj z1vkw4tq_miH(7<-FK-}__u-=+C>ZKr0K$SQum|ZGhhT^T@j+?t;uM0ExT*YN4fsz> z{W~~^C4T+l0{mtQew}u!-3DzQzf?JJ7qxk+fXu<%N&$F*6mZD}1`-h2ZUX-uK!Vwe zlrJCfT2*fi2EsMsD6G~GFYFHiPW5sKiL~b&t)G^B3n0e5ao7Y(44uT`10IC6`->x| zn=;vmB`@*4;1q|mh*H=RN|w`rq8GF(^*$_lQ_$kryD_g=`P;hpc3&4XGJ2b8rk$2t z^jzLKolBnRFHc{Tho&$bO#+H5m#X?>5BQhy!u%o|AIF9q1MplJTm1?)YwrL0E{%gB2}2pkT;NC9C+I_|&FF7`MWgMVK&)lrMT zvO*Lv&L4mwShedQh^|&AJVr^h^?s-0`DDM&Us(hGvzI^AEO{!D=_~awtO4^wuXywT z!?*XgIs?NE?Am9)eK-JX>p1BB{%{}yYrXfvw~g>A+TFIad2r`q`D;R05;-QXOLBv!GrUKf< zQJ4c*OESuzK?SUE9bwj+eN4k!13E%S1}fnA*1L8+bT9?OfHM|Bgdt%Eh;9%F{7Ql7 zOh?DA5VzijR$-7~;0HcI6$3g}c_tp_bX=WqKuEq=1OBpiQ44Rjd(MoWiTPy>R0VuZ zPAfnAItyQwj$oJzjUbqJA$9WsVHA<=S2Di!nqUGFQK@=fGSg!Z%Zwcp?P+mouIsN5ft2RSBpij< z4~BT;srQD70|AMuPm(YM=ONP9F$I(kdZ8jN!JD@vUTzqU`U@Vp2RUXrib(pL(1e#v zPj`;xEV76RL!r#Q@`=7GWASGAsDS^|i{GlC&ShXyn^mrM9`0z?Y^uejH#%{Ed1q;X>ap>6o*;B3L zHZ>M}AR|--tZ{fE*r%+4IQ(XaL~km}o*MvBJ7$33@BzX>GZqyYR~d?5i|pUb9-#&h zmyp$};}L}Auj;BJZXp0f_awlSt26S`k&tPlFK)o)iF-g|vUb){rSGf(H_mIZDz#?H zP?Udd2$m-pYQWRR=VmPYctzH=gLUr`0x;DFy80Qn-z_4~0mw(uTYD6yHGyl&Vrcf| zEoM#k+m_I0JQjuMx3xeCAe}}ogxNb2+9QFn@mtFa%-ZMR`zKOXMEaGBT$Jcbq_gyX zL29hvUOaEDJdwcTj_HA?6^BL;iWVmc)`qdj+C0hKZSJ;_?~q`{MYiX>(lhg=?n0NC zzdacH`f!S$Hil12zx?4Xe(V-=Pm>E4Jj})X_gEi3E+PLDi(l6DeKrp;Xjs{^+E=q- zvqo;d4OXrIxVJ}X0jY897;m7pK(@>cAI-k-yCLyolufrNIN)N%2ZtN7Fm0fw!Y|7* zbd#u^q}v02Kvcqvytl6AN{_vwO|~Nm2sVMM;*p!cZD3cx{Dx}Ak0E;j4*~NpTpkT% zE*+A9aqoa9uIX_0U?LL6TqodzfogT|L@H`|JRik>!6^hiAfQ;Q^33{pIv>l^#eVGH zTLXG_2h-WqNxibpz3Bm8_{)dje0vlYdTXz?$V-P9Mxh|={=5|Odul>P4U{RE1ZezT z2WEeu6J$q71dK-l^Mi<}XcRu?z-`5Vb{_uItz-T0c-RlR(vFmOz83O1a!_!&yYILLvbH(gVjGPVE7_5e7Ky@2!gF2 zE*|i?A&uwt%1+t-8Den>#R201vv*FMXT75%7>{tvz#6nKU3f0dZI-Ym{*_A7+du6%7 z4PgQdUP8g^coC1q)!+G$eT>`Gfr8YdSw=BtEuM zC^&@&@(0r@T8do!?CHqkC(?`TB*Ek6yT4o{tx0(OiJj?^BbP6-LhKkM)HydqlH~7*DE&Fg98D_*-l2=*_fq*I5CR(KWGUkX-KqzJg zQl6oVDLCkkz~95fi)|hg;j9$irI$t}mE9LRJ$zMX?V`Qgp>*OKH*SVQlZWbS^%NK^ z0I(o+DR2v3wUu1Ipx^^~4>p!{d$5q8$Ps@<35>la3edVjn|Y5q1Y0>h9!qNnk2-@u z1by0_PABXL&o&8L72IuhHbW-A{eq13x1QX_L^dU7+ ze;34FUc&ifjjISFkTe|=k-y%G0VpKke(P~>bi{3S&}9TLX5Y1_S65aNOc;9KDuiSI@Z&e>X6N9H0jLl8p8D@@23y z^Gm@iC*ZHPfUmFH^Tt6~my4Ex8^K^Mj0BbvkeNsq)mAWGSnMFT*E82KH5e}ys)cuDM=q$APPa!Wh0^E zcS;_(z;MN7D%>Qw-;^xa)A-@1!?$>Xc!7tLo5nY%t_n{@{qJFGpc z;c**%JBYG~hYAP)8>?wUn^~zPA-Y2|*kK(AWgql6G=@}Y44LRL)>az}xIEyVs~USg zTFtrgN9EYy`f+H>x;2C%eWIPb1#`$ZTCF{u5KM1<4vXbs@$*wX@s zkB-N)RYQAZb+#sO2LLMCt9RCb{|FhLSX9EOq-X)(y@M<;0_#O;m{eb zw+HcG(CuA=;mw_JTTozd5Fr9<%j~zcgP?ibg*uZ0|}gSC4e{>nxdFBJl=(5vRS`$y9jta4#@hl}kLPx%rN7e9(z>|7aln#4NM%t@sMKNC- zCJ(o9t{(8?7W`*h{C@sxs|EdhAMba%*Xr?xzRHGKhPR>M&F#qPcJ?wj4mTTfGkSfq znJrwc3&$vmJ%fuzTuktZB6IQ|$O$cp&@;b+8W=R0PzKH;OJWD#8@#`~jkJt{gYvH> z5Wiy%2vJwo1>!3pfFU=bZF^v`8cJcnyy^tO!l|T!b*|#M0~03{TeH9ghS-!<ADZwq}6j#B?k9v5E-Zl>kh zn=AB#R}No2PSc~(#lTm`j0RRt`tq$s3``F7Pd|#upJVZBSA7Lo0s1PNN$=d>Wp`Xa zVCgO9+kGwukm(29XKU*JZW;A_$f_I$A)8yomLs~7QNGv#4mhF^jD;7(eh_p}3xib` zq&m|@$3qAY#;A`48azA!3qVf5*_btqOoHYQJ3in{i;5r^$Yfe%d=MMMcyyGx0x(oS z{#wkzkVZG;p=N-e68+2oV0*YLs};pAphcHz0j)$<6agN~s_iKT0`aw!!#6MUIfv}b`Fb(_{8G0!KT+j%ve2&F@ z1|=W;p(4-;dP&Gi5G{)nurkV11tN)&%JjHEUydZ4(M%hqq3%Tv|BIbkAB1{Km6IQB zdLq8)8p2YRr^!+%@dEmSW?lbnnJg0JI(E<$muMbV5l)lmZyS`>;k(7*9X}UC4>*2Q zz(2R**Hyg@m)7KgTp)`ZRDY;kqVU!89YJo`>>cj5xB;O zH9fyoMLLWXzZLW|E1W-CdVaCH}~fM(h6fUF~2KPm*it&Ua<`>K-whGU?hy~H6c8VQC4xpFv{sIj@ZQfKy0!>`4-JephrZ#1?pf3W4Y(eRq%w!6 z$m$z*l>1-^4kUyi2Sg?&fqyyGdZPO|^dM3|a4N(Vbu6j3h!N96#J*qX&M9xNq2F_X zvtL*j$&4C7w~VAA$w*zEWA776RHpdteK(1pLXDoKe0jL@CT{YLgVKfKmps50LLM9w zLehstI9TZvc$a(RlAn-2Zoz+Uo!_eKtkT_xF~xDBu7}%@S+hrn8zS89(7tF0zVp06 zHyc{D8Po4@6YbQVGBgyqFyw6j|79Qn-)bR*gdi4-B0=LUT;ObM!!DG4H#$gA>RPB{ zYOVxZj?5T~0ZFKE@<4rTvX;{}V=p1OfrbVG8BDu)w@30NU56n&>LupGwm;yey#Wu8Td_7`mx-2K-)*=8RV z@Xw<7{l*%etR=l*Mx`UHYMvQhIlGX#Ah@b#h6nt>L6Vp&BY$IF({I_aA4f+?5ms3+QJrXsnUbN zf$7jaO8wjteGlJ90XvBGafLO49e@Wo4WrEAP(qhmWdm>q$6H6;b5r&e@TYw*5)5v@ zsC2}m5(JISA0IhV{cOLg{$y2<8kjRoaV6dycbj#({&EfYzkd1K2TY#uyRQzxj|v!r zC+*2_TN>jy10&^^5|{(Y2U0>GB!2-I`f48`@SHO)$q0aQ9G@0_n z6Xyi|I1cvUd~w$K@EgR`n#t9GPOsBzeA>1j74T2K^Ro(2&mHY-vzoG*5gxqh;`lqz zzm6=X741Hv4~o=^DGvN<9o{fvP0qiBKX z0C7bDBHBja6AmLAD;Lu{Yrv;G4X*!_`1RAf9pK9g&m%x%Z8jS>65|exL=a|vK>7z1 z)_(7Ze1Gw?@SgZnVgTWKyNZpVV7O?zUM{`+wF6=B%v3FELJAxS|QKOl1KBo9E z^ovSY=e-0Ey;||Z-&)gov;Or*k@=I}`IT6*DZ*ofvu(c3l<9F?#r6*9K9;+?w9pyg z2gPkpdhsvt^F8W1MU#wOl z6qC+ieiBPQ08Om~4wV|nHUrNO4J0&!I0t9I+*bvbPNrkmXg-ksf zF4e<+4Pkeey3UUoAUT!FtaFR$H`K{A_E3R>-OPdo1;);0ul&kub%}pc_9y1(W!VQ5d2^IOZmFehhuaUiUSB-F+NF{$$7A zZq=ZSF^HipLhMS=W%*3}JC6wlCJc{o#x2%h( zc=qL8$FY`8CFIT4y`l9RZ#);H;$=0IEmZz>JOdBZw4kXi0TA$bBne>!H6U;>y-mQUa(6zmZdyg$old*+=G>o3T!N$b*MLtvy+muk zFRS0n;}Y_kA9g29z6aUigniyC8;Q8o{ekIkd!YcSe%Y?UK}8r6B!E-^Zk-DQ06r-& z#Gz6Sef8@G3S6uP^|~mYz4WCH&59`rRLU>QAB8aL_wa9oI;e9;qV)457cSbNfgS^g z)9)mbK^iiDA$3lIYt65#X}C8$HDgOAWv~!Gr)7%Q=Y8OtB#(3%lldn|f|iiDgm___ zKBUj_Lqi<^`iZzR2_e+1pwP-#@q10bqQ2Gl5fg8b&8%vOK^inXqvvDfuh6Ej=#t{h zP!Eu+Sm$uOfc_7xKr&KWgu&t9fq*yOKR7O19mG=*k0h;M*Nrr_f%XSPLR(Y}Jc6JZ z{QHdJ7W+;W!{1gIk>UGby@bE5>bk5${85kKw+eVat8vv)HaIJ0O!24gdVVw z0H!>$y!9A<%Ol&r69j?Q^_3-KfgyzJA)WXDHt^t4X+vqttlEc;eXONdi z1>AB9CLhqjr`!bY0~YlHHyoQmaS_<)(HKJh!J2tUSLMKM_pW=U7TPK!tikqNrFmSF z^)(E~J|_Fx&p&WNf>p@)k%F0q8c3uI>K=PQ7~vM$sV@Vg#q`F5aGC_xa}um^9BiqW zk(K!@2ojSrrIbOzce;Y{y{oL%i z4|(zhVb0c%&0k2nU#?nH`^%4#^QZH|?29Zn z)-+VYJA{DDw5-(((ig|h5UQ0?fWStpJGeHocFxcxl89QMwj$gdmfqGUT^Iai_-

(U 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 literal 0 HcmV?d00001 diff --git a/images/adc128s102.png b/images/adc128s102.png new file mode 100644 index 0000000000000000000000000000000000000000..7e5764892b22db2ad69eba2e7e447ea5a4d8087b GIT binary patch literal 16631 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 E08tL80ssI2 literal 0 HcmV?d00001 diff --git a/index.rst b/index.rst index 955839905..f156cdd36 100644 --- a/index.rst +++ b/index.rst @@ -207,6 +207,7 @@ Analogue .. imgtable:: ADC, components/sensor/adc, flash.svg, ESP internal + ADC128S102, components/sensor/adc128s102, adc128s102.png , 8-channel ADC ADS1115, components/sensor/ads1115, ads1115.jpg, 4-channel ADC CD74HC4067, components/sensor/cd74hc4067, cd74hc4067.jpg, 16-channel analog multiplexer MCP3008, components/sensor/mcp3008, mcp3008.jpg, 8-channel ADC From b1b0aeb68f9afbc4b51a7c7841b8ae6fb76d29a0 Mon Sep 17 00:00:00 2001 From: hagak <9702199+hagak@users.noreply.github.com> Date: Wed, 19 Oct 2022 03:29:31 -0400 Subject: [PATCH 08/67] Added Daikin BRC Component to the Climate IR doc (#2245) Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> --- components/climate/climate_ir.rst | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/components/climate/climate_ir.rst b/components/climate/climate_ir.rst index 6773d5c4b..c60fa8b46 100644 --- a/components/climate/climate_ir.rst +++ b/components/climate/climate_ir.rst @@ -27,6 +27,8 @@ submit a feature request (see FAQ). +---------------------------------------+---------------------+----------------------+ | Daikin | ``daikin`` | yes | +---------------------------------------+---------------------+----------------------+ +| :ref:`Daikin BRC` | ``daikin_brc`` | yes | ++---------------------------------------+---------------------+----------------------+ | :ref:`Delonghi` | ``delonghi`` | yes | +---------------------------------------+---------------------+----------------------+ | Fujitsu General | ``fujitsu_general`` | yes | @@ -211,6 +213,28 @@ Configuration variables: header_high: 3265us # AC Units from LG in Brazil, for example use these timings header_low: 9856us +.. _daikin_brc: + +``daikin_brc`` Climate +------------------------- + +The Daikin BRC remotes are used by the ceiling cassette model of Daikin heatpumps. + + +Configuration variables: + +- **use_fahrenheit** (*Optional*, boolean): U.S. models of the Daikin BRC remote send the temperature in Fahrenheit, if your remote shows Fahrenheit and can not be changed to Celsius then set this to true. Defaults to ``false``. + +.. code-block:: yaml + + # Example configuration entry + climate: + - platform: daikin_brc + name: "AC" + sensor: room_temperature + use_fahrenheit: true + + .. _delonghi_ir: ``delonghi`` Climate From f5e4c2a39afa4fcc9e40a4254d4027e085952bce Mon Sep 17 00:00:00 2001 From: Christoph Wempe Date: Sun, 23 Oct 2022 12:52:51 +0200 Subject: [PATCH 09/67] Remove duplicated option in hmc5883l.rst The **range** option was listed twice. --- components/sensor/hmc5883l.rst | 1 - 1 file changed, 1 deletion(-) diff --git a/components/sensor/hmc5883l.rst b/components/sensor/hmc5883l.rst index b1bf83c2c..c2551acb0 100644 --- a/components/sensor/hmc5883l.rst +++ b/components/sensor/hmc5883l.rst @@ -52,7 +52,6 @@ Configuration variables: - **heading** (*Optional*): The heading of the sensor in degrees. All options from :ref:`Sensor `. - **oversampling** (*Optional*): The oversampling parameter for the sensor. -- **range** (*Optional*): The range parameter for the sensor. - **update_interval** (*Optional*, :ref:`config-time`): The interval to check the sensor. Defaults to ``60s``. - **oversampling** (*Optional*): Number of readings to average over for each sample. One of ``1x``, ``2x``, ``4x``, ``8x``. Defaults to ``1x``. From 5e214c836f61b3d65bb389b7cc7ca6a971fae3ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=2E=20=C3=81rkosi=20R=C3=B3bert?= Date: Tue, 25 Oct 2022 08:10:06 +0200 Subject: [PATCH 10/67] Remove human readable example from uptime (#2384) --- components/sensor/uptime.rst | 38 ------------------------------------ 1 file changed, 38 deletions(-) diff --git a/components/sensor/uptime.rst b/components/sensor/uptime.rst index c8ea1a9e6..c1f6db763 100644 --- a/components/sensor/uptime.rst +++ b/components/sensor/uptime.rst @@ -23,44 +23,6 @@ Configuration variables: - **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. - All other options from :ref:`Sensor `. -Human readable sensor ---------------------- - -The sensor reports uptime in seconds which is good for automations -but is hard to read for humans, this example creates a text sensor -with human readable output. - -.. code-block:: yaml - - # Example configuration entry - text_sensor: - - platform: template - name: Uptime Human Readable - id: uptime_human - icon: mdi:clock-start - sensor: - - platform: uptime - name: Uptime Sensor - id: uptime_sensor - update_interval: 60s - on_raw_value: - then: - - text_sensor.template.publish: - id: uptime_human - state: !lambda |- - int seconds = round(id(uptime_sensor).raw_state); - int days = seconds / (24 * 3600); - seconds = seconds % (24 * 3600); - int hours = seconds / 3600; - seconds = seconds % 3600; - int minutes = seconds / 60; - seconds = seconds % 60; - return ( - (days ? to_string(days) + "d " : "") + - (hours ? to_string(hours) + "h " : "") + - (minutes ? to_string(minutes) + "m " : "") + - (to_string(seconds) + "s") - ).c_str(); See Also -------- From 540a68d1f65e26573731542fd7dad5e14d986b3d Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 27 Oct 2022 12:17:26 +1300 Subject: [PATCH 11/67] Add compile_process_limit docs (#2391) --- components/esphome.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/components/esphome.rst b/components/esphome.rst index 8b1cce9eb..55f7307ec 100644 --- a/components/esphome.rst +++ b/components/esphome.rst @@ -52,6 +52,8 @@ Advanced options: - **version** (**Required**, string): Version of the project - **min_version** (*Optional*, string): The minimum ESPHome version required to compile this configuration. See :ref:`esphome-min_version`. +- **compile_process_limit** (*Optional*, int): The maximum number of simultaneous compile processes to run. + Defaults to the number of cores of the CPU which is also the maximum you can set. Old-style platform options, which have been moved to the platform-specific :doc:`esp32 ` and :doc:`esp8266 ` sections but are still accepted here for compatibility reasons (usage not From 423e1e69d2e16b9f57170a1ef6d5d92f061aded2 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 27 Oct 2022 12:38:26 +1300 Subject: [PATCH 12/67] Add basic rp2040 docs page (#2392) --- components/rp2040.rst | 25 +++++++++++++++++ images/rp2040.svg | 62 +++++++++++++++++++++++++++++++++++++++++++ index.rst | 1 + 3 files changed, 88 insertions(+) create mode 100644 components/rp2040.rst create mode 100644 images/rp2040.svg diff --git a/components/rp2040.rst b/components/rp2040.rst new file mode 100644 index 000000000..4214edc1b --- /dev/null +++ b/components/rp2040.rst @@ -0,0 +1,25 @@ +RP2040 Platform +=============== + +.. seo:: + :description: Configuration for the RP2040 platform for ESPHome. + :image: rp2040.svg + +This component contains platform-specific options for the RP2040 platform. + +.. code-block:: yaml + + # Example configuration entry + rp2040: + board: rpipicow + +Configuration variables: +------------------------ + +- **board** (*Optional*, string): The board type. Valid options are ``rpipico`` and ``rpipicow``. + +See Also +-------- + +- :doc:`esphome` +- :ghedit:`Edit` diff --git a/images/rp2040.svg b/images/rp2040.svg new file mode 100644 index 000000000..36e48a00d --- /dev/null +++ b/images/rp2040.svg @@ -0,0 +1,62 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + diff --git a/index.rst b/index.rst index f156cdd36..eec1e9540 100644 --- a/index.rst +++ b/index.rst @@ -664,6 +664,7 @@ Misc Components ESP8266, components/esp8266, esp8266.svg ESP32, components/esp32, esp32.svg + RP2040, components/rp2040, rp2040.svg Remote Receiver, components/remote_receiver, remote.svg Remote Transmitter, components/remote_transmitter, remote.svg From 1160dc279f382dc388ac32d86b32e57daec3f9d7 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 27 Oct 2022 15:43:17 +1300 Subject: [PATCH 13/67] Remove devices on home page and replace with platforms (#2393) --- _redirects | 2 + components/esp32.rst | 30 +++++ components/esp8266.rst | 177 +++++++++++++++++++++++++- components/rp2040.rst | 5 + components/sensor/esp32_hall.rst | 2 +- devices/esp32.rst | 60 --------- devices/esp8266.rst | 199 ------------------------------ devices/nodemcu_esp32.rst | 2 +- devices/nodemcu_esp8266.rst | 2 +- devices/sonoff.rst | 2 +- guides/migrate_espeasy.rst | 8 +- guides/migrate_espurna.rst | 8 +- guides/migrate_sonoff_tasmota.rst | 14 +-- index.rst | 26 +--- 14 files changed, 230 insertions(+), 307 deletions(-) delete mode 100644 devices/esp32.rst delete mode 100644 devices/esp8266.rst diff --git a/_redirects b/_redirects index 7ed3fa34a..dfa37018e 100644 --- a/_redirects +++ b/_redirects @@ -4,3 +4,5 @@ # e.g: /components/sensors/abc.html /components/sensors/xyz.html 301 /components/sensor/sgp40.html /components/sensor/sgp4x.html 301 /components/binary_sensor/xpt2046.html /components/touchscreen/xpt2046.html 301 +/devices/esp8266.html /components/esp8266.html +/devices/esp32.html /components/esp32.html diff --git a/components/esp32.rst b/components/esp32.rst index 32692f96f..6e9bb7758 100644 --- a/components/esp32.rst +++ b/components/esp32.rst @@ -27,8 +27,38 @@ Configuration variables: ``esp32s2``, ``esp32s3``, ``esp32c3`` and ``esp32h2``. Defaults to the variant that is detected from the board, if a board that's unknown to ESPHome is used, this option is mandatory. +.. note:: + + Support for the ESP32-S2 and ESP32-C3 is still in development and there could be issues. + .. _esp32-arduino_framework: +GPIO Pin Numbering +------------------ + +The ESP32 boards often use the internal GPIO pin numbering on the board, this means that +you don't have to worry about other kinds of pin numberings, yay! + +Some notes about the pins on the ESP32: + +- ``GPIO0`` is used to determine the boot mode on startup. It should therefore not be pulled LOW + on startup to avoid booting into flash mode. You can, however, still use this as an output pin. +- ``GPIO34``-``GPIO39`` can not be used as outputs (even though GPIO stands for "general purpose input + **output**"...). +- ``GPIO32``-``GPIO39``: These pins can be used with the :doc:`/components/sensor/adc` to measure + voltages. +- ``GPIO2``: This pin is connected to the blue LED on the board. It also supports + the :doc:`touch pad binary sensor ` like some other + pins. + +.. code-block:: yaml + + # Example configuration entry + binary_sensor: + - platform: gpio + name: "Pin GPIO23" + pin: GPIO23 + Arduino framework ----------------- diff --git a/components/esp8266.rst b/components/esp8266.rst index 10ded12f7..5fa9ff86d 100644 --- a/components/esp8266.rst +++ b/components/esp8266.rst @@ -20,7 +20,7 @@ Configuration variables: - **board** (**Required**, string): The PlatformIO board ID that should be used. Choose the appropriate board from - `this list `__ (the icon next to the + `this list `__ (the icon next to the name can be used to copy the board ID). *This only affects pin aliases, flash size and some internal settings*, if unsure choose a generic board from Espressif such as ``esp01_1m``. - **framework** (*Optional*): Options for the underlying framework used by ESPHome. @@ -39,6 +39,181 @@ Configuration variables: - **board_flash_mode** (*Optional*, string): The SPI mode of the flash chip. One of ``qio``, ``qout``, ``dio`` and ``dout``. Defaults to ``dout`` for compatibility with all chips. Note: on the next OTA update the actual flash mode is automatically detected and changed to the appropriate one. - **early_pin_init** (*Optional*, boolean): Specifies whether pins should be initialised as early as possible to known values. Recommended value is ``false`` where switches are involved, as these will toggle when updating the firmware or when restarting the device. Defaults to ``true``. +GPIO Pin Numbering +------------------ + +Many boards have a pin numbering for the exposed pins that is different from the internally used +ones. ESPHome tries to map the silk-screen pin numbers into the internal pin numbers with a few +boards, but for generic ESP8266 boards it is often required to just use the internal pin numbers. +To do this, just prefix all pins with ``GPIO``, for example ``GPIO0`` for the pin with the internal pin +number 0. + +Some notes on the pins: + +- ``GPIO6`` - ``GPIO11``, ``GPIO0``, ``GPIO2`` and ``GPIO15`` are often already used by the internal + flash interface and boot mode detection. So it's best to avoid using these pins. +- ``GPIO17`` additionally has an ADC connected to it. See the :doc:`/components/sensor/adc` + to read voltages (in the range from 0 to 1.0V) on this pin. + + +.. code-block:: yaml + + # Example configuration entry + esphome: + name: livingroom + + esp8266: + board: nodemcuv2 + + binary_sensor: + - platform: gpio + name: "Pin GPIO17" + pin: GPIO17 + + +Special Pins +^^^^^^^^^^^^ + +=================== ============================================= +``GPIO0`` Controls Boot Mode +------------------- --------------------------------------------- +``GPIO1`` UART TX pin +------------------- --------------------------------------------- +``GPIO2`` Controls Boot Mode +------------------- --------------------------------------------- +``GPIO3`` UART RX pin +------------------- --------------------------------------------- +``GPIO6`` SDIO/Flash CLK pin +------------------- --------------------------------------------- +``GPIO7`` SDIO/Flash Data 0 pin +------------------- --------------------------------------------- +``GPIO8`` SDIO/Flash Data 1 pin +------------------- --------------------------------------------- +``GPIO9`` SDIO/Flash Data 2 pin (qio/qout only) +------------------- --------------------------------------------- +``GPIO10`` SDIO/Flash Data 3 pin (qio/qout only) +------------------- --------------------------------------------- +``GPIO11`` SDIO/Flash CMD pin +------------------- --------------------------------------------- +``GPIO12`` Attached to Hardware SPI controller MISO +------------------- --------------------------------------------- +``GPIO13`` Attached to Hardware SPI controller MOSI +------------------- --------------------------------------------- +``GPIO14`` Attached to Hardware SPI controller CLK +------------------- --------------------------------------------- +``GPIO15`` Controls Boot Mode; Attached to Hardware SPI + controller CS +------------------- --------------------------------------------- +``GPIO16`` Special pin that can be accessed from RTC, + and is Deep-Sleep wakeup pin +------------------- --------------------------------------------- +TOUT aka ``GPIO17`` ADC pin for measuring voltages, can only be + used as analog input pin +=================== ============================================= + +This means effectively only the following pins can be used as general purpose GPIO: + +========== ============================== ============================== +**Pin** **Restrictions** **State after Reset** +---------- ------------------------------ ------------------------------ +``GPIO0`` If HIGH on boot Weak Pull Up +---------- ------------------------------ ------------------------------ +``GPIO2`` If HIGH on boot Weak Pull Up +---------- ------------------------------ ------------------------------ +``GPIO4`` High Impedance +---------- ------------------------------ ------------------------------ +``GPIO5`` High Impedance +---------- ------------------------------ ------------------------------ +``GPIO6`` Weak Pull Up +---------- ------------------------------ ------------------------------ +``GPIO12`` Weak Pull Up +---------- ------------------------------ ------------------------------ +``GPIO13`` Weak Pull Up +---------- ------------------------------ ------------------------------ +``GPIO14`` Weak Pull Up +---------- ------------------------------ ------------------------------ +``GPIO15`` If LOW on boot Weak Pull Up +---------- ------------------------------ ------------------------------ +``GPIO16`` Has pull-down (but no pull-up) Weak Pull Down + resistor +========== ============================== ============================== + + +Boot Modes +---------- + +On each boot, the ESP8266 will check three pins to determine in which boot mode to enter. +There are three boot modes: + +========================= ========= ========= ========== ============== +**Mode** ``GPIO0`` ``GPIO2`` ``GPIO15`` ``boot mode:`` +------------------------- --------- --------- ---------- -------------- +Boot from Flash (normal) HIGH HIGH LOW 3 +------------------------- --------- --------- ---------- -------------- +Download Code from UART LOW HIGH LOW 1 +------------------------- --------- --------- ---------- -------------- +Boot from SD-Card ANY ANY HIGH 4-7 +========================= ========= ========= ========== ============== + +You can identify these on boot-up by looking at the UART output, the first number +in the ``boot mode:`` line tells you what mode was selected + +.. code-block:: text + + ets Jan 8 2013,rst cause:4, boot mode:(3,6) + +The first lines when viewing the UART logs might have unrecognized characters. This is +because the effective baudrate of the ESP8266 bootloader is 74800, whereas the program uses 115200. + +Reset Causes +------------ + +Additionally, the first line also contains the **reset cause**. +These reset causes `are documented +`__: + +== =================================== +0 Undefined +-- ----------------------------------- +1 Power On Reboot +-- ----------------------------------- +2 External reset or deep-sleep wakeup +-- ----------------------------------- +4 Hardware WDT reset +== =================================== + +After a software reset, the reset cause will not change. + +Electrical Characteristics +-------------------------- + +=========================================================== =========== =========== =========== =========== +**Parameter** **Min.** **Typical** **Max.** **Unit** +----------------------------------------------------------- ----------- ----------- ----------- ----------- +Operating Temperature -40 125 °C +----------------------------------------------------------- ----------- ----------- ----------- ----------- +Working Voltage ``V_IO`` 2.5 3.3 3.6 V +----------------------------------------------------------- ----------- ----------- ----------- ----------- +``V_IL`` - INPUT voltage level to be considered LOW -0.3 0.25*V_IO V +----------------------------------------------------------- ----------- ----------- ----------- ----------- +``V_IH`` - INPUT voltage level to be considered HIGH 0.75*V_IO 3.6 V +----------------------------------------------------------- ----------- ----------- ----------- ----------- +``V_OL`` - OUTPUT voltage level for LOW 0.1*V_IO V +----------------------------------------------------------- ----------- ----------- ----------- ----------- +``V_OH`` - OUTPUT voltage level for HIGH 0.8*V_IO V +----------------------------------------------------------- ----------- ----------- ----------- ----------- +``I_MAX`` - Maximum current for GPIO 12 mA +----------------------------------------------------------- ----------- ----------- ----------- ----------- +Power Consumption in Deep Sleep 20 µA +----------------------------------------------------------- ----------- ----------- ----------- ----------- +Power Consumption in Active Mode 120 mA +=========================================================== =========== =========== =========== =========== + +Source: `ESP8266EX datasheet `__ + +The internal pull up/down resistors have values of 30kΩ to 100kΩ +(`source `__). + See Also -------- diff --git a/components/rp2040.rst b/components/rp2040.rst index 4214edc1b..6adcb8f6f 100644 --- a/components/rp2040.rst +++ b/components/rp2040.rst @@ -7,6 +7,11 @@ RP2040 Platform This component contains platform-specific options for the RP2040 platform. +.. note:: + + Support for all aspects of ESPHome on the RP2040 is still in development. + Please search for or create an `issue `__ if you encounter an unknown problem. + .. code-block:: yaml # Example configuration entry diff --git a/components/sensor/esp32_hall.rst b/components/sensor/esp32_hall.rst index 00cf7a13d..436b8610a 100644 --- a/components/sensor/esp32_hall.rst +++ b/components/sensor/esp32_hall.rst @@ -50,6 +50,6 @@ See Also - :ref:`sensor-filters` - :doc:`adc` -- :doc:`/devices/esp32` +- :doc:`/components/esp32` - :apiref:`esp32_hall/esp32_hall.h` - :ghedit:`Edit` diff --git a/devices/esp32.rst b/devices/esp32.rst deleted file mode 100644 index 75a32f216..000000000 --- a/devices/esp32.rst +++ /dev/null @@ -1,60 +0,0 @@ -Generic ESP32 -============= - -.. seo:: - :description: Information about how to use generic ESP32 boards in ESPHome. - :image: esp32.svg - :keywords: ESP32 - -All devices based on the original ESP32 are supported by ESPHome. Simply select ``ESP32`` when -the ESPHome wizard asks you for your platform and choose a board type -from `this link `__ when the wizard -asks you for the board type. - -.. code-block:: yaml - - # Example configuration entry - esphome: - name: livingroom - - esp32: - board: - -.. note:: - - Support for the ESP32-S2 and ESP32-C3 is currently in development. - -The ESP32 boards often use the internal GPIO pin numbering on the board, this means that -you don't have to worry about other kinds of pin numberings, yay! - -Some notes about the pins on the ESP32: - -- ``GPIO0`` is used to determine the boot mode on startup. It should therefore not be pulled LOW - on startup to avoid booting into flash mode. You can, however, still use this as an output pin. -- ``GPIO34``-``GPIO39`` can not be used as outputs (even though GPIO stands for "general purpose input - **output**"...). -- ``GPIO32``-``GPIO39``: These pins can be used with the :doc:`/components/sensor/adc` to measure - voltages. -- ``GPIO2``: This pin is connected to the blue LED on the board. It also supports - the :doc:`touch pad binary sensor ` like some other - pins. - -.. code-block:: yaml - - # Example configuration entry - esphome: - name: livingroom - - esp32: - board: - - binary_sensor: - - platform: gpio - name: "Pin GPIO23" - pin: GPIO23 - -See Also --------- - -- :doc:`nodemcu_esp32` -- :ghedit:`Edit` diff --git a/devices/esp8266.rst b/devices/esp8266.rst deleted file mode 100644 index 0f922ebb2..000000000 --- a/devices/esp8266.rst +++ /dev/null @@ -1,199 +0,0 @@ -Generic ESP8266 -=============== - -.. seo:: - :description: Instructions for using generic ESP8266s with ESPHome. - :image: esp8266.svg - :keywords: ESP8266 - -All ESP8266-based devices are supported by ESPHome. Simply select ``ESP8266`` when -the ESPHome wizard asks you for your platform and choose a board type -from `this link `__ when the wizard -asks you for the board type. - - -.. code-block:: yaml - - # Example configuration entry - esphome: - name: livingroom - - esp8266: - board: - -Many boards have a pin numbering for the exposed pins that is different from the internally used -ones. ESPHome tries to map the silk-screen pin numbers into the internal pin numbers with a few -boards, but for generic ESP8266 boards it is often required to just use the internal pin numbers. -To do this, just prefix all pins with ``GPIO``, for example ``GPIO0`` for the pin with the internal pin -number 0. - -Some notes on the pins: - -- ``GPIO6`` - ``GPIO11``, ``GPIO0``, ``GPIO2`` and ``GPIO15`` are often already used by the internal - flash interface and boot mode detection. So it's best to avoid using these pins. -- ``GPIO17`` additionally has an ADC connected to it. See the :doc:`/components/sensor/adc` - to read voltages (in the range from 0 to 1.0V) on this pin. - - -.. code-block:: yaml - - # Example configuration entry - esphome: - name: livingroom - - esp8266: - board: nodemcuv2 - - binary_sensor: - - platform: gpio - name: "Pin GPIO17" - pin: GPIO17 - - -Special Pins ------------- - -=================== ============================================= -``GPIO0`` Controls Boot Mode -------------------- --------------------------------------------- -``GPIO1`` UART TX pin -------------------- --------------------------------------------- -``GPIO2`` Controls Boot Mode -------------------- --------------------------------------------- -``GPIO3`` UART RX pin -------------------- --------------------------------------------- -``GPIO6`` SDIO/Flash CLK pin -------------------- --------------------------------------------- -``GPIO7`` SDIO/Flash Data 0 pin -------------------- --------------------------------------------- -``GPIO8`` SDIO/Flash Data 1 pin -------------------- --------------------------------------------- -``GPIO9`` SDIO/Flash Data 2 pin (qio/qout only) -------------------- --------------------------------------------- -``GPIO10`` SDIO/Flash Data 3 pin (qio/qout only) -------------------- --------------------------------------------- -``GPIO11`` SDIO/Flash CMD pin -------------------- --------------------------------------------- -``GPIO12`` Attached to Hardware SPI controller MISO -------------------- --------------------------------------------- -``GPIO13`` Attached to Hardware SPI controller MOSI -------------------- --------------------------------------------- -``GPIO14`` Attached to Hardware SPI controller CLK -------------------- --------------------------------------------- -``GPIO15`` Controls Boot Mode; Attached to Hardware SPI - controller CS -------------------- --------------------------------------------- -``GPIO16`` Special pin that can be accessed from RTC, - and is Deep-Sleep wakeup pin -------------------- --------------------------------------------- -TOUT aka ``GPIO17`` ADC pin for measuring voltages, can only be - used as analog input pin -=================== ============================================= - -This means effectively only the following pins can be used as general purpose GPIO: - -========== ============================== ============================== -**Pin** **Restrictions** **State after Reset** ----------- ------------------------------ ------------------------------ -``GPIO0`` If HIGH on boot Weak Pull Up ----------- ------------------------------ ------------------------------ -``GPIO2`` If HIGH on boot Weak Pull Up ----------- ------------------------------ ------------------------------ -``GPIO4`` High Impedance ----------- ------------------------------ ------------------------------ -``GPIO5`` High Impedance ----------- ------------------------------ ------------------------------ -``GPIO6`` Weak Pull Up ----------- ------------------------------ ------------------------------ -``GPIO12`` Weak Pull Up ----------- ------------------------------ ------------------------------ -``GPIO13`` Weak Pull Up ----------- ------------------------------ ------------------------------ -``GPIO14`` Weak Pull Up ----------- ------------------------------ ------------------------------ -``GPIO15`` If LOW on boot Weak Pull Up ----------- ------------------------------ ------------------------------ -``GPIO16`` Has pull-down (but no pull-up) Weak Pull Down - resistor -========== ============================== ============================== - -Boot Modes ----------- - -On each boot, the ESP8266 will check three pins to determine in which boot mode to enter. -There are three boot modes: - -========================= ========= ========= ========== ============== -**Mode** ``GPIO0`` ``GPIO2`` ``GPIO15`` ``boot mode:`` -------------------------- --------- --------- ---------- -------------- -Boot from Flash (normal) HIGH HIGH LOW 3 -------------------------- --------- --------- ---------- -------------- -Download Code from UART LOW HIGH LOW 1 -------------------------- --------- --------- ---------- -------------- -Boot from SD-Card ANY ANY HIGH 4-7 -========================= ========= ========= ========== ============== - -You can identify these on boot-up by looking at the UART output, the first number -in the ``boot mode:`` line tells you what mode was selected - -.. code-block:: text - - ets Jan 8 2013,rst cause:4, boot mode:(3,6) - -The first lines when viewing the UART logs might have unrecognized characters. This is -because the effective baudrate of the ESP8266 bootloader is 74800, whereas the program uses 115200. - -Reset Causes ------------- - -Additionally, the first line also contains the **reset cause**. -These reset causes `are documented -`__: - -== =================================== -0 Undefined --- ----------------------------------- -1 Power On Reboot --- ----------------------------------- -2 External reset or deep-sleep wakeup --- ----------------------------------- -4 Hardware WDT reset -== =================================== - -After a software reset, the reset cause will not change. - -Electrical Characteristics --------------------------- - -=========================================================== =========== =========== =========== =========== -**Parameter** **Min.** **Typical** **Max.** **Unit** ------------------------------------------------------------ ----------- ----------- ----------- ----------- -Operating Temperature -40 125 °C ------------------------------------------------------------ ----------- ----------- ----------- ----------- -Working Voltage ``V_IO`` 2.5 3.3 3.6 V ------------------------------------------------------------ ----------- ----------- ----------- ----------- -``V_IL`` - INPUT voltage level to be considered LOW -0.3 0.25*V_IO V ------------------------------------------------------------ ----------- ----------- ----------- ----------- -``V_IH`` - INPUT voltage level to be considered HIGH 0.75*V_IO 3.6 V ------------------------------------------------------------ ----------- ----------- ----------- ----------- -``V_OL`` - OUTPUT voltage level for LOW 0.1*V_IO V ------------------------------------------------------------ ----------- ----------- ----------- ----------- -``V_OH`` - OUTPUT voltage level for HIGH 0.8*V_IO V ------------------------------------------------------------ ----------- ----------- ----------- ----------- -``I_MAX`` - Maximum current for GPIO 12 mA ------------------------------------------------------------ ----------- ----------- ----------- ----------- -Power Consumption in Deep Sleep 20 µA ------------------------------------------------------------ ----------- ----------- ----------- ----------- -Power Consumption in Active Mode 120 mA -=========================================================== =========== =========== =========== =========== - -Source: `ESP8266EX datasheet `__ - -The internal pull up/down resistors have values of 30kΩ to 100kΩ -(`source `__). - -See Also --------- - -- :doc:`nodemcu_esp8266` -- :ghedit:`Edit` diff --git a/devices/nodemcu_esp32.rst b/devices/nodemcu_esp32.rst index 164b5c514..cbfadfb6b 100644 --- a/devices/nodemcu_esp32.rst +++ b/devices/nodemcu_esp32.rst @@ -61,6 +61,6 @@ Note that in certain conditions you *can* use the pins marked as ``INTERNAL`` in See Also -------- -- :doc:`esp32` +- :doc:`/components/esp32` - :doc:`nodemcu_esp8266` - :ghedit:`Edit` diff --git a/devices/nodemcu_esp8266.rst b/devices/nodemcu_esp8266.rst index 3b2d759b4..7772abafa 100644 --- a/devices/nodemcu_esp8266.rst +++ b/devices/nodemcu_esp8266.rst @@ -73,6 +73,6 @@ Note that in certain conditions you *can* use the pins marked as ``INTERNAL`` in See Also -------- -- :doc:`esp8266` +- :doc:`/components/esp8266` - :doc:`nodemcu_esp32` - :ghedit:`Edit` diff --git a/devices/sonoff.rst b/devices/sonoff.rst index 8214b7be0..7287094b1 100644 --- a/devices/sonoff.rst +++ b/devices/sonoff.rst @@ -421,5 +421,5 @@ See Also - :doc:`sonoff_s20` - :doc:`sonoff_4ch` - :doc:`sonoff_basic` -- :doc:`esp8266` +- :doc:`/components/esp8266` - :ghedit:`Edit` diff --git a/guides/migrate_espeasy.rst b/guides/migrate_espeasy.rst index 6eba19454..b0f954d63 100644 --- a/guides/migrate_espeasy.rst +++ b/guides/migrate_espeasy.rst @@ -47,12 +47,8 @@ Happy Hacking! See Also -------- -- :doc:`/devices/nodemcu_esp8266` -- :doc:`/devices/nodemcu_esp32` -- :doc:`/devices/esp8266` -- :doc:`/devices/esp32` -- :doc:`/devices/sonoff_s20` -- :doc:`/devices/sonoff_4ch` +- :doc:`/components/esp8266` +- :doc:`/components/esp32` - :doc:`migrate_espurna` - :doc:`migrate_sonoff_tasmota` - :ghedit:`Edit` diff --git a/guides/migrate_espurna.rst b/guides/migrate_espurna.rst index 3d5b82a44..09505a24e 100644 --- a/guides/migrate_espurna.rst +++ b/guides/migrate_espurna.rst @@ -52,12 +52,8 @@ Happy Hacking! See Also -------- -- :doc:`/devices/nodemcu_esp8266` -- :doc:`/devices/nodemcu_esp32` -- :doc:`/devices/esp8266` -- :doc:`/devices/esp32` -- :doc:`/devices/sonoff_s20` -- :doc:`/devices/sonoff_4ch` +- :doc:`/components/esp8266` +- :doc:`/components/esp32` - :doc:`migrate_espeasy` - :doc:`migrate_sonoff_tasmota` - :ghedit:`Edit` diff --git a/guides/migrate_sonoff_tasmota.rst b/guides/migrate_sonoff_tasmota.rst index a0ada06e4..8f3accd06 100644 --- a/guides/migrate_sonoff_tasmota.rst +++ b/guides/migrate_sonoff_tasmota.rst @@ -11,8 +11,7 @@ ESPHome create a binary for you and then upload that in the Tasmota web interfac Getting the Binary ------------------ -First follow the guides for the :ref:`different supported devices ` and create a configuration -file. Then, generate and download the binary: +First create a configuration for your device. Then, generate and download the legacy binary: - **Using the Home Assistant add-on/dashboard**: Just click the ``COMPILE`` button, wait for the compilation to end and press the ``DOWNLOAD BINARY`` @@ -60,17 +59,12 @@ Happy Hacking! .. note:: If you are using Tasmota 8+ and get an error after uploading the firmware, go to the console and type ```SetOption78 1```, then restart the device and try the firmware again. - + See Also -------- -- :doc:`/devices/sonoff_s20` -- :doc:`/devices/sonoff_4ch` -- :doc:`/devices/sonoff` -- :doc:`/devices/nodemcu_esp8266` -- :doc:`/devices/nodemcu_esp32` -- :doc:`/devices/esp8266` -- :doc:`/devices/esp32` +- :doc:`/components/esp8266` +- :doc:`/components/esp32` - :doc:`migrate_espurna` - :doc:`migrate_espeasy` - :ghedit:`Edit` diff --git a/index.rst b/index.rst index eec1e9540..94cb59ba3 100644 --- a/index.rst +++ b/index.rst @@ -113,26 +113,14 @@ ESPHome is a system to control your ESP8266/ESP32 by simple yet powerful configu .. _devices: -Devices -------- - -This list contains a bunch of getting started and more advanced guides for using ESPHome. -Technically, all ESP8266/ESP32 devices are supported by ESPHome. +Platforms +--------- .. imgtable:: - Generic ESP8266, devices/esp8266, esp8266.svg - Generic ESP32, devices/esp32, esp32.svg - NodeMCU ESP8266, devices/nodemcu_esp8266, nodemcu_esp8266.jpg - - NodeMCU ESP32, devices/nodemcu_esp32, nodemcu_esp32.jpg - Sonoff S20, devices/sonoff_s20, sonoff_s20.jpg - Sonoff 4CH, devices/sonoff_4ch, sonoff_4ch.jpg - - Generic Sonoff, devices/sonoff, sonoff.svg - Sonoff Basic, devices/sonoff_basic, sonoff_basic.jpg - Sonoff T1 UK 3 Gang V1.1, devices/sonoff_t1_uk_3gang_v1.1, sonoff_t1_uk_3g_v1.1.jpg - Sonoff T3 EU 3 Gang V1.0, devices/sonoff_t3_eu_3gang_v1.0, sonoff_t3_eu_3g_v1.0.jpg + ESP8266, components/esp8266, esp8266.svg + ESP32, components/esp32, esp32.svg + RP2040, components/rp2040, rp2040.svg Core Components --------------- @@ -662,10 +650,6 @@ Misc Components .. imgtable:: - ESP8266, components/esp8266, esp8266.svg - ESP32, components/esp32, esp32.svg - RP2040, components/rp2040, rp2040.svg - Remote Receiver, components/remote_receiver, remote.svg Remote Transmitter, components/remote_transmitter, remote.svg Status LED, components/status_led, led-on.svg From f99ee565a4a174f758e2a16df1b43ade436f03fe Mon Sep 17 00:00:00 2001 From: Paul Nicholls Date: Thu, 27 Oct 2022 20:27:10 +1300 Subject: [PATCH 14/67] Revise SM300D2 documentation Adds information about the LCD modules which are often sold with/for these sensors, and using them in conjunction with an ESP. Also notes that INPUT_PULLDOWN mode may help with reliability, and aligns some of the config descriptions with other air quality sensors. --- components/sensor/sm300d2.rst | 40 ++++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/components/sensor/sm300d2.rst b/components/sensor/sm300d2.rst index 2a2d1dc71..1e0ac5ade 100644 --- a/components/sensor/sm300d2.rst +++ b/components/sensor/sm300d2.rst @@ -19,16 +19,24 @@ The ``sm300d2`` sensor platform allows you to use the SM300D2 7-in-1 Air Quality :width: 50.0% -The SM300D2 sensor supports connections via UART or RS485. This platform only supports UART-connections. +Although the SM300D2 sensor supports connections via UART or RS485, this platform only supports UART +connections. The LCD module which is often sold with/for these sensor boards can work over either UART +or RS485, so you can use the LCD over RS485 and an ESP over UART at the same time (see +:ref:`note below ` regarding powering everything). + Make sure you have a :ref:`UART bus ` in your configuration with the ``rx_pin`` connected to the -TX pin of the sensor. The sensor does not support receiving data, so the ``tx_pin`` does not need to be -connected. The sensor expects the baud rate to be set at 9600. +sensor's TX pin. The sensor does not support receiving data, so the ``tx_pin`` does not need to be +connected. The UART bus should be set to a baud rate of 9600 to match the sensor's output. Setting the +``rx_pin``'s mode to ``INPUT_PULLDOWN`` may help improve reliability if you're regularly getting missed +or bad/incomplete readings. .. code-block:: yaml # Example configuration entry uart: - rx_pin: D0 + rx_pin: + number: D0 + mode: INPUT_PULLDOWN tx_pin: D1 baud_rate: 9600 @@ -54,43 +62,43 @@ Configuration variables: ------------------------ -- **co2** (**Required**): The CO₂ data from the sensor in parts per million (ppm). +- **co2** (**Required**): The information for the CO₂ sensor. Readings in parts per million (ppm). - **name** (**Required**, string): The name of the CO₂ sensor. - **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. - All other options from :ref:`Sensor `. -- **formaldehyde** (**Required**): The formaldehyde data of the sensor in micrograms per cubic meter air (µg/m³). +- **formaldehyde** (**Required**): The information for the formaldehyde sensor. Readings in µg/m³. - **name** (**Required**, string): The name of the formaldehyde sensor. - **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. - All other options from :ref:`Sensor `. -- **tvoc** (**Required**): The total volatile organic compounds (TVOC) data of the sensor in micrograms per cubic meter air (µg/m³). +- **tvoc** (**Required**): The information for the total volatile organic compounds (TVOC) sensor. Readings in µg/m³. - **name** (**Required**, string): The name of the TVOC sensor. - **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. - All other options from :ref:`Sensor `. -- **pm_2_5** (**Required**): The PM2.5 data of the sensor in micrograms per cubic meter air (µg/m³). +- **pm_2_5** (**Required**): The information for the **Weight Concentration** sensor for fine particles up to 2.5μm. Readings in µg/m³. - **name** (**Required**, string): The name of the PM2.5 sensor. - **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. - All other options from :ref:`Sensor `. -- **pm_10_0** (**Required**): The PM10 data of the sensor in micrograms per cubic meter air (µg/m³). +- **pm_10_0** (**Required**): The information for the **Weight Concentration** sensor for coarse particles up to 10μm. Readings in µg/m³. - **name** (**Required**, string): The name of the PM10 sensor. - **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. - All other options from :ref:`Sensor `. -- **temperature** (**Required**): The temperature data of the sensor in degrees celsius (°C). +- **temperature** (**Required**): The information for the temperature sensor. Readings in degrees celsius (°C). - **name** (**Required**, string): The name of the temperature sensor. - **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. - All other options from :ref:`Sensor `. -- **humidity** (**Required**): The humidity data of the sensor in percent relative humidity (%). +- **humidity** (**Required**): The information for the relative humidity sensor. Readings in %. - **name** (**Required**, string): The name of the humidity sensor. - **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. @@ -110,10 +118,18 @@ Configuration variables: Pins on the SM300D2. UART RX is not in use. +.. _pins-note: + .. note:: - ``5V`` should be connected to power supply (supported voltage is 4.8 V to 5.2 V), ``GD`` to ``GND`` pin + The board's ``GD`` pin must be connected to a ``GND`` pin on the ESP. + The sensor board requires between 4.8 and 5.2 volts via the ``5V`` pin in either the UART or RS485 socket, as they + are connected. If you're using a USB-powered ESP module with a 5V input pin (i.e. ``VIN``) exposed, you can choose + to connect the UART ``5V`` pin to the ESP's ``VIN`` and then power everything through either the LCD module or the + ESP module, with a single power cable. If you choose to power the ESP separately from the sensor board, leave the + UART ``5V`` pin unconnected. + See Also -------- From 354ec1f1891a16bdbbd176b230ac9d4dd2fc8eca Mon Sep 17 00:00:00 2001 From: Christian Ferbar <5595808+ferbar@users.noreply.github.com> Date: Sun, 6 Nov 2022 07:15:57 +0100 Subject: [PATCH 15/67] Fix Example configuration entry V1 (#2271) --- components/web_server.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/components/web_server.rst b/components/web_server.rst index 78c95f4c4..4e1e29efe 100644 --- a/components/web_server.rst +++ b/components/web_server.rst @@ -110,8 +110,10 @@ Force to turn off OTA function because the missing authentication. # Example configuration entry V1 web_server: port: 80 + version: 1 ota: false css_include: "../../../esphome-docs/_static/webserver-v1.min.css" + css_url: "" js_include: "../../../esphome-docs/_static/webserver-v1.min.js" js_url: "" From c7dadabb7b1cdfb0548126aece3766b9d73a6b3f Mon Sep 17 00:00:00 2001 From: Christian Ferbar <5595808+ferbar@users.noreply.github.com> Date: Sun, 6 Nov 2022 07:27:19 +0100 Subject: [PATCH 16/67] fix web_server javascript when in strict mode / local files (#2270) --- _static/webserver-v1.js | 4 ++-- _static/webserver-v1.min.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/_static/webserver-v1.js b/_static/webserver-v1.js index f82011ae5..781253c0c 100644 --- a/_static/webserver-v1.js +++ b/_static/webserver-v1.js @@ -23,7 +23,7 @@ source.addEventListener('log', function (e) { log.innerHTML += '' + e.data.substr(7, e.data.length - 11) + "\n"; }); -actions = [ +const actions = [ ["switch", ["toggle"]], ["light", ["toggle"]], ["fan", ["toggle"]], @@ -31,7 +31,7 @@ actions = [ ["button", ["press"]], ["lock", ["lock", "unlock", "open"]], ]; -multi_actions = [ +const multi_actions = [ ["select", "option"], ["number", "value"], ]; diff --git a/_static/webserver-v1.min.js b/_static/webserver-v1.min.js index fe912baf0..5c6a80518 100644 --- a/_static/webserver-v1.min.js +++ b/_static/webserver-v1.min.js @@ -1 +1 @@ -const source=new EventSource("/events");source.addEventListener("log",function(t){const e=document.getElementById("log");let n=[["","e"],["","w"],["","i"],["","c"],["","d"],["","v"]],o="";for(const e of n)t.data.startsWith(e[0])&&(o=e[1]);""==o&&(e.innerHTML+=t.data+"\n"),e.innerHTML+=''+t.data.substr(7,t.data.length-11)+"\n"}),actions=[["switch",["toggle"]],["light",["toggle"]],["fan",["toggle"]],["cover",["open","close"]],["button",["press"]],["lock",["lock","unlock","open"]]],multi_actions=[["select","option"],["number","value"]],source.addEventListener("state",function(t){const e=JSON.parse(t.data);document.getElementById(e.id).children[1].innerText=e.state});const states=document.getElementById("states");let row,i=0;for(;row=states.rows[i];i++)if(row.children[2].children.length){for(const t of actions)if(row.classList.contains(t[0])){let e=row.id.substr(t[0].length+1);for(let n=0;n'+t.data.substr(7,t.data.length-11)+"\n"});const actions=[["switch",["toggle"]],["light",["toggle"]],["fan",["toggle"]],["cover",["open","close"]],["button",["press"]],["lock",["lock","unlock","open"]]];const multi_actions=[["select","option"],["number","value"]];source.addEventListener("state",function(t){const e=JSON.parse(t.data);document.getElementById(e.id).children[1].innerText=e.state});const states=document.getElementById("states");let row,i=0;for(;row=states.rows[i];i++)if(row.children[2].children.length){for(const t of actions)if(row.classList.contains(t[0])){let e=row.id.substr(t[0].length+1);for(let n=0;n`, + the anticlockwise one to :ref:`display_menu.up ` and the switch + to :ref:`display_menu.enter ` action. The ``joystick`` mode + expects the up, down, left and right buttons wired to the :ref:`display_menu.up `, + :ref:`display_menu.down `, :ref:`display_menu.left ` + and :ref:`display_menu.right ` actions and the middle button + to the :ref:`display_menu.enter ` action. Defaults to ``rotary``. +- **menu** (**Required**): The first level of the menu. + +Automations: + +- **on_enter** (*Optional*, :ref:`Automation `): An automation to perform + when the menu level (here the root one) is entered. See :ref:`display_menu-on_enter`. +- **on_leave** (*Optional*, :ref:`Automation `): An automation to perform + when the menu level is not displayed anymore. + See :ref:`display_menu-on_leave`. + +Menu Items +---------- + +The component manages a hierarchy of menu items. The common configuration variables are: + +- **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation. +- **type** (**Required**, string): The type of the menu item (see below). +- **text** (*Optional*, string, :ref:`templatable `): The text displayed + for the menu item. If a lambda is specified it gets an ``it`` argument pointing to + the ``MenuItem`` that is being drawn. + + +.. _display_menu-edit_mode: + +Editing values +************** + +Some of the menu items provide a way to edit values either by selecting from a list of options +or changing a numeric one. Such items can be configured in two ways. + +If the ``immediate_edit`` configuration is ``false``, the editing mode has to be activated +first by activating the rotary encoder's switch or the joystick's center button. +On the activation the ``on_enter`` automation is called and the item is marked as editable +(the ``>`` selection marker changes to ``*`` as default). The value can be then +iterated through the rotary wheel (in the ``rotary`` mode) or the joystick left +and right buttons (in the ``joystick`` one). The editing mode is deactivated +by another clicking of the switch, the ``on_leave`` automation is called and the selection +marker changes back. + +If the ``immediate_edit`` configuration is ``true`` the menu item is editable immediately +when it is selected. The ``on_enter`` and ``on_leave`` are not called. In the ``joystick`` mode +the left and right buttons iterate through the values; the items that are editable +show the editable marker to signal that the buttons can be used. In the ``rotary`` mode +activating the switch iterates to the next value. The selection marker does not change +(here it is used to signal whether rotating the knob navigates the menu or changes the value). +The menu item of the ``number`` type can be only immediately editable in the ``joystick`` mode. + +Label +***** + +.. code-block:: yaml + + items: + - id: my_label + type: label + text: 'My Label' + +The menu item of the type ``label`` just displays a text. There is no configuration and +no interaction is possible. + +Menu +**** + +.. code-block:: yaml + + items: + - type: menu + text: 'My Submenu' + on_enter: + then: + lambda: 'ESP_LOGI("display_menu", "enter: %s", it->get_text().c_str());' + on_leave: + then: + lambda: 'ESP_LOGI("display_menu", "leave: %s", it->get_text().c_str());' + items: + - type: label + text: 'Label' + - type: back + text: 'Back' + +The menu item of the type ``menu`` defines a list of child menu items. When the item +is clicked the display shows the new menu level. + +Configuration variables: + +- **menu** (**Required**): Defines the child menu items. + +Automations: + +- **on_enter** (*Optional*, :ref:`Automation `): An automation to perform + when the menu level is entered. See :ref:`display_menu-on_enter`. +- **on_leave** (*Optional*, :ref:`Automation `): An automation to perform + when the menu level is not displayed anymore. + See :ref:`display_menu-on_leave`. + +Back +**** + +.. code-block:: yaml + + items: + - type: back + text: 'Back' + +The menu item of the type ``back`` closes the current menu level and goes up in +the menu level hierarchy. The ``on_leave`` automation of the current level and +``on_enter`` one of the higher one are invoked. There is no configuration. + +Select +****** + +.. code-block:: yaml + + lcd_menu: + items: + - type: select + immediate_edit: false + text: 'My Color' + select: my_color + on_enter: + then: + lambda: 'ESP_LOGI("display_menu", "select enter: %s, %s", it->get_text().c_str(), it->get_value_text().c_str());' + on_leave: + then: + lambda: 'ESP_LOGI("display_menu", "select leave: %s, %s", it->get_text().c_str(), it->get_value_text().c_str());' + on_value: + then: + lambda: 'ESP_LOGI("display_menu", "select value: %s, %s", it->get_text().c_str(), it->get_value_text().c_str());' + + select: + - platform: template + id: my_color + optimistic: true + options: + - 'Red' + - 'Green' + - 'Blue' + +The menu item of the type ``select`` allows cycling through a set of values defined by the +associated ``select`` component. + +Configuration variables: + +- **immediate_edit** (*Optional*, boolean): Whether the item can be immediately edited when + selected. See :ref:`Editing Values `. Defaults to ``false``. +- **select** (**Required**, :ref:`config-id`): A ``select`` component managing + the edited value. +- **value_lambda** (*Optional*, :ref:`lambda `): + Lambda returning a string to be displayed as value. The lambda gets an ``it`` argument + pointing to the ``MenuItem``. If not specified the selected option name of the ``select`` + component is used as the value. + +Automations: + +- **on_enter** (*Optional*, :ref:`Automation `): An automation to perform + when the editing mode is activated. See :ref:`display_menu-on_enter`. +- **on_leave** (*Optional*, :ref:`Automation `): An automation to perform + when the editing mode is exited. + See :ref:`display_menu-on_leave`. +- **on_value** (*Optional*, :ref:`Automation `): An automation to perform + when the value is changed. + See :ref:`display_menu-on_value`. + +Number +****** + +.. code-block:: yaml + + lcd_menu: + items: + - type: number + text: 'My Number' + format: '%.2f' + number: my_number + on_enter: + then: + lambda: 'ESP_LOGI("display_menu", "number enter: %s, %s", it->get_text().c_str(), it->get_value_text().c_str());' + on_leave: + then: + lambda: 'ESP_LOGI("display_menu", "number leave: %s, %s", it->get_text().c_str(), it->get_value_text().c_str());' + on_value: + then: + lambda: 'ESP_LOGI("display_menu", "number value: %s, %s", it->get_text().c_str(), it->get_value_text().c_str());' + + number: + - platform: template + id: my_number + optimistic: true + min_value: 10.0 + max_value: 20.0 + step: 0.5 + on_value: + then: + lambda: 'ESP_LOGI("number", "value: %f", x);' + +The menu item of the type ``number`` allows editing a floating point number. +On click the ``on_enter`` automation is called and the item is marked as editable +(the ``>`` selection marker changes to ``*`` as default). Up and down events +then increase and decrease the value by steps defined in the ``number``, +respecting the ``min_value`` and ``max_value``. The editing mode is exited +by another click. + +Note that the fractional floating point values do not necessarily add nicely and +ten times ``0.100000`` is not necessarily ``1.000000``. Use steps that are +powers of two (such as ``0.125``) or take care of the rounding explicitly. + +Configuration variables: + +- **immediate_edit** (*Optional*, boolean): Whether the item can be immediately edited when + selected. See :ref:`Editing Values `. Ignored in the ``rotary`` mode. + Defaults to ``false``. +- **number** (**Required**, :ref:`config-id`): A ``number`` component managing + the edited value. If on entering the value is less than ``min_value`` or more than + ``max_value``, the value is capped to fall into the range. +- **format** (*Optional*, string): A ``printf``-like format string specifying + exactly one ``f`` or ``g``-type conversion used to display the current value. + Defaults to ``%.1f``. +- **value_lambda** (*Optional*, :ref:`lambda `): + Lambda returning a string to be displayed as value. The lambda gets an ``it`` argument + pointing to the ``MenuItem``. If not specified the value of the ``number`` component + formatted according to the ``format`` is used as the value. + +Automations: + +- **on_enter** (*Optional*, :ref:`Automation `): An automation to perform + when the editing mode is activated. See :ref:`display_menu-on_enter`. +- **on_leave** (*Optional*, :ref:`Automation `): An automation to perform + when the editing mode is exited. + See :ref:`display_menu-on_leave`. +- **on_value** (*Optional*, :ref:`Automation `): An automation to perform + when the value is changed. + See :ref:`display_menu-on_value`. + +Switch +****** + +.. code-block:: yaml + + lcd_menu: + items: + - type: switch + immediate_edit: false + text: 'My Switch' + on_text: 'Bright' + off_text: 'Dark' + switch: my_switch + on_enter: + then: + lambda: 'ESP_LOGI("display_menu", "switch enter: %s, %s", it->get_text().c_str(), it->get_value_text().c_str());' + on_leave: + then: + lambda: 'ESP_LOGI("display_menu", "switch leave: %s, %s", it->get_text().c_str(), it->get_value_text().c_str());' + on_value: + then: + lambda: 'ESP_LOGI("display_menu", "switch value: %s, %s", it->get_text().c_str(), it->get_value_text().c_str());' + + switch: + - platform: template + id: my_switch + optimistic: true + +The menu item of the type ``switch`` allows toggling the associated ``switch`` component. + +Configuration variables: + +- **immediate_edit** (*Optional*, boolean): Whether the item can be immediately edited when + selected. See :ref:`Editing Values `. Defaults to ``false``. +- **on_text** (*Optional*, string): The text for the ``ON`` state. Defaults to ``On``. +- **off_text** (*Optional*, string): The text for the ``OFF`` state. Defaults to ``Off``. +- **switch** (**Required**, :ref:`config-id`): A ``switch`` component managing + the edited value. +- **value_lambda** (*Optional*, :ref:`lambda `): + Lambda returning a string to be displayed as value. The lambda gets an ``it`` argument + pointing to the ``MenuItem``. If not specified the ``on_text`` / ``off_text`` is used. + +Automations: + +- **on_enter** (*Optional*, :ref:`Automation `): An automation to perform + when the editing mode is activated. See :ref:`display_menu-on_enter`. +- **on_leave** (*Optional*, :ref:`Automation `): An automation to perform + when the editing mode is exited. + See :ref:`display_menu-on_leave`. +- **on_value** (*Optional*, :ref:`Automation `): An automation to perform + when the value is changed. + See :ref:`display_menu-on_value`. + +Command +******* + +.. code-block:: yaml + + items: + - type: command + text: 'Hide' + on_value: + then: + - display_menu.hide: + +The menu item of the type ``command`` allows triggering commands. There is no +additional configuration. + +Automations: + +- **on_value** (*Optional*, :ref:`Automation `): An automation to perform + when the menu item is clicked. + See :ref:`display_menu-on_value`. + +Custom +****** + +.. code-block:: yaml + + lcd_menu: + items: + - type: custom + immediate_edit: false + text: 'My Custom' + value_lambda: 'return to_string(some_state);' + on_next: + then: + lambda: 'some_state++;' + on_prev: + then: + lambda: 'some_state--;' + +The menu item of the type ``custom`` delegates navigating the values to the automations +and displaying the value to the ``value_lambda``. + +Configuration variables: + +- **immediate_edit** (*Optional*, boolean): Whether the item can be immediately edited when + selected. See :ref:`Editing Values `. Defaults to ``false``. +- **value_lambda** (*Optional*, :ref:`lambda `): + Lambda returning a string to be displayed as value. The lambda gets an ``it`` argument + pointing to the ``MenuItem``. + +Automations: + +- **on_enter** (*Optional*, :ref:`Automation `): An automation to perform + when the editing mode is activated. See :ref:`display_menu-on_enter`. +- **on_leave** (*Optional*, :ref:`Automation `): An automation to perform + when the editing mode is exited. + See :ref:`display_menu-on_leave`. +- **on_value** (*Optional*, :ref:`Automation `): An automation to perform + when the value is changed. + See :ref:`display_menu-on_value`. +- **on_next** (*Optional*, :ref:`Automation `): An automation to perform + when the user navigates to the next value. + See :ref:`display_menu-on_next`. +- **on_prev** (*Optional*, :ref:`Automation `): An automation to perform + when the user navigates to the previous value. + See :ref:`display_menu-on_prev`. + +Automations +----------- + +.. _display_menu-on_enter: + +``on_enter`` +************ + +This automation will be triggered when the menu level is entered, i.e. the component +draws its items on the display. The ``it`` parameter points to a ``MenuItem`` class +with the information of the menu item describing the displayed child items. +If present at the top level it is an internally generated root menu item, +otherwise an user defined one. + + +.. code-block:: yaml + + lcd_menu: + ... + items: + - type: menu + text: 'Submenu 1' + on_enter: + then: + lambda: 'ESP_LOGI("display_menu", "enter: %s", it->get_text().c_str());' + +.. _display_menu-on_leave: + +``on_leave`` +************ + +This automation will be triggered when the menu level is exited, i.e. the component +does not draw its items on the display anymore. The ``it`` parameter points to +a ``MenuItem`` class with the information of the menu item. If present at the +top level it is an internally generated root menu item, otherwise +an user defined one. It does not matter whether the level was left due to entering +the submenu or going back to the parent menu. + +.. code-block:: yaml + + lcd_menu: + ... + items: + - type: menu + text: 'Submenu 1' + on_leave: + then: + lambda: 'ESP_LOGI("display_menu", "leave: %s", it->get_text().c_str());' + +.. _display_menu-on_value: + +``on_value`` +************ + +This automation will be triggered when the value edited through the menu changed +or a command was triggered. + +.. code-block:: yaml + + lcd_menu: + ... + items: + - type: select + text: 'Select Item' + select: my_select_1 + on_value: + then: + lambda: 'ESP_LOGI("display_menu", "select value: %s, %s", it->get_text().c_str(), it->get_value_text().c_str());' + +.. _display_menu-on_next: + +``on_next`` +*********** + +This automation will be triggered when the user requested to set the value to the next one. + +.. code-block:: yaml + + lcd_menu: + ... + items: + - type: custom + text: 'Custom Item' + value_lambda: 'return to_string(some_state);' + on_next: + then: + lambda: 'some_state++;' + +.. _display_menu-on_prev: + +``on_prev`` +*********** + +This automation will be triggered when the user requested to set the value to the previous one. + +.. code-block:: yaml + + lcd_menu: + ... + items: + - type: custom + text: 'Custom Item' + value_lambda: 'return to_string(some_state);' + on_prev: + then: + lambda: 'some_state--;' + +.. _display_menu-up_action: + +``display_menu.up`` Action +************************** + +This is an :ref:`Action ` for navigating up in a menu. The action +is usually wired to an anticlockwise turn of a rotary encoder or to the upper +button of the joystick. + +.. code-block:: yaml + + sensor: + - platform: rotary_encoder + ... + on_anticlockwise: + - display_menu.up: + +Configuration variables: + +- **id** (*Optional*, :ref:`config-id`): The ID of the menu to navigate. + +.. _display_menu-down_action: + +``display_menu.down`` Action +**************************** + +This is an :ref:`Action ` for navigating down in a menu. The action +is usually wired to a clockwise turn of a rotary encoder or to the lower +button of the joystick. + +.. code-block:: yaml + + sensor: + - platform: rotary_encoder + ... + on_clockwise: + - display_menu.down: + +Configuration variables: + +- **id** (*Optional*, :ref:`config-id`): The ID of the menu to navigate. + +.. _display_menu-left_action: + +``display_menu.left`` Action +**************************** + +This is an :ref:`Action ` usually wired to the left button +of the joystick. In the ``joystick`` mode it is used to set the previous +value or to decrement the numeric one; depending on the ``immediate_edit`` +flag entering the edit mode is required or not. If used in the ``rotary`` +mode it exits the editing. In both modes it can be also used to navigate +back one level when used with the ``back`` menu item. + +.. code-block:: yaml + + binary_sensor: + - platform: gpio + ... + on_press: + - display_menu.left: + +Configuration variables: + +- **id** (*Optional*, :ref:`config-id`): The ID of the menu to navigate. + +.. _display_menu-right_action: + +``display_menu.right`` Action +***************************** + +This is an :ref:`Action ` usually wired to the right button +of the joystick. In the ``joystick`` mode it is used to set the next +value or to increment the numeric one; depending on the ``immediate_edit`` +flag entering the edit mode is required or not. In both modes it can +be also used to enter the submenu when used with the ``menu`` menu item. + +.. code-block:: yaml + + binary_sensor: + - platform: gpio + ... + on_press: + - display_menu.right: + +Configuration variables: + +- **id** (*Optional*, :ref:`config-id`): The ID of the menu to navigate. + +.. _display_menu-enter_action: + +``display_menu.enter`` Action +***************************** + +This is an :ref:`Action ` for triggering a selected menu item, resulting +in an action depending on the type of the item - entering a submenu, starting/stopping +editing or triggering a command. The action is usually wired to a press button +of a rotary encoder or to the center button of the joystick. + +.. code-block:: yaml + + binary_sensor: + - platform: gpio + ... + filters: + - delayed_on: 10ms + - delayed_off: 10ms + on_press: + - display_menu.enter: + +Configuration variables: + +- **id** (*Optional*, :ref:`config-id`): The ID of the menu to navigate. + +.. display_menu-show_action: + +``display_menu.show`` Action +**************************** + +This is an :ref:`Action ` for showing an inactive menu. The state +of the menu remains unchanged, i.e. the menu level shown at the moment it was hidden +is restored, as is the selected item. The following snippet shows the menu if it is +inactive, otherwise triggers the selected item. + +.. code-block:: yaml + + on_press: + - if: + condition: + display_menu.is_active: + then: + - display_menu.enter: + else: + - display_menu.show: + +Configuration variables: + +- **id** (*Optional*, :ref:`config-id`): The ID of the menu to show. + +.. display_menu-hide_action: + +``display_menu.hide`` Action +**************************** + +This is an :ref:`Action ` for hiding the menu. A hidden menu +does not react to ``draw()`` and does not process navigation actions. + +.. code-block:: yaml + + lcd_menu: + ... + items: + - type: command + text: 'Hide' + on_value: + then: + - display_menu.hide: + +Configuration variables: + +- **id** (*Optional*, :ref:`config-id`): The ID of the menu to hide. + +.. display_menu-show_main_action: + +``display_menu.show_main`` Action +********************************* + +This is an :ref:`Action ` for showing the root level of the menu. + +.. code-block:: yaml + + lcd_menu: + ... + items: + - type: command + text: 'Show Main' + on_value: + then: + - display_menu.show_main: + +Configuration variables: + +- **id** (*Optional*, :ref:`config-id`): The ID of the menu to hide. + +.. _display_menu-is_active: + +``display_menu.is_active`` Condition +************************************ + +This :ref:`Condition ` checks if the given menu is active, i.e. +shown on the display and processing navigation events. + +.. code-block:: yaml + + on_press: + - if: + condition: + display_menu.is_active: + ... + +See Also +-------- + +- :apiref:`display_menu_base/display_menu_base.h` + +.. toctree:: + :maxdepth: 1 + :glob: + + * diff --git a/components/display_menu/lcd_menu.rst b/components/display_menu/lcd_menu.rst new file mode 100644 index 000000000..af00f765d --- /dev/null +++ b/components/display_menu/lcd_menu.rst @@ -0,0 +1,107 @@ +LCD Menu +======== + +.. seo:: + :description: Instructions for setting up a simple hierarchical menu on displays. + :image: lcd_menu.png + +The component provides an infrastructure for setting up a hierarchical menu +on the character based LCD displays. + + +.. figure:: images/lcd_menu.png + :align: center + :width: 50.0% + +.. _lcd_menu: + +Overview +-------- + +The integration implements the :ref:`Display Menu ` integration providing +a hierarchical menu primarily intended to be controlled either by a rotary encoder +with a button or a five-button joystick controller. + +The component needs to be connected to an instance of a character based LCD display, which +at the moment are :ref:`lcd-pcf8574` or a :ref:`lcd-gpio`. For the best results the GPIO +connection is recommended; the I²C one running at the speed according to the datasheet +(usually 100 kHz) or even ESPHome default (50 kHz) will create perceptible delays especially +when changing a numeric value using the rotary encoder. Most PCF8574 adapters used with +these displays will happily run at 200 or even 400 kHz though so if you are comfortable +accepting risks from running your hardware out of spec, you might want to try that +in your ``i2c`` configuration. + +.. code-block:: yaml + + # Example configuration entry + display: + - platform: lcd_pcf8574 + id: my_lcd + dimensions: 20x4 + ... + user_characters: + - position: 0 + data: + - 0b00100 + - 0b01110 + - 0b10101 + - 0b00100 + - 0b00100 + - 0b00100 + - 0b11100 + - 0b00000 + lambda: |- + id(my_lcd_menu).draw(); + if (!id(my_lcd_menu).is_active()) + it.print("Menu is not active"); + + # Declare a LCD menu + lcd_menu: + id: my_lcd_menu + display_id: my_lcd + active: true + mode: rotary + mark_back: 0x08 + mark_selected: 0x3e + mark_editing: 0x2a + mark_submenu: 0x7e + items: + ... + + # Encoder to provide navigation + sensor: + - platform: rotary_encoder + ... + on_anticlockwise: + - display_menu.up: + on_clockwise: + - display_menu.down: + + # A de-bounced GPIO is used to 'click' + binary_sensor: + - platform: gpio + ... + filters: + - delayed_on: 10ms + - delayed_off: 10ms + on_press: + - display_menu.enter: + +Configuration variables: + +- **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation. +- **display_id** (*Optional*, :ref:`config-id`): Manually specify the ID of the LCD display. +- **mark_back**, **mark_selected**, **mark_editing**, **mark_submenu** (*Optional*, 0-255): + Code of the character used to mark menu items going back one level, a selected one, + the editing mode and item leading to a submenu. Defaults to ``0x5e`` (``^``), ``0x3e`` (``>``), + ``0x2a`` (``*``) and ``0x7e`` (a right arrow). As the character set lacks a good looking + up arrow, using a user defined character is advisable (use ``8`` to reference one at + position ``0`` to avoid problems with zeros in a string). + +The rest of the configuration is described in the :ref:`Display Menu ` component. +The menu inherits the dimensions of the connected LCD display and uses the whole area. + +See Also +-------- + +- :apiref:`lcd_menu/lcd_menu.h` diff --git a/components/index.rst b/components/index.rst index 15a1cda2c..a873c9e66 100644 --- a/components/index.rst +++ b/components/index.rst @@ -20,5 +20,6 @@ Components stepper/index touchscreen/index lock/index + display_menu/index media_player/index * diff --git a/images/lcd_menu.png b/images/lcd_menu.png new file mode 100644 index 0000000000000000000000000000000000000000..979951e437265abbb2fa5d1cae5a950a54982dd2 GIT binary patch literal 8588 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 Date: Tue, 8 Nov 2022 11:11:12 +1300 Subject: [PATCH 18/67] Add default ota port for rp2040 (#2415) --- components/ota.rst | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/components/ota.rst b/components/ota.rst index 1e053fa4f..c05e9f33e 100644 --- a/components/ota.rst +++ b/components/ota.rst @@ -16,8 +16,8 @@ ESPHome also has an "OTA safe mode". If for some reason your node gets into a boot loop, ESPHome will automatically try to detect this and will go over into a safe mode after the configured unsuccessful boot attempts (Defaults to ``10``). In that mode, all components are disabled and only Serial -Logging + Network(WiFi or Ethernet) + OTA are initialized, so that you can upload a new -binary. You can trigger entering safe mode by either configuring a dedicated button or +Logging + Network(WiFi or Ethernet) + OTA are initialized, so that you can upload a new +binary. You can trigger entering safe mode by either configuring a dedicated button or switch to do that or by pressing the reset button on the board for ``num_attempts`` times. @@ -34,8 +34,12 @@ Configuration variables: - **safe_mode** (*Optional*, boolean): Whether to enable safe mode. Defaults to ``true``. - **password** (*Optional*, string): The password to use for updates. -- **port** (*Optional*, int): The port to use for OTA updates. Defaults - to ``3232`` for the ESP32 and ``8266`` for the ESP8266. +- **port** (*Optional*, int): The port to use for OTA updates. + Defaults: + + - ``3232`` for the ESP32 + - ``8266`` for the ESP8266 + - ``2040`` for the RP2040 - **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation. - **reboot_timeout** (*Optional*, :ref:`config-time`): The amount of time to wait before rebooting when in safe mode. Defaults to ``5min``. From 33f45d38271f12478ba02ba1b54fcd136a2ff30e Mon Sep 17 00:00:00 2001 From: jimtng <2554958+jimtng@users.noreply.github.com> Date: Wed, 9 Nov 2022 13:52:04 +1000 Subject: [PATCH 19/67] Add documentation on script parameters (#2120) Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> --- guides/automations.rst | 49 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 45 insertions(+), 4 deletions(-) diff --git a/guides/automations.rst b/guides/automations.rst index d8da7656d..5b2a940a4 100644 --- a/guides/automations.rst +++ b/guides/automations.rst @@ -712,9 +712,45 @@ Configuration variables: - **max_runs** (*Optional*, int): Allows limiting the maxiumun number of runs when using script modes ``queued`` and ``parallel``, use value ``0`` for unlimited runs. Defaults to ``0``. +- **parameters** (*Optional*, :ref:`Script Parameters `): A script can define one + or more parameters that must be provided in order to execute. All parameters defined here are + mandatory and must be given when calling the script. - **then** (**Required**, :ref:`Action `): The action to perform. +.. _script-parameters: + +``Script Parameters`` +--------------------- + +Scripts can be defined with parameters. The arguments given when calling the script can be used within +the script's lambda actions. To define the parameters, add the parameter names under `parameters:` key +and specify the data type for that parameter. + +Supported data types: + +* `bool`: A boolean true/false. C++ type: `bool` +* `int`: An integer. C++ type: `int32_t` +* `float`: A floating point number. C++ type: `float` +* `string`: A string. C++ type: `std::string` + +Each of these also exist in array form: + +* `bool[]`: An array of boolean values. C++ type: `std::vector` +* Same for other types. + +.. code-block:: yaml + + script: + - id: blink_light + parameters: + delay_ms: int + then: + - light.turn_on: status_light + # The param delay_ms is accessible using a lambda + - delay: !lambda return delay_ms; + - light.turn_off: status_light + .. _script-execute_action: ``script.execute`` Action @@ -729,12 +765,17 @@ script was already running. on_...: then: - script.execute: my_script + + # Calling a non-parameterised script in a lambda + - lambda: id(my_script).execute(); -or as lambda + # Calling a script with parameters + - script.execute: + id: blink_light + delay_ms: 500 -.. code-block:: yaml - - lambda: 'id(my_script).execute();' + # Calling a parameterised script inside a lambda + - lambda: id(blink_light)->execute(1000); .. _script-stop_action: From 47fb39cdd81bc0236f6db6e46a441f8da3e770a7 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 9 Nov 2022 17:27:19 +1300 Subject: [PATCH 20/67] Bump version to 2022.11.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 b489df92e..8bc2c31dd 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 = 2022.11.0-dev +PROJECT_NUMBER = 2022.11.0b1 # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a diff --git a/Makefile b/Makefile index 299496721..709a09d40 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ ESPHOME_PATH = ../esphome -ESPHOME_REF = dev +ESPHOME_REF = 2022.11.0b1 .PHONY: html html-strict cleanhtml deploy help live-html Makefile netlify netlify-api api netlify-dependencies svg2png copy-svg2png minify diff --git a/_static/version b/_static/version index 17d938bba..121de79cf 100644 --- a/_static/version +++ b/_static/version @@ -1 +1 @@ -2022.11.0-dev \ No newline at end of file +2022.11.0b1 \ No newline at end of file diff --git a/conf.py b/conf.py index 4743aa159..897e1b72e 100644 --- a/conf.py +++ b/conf.py @@ -69,7 +69,7 @@ author = "ESPHome" # The short X.Y version. version = "2022.11" # The full version, including alpha/beta/rc tags. -release = "2022.11.0-dev" +release = "2022.11.0b1" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 8d5f6d70986bd8b6a85ebab2bf448b33abfc2022 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 9 Nov 2022 17:29:56 +1300 Subject: [PATCH 21/67] Update changelog for 2022.11.0b1 --- changelog/2022.11.0.rst | 116 ++++++++++++++++++++++++++++++++++++++++ changelog/index.rst | 2 +- 2 files changed, 117 insertions(+), 1 deletion(-) create mode 100644 changelog/2022.11.0.rst diff --git a/changelog/2022.11.0.rst b/changelog/2022.11.0.rst new file mode 100644 index 000000000..7fa7bbf19 --- /dev/null +++ b/changelog/2022.11.0.rst @@ -0,0 +1,116 @@ +ESPHome 2022.11.0 - 16th November 2022 +====================================== + +.. seo:: + :description: Changelog for ESPHome 2022.11.0. + :image: /_static/changelog-2022.10.0.png + :author: Jesse Hills + :author_twitter: @jesserockz + +.. imgtable:: + :columns: 2 + + +Raspberry Pi Pico-W +------------------- + +To be written... + +Script Parameters +----------------- + +To be written... + +LCD Menu +-------- + +To be written... + + +Full list of changes +-------------------- + +New Features +^^^^^^^^^^^^ + +- Allow preserving WiFi credentials entered with captive_portal :esphomepr:`3813` by :ghuser:`kuba2k2` (new-feature) + +New Components +^^^^^^^^^^^^^^ + +- Add support for wl-134 :esphomepr:`3569` by :ghuser:`hobbypunk90` (new-integration) +- New platform ethernet_info from component text_sensor :esphomepr:`3811` by :ghuser:`gtjadsonsantos` (new-integration) +- Implementation for Atlas Scientific Peristaltic Pump :esphomepr:`3528` by :ghuser:`carlos-sarmiento` (new-integration) +- Add adc128s102 sensor :esphomepr:`3822` by :ghuser:`DeerMaximum` (new-integration) +- Added component Daikin BRC to support ceiling cassette heatpumps :esphomepr:`3743` by :ghuser:`hagak` (new-integration) +- Initial Support for RP2040 platform :esphomepr:`3284` by :ghuser:`jesserockz` (new-integration) +- Implement a simple LCD menu :esphomepr:`3406` by :ghuser:`numo68` (new-integration) + +Breaking Changes +^^^^^^^^^^^^^^^^ + +- Don't Use Base Network Manual IP for WiFi AP :esphomepr:`3902` by :ghuser:`bkaufx` (breaking-change) + +All changes +^^^^^^^^^^^ + +- Update the ibeacon code :esphomepr:`3859` by :ghuser:`fhriley` +- Don't Use Base Network Manual IP for WiFi AP :esphomepr:`3902` by :ghuser:`bkaufx` (breaking-change) +- Allow preserving WiFi credentials entered with captive_portal :esphomepr:`3813` by :ghuser:`kuba2k2` (new-feature) +- Add support for wl-134 :esphomepr:`3569` by :ghuser:`hobbypunk90` (new-integration) +- New platform ethernet_info from component text_sensor :esphomepr:`3811` by :ghuser:`gtjadsonsantos` (new-integration) +- Implementation for Atlas Scientific Peristaltic Pump :esphomepr:`3528` by :ghuser:`carlos-sarmiento` (new-integration) +- Add adc128s102 sensor :esphomepr:`3822` by :ghuser:`DeerMaximum` (new-integration) +- Added component Daikin BRC to support ceiling cassette heatpumps :esphomepr:`3743` by :ghuser:`hagak` (new-integration) +- Bump platformio from 6.0.2 to 6.1.4 :esphomepr:`3711` by :ghuser:`dependabot[bot]` +- Add API interface to request a complete device config as JSON. :esphomepr:`3911` by :ghuser:`RoboMagus` +- Initial Support for RP2040 platform :esphomepr:`3284` by :ghuser:`jesserockz` (new-integration) +- Bump esphome-dashboard to 20221020.0 :esphomepr:`3920` by :ghuser:`jesserockz` +- Fix missing dependencies for heatpumpir :esphomepr:`3933` by :ghuser:`jesserockz` +- Update the PR template :esphomepr:`3934` by :ghuser:`jesserockz` +- Fix error with require_framework_version and rp2040 :esphomepr:`3923` by :ghuser:`jesserockz` +- Make mDNS on rp2040 work :esphomepr:`3936` by :ghuser:`jesserockz` +- Send manufacturer name via API :esphomepr:`3938` by :ghuser:`jesserockz` +- Update base platformio board for rp2040 :esphomepr:`3937` by :ghuser:`jesserockz` +- Implement different random for rp2040 :esphomepr:`3939` by :ghuser:`jesserockz` +- add proper device class to uptime :esphomepr:`3928` by :ghuser:`nagyrobi` +- Show local mac when scanning wifi :esphomepr:`3635` by :ghuser:`cvwillegen` +- Prefix devcontainer image with ghcr.io :esphomepr:`3942` by :ghuser:`jesserockz` +- Implement InterruptLock for RP2040 :esphomepr:`3945` by :ghuser:`jesserockz` +- Implement RP2040 preferences :esphomepr:`3946` by :ghuser:`jesserockz` +- Fix filesystem size for RP2040 OTA :esphomepr:`3947` by :ghuser:`jesserockz` +- Bump esphome/Improv to 1.2.3 :esphomepr:`3948` by :ghuser:`jesserockz` +- Add core config option to limit compile process count :esphomepr:`3952` by :ghuser:`jesserockz` +- Some RP2040 wifi changes for AP mode :esphomepr:`3953` by :ghuser:`jesserockz` +- Update rp2040 to latest framework release from GitHub :esphomepr:`3954` by :ghuser:`jesserockz` +- [SM300D2] Reduce log severity for successful reads :esphomepr:`3955` by :ghuser:`pauln` +- Fix imports for rp2040 with no wifi :esphomepr:`3956` by :ghuser:`jesserockz` +- Allow using LED pin on rpi pico-w :esphomepr:`3957` by :ghuser:`jesserockz` +- Fix RP2040 SPISettings :esphomepr:`3960` by :ghuser:`jesserockz` +- Make some minor changes to I²C so rp2040 works :esphomepr:`3959` by :ghuser:`jesserockz` +- Bump tornado from 6.1 to 6.2 :esphomepr:`3620` by :ghuser:`dependabot[bot]` +- Bump pytest-cov from 3.0.0 to 4.0.0 :esphomepr:`3922` by :ghuser:`dependabot[bot]` +- Remove gitpod :esphomepr:`3964` by :ghuser:`balloob` +- Bump pyupgrade from 3.0.0 to 3.2.0 :esphomepr:`3973` by :ghuser:`dependabot[bot]` +- Bump pytest from 7.1.3 to 7.2.0 :esphomepr:`3966` by :ghuser:`dependabot[bot]` +- Bump actions/stale from 5 to 6 :esphomepr:`3841` by :ghuser:`dependabot[bot]` +- Bump pylint from 2.15.3 to 2.15.5 :esphomepr:`3978` by :ghuser:`dependabot[bot]` +- Bump pytest-mock from 3.8.2 to 3.10.0 :esphomepr:`3877` by :ghuser:`dependabot[bot]` +- Allow multiple bluetooth proxy connections :esphomepr:`3971` by :ghuser:`jesserockz` +- Always use gh releases in base platformio file for rp2040 :esphomepr:`3988` by :ghuser:`jesserockz` +- Allow the use of multiple RDM6300 devices :esphomepr:`3989` by :ghuser:`mbardeen` +- Bump aioesphomeapi from 10.13.0 to 11.4.2 :esphomepr:`3987` by :ghuser:`dependabot[bot]` +- rp2040: Set watchdog to reboot properly :esphomepr:`3991` by :ghuser:`jesserockz` +- RP2040 uart support :esphomepr:`3990` by :ghuser:`jesserockz` +- add uart number to LOGCONFIG :esphomepr:`3996` by :ghuser:`tomaszduda23` +- Implement a simple LCD menu :esphomepr:`3406` by :ghuser:`numo68` (new-integration) +- Lint updates :esphomepr:`3992` by :ghuser:`jesserockz` +- Bump zeroconf from 0.39.1 to 0.39.4 :esphomepr:`3979` by :ghuser:`dependabot[bot]` +- Bump black from 22.8.0 to 22.10.0 :esphomepr:`3986` by :ghuser:`dependabot[bot]` +- Skip validation of defined pins :esphomepr:`3999` by :ghuser:`jenscski` +- Bump pytest-asyncio from 0.19.0 to 0.20.1 :esphomepr:`4003` by :ghuser:`dependabot[bot]` +- Bump aioesphomeapi from 11.4.2 to 11.4.3 :esphomepr:`4002` by :ghuser:`dependabot[bot]` +- Bump platformio from 6.1.4 to 6.1.5 :esphomepr:`4004` by :ghuser:`dependabot[bot]` +- Enable calibration, callbacks and custom commands for EZO sensors :esphomepr:`3910` by :ghuser:`gvdhoven` +- Bump esphome-dashboard to 20221109.0 :esphomepr:`4006` by :ghuser:`jesserockz` +- Add support for parameters in scripts :esphomepr:`3538` by :ghuser:`jimtng` diff --git a/changelog/index.rst b/changelog/index.rst index babc04499..ab582c12b 100644 --- a/changelog/index.rst +++ b/changelog/index.rst @@ -2,7 +2,7 @@ Changelog ========= .. redirect:: - :url: /changelog/2022.10.0.html + :url: /changelog/2022.11.0.html .. toctree:: :glob: From 444271adfbbb25e3a9a4a5004435871b5eecc2e4 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 9 Nov 2022 17:30:33 +1300 Subject: [PATCH 22/67] Update supporters for 2022.11.0b1 --- guides/supporters.rst | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/guides/supporters.rst b/guides/supporters.rst index cccb67bad..ab29c41f5 100644 --- a/guides/supporters.rst +++ b/guides/supporters.rst @@ -175,6 +175,7 @@ Contributors - `Dmitry Berezovsky (@corvis) `__ - `Cougar (@Cougar) `__ - `Connor Prussin (@cprussin) `__ +- `Corey Rice (@crice009) `__ - `cryptelli (@cryptelli) `__ - `cstaahl (@cstaahl) `__ - `Chris Talkington (@ctalkington) `__ @@ -499,6 +500,7 @@ Contributors - `Kyle Manna (@kylemanna) `__ - `Kalashnikov Ilya (@l1bbcsg) `__ - `Limor "Ladyada" Fried (@ladyada) `__ +- `Lakshantha Dissanayake (@lakshanthad) `__ - `Luca Adrian L (@lal12) `__ - `Fredrik Lindqvist (@Landrash) `__ - `Laszlo Gazdag (@lazlyhu) `__ @@ -652,12 +654,10 @@ Contributors - `Ockert Marais (@OckertM) `__ - `Dave Walker (@oddsockmachine) `__ - `Andrey Ganzevich (@odya) `__ -- `Olivér Falvai (@ofalvai) `__ - `ogatatsu (@ogatatsu) `__ - `Oğuzhan Başer (@oguzhanbaser) `__ - `Omar Ghader (@omarghader) `__ - `Ömer Şiar Baysal (@omersiar) `__ -- `Oncleben31 (@oncleben31) `__ - `Oscar Bolmsten (@oscar-b) `__ - `Trammell Hudson (@osresearch) `__ - `Otamay (@Otamay) `__ @@ -740,6 +740,7 @@ Contributors - `Silvio (@s1lvi0) `__ - `Jan Čermák (@sairon) `__ - `sascha lammers (@sascha432) `__ +- `Søren Christian Aarup (@scaarup) `__ - `Nils Schulte (@Schnilz) `__ - `Wolle (@schreibfaul1) `__ - `Ville Skyttä (@scop) `__ @@ -896,4 +897,4 @@ Contributors - `Zack Barett (@zsarnett) `__ - `Christian Zufferey (@zuzu59) `__ -*This page was last updated November 1, 2022.* +*This page was last updated November 9, 2022.* From 983ca09fdc8315713957054bb7aa4fb1215ad3a4 Mon Sep 17 00:00:00 2001 From: Gilles van den Hoven Date: Wed, 9 Nov 2022 23:07:16 +0100 Subject: [PATCH 23/67] Updates for new functionality of the EZO component. (#2133) Co-authored-by: Steve HOLWEG Co-authored-by: Samuel Sieb --- components/sensor/ezo.rst | 135 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 131 insertions(+), 4 deletions(-) diff --git a/components/sensor/ezo.rst b/components/sensor/ezo.rst index 042722250..fd7e2b7a4 100644 --- a/components/sensor/ezo.rst +++ b/components/sensor/ezo.rst @@ -9,6 +9,8 @@ EZO sensor circuits The ``ezo`` sensor platform allows you to use your EZO sensor circuits with ESPHome. The :ref:`I²C Bus ` is required to be set up in your configuration for this sensor to work. +All embedded solutions from EZO can be found `here `__. +If a certain command is not supported directly, it can be executed with the ``send_custom()`` method call. .. figure:: images/ezo-ph-circuit.png :align: center @@ -43,20 +45,145 @@ Configuration variables: - **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas. - All other options from :ref:`Sensor `. +.. _evo_callbacks: + +Callbacks +--------- + +- **on_led:** : Triggered when the result of ``get_led_state()`` is ready. The LED state is provided as a boolean variable named ``x``. +- **on_device_information:** : Triggered when the result of ``get_device_information()`` is ready. The result is provided as a ``std::string`` variable named ``x``. +- **on_slope:** : Triggered when the result of ``get_slope()`` is ready. The result is provided as a ``std::string`` variable named ``x``. +- **on_calibration:** : Triggered when the result of ``get_calibration()`` is ready. The result is provided as a ``std::string`` variable named ``x``. +- **on_t:** : Triggered when the result of ``get_t()`` is ready. The result is provided as a ``std::string`` variable named ``x``. +- **on_custom:** : Triggered when the result of ``get_custom()`` is ready. The result is provided as a ``std::string`` variable named ``x``. + +.. _evo_lambda_calls: + lambda calls ------------ -From :ref:`lambdas `, you can set the temperature compensation for the -sensors that support that option. +From :ref:`lambdas `, you can interact with the sensor in various ways. For any ``get`` command a trigger will be called with the information retrieved from the sensor. See :ref:`evo_callbacks`. For more information on the command specifics, refer to the datasheet. -- ``set_tempcomp_value()``: Send the given temperature to the sensor. +- ``set_i2c(uint8_t address)``: Set I2C address of the device, must be an integer between 1 and 127 + + .. code-block:: cpp + + id(ph_ezo).set_i2c(100); + + +- ``get_device_information()``: Sensor retrieves calibration and triggers ``on_device_information:`` once done + + .. code-block:: cpp + + id(ph_ezo).get_device_information(); + + +- ``set_sleep()``: Put the device to sleep + + .. code-block:: cpp + + id(ph_ezo).set_sleep(); + + +- ``get_state()``: Performs a read on the current sensor. + + .. code-block:: cpp + + id(ph_ezo).get_state(); + + +- ``get_slope()``: Sensor retrieves slope and triggers ``on_slope:`` once done + + .. code-block:: cpp + + id(ph_ezo).get_slope(); + + +- ``get_t()``: Sensor retrieves temperature compensation value (in Celcius) and triggers ``on_t:`` once done + + .. code-block:: cpp + + id(ph_ezo).get_t(); + + +- ``set_t(float value)``: Send the given temperature (in Celcius) to the sensor. + + .. code-block:: cpp + + id(ph_ezo).set_t("27.00"); + + +- ``set_tempcomp_value(float temp)``: Send the given temperature (in Celcius) to the sensor (this is an alias of `set_t()` for backwards compatibility) .. code-block:: cpp - // Within a lambda, set the temperature compensation value from the temperature sensor id(ph_ezo).set_tempcomp_value(id(rtd_ezo).state); +- ``get_calibration()``: Sensor retrieves calibration and triggers ``on_calibration:`` once done + + .. code-block:: cpp + + id(ph_ezo).get_calibration(); + + +- ``set_calibration_generic(float value)``: Sets the calibration with no point. + + .. code-block:: cpp + + id(ph_ezo).set_calibration_generic(750.0); + + +- ``set_calibration_point_low(float value)``: Sets the low calibration point. + + .. code-block:: cpp + + id(ph_ezo).set_calibration_point_low(4.00); + + +- ``set_calibration_point_mid(float value)``: Sets the medium calibration point. + + .. code-block:: cpp + + id(ph_ezo).set_calibration_point_mid(7.00); + + +- ``set_calibration_point_high(float value)``: Sets the high calibration point. + + .. code-block:: cpp + + id(ph_ezo).set_calibration_point_low(10.00); + + +- ``clear_calibration()``: Clears all calibration points. + + .. code-block:: cpp + + id(ph_ezo).clear_calibration(); + + +- ``get_led_state()``: Sensor LED state and triggers ``on_led:`` once done + + .. code-block:: cpp + + id(ph_ezo).get_led_state(); + + +- ``set_led_state(bool on)``: Sensor LED on or off + + .. code-block:: cpp + + id(ph_ezo).set_led_state(true); + + +- ``send_custom(const std::string &payload, uint16_t delay_ms = 300, bool response_expected = false)``: Runs a custom command. This sends exactly what is in ``payload``. Optionally you can set a ``delay`` and if a response is expected that should be parsed. Defaults to ``false`` for custom commands. Triggers ``on_custom:`` if there's a response. + + .. code-block:: cpp + + // Run a custom command to turn on the LED + id(ph_ezo).send_custom("L,1"); + + See Also -------- From 8a901cb1d91cfd11f5031ccdbb34f6c948576a8c Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 10 Nov 2022 11:08:25 +1300 Subject: [PATCH 24/67] Bump version to 2022.11.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 8bc2c31dd..f2f74d453 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 = 2022.11.0b1 +PROJECT_NUMBER = 2022.11.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 709a09d40..eaa1d771a 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ ESPHOME_PATH = ../esphome -ESPHOME_REF = 2022.11.0b1 +ESPHOME_REF = 2022.11.0b2 .PHONY: html html-strict cleanhtml deploy help live-html Makefile netlify netlify-api api netlify-dependencies svg2png copy-svg2png minify diff --git a/_static/version b/_static/version index 121de79cf..e4f798a0a 100644 --- a/_static/version +++ b/_static/version @@ -1 +1 @@ -2022.11.0b1 \ No newline at end of file +2022.11.0b2 \ No newline at end of file diff --git a/conf.py b/conf.py index 897e1b72e..241a5d9dc 100644 --- a/conf.py +++ b/conf.py @@ -69,7 +69,7 @@ author = "ESPHome" # The short X.Y version. version = "2022.11" # The full version, including alpha/beta/rc tags. -release = "2022.11.0b1" +release = "2022.11.0b2" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 2dd813669861c15662c2891c2b7193b263330f78 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 10 Nov 2022 11:48:34 +1300 Subject: [PATCH 25/67] Update changelog for 2022.11.0b2 --- _static/changelog-2022.11.0.png | Bin 0 -> 60166 bytes changelog/2022.11.0.rst | 99 ++++++++++++++++++++++++++++++-- index.rst | 1 + 3 files changed, 96 insertions(+), 4 deletions(-) create mode 100644 _static/changelog-2022.11.0.png diff --git a/_static/changelog-2022.11.0.png b/_static/changelog-2022.11.0.png new file mode 100644 index 0000000000000000000000000000000000000000..3d28c77c9c1f148b70e121c8cb0dbe0a444b43ed GIT binary patch literal 60166 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 literal 0 HcmV?d00001 diff --git a/changelog/2022.11.0.rst b/changelog/2022.11.0.rst index 7fa7bbf19..63634d484 100644 --- a/changelog/2022.11.0.rst +++ b/changelog/2022.11.0.rst @@ -3,27 +3,74 @@ ESPHome 2022.11.0 - 16th November 2022 .. seo:: :description: Changelog for ESPHome 2022.11.0. - :image: /_static/changelog-2022.10.0.png + :image: /_static/changelog-2022.11.0.png :author: Jesse Hills :author_twitter: @jesserockz .. imgtable:: - :columns: 2 + :columns: 4 + + RP2040, components/rp2040, rp2040.svg + WL-134 Pet Tag Sensor , components/text_sensor/wl_134, fingerprint.svg + Ethernet Info, components/text_sensor/ethernet_info, ethernet.svg + Atlas Scientific Peristaltic Pump, components/ezo_pmp, ezo-pmp.jpg + ADC128S102, components/sensor/adc128s102, adc128s102.png + Daikin BRC, components/climate/climate_ir, air-conditioner-ir.svg + Display Menu Core, components/display_menu/index, folder-open.svg + LCD Menu, components/display_menu/lcd_menu, lcd_menu.png Raspberry Pi Pico-W ------------------- -To be written... +What can I say... I (Jesse) started working on making ESPHome run on the original Raspberry Pi +Pico one random weekend just for fun with no real intention of taking it further myself. +Little did I know there would be a Raspberry Pi Pico-W released earlier this year which sparked +up interest in continuing that PR and almost fully implementing RP2040 and the Pico-W as +a supported platform in ESPHome. + +There are things that have not been tested, and most likely things that will not work, so +please `create or search for an issue `__ if this is the case. + +Looking forward to seeing peoples projects built on these boards running ESPHome. Script Parameters ----------------- -To be written... +Thanks :ghuser:`jimtng` for taking the time to implement a feature requested by many people over time. +Parameters on scripts are now a thing. + +.. code-block:: yaml + + script: + - id: push_button + parameters: + button: int + then: + - logger.log: + format: "Button %d pressed" + args: [ button ] + + on_...: + - script.execute: + id: push_button + button: 1 + + on_...: + - script.execute: + id: push_button + button: 2 LCD Menu -------- +Another great feature added this release is the LCD Menu. This allows a user to build a simple (or complex) +menu system on an lcd display within ESPHome YAML, with support for switches, numbers, selects etc. +Thanks :ghuser:`numo68`. + +Preserving User WiFi Credentials +-------------------------------- + To be written... @@ -51,6 +98,14 @@ Breaking Changes - Don't Use Base Network Manual IP for WiFi AP :esphomepr:`3902` by :ghuser:`bkaufx` (breaking-change) +Beta Changes +^^^^^^^^^^^^ + +- Update set-output to use new GITHUB_OUTPUT :esphomepr:`4008` by :ghuser:`jesserockz` +- Add cover toggle support to current based cover :esphomepr:`3950` by :ghuser:`maringeph` +- Add option for dashboard command to only generate the project and supporting files :esphomepr:`3981` by :ghuser:`jesserockz` +- Fix local webserver based on esphome/esphome-webserver#17 :esphomepr:`3958` by :ghuser:`RoboMagus` + All changes ^^^^^^^^^^^ @@ -114,3 +169,39 @@ All changes - Enable calibration, callbacks and custom commands for EZO sensors :esphomepr:`3910` by :ghuser:`gvdhoven` - Bump esphome-dashboard to 20221109.0 :esphomepr:`4006` by :ghuser:`jesserockz` - Add support for parameters in scripts :esphomepr:`3538` by :ghuser:`jimtng` +- Update set-output to use new GITHUB_OUTPUT :esphomepr:`4008` by :ghuser:`jesserockz` +- Add cover toggle support to current based cover :esphomepr:`3950` by :ghuser:`maringeph` +- Add option for dashboard command to only generate the project and supporting files :esphomepr:`3981` by :ghuser:`jesserockz` +- Fix local webserver based on esphome/esphome-webserver#17 :esphomepr:`3958` by :ghuser:`RoboMagus` + +Past Changelogs +--------------- + +- :doc:`2022.10.0` +- :doc:`2022.9.0` +- :doc:`2022.8.0` +- :doc:`2022.6.0` +- :doc:`2022.5.0` +- :doc:`2022.4.0` +- :doc:`2022.3.0` +- :doc:`2022.2.0` +- :doc:`2022.1.0` +- :doc:`2021.12.0` +- :doc:`2021.11.0` +- :doc:`2021.10.0` +- :doc:`2021.9.0` +- :doc:`2021.8.0` +- :doc:`v1.20.0` +- :doc:`v1.19.0` +- :doc:`v1.18.0` +- :doc:`v1.17.0` +- :doc:`v1.16.0` +- :doc:`v1.15.0` +- :doc:`v1.14.0` +- :doc:`v1.13.0` +- :doc:`v1.12.0` +- :doc:`v1.11.0` +- :doc:`v1.10.0` +- :doc:`v1.9.0` +- :doc:`v1.8.0` +- :doc:`v1.7.0` diff --git a/index.rst b/index.rst index 6b1131f83..67854888f 100644 --- a/index.rst +++ b/index.rst @@ -697,6 +697,7 @@ Misc Components PipSolar - compatible PV Inverter, components/pipsolar, pipsolar.jpg Grow Fingerprint Reader, components/fingerprint_grow, fingerprint.svg SML, components/sml, sml.svg + Atlas Scientific Peristaltic Pump, components/ezo_pmp, ezo-pmp.jpg Demo, components/demo, description.svg Copy, components/copy, content-copy.svg From ce7dc625903329f517ead05627f6172527e8d630 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 10 Nov 2022 11:49:11 +1300 Subject: [PATCH 26/67] Update supporters for 2022.11.0b2 --- guides/supporters.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/guides/supporters.rst b/guides/supporters.rst index ab29c41f5..277f3989a 100644 --- a/guides/supporters.rst +++ b/guides/supporters.rst @@ -17,7 +17,6 @@ Contributors (in alphabetical order) - `0hax (@0hax) `__ -- `Nikola (@0nikola1) `__ - `0x0a11c0de (@0x0a11c0de) `__ - `Tercio Filho (@0x3333) `__ - `2016for (@2016for) `__ @@ -165,7 +164,9 @@ Contributors - `Clifford Roche (@cmroche) `__ - `code-review-doctor (@code-review-doctor) `__ - `CODeRUS (@CODeRUS) `__ +- `Nick (@codewise-nicolas) `__ - `Cody James (@codyjamestechnical) `__ +- `Colin Leroy-Mira (@colinleroy) `__ - `Conclusio (@Conclusio) `__ - `John Coggeshall (@coogle) `__ - `James Crook (@cooljimy84) `__ @@ -433,6 +434,7 @@ Contributors - `Joe (@jhansche) `__ - `Jim Bauwens (@jimbauwens) `__ - `jimtng (@jimtng) `__ +- `Jeroen (@jjansen85) `__ - `Jérémy JOURDIN (@JJK801) `__ - `Jonathan Jefferies (@jjok) `__ - `John K. Luebs (@jkl1337) `__ @@ -615,7 +617,6 @@ Contributors - `Martin Weinelt (@mweinelt) `__ - `Igor Scheller (@MyIgel) `__ - `Mynasru (@Mynasru) `__ -- `Niels Ulrik Andersen (@myplacedk) `__ - `Kevin Uhlir (@n0bel) `__ - `Erik Näsström (@Naesstrom) `__ - `H. Árkosi Róbert (@nagyrobi) `__ @@ -638,9 +639,7 @@ Contributors - `niklasweber (@niklasweber) `__ - `Niorix (@Niorix) `__ - `Zvonimir Haramustek (@nitko12) `__ -- `Nikolay Kitanov (@nkitanov) `__ - `nldroid (@nldroid) `__ -- `Nicolas Liaudat (@nliaudat) `__ - `Niccolò Maggioni (@nmaggioni) `__ - `Jan Sandbrink (@NobodysNightmare) `__ - `Łukasz Śliwiński (@nonameplum) `__ @@ -658,6 +657,7 @@ Contributors - `Oğuzhan Başer (@oguzhanbaser) `__ - `Omar Ghader (@omarghader) `__ - `Ömer Şiar Baysal (@omersiar) `__ +- `optimusprimespace (@optimusprimespace) `__ - `Oscar Bolmsten (@oscar-b) `__ - `Trammell Hudson (@osresearch) `__ - `Otamay (@Otamay) `__ @@ -897,4 +897,4 @@ Contributors - `Zack Barett (@zsarnett) `__ - `Christian Zufferey (@zuzu59) `__ -*This page was last updated November 9, 2022.* +*This page was last updated November 10, 2022.* From 4e4878ebfe883a811d504d2f5ad464861816ebb2 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Fri, 11 Nov 2022 11:49:39 +1300 Subject: [PATCH 27/67] Bump version to 2022.11.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 f2f74d453..11b9ffd8d 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 = 2022.11.0b2 +PROJECT_NUMBER = 2022.11.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 eaa1d771a..148a6c5b2 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ ESPHOME_PATH = ../esphome -ESPHOME_REF = 2022.11.0b2 +ESPHOME_REF = 2022.11.0b3 .PHONY: html html-strict cleanhtml deploy help live-html Makefile netlify netlify-api api netlify-dependencies svg2png copy-svg2png minify diff --git a/_static/version b/_static/version index e4f798a0a..143a42cbb 100644 --- a/_static/version +++ b/_static/version @@ -1 +1 @@ -2022.11.0b2 \ No newline at end of file +2022.11.0b3 \ No newline at end of file diff --git a/conf.py b/conf.py index 241a5d9dc..3c6a5ea2b 100644 --- a/conf.py +++ b/conf.py @@ -69,7 +69,7 @@ author = "ESPHome" # The short X.Y version. version = "2022.11" # The full version, including alpha/beta/rc tags. -release = "2022.11.0b2" +release = "2022.11.0b3" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 7ec192fbc93c84126144c61535c5a96623a3fcb1 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Fri, 11 Nov 2022 11:50:03 +1300 Subject: [PATCH 28/67] Update changelog for 2022.11.0b3 --- changelog/2022.11.0.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/changelog/2022.11.0.rst b/changelog/2022.11.0.rst index 63634d484..54eb7eed6 100644 --- a/changelog/2022.11.0.rst +++ b/changelog/2022.11.0.rst @@ -105,6 +105,7 @@ Beta Changes - Add cover toggle support to current based cover :esphomepr:`3950` by :ghuser:`maringeph` - Add option for dashboard command to only generate the project and supporting files :esphomepr:`3981` by :ghuser:`jesserockz` - Fix local webserver based on esphome/esphome-webserver#17 :esphomepr:`3958` by :ghuser:`RoboMagus` +- fix to_lower filter :esphomepr:`4015` by :ghuser:`ssieb` All changes ^^^^^^^^^^^ @@ -173,6 +174,7 @@ All changes - Add cover toggle support to current based cover :esphomepr:`3950` by :ghuser:`maringeph` - Add option for dashboard command to only generate the project and supporting files :esphomepr:`3981` by :ghuser:`jesserockz` - Fix local webserver based on esphome/esphome-webserver#17 :esphomepr:`3958` by :ghuser:`RoboMagus` +- fix to_lower filter :esphomepr:`4015` by :ghuser:`ssieb` Past Changelogs --------------- From 5d89e2ba6830b8055402134fb1a8d7e8f02620da Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Fri, 11 Nov 2022 11:50:41 +1300 Subject: [PATCH 29/67] Update supporters for 2022.11.0b3 --- guides/supporters.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/guides/supporters.rst b/guides/supporters.rst index 277f3989a..192ceeae7 100644 --- a/guides/supporters.rst +++ b/guides/supporters.rst @@ -135,6 +135,7 @@ Contributors - `Brett Profitt (@brettp) `__ - `Brian Hanifin (@brianhanifin) `__ - `brianrjones69 (@brianrjones69) `__ +- `Ben Brooks (@brooksben11) `__ - `buddydvd (@buddydvd) `__ - `Jon Little (@burundiocibu) `__ - `buxtronix (@buxtronix) `__ @@ -897,4 +898,4 @@ Contributors - `Zack Barett (@zsarnett) `__ - `Christian Zufferey (@zuzu59) `__ -*This page was last updated November 10, 2022.* +*This page was last updated November 11, 2022.* From 0aa9702f6de57c0bb7350a6862ba5305dd71a3bc Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Mon, 14 Nov 2022 13:31:49 +1300 Subject: [PATCH 30/67] Bump version to 2022.11.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 11b9ffd8d..1b4090ab2 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 = 2022.11.0b3 +PROJECT_NUMBER = 2022.11.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 148a6c5b2..65c033fbc 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ ESPHOME_PATH = ../esphome -ESPHOME_REF = 2022.11.0b3 +ESPHOME_REF = 2022.11.0b4 .PHONY: html html-strict cleanhtml deploy help live-html Makefile netlify netlify-api api netlify-dependencies svg2png copy-svg2png minify diff --git a/_static/version b/_static/version index 143a42cbb..0a340ae44 100644 --- a/_static/version +++ b/_static/version @@ -1 +1 @@ -2022.11.0b3 \ No newline at end of file +2022.11.0b4 \ No newline at end of file diff --git a/conf.py b/conf.py index 3c6a5ea2b..80c858c25 100644 --- a/conf.py +++ b/conf.py @@ -69,7 +69,7 @@ author = "ESPHome" # The short X.Y version. version = "2022.11" # The full version, including alpha/beta/rc tags. -release = "2022.11.0b3" +release = "2022.11.0b4" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 893fdeaf22d0fc1d53cbbe16135f506f0157fa16 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Mon, 14 Nov 2022 13:41:42 +1300 Subject: [PATCH 31/67] Update changelog for 2022.11.0b4 --- changelog/2022.11.0.rst | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/changelog/2022.11.0.rst b/changelog/2022.11.0.rst index 54eb7eed6..5ffdcce58 100644 --- a/changelog/2022.11.0.rst +++ b/changelog/2022.11.0.rst @@ -73,6 +73,20 @@ Preserving User WiFi Credentials To be written... +Running ESPHome on lower powered machines +----------------------------------------- + +People have noticed that trying to compile their projects on machine such as the Raspberry Pi 3 would crash either the whole machine +or the ESPHome add-on, or Home Assistant. This is due to having less RAM and CPU power available to run all of the things at the same time. +A new config option has been added as per the example below that should help to allow compiling on machines such as Raspberry Pi 3. +By default ESPHome tries to compile using all of the processor cores, and this allows you to limit it to a lower amount. + +.. code-block:: yaml + + esphome: + ... + compile_process_limit: 1 + Full list of changes -------------------- @@ -106,6 +120,9 @@ Beta Changes - Add option for dashboard command to only generate the project and supporting files :esphomepr:`3981` by :ghuser:`jesserockz` - Fix local webserver based on esphome/esphome-webserver#17 :esphomepr:`3958` by :ghuser:`RoboMagus` - fix to_lower filter :esphomepr:`4015` by :ghuser:`ssieb` +- Mark webserver and captive portal as not available on rp2040 :esphomepr:`4023` by :ghuser:`jesserockz` +- Fix time components on rp2040 :esphomepr:`4024` by :ghuser:`jesserockz` +- Mark mqtt as unavailable on rp2040 :esphomepr:`4025` by :ghuser:`jesserockz` All changes ^^^^^^^^^^^ @@ -175,6 +192,9 @@ All changes - Add option for dashboard command to only generate the project and supporting files :esphomepr:`3981` by :ghuser:`jesserockz` - Fix local webserver based on esphome/esphome-webserver#17 :esphomepr:`3958` by :ghuser:`RoboMagus` - fix to_lower filter :esphomepr:`4015` by :ghuser:`ssieb` +- Mark webserver and captive portal as not available on rp2040 :esphomepr:`4023` by :ghuser:`jesserockz` +- Fix time components on rp2040 :esphomepr:`4024` by :ghuser:`jesserockz` +- Mark mqtt as unavailable on rp2040 :esphomepr:`4025` by :ghuser:`jesserockz` Past Changelogs --------------- From 0505d6fd86791c6d135e84752bd5766f51994852 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Mon, 14 Nov 2022 13:42:17 +1300 Subject: [PATCH 32/67] Update supporters for 2022.11.0b4 --- guides/supporters.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/guides/supporters.rst b/guides/supporters.rst index 192ceeae7..b91ad56c8 100644 --- a/guides/supporters.rst +++ b/guides/supporters.rst @@ -104,6 +104,7 @@ Contributors - `Viktr (@BbIKTOP) `__ - `J. Nick Koston (@bdraco) `__ - `Maxim Ocheretianko (@bearpawmaxim) `__ +- `Benjamin Freeman (@Beetix) `__ - `Benno Pütz (@bennop) `__ - `Benoit3 (@Benoit3) `__ - `Ben Suffolk (@bensuffolk) `__ @@ -898,4 +899,4 @@ Contributors - `Zack Barett (@zsarnett) `__ - `Christian Zufferey (@zuzu59) `__ -*This page was last updated November 11, 2022.* +*This page was last updated November 14, 2022.* From 44a37e3a5a4815b59cc80f755c1d0ee9d85ad5b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=2E=20=C3=81rkosi=20R=C3=B3bert?= Date: Mon, 14 Nov 2022 14:17:55 +0100 Subject: [PATCH 33/67] Update homeassistant.rst --- components/sensor/homeassistant.rst | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/components/sensor/homeassistant.rst b/components/sensor/homeassistant.rst index 35f8c5d44..c30f7e95f 100644 --- a/components/sensor/homeassistant.rst +++ b/components/sensor/homeassistant.rst @@ -16,7 +16,7 @@ states from your Home Assistant instance using the :doc:`native API `. - Albeit you might not plan to __export__ states from the node and you do not need an entity of the node + Albeit you might not plan to *export* states from the node and you do not need an entity of the node in Home Assistant, this component still requires you to register the node under Home Assistant. See: :doc:`Getting started with Home Assistant ` @@ -47,6 +47,15 @@ Configuration variables: - **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation. - All other options from :ref:`Sensor `. + +.. note:: + + The sensors implemented by this component are by default ``internal``, to avoid exporting back them to + Home Assistant. Should you still want to do that (eg. because you use ESPHome's very efficient filters + on them) you need to specifically configure ``internal: false``. Also, ``state_class``, ``unit_of_measurement`` + are not inherited from the imported sensor so you need to set them manually. + + See Also -------- From b92ca2d93a60a405098973e98eb0c187def86443 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=2E=20=C3=81rkosi=20R=C3=B3bert?= Date: Mon, 14 Nov 2022 14:20:09 +0100 Subject: [PATCH 34/67] Update homeassistant.rst --- components/text_sensor/homeassistant.rst | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/components/text_sensor/homeassistant.rst b/components/text_sensor/homeassistant.rst index 7d514ad10..31f332f8e 100644 --- a/components/text_sensor/homeassistant.rst +++ b/components/text_sensor/homeassistant.rst @@ -16,7 +16,7 @@ states from your Home Assistant instance using the :doc:`native API `. From 0978f22ddd1ba0678b4b691f293c69ea83c2759a Mon Sep 17 00:00:00 2001 From: Guillermo Ruffino Date: Tue, 15 Nov 2022 15:36:35 -0300 Subject: [PATCH 35/67] suggest using broadcast address for pzemac (#2293) --- components/sensor/pzemac.rst | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/components/sensor/pzemac.rst b/components/sensor/pzemac.rst index ebb96be95..cebb686a1 100644 --- a/components/sensor/pzemac.rst +++ b/components/sensor/pzemac.rst @@ -143,8 +143,12 @@ You must set the ``address`` of the ``modbus_controller`` to the current address modbus_controller: - id: pzem - ## the current device addr + # The current device address. address: 0x1 + # The special address 0xF8 is a broadcast address accepted by any pzem device, + # so if you use this address, make sure there is only one pzem device connected + # to the uart bus. + # address: 0xF8 modbus_id: mod_bus_pzem command_throttle: 0ms setup_priority: -10 From 339647d61e880a819251f06d0acd0c781e16eabe Mon Sep 17 00:00:00 2001 From: Guillermo Ruffino Date: Tue, 15 Nov 2022 11:27:56 -0300 Subject: [PATCH 36/67] better error messages (#2374) --- schema_doc.py | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/schema_doc.py b/schema_doc.py index c69f451d5..4cce753f7 100644 --- a/schema_doc.py +++ b/schema_doc.py @@ -620,9 +620,15 @@ class SchemaGeneratorVisitor(nodes.NodeVisitor): component_parts = split_text[0].split(".") if len(component_parts) == 3: - cv = get_component_file(self.app, component_parts[1])[ - component_parts[1] + "." + component_parts[0] - ][split_text[1].lower()][component_parts[2]] + try: + cv = get_component_file(self.app, component_parts[1])[ + component_parts[1] + "." + component_parts[0] + ][split_text[1].lower()][component_parts[2]] + except KeyError: + logger.warn( + f"In {self.docname} cannot found schema of {title_text}" + ) + cv = None if cv is not None: cv["docs"] = description self.props = self.find_props(cv.get("schema", {})) @@ -934,7 +940,12 @@ class SchemaGeneratorVisitor(nodes.NodeVisitor): # this is e.g. when a property has a list inside, and the list inside are the options. # just validate **prop_name** s3 = re.search(r"\* \*\*(\w*)\*\*:\s", name_type) - prop_name = s3.group(1) + if s3 is not None: + prop_name = s3.group(1) + else: + logger.info( + f"In '{self.docname} {self.previous_title_text} Invalid list format: {node.rawsource}" + ) param_type = None else: logger.info( @@ -1150,9 +1161,10 @@ def handle_component(app, doctree, docname): doctree.walkabout(v) except Exception as e: err_str = f"In {docname}.rst: {str(e)}" - logger.warning(err_str) - # print stack + # if you put a breakpoint here get call-stack in the console by entering + # import traceback # traceback.print_exc() + logger.warning(err_str) def build_finished(app, exception): From 3a6697e1028466081ce6d5276b3625b6bb53ad1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=2E=20=C3=81rkosi=20R=C3=B3bert?= Date: Wed, 16 Nov 2022 00:28:38 +0100 Subject: [PATCH 37/67] Cleaner images for LCD Menu component, nicer back arrow character (#2441) Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> --- components/display_menu/images/lcd_menu.png | Bin 74174 -> 4095 bytes components/display_menu/lcd_menu.rst | 26 +++++++++++--------- images/lcd_menu.png | Bin 8588 -> 2702 bytes 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/components/display_menu/images/lcd_menu.png b/components/display_menu/images/lcd_menu.png index 482f0ad431c9f396a29fdf5dcaa1c590befa87fc..be3ebd427470a2fb4a99e7076b3eebed5ae83a5c 100644 GIT binary patch literal 4095 zcmeHKYgAL&6-LF{$cUXrvUED;9?l%sgM{mJmeJ;64Q%o)=XPRie1jH_O7+>S^J!` z_c>?pefHU3s-LgVyt$ThO-xMYQ8s%~O-z0Ro0!aWF`b3=;3WrYu;w$rZ2{ghX3Q`e zjTkr0FOoMQH8Gign&Rai5SP;@cMmCC|GQI-m#xkYu)qKQi;PyAVjf{}ie_CO&jLBC zbslkhNBQ8VOE${fw;Cmhvq`;fMbOp@2NWG^iT+NlS}#L(*qQ$SQ5tU-5x&-13P6zp1QPT8irj!Sh4sNHq+( zcFwWkTqCcD*zYlwA)KT?t(MJRxl&}`+Gc$a7*M9bd(+|johO}vG$}3yvSj05p$>0| zC~`;-3TVya*?vX**N*wV;EM>4+@B{7Tz$KR5A*jsvmfFBX5TgK16{e9SqLd3pvK=^ zo<popyE_Zz&ZjULTGgL6*p&?1 z^cKTU*vsf|c;d1-2S~0e!|p+G-UwQ24uE;Xx?P~Sh+oIpLl>&XP>1-(>cc>L9!zYA zXI|w$qc!(9i9{{Yi4g3f9K8XDZwEQbYRQh~KIG6)j$95^y1uLAt@re!q?)^=W63dI zD_u|CBa71$nrQe9A7_DgcKOzUKc=NtxKZ~ZR< zxVZceN|x_j9xS!?o`fZ1t@`~;sk&NCzw|2kOmG)>BDYK*l`?!q)aeO6Q10;sKZWdm zh_wd(m__#mlMSVX{GOqD1o^fz2EDMGsJ@?@37?lv?y&a8qhl63~jNO z=D>3&f_=cc-YgnzpHwZdtIM8d&dZ` zh#$)p@|OY@0_6He5GwYg9XJM~0r~ugGXVtg058slsI+9*&J5-8=K_HXvFvF96|eN; zz;783Vn!!}o_%?%O#Y(P_WLwBa4vMW-0H%4~5=~8L!ePsqq%21Cr zgoOtIv5v&YNuRrf8if_wY{Fw5OI5WZOts}m(h`+sgE-vSrYH|&#O{Coh;;YFm=w;I zYP(AYvLsdiSM;me=uF}rR|H431Of@ag{9q&?DZp#siekw>%8nZsVw~p;LVW8dew`J z*4%RVC~_!j8x|=y`Yxj=f$wxrH`GXkpzuT@Fq(46_nIWBEER^IiEE&kF0jXVpRS)sc+TiX>UPT)9DYD+NBijIJ7NQ?ysI zj%Cvvl!yBz z!)B#AE0&_|6-!1sBkNtHXE5Tto>Ph|`yK^ueb4U!tZm_8Jn}a#tWy>vY(9))e9Rb)X50;oHUw}mp8uGIi3#~{E<;of+~JS^ z7OSFu%=Q9%qqllp7Tsoytk@*!cTQIX-E1SZ&lxS`uIw9CuQ;^lUQdgCYE61YhN$Xs zp?0CYhN5vdyd-T+H0ZX#JJ-bD*cvjhKfFg>IvgrVu4gte{oHhQO?#x0Ohw?fJ$;$2 z6JJ|tE7dM=M0XT7nt-OWu9wM0B3`@&XJ^&&|AA$1lG->^!GT|T;oboc7x0ko>HgvL z%V}MnQ=$c|=*L6Hv#FEy-zSC5gphNRM`c&4P^Y*wW<|ygzCJ}Lf$zI<;t2Ys5EXAb9g-Fh$0x7~pbln{dlr+2 zj@Y-xWjeQsbYHBqTw6}xH=pd^ix1?$0_;uS>^}{vsC)}ori72vikJ6e(1!;>4DQ;E zZ!{t}4{Yzx0Bt&cBJYvP}r pICYzm*XjG+SKs~q-%+}>)_AtEJa*CTQ}oFpinp&q{{RAH5r_Z) literal 74174 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%0A0^fvv3&fgi)^;b?}Hx&ImK=U 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 +- :doc:`/components/sensor/rotary_encoder` +- :doc:`/components/binary_sensor/index` - :apiref:`lcd_menu/lcd_menu.h` diff --git a/images/lcd_menu.png b/images/lcd_menu.png index 979951e437265abbb2fa5d1cae5a950a54982dd2..7ab9c2fbb38ba6cbd21f305e86fb54025432d9c1 100644 GIT binary patch literal 2702 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 Date: Wed, 16 Nov 2022 12:30:45 +1300 Subject: [PATCH 38/67] Bump version to 2022.11.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 1b4090ab2..dd65b74f7 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 = 2022.11.0b4 +PROJECT_NUMBER = 2022.11.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 65c033fbc..329880f24 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ ESPHOME_PATH = ../esphome -ESPHOME_REF = 2022.11.0b4 +ESPHOME_REF = 2022.11.0b5 .PHONY: html html-strict cleanhtml deploy help live-html Makefile netlify netlify-api api netlify-dependencies svg2png copy-svg2png minify diff --git a/_static/version b/_static/version index 0a340ae44..4f2492fed 100644 --- a/_static/version +++ b/_static/version @@ -1 +1 @@ -2022.11.0b4 \ No newline at end of file +2022.11.0b5 \ No newline at end of file diff --git a/conf.py b/conf.py index 80c858c25..0066e0a2d 100644 --- a/conf.py +++ b/conf.py @@ -69,7 +69,7 @@ author = "ESPHome" # The short X.Y version. version = "2022.11" # The full version, including alpha/beta/rc tags. -release = "2022.11.0b4" +release = "2022.11.0b5" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 72a3dde9d22d033ce19f6addd27211095347d30f Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 16 Nov 2022 12:31:22 +1300 Subject: [PATCH 39/67] Update changelog for 2022.11.0b5 --- changelog/2022.11.0.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/changelog/2022.11.0.rst b/changelog/2022.11.0.rst index 5ffdcce58..39a8a0aa4 100644 --- a/changelog/2022.11.0.rst +++ b/changelog/2022.11.0.rst @@ -123,6 +123,7 @@ Beta Changes - Mark webserver and captive portal as not available on rp2040 :esphomepr:`4023` by :ghuser:`jesserockz` - Fix time components on rp2040 :esphomepr:`4024` by :ghuser:`jesserockz` - Mark mqtt as unavailable on rp2040 :esphomepr:`4025` by :ghuser:`jesserockz` +- Update_interval less that 1 second in QMC5883L integration :esphomepr:`4031` by :ghuser:`2mikrobi` All changes ^^^^^^^^^^^ @@ -195,6 +196,7 @@ All changes - Mark webserver and captive portal as not available on rp2040 :esphomepr:`4023` by :ghuser:`jesserockz` - Fix time components on rp2040 :esphomepr:`4024` by :ghuser:`jesserockz` - Mark mqtt as unavailable on rp2040 :esphomepr:`4025` by :ghuser:`jesserockz` +- Update_interval less that 1 second in QMC5883L integration :esphomepr:`4031` by :ghuser:`2mikrobi` Past Changelogs --------------- From 759d2a0f57079dd299dd3bd19b1b5d761335968f Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 16 Nov 2022 12:31:59 +1300 Subject: [PATCH 40/67] Update supporters for 2022.11.0b5 --- guides/supporters.rst | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/guides/supporters.rst b/guides/supporters.rst index b91ad56c8..90296e1f6 100644 --- a/guides/supporters.rst +++ b/guides/supporters.rst @@ -20,6 +20,7 @@ Contributors - `0x0a11c0de (@0x0a11c0de) `__ - `Tercio Filho (@0x3333) `__ - `2016for (@2016for) `__ +- `2mikrobi (@2mikrobi) `__ - `Pavel Golovin (@31337Ghost) `__ - `David Martin (@3ative) `__ - `Alessandro Campolo (@a13ssandr0) `__ @@ -166,7 +167,6 @@ Contributors - `Clifford Roche (@cmroche) `__ - `code-review-doctor (@code-review-doctor) `__ - `CODeRUS (@CODeRUS) `__ -- `Nick (@codewise-nicolas) `__ - `Cody James (@codyjamestechnical) `__ - `Colin Leroy-Mira (@colinleroy) `__ - `Conclusio (@Conclusio) `__ @@ -184,6 +184,7 @@ Contributors - `Chris Talkington (@ctalkington) `__ - `Massimo Cetra (@ctrix) `__ - `cvwillegen (@cvwillegen) `__ +- `Christoph Wempe (@CWempe) `__ - `cwitting (@cwitting) `__ - `Alex Solomaha (@CyanoFresh) `__ - `Luar Roji (@cyberplant) `__ @@ -253,7 +254,6 @@ Contributors - `Drew Perttula (@drewp) `__ - `drmpf (@drmpf) `__ - `DrRob (@DrRob) `__ -- `drug123 (@drug123) `__ - `Daniel Müller (@dtmuller) `__ - `dubit0 (@dubit0) `__ - `Sergey V. DUDANOV (@dudanov) `__ @@ -460,6 +460,7 @@ Contributors - `Javier Peletier (@jpeletier) `__ - `jsuanet (@jsuanet) `__ - `James Szalay (@jtszalay) `__ +- `Julie Koubová (@juliekoubova) `__ - `Justahobby01 (@Justahobby01) `__ - `Mike Ryan (@justfalter) `__ - `Justin Gerhardt (@justin-gerhardt) `__ @@ -899,4 +900,4 @@ Contributors - `Zack Barett (@zsarnett) `__ - `Christian Zufferey (@zuzu59) `__ -*This page was last updated November 14, 2022.* +*This page was last updated November 16, 2022.* From e81a5d47fda8ab4459e0155a1d8ab40f9d1ec7b2 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 16 Nov 2022 15:46:36 +1300 Subject: [PATCH 41/67] Updates for runtime entered wifi credentials (#2443) --- components/captive_portal.rst | 10 ++-------- components/wifi.rst | 9 +++++++++ 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/components/captive_portal.rst b/components/captive_portal.rst index dfc6d5974..4b2543347 100644 --- a/components/captive_portal.rst +++ b/components/captive_portal.rst @@ -16,7 +16,7 @@ After 1 minute of unsuccessful WiFi connection attempts, the ESP will start a Wi :width: 70.0% In this web interface, you can manually override the WiFi settings of the device (please note -this will be overwritten by any subsequent upload (unless ``keep_user_credentials`` is enabled) so make sure to also update your YAML configuration). +this will be overwritten by any subsequent upload so make sure to also update your YAML configuration). Additionally, you can upload a new firmware file. @@ -34,16 +34,10 @@ manually in your browser. password: !secret wifi_ap_password captive_portal: - # Set to true to preserve captive_portal credentials over OTA updates - # Note that you can't set STA credentials in YAML if you're using this - keep_user_credentials: false -Configuration variables: ------------------------- +No configuration variables. -- **keep_user_credentials** (*Optional*, boolean): Do not erase WiFi credentials entered using :doc:`captive_portal` over subsequent OTA updates. - Note: WiFi STA credentials cannot be set in YAML when using this. See Also -------- diff --git a/components/wifi.rst b/components/wifi.rst index bfc2378e5..4899a2303 100644 --- a/components/wifi.rst +++ b/components/wifi.rst @@ -120,6 +120,15 @@ devices name as the ssid with no password. ap: password: "W1PBGyrokfLz" +User Entered Credentials +------------------------ + +Some components such as :doc:`captive_portal`, :doc:`improv_serial` and :doc:`esp32_improv` +enable the user to send and save Wi-Fi credentials to the device. Beginning in 2022.11.0, +as long as no credentials are set in the config file, and firmware is uploaded without erasing +the flash (via OTA), the device will keep the saved credentials. + + .. _wifi-manual_ip: Manual IPs From 0f62179bb9138a2e4f4ac345f9c9dc20fceb21fb Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 16 Nov 2022 15:48:53 +1300 Subject: [PATCH 42/67] Bump version to 2022.11.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 dd65b74f7..151e8eaad 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 = 2022.11.0b5 +PROJECT_NUMBER = 2022.11.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 329880f24..714b35749 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ ESPHOME_PATH = ../esphome -ESPHOME_REF = 2022.11.0b5 +ESPHOME_REF = 2022.11.0b6 .PHONY: html html-strict cleanhtml deploy help live-html Makefile netlify netlify-api api netlify-dependencies svg2png copy-svg2png minify diff --git a/_static/version b/_static/version index 4f2492fed..3b4bd5694 100644 --- a/_static/version +++ b/_static/version @@ -1 +1 @@ -2022.11.0b5 \ No newline at end of file +2022.11.0b6 \ No newline at end of file diff --git a/conf.py b/conf.py index 0066e0a2d..617157e67 100644 --- a/conf.py +++ b/conf.py @@ -69,7 +69,7 @@ author = "ESPHome" # The short X.Y version. version = "2022.11" # The full version, including alpha/beta/rc tags. -release = "2022.11.0b5" +release = "2022.11.0b6" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 4bb3a49fe3a238df93d3952abc0e5d2dd2c74a97 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 16 Nov 2022 16:29:16 +1300 Subject: [PATCH 43/67] Update changelog for 2022.11.0b6 --- changelog/2022.11.0.rst | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/changelog/2022.11.0.rst b/changelog/2022.11.0.rst index 39a8a0aa4..6d368ce4d 100644 --- a/changelog/2022.11.0.rst +++ b/changelog/2022.11.0.rst @@ -71,7 +71,13 @@ Thanks :ghuser:`numo68`. Preserving User WiFi Credentials -------------------------------- -To be written... +If you purchase a device, or install ESPHome on a device that does not have Wi-Fi credentials pre-configured from YAML, +ESPHome will now preserve any credentials entered via the :doc:`/components/captive_portal`, :doc:`/components/improv_serial` +or :doc:`/components/esp32_improv` components after an OTA update of the firmeware is done. It is possible they can survive +flashing via serial, but only if the flash was not erased first, which it is in the case of using ESPHome to flash. + +Products that use `ESP Web Tools `__ are able to specify in the manifest that the flash +should not be erased when installing the firmware and this is a way to provide updates for a device that was sold. Running ESPHome on lower powered machines ----------------------------------------- @@ -124,6 +130,7 @@ Beta Changes - Fix time components on rp2040 :esphomepr:`4024` by :ghuser:`jesserockz` - Mark mqtt as unavailable on rp2040 :esphomepr:`4025` by :ghuser:`jesserockz` - Update_interval less that 1 second in QMC5883L integration :esphomepr:`4031` by :ghuser:`2mikrobi` +- Always save user wifi credentials if non in config :esphomepr:`4036` by :ghuser:`jesserockz` All changes ^^^^^^^^^^^ @@ -197,6 +204,7 @@ All changes - Fix time components on rp2040 :esphomepr:`4024` by :ghuser:`jesserockz` - Mark mqtt as unavailable on rp2040 :esphomepr:`4025` by :ghuser:`jesserockz` - Update_interval less that 1 second in QMC5883L integration :esphomepr:`4031` by :ghuser:`2mikrobi` +- Always save user wifi credentials if non in config :esphomepr:`4036` by :ghuser:`jesserockz` Past Changelogs --------------- From ac8a39e4557541549b266861c9e72ab019875984 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 17 Nov 2022 07:17:42 +1300 Subject: [PATCH 44/67] Bump version to 2022.11.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 151e8eaad..b10530a68 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 = 2022.11.0b6 +PROJECT_NUMBER = 2022.11.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 714b35749..6c1677a50 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ ESPHOME_PATH = ../esphome -ESPHOME_REF = 2022.11.0b6 +ESPHOME_REF = 2022.11.0 .PHONY: html html-strict cleanhtml deploy help live-html Makefile netlify netlify-api api netlify-dependencies svg2png copy-svg2png minify diff --git a/_static/version b/_static/version index 3b4bd5694..4d4bb863c 100644 --- a/_static/version +++ b/_static/version @@ -1 +1 @@ -2022.11.0b6 \ No newline at end of file +2022.11.0 \ No newline at end of file diff --git a/conf.py b/conf.py index 617157e67..ab3a32ef8 100644 --- a/conf.py +++ b/conf.py @@ -69,7 +69,7 @@ author = "ESPHome" # The short X.Y version. version = "2022.11" # The full version, including alpha/beta/rc tags. -release = "2022.11.0b6" +release = "2022.11.0" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From b95d280fba6bb0cb2c940fec4a17bf15ceb2b449 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 17 Nov 2022 07:19:25 +1300 Subject: [PATCH 45/67] Update supporters for 2022.11.0 --- guides/supporters.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/supporters.rst b/guides/supporters.rst index 90296e1f6..1e0a5094b 100644 --- a/guides/supporters.rst +++ b/guides/supporters.rst @@ -900,4 +900,4 @@ Contributors - `Zack Barett (@zsarnett) `__ - `Christian Zufferey (@zuzu59) `__ -*This page was last updated November 16, 2022.* +*This page was last updated November 17, 2022.* From 827d472fdc014a18d8fa19ebf1f2c2b72115777d Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 17 Nov 2022 07:47:06 +1300 Subject: [PATCH 46/67] Add nginx bump to changelog --- changelog/2022.11.0.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/changelog/2022.11.0.rst b/changelog/2022.11.0.rst index 6d368ce4d..219fbcfe0 100644 --- a/changelog/2022.11.0.rst +++ b/changelog/2022.11.0.rst @@ -131,6 +131,7 @@ Beta Changes - Mark mqtt as unavailable on rp2040 :esphomepr:`4025` by :ghuser:`jesserockz` - Update_interval less that 1 second in QMC5883L integration :esphomepr:`4031` by :ghuser:`2mikrobi` - Always save user wifi credentials if non in config :esphomepr:`4036` by :ghuser:`jesserockz` +- bump nginx-light 1.18.0-6.1+deb11u2 to 1.18.0-6.1+deb11u3 :esphomepr:`4034` by :ghuser:`johnmoxley` All changes ^^^^^^^^^^^ @@ -205,6 +206,7 @@ All changes - Mark mqtt as unavailable on rp2040 :esphomepr:`4025` by :ghuser:`jesserockz` - Update_interval less that 1 second in QMC5883L integration :esphomepr:`4031` by :ghuser:`2mikrobi` - Always save user wifi credentials if non in config :esphomepr:`4036` by :ghuser:`jesserockz` +- bump nginx-light 1.18.0-6.1+deb11u2 to 1.18.0-6.1+deb11u3 :esphomepr:`4034` by :ghuser:`johnmoxley` Past Changelogs --------------- From f98f7071bb9709211548b9bea39dd6e9aa7333a0 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 17 Nov 2022 13:51:15 +1300 Subject: [PATCH 47/67] Add notes for ADC on RP2040 (#2446) --- components/sensor/adc.rst | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/components/sensor/adc.rst b/components/sensor/adc.rst index 21fa50d61..a8c03e99c 100644 --- a/components/sensor/adc.rst +++ b/components/sensor/adc.rst @@ -6,9 +6,12 @@ Analog To Digital Sensor :image: flash.svg The Analog To Digital (``adc``) Sensor allows you to use the built-in -ADC in your device to measure a voltage on certain pins. On the ESP8266 -only pin A0 (GPIO17) supports this. On the ESP32 pins GPIO32 through -GPIO39 can be used. +ADC in your device to measure a voltage on certain pins. + +- ESP8266: Only pin A0 (GPIO17) can be used. +- ESP32: GPIO32 through GPIO39 can be used. +- RP2040: GPIO26 through GPIO29 can be used. + .. figure:: images/adc-ui.png :align: center @@ -105,7 +108,7 @@ To measure the VCC voltage, set ``pin:`` to ``VCC`` and make sure nothing is con .. note:: To avoid confusion: It measures the voltage at the chip, and not at the VCC pin of the board. It should usually be around 3.3V. - + .. code-block:: yaml sensor: @@ -113,6 +116,22 @@ To measure the VCC voltage, set ``pin:`` to ``VCC`` and make sure nothing is con pin: VCC name: "VCC Voltage" +RP2040 Internal Core Temperature +-------------------------------- + +The RP2040 has an internal temperature sensor that can be used to measure the core temperature. This sensor is not available on the GPIO pins, but is available on the internal ADC. +The below code is how you can access the temperature and expose as a sensor. The filter values are taken from the RP2040 datasheet to calculate Voltage to Celcius. + +.. code-block:: yaml + + sensor: + - platform: adc + pin: TEMPERATURE + name: "Core Temperature" + unit_of_measurement: "°C" + filters: + - lambda: return 27 - (x - 0.706f) / 0.001721f; + Multiple ADC Sensors --------------------- From e070afa117103a3df471820675f0d7e2a9684de5 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 17 Nov 2022 13:52:18 +1300 Subject: [PATCH 48/67] Bump version to 2022.11.1 --- Doxygen | 2 +- Makefile | 2 +- _static/version | 2 +- conf.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Doxygen b/Doxygen index b10530a68..fe95949b2 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 = 2022.11.0 +PROJECT_NUMBER = 2022.11.1 # 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 6c1677a50..da05b2951 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ ESPHOME_PATH = ../esphome -ESPHOME_REF = 2022.11.0 +ESPHOME_REF = 2022.11.1 .PHONY: html html-strict cleanhtml deploy help live-html Makefile netlify netlify-api api netlify-dependencies svg2png copy-svg2png minify diff --git a/_static/version b/_static/version index 4d4bb863c..8512b9247 100644 --- a/_static/version +++ b/_static/version @@ -1 +1 @@ -2022.11.0 \ No newline at end of file +2022.11.1 \ No newline at end of file diff --git a/conf.py b/conf.py index ab3a32ef8..4138c96e5 100644 --- a/conf.py +++ b/conf.py @@ -69,7 +69,7 @@ author = "ESPHome" # The short X.Y version. version = "2022.11" # The full version, including alpha/beta/rc tags. -release = "2022.11.0" +release = "2022.11.1" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 797cabcfd187341317fc376ced8851ac17b3e5d2 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 17 Nov 2022 13:52:40 +1300 Subject: [PATCH 49/67] Update changelog for 2022.11.1 --- changelog/2022.11.0.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/changelog/2022.11.0.rst b/changelog/2022.11.0.rst index 219fbcfe0..945d2e60b 100644 --- a/changelog/2022.11.0.rst +++ b/changelog/2022.11.0.rst @@ -93,6 +93,10 @@ By default ESPHome tries to compile using all of the processor cores, and this a ... compile_process_limit: 1 +Release 2022.11.1 - November 17 +------------------------------- + +- Support ADC on RP2040 :esphomepr:`4040` by :ghuser:`jesserockz` Full list of changes -------------------- From 6b22309584182503234683dfac530e888315720d Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 17 Nov 2022 13:53:17 +1300 Subject: [PATCH 50/67] Update supporters for 2022.11.1 --- guides/supporters.rst | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/guides/supporters.rst b/guides/supporters.rst index 1e0a5094b..5fe228a0e 100644 --- a/guides/supporters.rst +++ b/guides/supporters.rst @@ -237,11 +237,9 @@ Contributors - `Dirk Heinke (@DirkHeinke) `__ - `Dirk Jahnke (@dirkj) `__ - `Johann V. (@divinitas) `__ -- `djwlindenaar (@djwlindenaar) `__ - `Marcos Pérez Ferro (@djwmarcx) `__ - `Dan Mannock (@dmannock) `__ - `Dmitriy Lopatko (@dmitriy5181) `__ -- `dmkif (@dmkif) `__ - `Farzad E. (@dnetguru) `__ - `DrZoid (@docteurzoidberg) `__ - `Dominik (@DomiStyle) `__ @@ -449,6 +447,7 @@ Contributors - `Johan van der Kuijl (@johanvanderkuijl) `__ - `Johboh (@Johboh) `__ - `John Erik Halse (@johnerikhalse) `__ +- `John Moxley (@johnmoxley) `__ - `JonasEr (@JonasEr) `__ - `Jonathan Adams (@jonathanadams) `__ - `Jonathan Treffler (@JonathanTreffler) `__ @@ -553,6 +552,7 @@ Contributors - `Ben Marengo (@marengaz) `__ - `Marvin Gaube (@margau) `__ - `Martynas Griškonis (@Margriko) `__ +- `maringeph (@maringeph) `__ - `Mario (@mario-tux) `__ - `Marek Marczykowski-Górecki (@marmarek) `__ - `Matthew Harrold (@marrold) `__ @@ -630,7 +630,6 @@ Contributors - `Nazar Mokrynskyi (@nazar-pc) `__ - `Bergont Nicolas (@nbergont) `__ - `NMC (@ncareau) `__ -- `Nebula (@nebula-it) `__ - `NeoAcheron (@NeoAcheron) `__ - `Mike Meessen (@netmikey) `__ - `Nick B. (@NickB1) `__ @@ -801,7 +800,6 @@ Contributors - `Ryan Hoffman (@tekmaven) `__ - `testbughub (@testbughub) `__ - `Greg Lincoln (@tetious) `__ -- `Nejc (@thedexboy) `__ - `Thomas Eckerstorfer (@TheEggi) `__ - `Theexternaldisk (@Theexternaldisk) `__ - `TheGroundZero (@TheGroundZero) `__ From 725a05229df7c221c3db658b3a346b370ff36854 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 17 Nov 2022 19:36:15 +1300 Subject: [PATCH 51/67] Update datasheet link on scd4x (#2449) --- components/sensor/scd4x.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/sensor/scd4x.rst b/components/sensor/scd4x.rst index 99955c423..04796d3d3 100644 --- a/components/sensor/scd4x.rst +++ b/components/sensor/scd4x.rst @@ -6,7 +6,7 @@ SCD4X CO₂, Temperature and Relative Humidity Sensor :image: scd4x.jpg The ``scd4x`` sensor platform allows you to use your Sensirion SCD4X CO₂ -(`datasheet `__) sensors with ESPHome. +(`datasheet `__) sensors with ESPHome. The :ref:`I²C Bus ` is required to be set up in your configuration for this sensor to work. .. figure:: images/scd4x.jpg From 86cdde13220200e60921fb956250eeb77706f2cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=2E=20=C3=81rkosi=20R=C3=B3bert?= Date: Thu, 17 Nov 2022 14:12:46 +0100 Subject: [PATCH 52/67] Update lcd_display.rst Remove dead link, add more explanation, note about the chipset versions, datasheet and character sets available. --- components/display/lcd_display.rst | 40 +++++++++++++++++++----------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/components/display/lcd_display.rst b/components/display/lcd_display.rst index ba6440a70..f499d31bf 100644 --- a/components/display/lcd_display.rst +++ b/components/display/lcd_display.rst @@ -7,16 +7,25 @@ Character-Based LCD Display .. _lcd-pcf8574: -lcd_pcf8574 Component +The ``lcd_pcf8574`` and ``lcd_gpio`` display components allow you to use HD44780-compatible, character-based LCD displays +with ESPHome. This integration is only for LCD displays that display individual characters on a screen +(usually 16-20 columns and 2-4 rows), and not for LCD displays that can control each pixel individually. + +.. note:: + + Mltiple versions of the display exist, supporting different character sets: + + - HD44780UA00 English-Japanese which includes katakana characters and some Greek letters and mathematical symbols + - HD44780UA02 English-European which includes Greek, Cyrillic and Western European characters (with some diacritics) + + It is possible to add 8 user-defined characters too. + + +``lcd_pcf8574`` Component --------------------- -The ``lcd_pcf8574`` display platform allows you to use standard character-based LCD displays like -`this one `__ -with ESPHome. This integration is only for LCD displays that display individual characters on a screen (usually 16-20 columns -and 2-4 rows), and not for LCD displays that can control each pixel individually. - -This version of the LCD integration is for LCD displays with a PCF8574 connected to all the data pins. This has -the benefit that you only need to connect two data wires to the ESP instead of the 6 or 10 with the :ref:`lcd-gpio`. +``lcd_pcf8574`` is for LCD displays with a PCF8574 connected to all the data pins. This has the benefit that you +only need to connect two data wires to the ESP instead of the 6 or 10 with the :ref:`lcd-gpio`. As the communication with the :ref:`I²C Bus `, you need to have an ``i2c:`` section in your configuration. .. figure:: images/lcd-pcf8574.jpg @@ -56,14 +65,12 @@ Configuration variables: .. _lcd-gpio: -lcd_gpio Component +``lcd_gpio`` Component ------------------ -The ``lcd_gpio`` display platform allows you to use standard character-based LCD displays like `this one `__ -with ESPHome. This integration is only for LCD displays that display individual characters on a screen (usually 16-20 columns -and 2-4 rows), and not for LCD displays that can control each pixel individually. Also, this is the GPIO version of the LCD -integration where each of the data pins of the LCD needs a dedicated GPIO pin on the ESP. These LCD displays are also -commonly sold with a PCF8574 chip which only need two lines to the ESP, for that see :ref:`lcd-pcf8574`. +The ``lcd_gpio`` version of this component addresses the screen directly and does not employ a PCF8574 module. +Each of the data pins of the LCD needs a dedicated GPIO pin on the ESP. Connecting the screen this way offers +faster refresh, especially in conjunction with an :ref:`LCD menu `. .. figure:: images/lcd-full.jpg :align: center @@ -248,7 +255,10 @@ See Also - :doc:`index` - :doc:`/components/switch/gpio` - :doc:`/components/binary_sensor/gpio` +- :ref:`lcd_menu ` - :doc:`/components/pcf8574` -- :apiref:`lcd_base/lcd_display.h` +- `HD44780U (LCD-II) datasheet `__ +- `Charset cheatsheet `__ - `Arduino LiquidCrystal Library `__ +- :apiref:`lcd_base/lcd_display.h` - :ghedit:`Edit` From 3d60ffa73c73d0e9f4f2abc485c3f3b407b24e51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=2E=20=C3=81rkosi=20R=C3=B3bert?= Date: Thu, 17 Nov 2022 14:13:28 +0100 Subject: [PATCH 53/67] Update index.rst Add Edit link to the bottom --- components/display_menu/index.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/components/display_menu/index.rst b/components/display_menu/index.rst index 1c680781b..abc4c71c9 100644 --- a/components/display_menu/index.rst +++ b/components/display_menu/index.rst @@ -757,3 +757,4 @@ See Also :glob: * +- :ghedit:`Edit` From 92f35cb0a2d30a97bc338f303ddab7a3f6ac4e19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=2E=20=C3=81rkosi=20R=C3=B3bert?= Date: Thu, 17 Nov 2022 14:13:56 +0100 Subject: [PATCH 54/67] Update lcd_menu.rst Add Edit link and LCD screens to the bottom --- components/display_menu/lcd_menu.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/components/display_menu/lcd_menu.rst b/components/display_menu/lcd_menu.rst index 1ee44a229..8ba5ef553 100644 --- a/components/display_menu/lcd_menu.rst +++ b/components/display_menu/lcd_menu.rst @@ -105,7 +105,10 @@ See Also -------- - :ref:`i2c` +- :ref:`lcd-pcf8574` +- :ref:`lcd-gpio` - :ref:`Display Menu ` - :doc:`/components/sensor/rotary_encoder` - :doc:`/components/binary_sensor/index` - :apiref:`lcd_menu/lcd_menu.h` +- :ghedit:`Edit` From e477822b6468c3b5b4e85499113fa994018a9888 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=2E=20=C3=81rkosi=20R=C3=B3bert?= Date: Thu, 17 Nov 2022 14:17:34 +0100 Subject: [PATCH 55/67] Update lcd_display.rst --- components/display/lcd_display.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/components/display/lcd_display.rst b/components/display/lcd_display.rst index f499d31bf..c5510d19d 100644 --- a/components/display/lcd_display.rst +++ b/components/display/lcd_display.rst @@ -22,7 +22,7 @@ with ESPHome. This integration is only for LCD displays that display individual ``lcd_pcf8574`` Component ---------------------- +------------------------- ``lcd_pcf8574`` is for LCD displays with a PCF8574 connected to all the data pins. This has the benefit that you only need to connect two data wires to the ESP instead of the 6 or 10 with the :ref:`lcd-gpio`. @@ -66,7 +66,7 @@ Configuration variables: .. _lcd-gpio: ``lcd_gpio`` Component ------------------- +---------------------- The ``lcd_gpio`` version of this component addresses the screen directly and does not employ a PCF8574 module. Each of the data pins of the LCD needs a dedicated GPIO pin on the ESP. Connecting the screen this way offers @@ -255,7 +255,7 @@ See Also - :doc:`index` - :doc:`/components/switch/gpio` - :doc:`/components/binary_sensor/gpio` -- :ref:`lcd_menu ` +- :ref:`LCD Menu ` - :doc:`/components/pcf8574` - `HD44780U (LCD-II) datasheet `__ - `Charset cheatsheet `__ From 8c36f340848209083f6e2c305ed98d597ae3d3c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=2E=20=C3=81rkosi=20R=C3=B3bert?= Date: Thu, 17 Nov 2022 14:20:52 +0100 Subject: [PATCH 56/67] Update index.rst --- components/display_menu/index.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/components/display_menu/index.rst b/components/display_menu/index.rst index abc4c71c9..3f0e4d54e 100644 --- a/components/display_menu/index.rst +++ b/components/display_menu/index.rst @@ -757,4 +757,5 @@ See Also :glob: * + - :ghedit:`Edit` From 450d5bdf23d5f29f8be3dfab0e12ac1a24bbfddd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=2E=20=C3=81rkosi=20R=C3=B3bert?= Date: Thu, 17 Nov 2022 14:22:48 +0100 Subject: [PATCH 57/67] Update lcd_display.rst --- components/display/lcd_display.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/components/display/lcd_display.rst b/components/display/lcd_display.rst index c5510d19d..757cf9402 100644 --- a/components/display/lcd_display.rst +++ b/components/display/lcd_display.rst @@ -21,8 +21,8 @@ with ESPHome. This integration is only for LCD displays that display individual It is possible to add 8 user-defined characters too. -``lcd_pcf8574`` Component -------------------------- +lcd_pcf8574 Component +--------------------- ``lcd_pcf8574`` is for LCD displays with a PCF8574 connected to all the data pins. This has the benefit that you only need to connect two data wires to the ESP instead of the 6 or 10 with the :ref:`lcd-gpio`. @@ -65,8 +65,8 @@ Configuration variables: .. _lcd-gpio: -``lcd_gpio`` Component ----------------------- +lcd_gpio Component +------------------ The ``lcd_gpio`` version of this component addresses the screen directly and does not employ a PCF8574 module. Each of the data pins of the LCD needs a dedicated GPIO pin on the ESP. Connecting the screen this way offers From 0ba89c6bb1e7ef0ce4bb66afb009b55918ba3ac8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=2E=20=C3=81rkosi=20R=C3=B3bert?= Date: Thu, 17 Nov 2022 14:27:40 +0100 Subject: [PATCH 58/67] Update lcd_display.rst --- components/display/lcd_display.rst | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/components/display/lcd_display.rst b/components/display/lcd_display.rst index 757cf9402..367ba7f20 100644 --- a/components/display/lcd_display.rst +++ b/components/display/lcd_display.rst @@ -5,8 +5,6 @@ Character-Based LCD Display :description: Instructions for setting up character-based LCD displays. :image: lcd.jpg -.. _lcd-pcf8574: - The ``lcd_pcf8574`` and ``lcd_gpio`` display components allow you to use HD44780-compatible, character-based LCD displays with ESPHome. This integration is only for LCD displays that display individual characters on a screen (usually 16-20 columns and 2-4 rows), and not for LCD displays that can control each pixel individually. @@ -20,6 +18,7 @@ with ESPHome. This integration is only for LCD displays that display individual It is possible to add 8 user-defined characters too. +.. _lcd-pcf8574: lcd_pcf8574 Component --------------------- From 4a9743bb0acc59218ae759b572935aefd6b50502 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=2E=20=C3=81rkosi=20R=C3=B3bert?= Date: Thu, 17 Nov 2022 14:53:26 +0100 Subject: [PATCH 59/67] Update lcd_display.rst A few more fixes. --- components/display/lcd_display.rst | 108 +++++++++++++++-------------- 1 file changed, 57 insertions(+), 51 deletions(-) diff --git a/components/display/lcd_display.rst b/components/display/lcd_display.rst index 367ba7f20..baf833386 100644 --- a/components/display/lcd_display.rst +++ b/components/display/lcd_display.rst @@ -13,8 +13,9 @@ with ESPHome. This integration is only for LCD displays that display individual Mltiple versions of the display exist, supporting different character sets: - - HD44780UA00 English-Japanese which includes katakana characters and some Greek letters and mathematical symbols + - HD44780UA00 English-Japanese which includes katakana characters, some Greek letters and mathematical symbols - HD44780UA02 English-European which includes Greek, Cyrillic and Western European characters (with some diacritics) + - HD44780UBxx custom, manufacturer-specific character sets It is possible to add 8 user-defined characters too. @@ -23,9 +24,9 @@ with ESPHome. This integration is only for LCD displays that display individual lcd_pcf8574 Component --------------------- -``lcd_pcf8574`` is for LCD displays with a PCF8574 connected to all the data pins. This has the benefit that you -only need to connect two data wires to the ESP instead of the 6 or 10 with the :ref:`lcd-gpio`. -As the communication with the :ref:`I²C Bus `, you need to have an ``i2c:`` section in your configuration. +``lcd_pcf8574`` is for LCD displays with a PCF8574 GPIO expander module connected to all the data pins. This has the +benefit that you only need to connect two data wires to the ESP instead of the six or ten as with the :ref:`lcd-gpio`. +The communication happens via :ref:`I²C Bus `, you need to have an ``i2c:`` section in your configuration. .. figure:: images/lcd-pcf8574.jpg :align: center @@ -46,8 +47,8 @@ As the communication with the :ref:`I²C Bus `, you need to have an ``i2c:` display: - platform: lcd_pcf8574 - dimensions: 18x4 - address: 0x3F + dimensions: 20x4 + address: 0x27 lambda: |- it.print("Hello World!"); @@ -82,7 +83,7 @@ faster refresh, especially in conjunction with an :ref:`LCD menu `. # Example configuration entry display: - platform: lcd_gpio - dimensions: 18x4 + dimensions: 20x4 data_pins: - D0 - D1 @@ -163,20 +164,62 @@ by default which means the character at the top left. 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. +User Defined Characters +----------------------- + +The LCD display has the possibility to define up to eight user defined characters occupying the characters +``0`` to ``7`` and mirrored at ``8`` to ``15`` (i.e. ``\x08`` can be used instead of the ``\0`` that can +be problematic in strings). Each character has eight lines of five bits, with the first line on the top +and the most significant bit on the left, meaning that ``0b10000`` followed by six zeros and a ``0b00001`` +defines a dot at the upper left and lower right of the character. + +.. code-block:: yaml + + display: + - platform: lcd_pcf8574 + id: mydisplay + # ... + user_characters: + - position: 0 + data: + - 0b00000 + - 0b01010 + - 0b00000 + - 0b00100 + - 0b00100 + - 0b10001 + - 0b01110 + - 0b00000 + - position: 7 + data: + - 0b00000 + - 0b01010 + - 0b00000 + - 0b00100 + - 0b00100 + - 0b00000 + - 0b01110 + - 0b10001 + lambda: |- + it.print("Hello, world \x08 \x07!"); + +Try this `custom Character Generator `__ to design your own sybmols. + + Backlight Control ----------------- -For the GPIO based display, the backlight is lit by applying Vcc to the A pin and K connected to ground. -The backlight can draw more power than the microcontroller output pins can supply, so it is advisable to use -a transistor as a switch to control the power for the backlight pins. - With the ``lcd_pcf8574`` the backlight can be turned on by ``it.backlight()`` and off by ``it.no_backlight()`` in the display lambda definition. The jumper on the PCF8574 board needs to be closed for the backlight control to work. Keep in mind that the display lambda runs for every ``update_interval``, so if the backlight is turned on/off there, it cannot be overridden from other parts. -Here is one solution for a typical use-case where the backlight is turned on after a motion sensor activates and -turns off 90 seconds after the last activation of the sensor. +With the ``lcd_gpio``, the backlight is lit by applying ``Vcc`` to the ``A`` pin and connect ``K`` pin to ``GND``. +The backlight can draw more power than the microcontroller output pins can supply, so it is advisable to use +a transistor as a switch to control the power for the backlight pins. + +Below an example for a typical use-case where the backlight is turned on when a motion sensor activates and +turns off ``90`` seconds after the last activation of the sensor. .. code-block:: yaml @@ -209,44 +252,6 @@ turns off 90 seconds after the last activation of the sensor. - lambda: |- id(mydisplay).no_backlight(); -User Defined Characters ------------------------ - -The LCD display has the possibility to define up to eight user defined characters occupying the characters -``0`` to ``7`` and mirrored at ``8`` to ``15`` (i.e. ``\x08`` can be used instead of the ``\0`` that can -be problematic in strings). Each character has eight lines of five bits, with the first line on the top -and the most significant bit on the left, meaning that ``0b10000`` followed by six zeros and a ``0b00001`` -defines a dot at the upper left and lower right of the character. - -.. code-block:: yaml - - display: - - platform: lcd_pcf8574 - id: mydisplay - # ... - user_characters: - - position: 0 - data: - - 0b00000 - - 0b01010 - - 0b00000 - - 0b00100 - - 0b00100 - - 0b10001 - - 0b01110 - - 0b00000 - - position: 7 - data: - - 0b00000 - - 0b01010 - - 0b00000 - - 0b00100 - - 0b00100 - - 0b00000 - - 0b01110 - - 0b10001 - lambda: |- - it.print("Hello, world \x08 \x07!"); See Also -------- @@ -258,6 +263,7 @@ See Also - :doc:`/components/pcf8574` - `HD44780U (LCD-II) datasheet `__ - `Charset cheatsheet `__ +- `Custom Character Generator `__ - `Arduino LiquidCrystal Library `__ - :apiref:`lcd_base/lcd_display.h` - :ghedit:`Edit` From 083e1705f310f7b085a15c25b3b090edea9bd2ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=2E=20=C3=81rkosi=20R=C3=B3bert?= Date: Thu, 17 Nov 2022 15:12:37 +0100 Subject: [PATCH 60/67] Add files via upload --- components/display/images/lcd_gpio.svg | 10580 +++++++++++++++++++++++ 1 file changed, 10580 insertions(+) create mode 100644 components/display/images/lcd_gpio.svg diff --git a/components/display/images/lcd_gpio.svg b/components/display/images/lcd_gpio.svg new file mode 100644 index 000000000..a587ee86f --- /dev/null +++ b/components/display/images/lcd_gpio.svg @@ -0,0 +1,10580 @@ + + + + + Liquid Cristal Display 16x2, top-connector, pinout + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 01 VSS / GND02 VCC / +5V03 VEE / Contrast04 RS / Register Select05 R/W / Read/Write06 E / Enable07 D0 / Data 0 (8Bit)08 D1 / Data 1 (8Bit)09 D2 / Data 2 (8Bit)10 D3 / Data 3 (8Bit)11 D4 / Data 4 (4/8Bit)12 D5 / Data 5 (4/8Bit)13 D6 / Data 6 (4/8Bit)14 D7 / Data 7 (4/8Bit)15 BLA / Backlight, Anode16 BLK / Backlight, Kathode + + + + + image/svg+xml + + + + + Openclipart + + + Liquid Cristal Display 16x2, top-connector, pinout + 2018-10-12 + Liquid Cristal Display 16x2 + https://openclipart.org/detail/84199/lcd-by-crudo + + + crudo, adlerweb + + + + + 16x2 + display + lcd + liquid cristal + panel + + + + + + + + + + + From 3b7aecebde286163ae09705f1d81c1c7767c5db8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=2E=20=C3=81rkosi=20R=C3=B3bert?= Date: Thu, 17 Nov 2022 15:24:44 +0100 Subject: [PATCH 61/67] Update lcd_display.rst --- components/display/lcd_display.rst | 33 ++++++++++++++++++------------ 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/components/display/lcd_display.rst b/components/display/lcd_display.rst index baf833386..94baf6852 100644 --- a/components/display/lcd_display.rst +++ b/components/display/lcd_display.rst @@ -11,13 +11,13 @@ with ESPHome. This integration is only for LCD displays that display individual .. note:: - Mltiple versions of the display exist, supporting different character sets: + Multiple versions of the display exist, supporting different character sets: - HD44780UA00 English-Japanese which includes katakana characters, some Greek letters and mathematical symbols - HD44780UA02 English-European which includes Greek, Cyrillic and Western European characters (with some diacritics) - HD44780UBxx custom, manufacturer-specific character sets - It is possible to add 8 user-defined characters too. + It is also possible to add eight user-defined characters. .. _lcd-pcf8574: @@ -32,7 +32,7 @@ The communication happens via :ref:`I²C Bus `, you need to have an ``i2c:` :align: center :width: 75.0% - The PCF8574 chip attached to the LCD Display. + The PCF8574 chip attached to the LCD Display .. figure:: images/lcd-hello_world.jpg :align: center @@ -63,6 +63,11 @@ Configuration variables: - **update_interval** (*Optional*, :ref:`config-time`): The interval to re-draw the screen. Defaults to ``1s``. - **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation. +.. note:: + + If you're not seeing anything on the display, make sure you try turning the contrast potentiometer around on the + PCF8574 board. + .. _lcd-gpio: lcd_gpio Component @@ -72,11 +77,11 @@ The ``lcd_gpio`` version of this component addresses the screen directly and doe Each of the data pins of the LCD needs a dedicated GPIO pin on the ESP. Connecting the screen this way offers faster refresh, especially in conjunction with an :ref:`LCD menu `. -.. figure:: images/lcd-full.jpg +.. figure:: images/lcd_gpio.svg :align: center :width: 75.0% - LCD Display. + LCD Display GPIO pinout .. code-block:: yaml @@ -112,6 +117,12 @@ Configuration variables: - **update_interval** (*Optional*, :ref:`config-time`): The interval to re-draw the screen. Defaults to ``1s``. - **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation. +.. note:: + + If you're not seeing anything on the display, make sure you apply ``3.3V`` to the ``03`` (``VEE``) contrast control + pin of the board. You can use a potentiometer to make it adjustable. + + .. _display-lcd_lambda: Rendering Lambda @@ -157,10 +168,6 @@ by default which means the character at the top left. - platform: sntp id: my_time -.. note:: - - If you're not seeing anything on the display, make sure you try turning the contrast potentiometer around. - 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. @@ -203,7 +210,7 @@ defines a dot at the upper left and lower right of the character. lambda: |- it.print("Hello, world \x08 \x07!"); -Try this `custom Character Generator `__ to design your own sybmols. +Try this `custom character generator `__ to design your own sybmols. Backlight Control @@ -214,9 +221,9 @@ display lambda definition. The jumper on the PCF8574 board needs to be closed fo Keep in mind that the display lambda runs for every ``update_interval``, so if the backlight is turned on/off there, it cannot be overridden from other parts. -With the ``lcd_gpio``, the backlight is lit by applying ``Vcc`` to the ``A`` pin and connect ``K`` pin to ``GND``. -The backlight can draw more power than the microcontroller output pins can supply, so it is advisable to use -a transistor as a switch to control the power for the backlight pins. +With the ``lcd_gpio``, the backlight is lit by applying ``Vcc`` to the ``15`` (``BLA``) pin and connect ``16`` (``BLK``) +pin to ``GND``. The backlight can draw more power than the microcontroller output pins can supply, so it is advisable +to use a transistor as a switch to control the power for the backlight pins. Below an example for a typical use-case where the backlight is turned on when a motion sensor activates and turns off ``90`` seconds after the last activation of the sensor. From 31853d1af5233ec22a93565c9ab7e03f8ba0e773 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=2E=20=C3=81rkosi=20R=C3=B3bert?= Date: Fri, 18 Nov 2022 09:19:55 +0100 Subject: [PATCH 62/67] Fix of typos again --- components/display/lcd_display.rst | 43 +++++++++++++++--------------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/components/display/lcd_display.rst b/components/display/lcd_display.rst index 94baf6852..0c01400a9 100644 --- a/components/display/lcd_display.rst +++ b/components/display/lcd_display.rst @@ -2,12 +2,16 @@ Character-Based LCD Display =========================== .. seo:: - :description: Instructions for setting up character-based LCD displays. + :description: Instructions for setting up character-based HD44780 LCD displays. :image: lcd.jpg The ``lcd_pcf8574`` and ``lcd_gpio`` display components allow you to use HD44780-compatible, character-based LCD displays with ESPHome. This integration is only for LCD displays that display individual characters on a screen -(usually 16-20 columns and 2-4 rows), and not for LCD displays that can control each pixel individually. +(usually 8-40 columns and 2-4 rows), and not for LCD displays that can control each pixel individually. + +.. figure:: images/lcd-hello_world.jpg + :align: center + :width: 60.0% .. note:: @@ -32,11 +36,7 @@ The communication happens via :ref:`I²C Bus `, you need to have an ``i2c:` :align: center :width: 75.0% - The PCF8574 chip attached to the LCD Display - -.. figure:: images/lcd-hello_world.jpg - :align: center - :width: 60.0% + LCD Display with a PCF8574 board attached on the back .. code-block:: yaml @@ -65,7 +65,7 @@ Configuration variables: .. note:: - If you're not seeing anything on the display, make sure you try turning the contrast potentiometer around on the + If you're not seeing anything on the display, try turning the contrast potentiometer around on the PCF8574 board. .. _lcd-gpio: @@ -73,9 +73,9 @@ Configuration variables: lcd_gpio Component ------------------ -The ``lcd_gpio`` version of this component addresses the screen directly and does not employ a PCF8574 module. +The ``lcd_gpio`` version of this component addresses the screen directly and does not employ a GPIO expander module. Each of the data pins of the LCD needs a dedicated GPIO pin on the ESP. Connecting the screen this way offers -faster refresh, especially in conjunction with an :ref:`LCD menu `. +faster refresh, especially in conjunction with an :ref:`LCD Menu `. .. figure:: images/lcd_gpio.svg :align: center @@ -103,15 +103,14 @@ Configuration variables: ************************ - **dimensions** (**Required**, string): The dimensions of the display with ``COLUMNSxROWS``. If you're not - sure, power the display up and just count them. -- **data_pins** (**Required**, list of :ref:`Pin Schemas `): A list of the data pins you - have hooked up to the LCD. The list can either be 8 items long (when you have connected all 8 data pins), or - 4 items long (if you're operating in 4-bit mode with either the first 4 data pins connected or the last 4 data + sure, power the display on, turn contrast high up and just count them. +- **data_pins** (**Required**, list of :ref:`pins `): A list of the data pins you + have hooked up to the LCD. The list can either be 4 items long (when you have connected all 8 data pins), or + 8 items long (if you're operating in 4-bit mode with either the first 4 data pins connected or the last 4 data pins connected). -- **enable_pin** (**Required**, :ref:`Pin Schema `): The pin you have ``EN`` hooked up to. -- **rs_pin** (**Required**, :ref:`Pin Schema `): The pin you have ``RS`` hooked up to. -- **rw_pin** (*Optional*, :ref:`Pin Schema `): Optionally set the pin you have ``RW`` hooked up to. - You can also just permanently connect that pin to GND. +- **enable_pin** (**Required**, :ref:`pin `): The pin you have ``E`` (``06``) hooked up to. +- **rs_pin** (**Required**, :ref:`pin `): The pin you have ``RS`` (``04``) hooked up to. +- **rw_pin** (*Optional*, :ref:`pin `): Optionally set the pin you have ``R/W`` (``05``) hooked up to. You can also just permanently connect that pin to ``GND``. - **lambda** (*Optional*, :ref:`lambda `): The lambda to use for rendering the content on the display. See :ref:`display-lcd_lambda` for more information. - **update_interval** (*Optional*, :ref:`config-time`): The interval to re-draw the screen. Defaults to ``1s``. @@ -119,7 +118,7 @@ Configuration variables: .. note:: - If you're not seeing anything on the display, make sure you apply ``3.3V`` to the ``03`` (``VEE``) contrast control + If you're not seeing anything on the display, make sure you apply ``3.3V`` to the ``VEE`` (``03``) contrast control pin of the board. You can use a potentiometer to make it adjustable. @@ -153,7 +152,7 @@ by default which means the character at the top left. // Let's write a sensor value (let's assume it's 42.1) it.printf("%.1f", id(my_sensor).state); - // Result: "42.1" (the dot will appear on the "2" segment) + // Result: "42.1" (the dot will appear on the segment showing "2") // Print a right-padded sensor value with 0 digits after the decimal it.printf("Sensor value: %8.0f", id(my_sensor).state); @@ -165,7 +164,7 @@ by default which means the character at the top left. # (Optional) For displaying time: time: - - platform: sntp + - platform: homeassistant id: my_time Please see :ref:`display-printf` for a quick introduction into the ``printf`` formatting rules and @@ -221,7 +220,7 @@ display lambda definition. The jumper on the PCF8574 board needs to be closed fo Keep in mind that the display lambda runs for every ``update_interval``, so if the backlight is turned on/off there, it cannot be overridden from other parts. -With the ``lcd_gpio``, the backlight is lit by applying ``Vcc`` to the ``15`` (``BLA``) pin and connect ``16`` (``BLK``) +With the ``lcd_gpio``, the backlight is lit by applying ``Vcc`` to the ``BLA`` (``15``) pin and connect ``BLK`` (``16``) pin to ``GND``. The backlight can draw more power than the microcontroller output pins can supply, so it is advisable to use a transistor as a switch to control the power for the backlight pins. From d06a2a3aabd2d8cd7112436b54c90e71fd051d35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=2E=20=C3=81rkosi=20R=C3=B3bert?= Date: Fri, 18 Nov 2022 09:27:15 +0100 Subject: [PATCH 63/67] Update lcd_display.rst --- components/display/lcd_display.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/components/display/lcd_display.rst b/components/display/lcd_display.rst index 0c01400a9..8527c9b39 100644 --- a/components/display/lcd_display.rst +++ b/components/display/lcd_display.rst @@ -105,9 +105,9 @@ Configuration variables: - **dimensions** (**Required**, string): The dimensions of the display with ``COLUMNSxROWS``. If you're not sure, power the display on, turn contrast high up and just count them. - **data_pins** (**Required**, list of :ref:`pins `): A list of the data pins you - have hooked up to the LCD. The list can either be 4 items long (when you have connected all 8 data pins), or - 8 items long (if you're operating in 4-bit mode with either the first 4 data pins connected or the last 4 data - pins connected). + have hooked up to the LCD. The list can either be 4 items long (operating in 4-bit mode with + either the first 4 data pins connected or the last 4 data pins connected), or 8 items long (when you have + connected all 8 data pins). - **enable_pin** (**Required**, :ref:`pin `): The pin you have ``E`` (``06``) hooked up to. - **rs_pin** (**Required**, :ref:`pin `): The pin you have ``RS`` (``04``) hooked up to. - **rw_pin** (*Optional*, :ref:`pin `): Optionally set the pin you have ``R/W`` (``05``) hooked up to. You can also just permanently connect that pin to ``GND``. From ea4b8111e684f9389a500099afaef674e2944d39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=2E=20=C3=81rkosi=20R=C3=B3bert?= Date: Fri, 18 Nov 2022 10:48:40 +0100 Subject: [PATCH 64/67] Update lcd_menu.rst --- components/display_menu/lcd_menu.rst | 37 +++++++++++++++------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/components/display_menu/lcd_menu.rst b/components/display_menu/lcd_menu.rst index 8ba5ef553..c254331e7 100644 --- a/components/display_menu/lcd_menu.rst +++ b/components/display_menu/lcd_menu.rst @@ -1,3 +1,5 @@ +.. _lcd_menu: + LCD Menu ======== @@ -6,14 +8,13 @@ LCD Menu :image: lcd_menu.png The component provides an infrastructure for setting up a hierarchical menu -on the character based LCD displays. - +on character based LCD displays. This offers the user an interactive method to display +labels, control entities like ``switch``, ``select``, ``number`` available locally on the +ESPHome node, without the requirement of a network connection. .. figure:: images/lcd_menu.png :align: center - :width: 50.0% - -.. _lcd_menu: + :width: 60.0% Overview -------- @@ -23,10 +24,10 @@ a hierarchical menu primarily intended to be controlled either by a rotary encod with a button or a five-button joystick controller. The component needs to be connected to an instance of a character based LCD display, which -at the moment are :ref:`lcd-pcf8574` or a :ref:`lcd-gpio`. For the best results the GPIO -connection is recommended; the I²C one running at the speed according to the datasheet -(usually ``100`` kHz) or even ESPHome default (``50`` kHz) will create perceptible delays especially -when changing a numeric value using the rotary encoder. Most ``PCF8574`` adapters used with +like :ref:`lcd-pcf8574` or :ref:`lcd-gpio`. For the best results the GPIO connection is +recommended; the I²C one running at the speed according to the datasheet (usually ``100`` +kHz) or even ESPHome default (``50`` kHz) will create perceptible delays especially when +changing a numeric value using the rotary encoder. Most ``PCF8574`` adapters used with these displays will happily run at ``200`` or even ``400`` kHz though so if you are comfortable accepting risks from running your hardware out of spec, you might want to try that in your :ref:`i2c` configuration. @@ -41,7 +42,7 @@ in your :ref:`i2c` configuration. ... user_characters: - position: 0 - data: # back arrow + data: # mark_back symbol - 0b00100 - 0b01000 - 0b11110 @@ -68,22 +69,24 @@ in your :ref:`i2c` configuration. items: ... - # Encoder to provide navigation + # Rotary encoder to provide navigation sensor: - platform: rotary_encoder ... + filters: + debounce: 30ms on_anticlockwise: - display_menu.up: on_clockwise: - display_menu.down: - # A de-bounced GPIO is used to 'click' + # A debounced GPIO push button is used to 'click' binary_sensor: - platform: gpio ... filters: - - delayed_on: 10ms - - delayed_off: 10ms + - delayed_on: 30ms + - delayed_off: 30ms on_press: - display_menu.enter: @@ -95,11 +98,11 @@ Configuration variables: Code of the character used to mark menu items going back one level, a selected one, the editing mode and item leading to a submenu. Defaults to ``0x5e`` (``^``), ``0x3e`` (``>``), ``0x2a`` (``*``) and ``0x7e`` (a right arrow). As the character set lacks a good looking - up arrow, using a user defined character is advisable (use ``8`` to reference one at - position ``0`` to avoid problems with zeros in a string). + back arrow, using a user defined character is advisable for ``mark_back`` (use ``8`` to + reference one at position ``0`` to avoid problems with zeros in a string). The rest of the configuration is described in the :ref:`Display Menu ` component. -The menu inherits the dimensions of the connected LCD display and uses the whole area. +The menu inherits the dimensions of the connected LCD display and uses the entire area. See Also -------- From 4109fcf5e66c0b02d2de5e7e59f3be785ce44500 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=2E=20=C3=81rkosi=20R=C3=B3bert?= Date: Fri, 18 Nov 2022 13:33:31 +0100 Subject: [PATCH 65/67] Add files via upload --- components/display/images/lcd_gpio.svg | 3098 ++++++++++++------------ 1 file changed, 1561 insertions(+), 1537 deletions(-) diff --git a/components/display/images/lcd_gpio.svg b/components/display/images/lcd_gpio.svg index a587ee86f..e0a4699c5 100644 --- a/components/display/images/lcd_gpio.svg +++ b/components/display/images/lcd_gpio.svg @@ -2,23 +2,23 @@ + inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)" + width="292.02167" + height="297.63901" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> Liquid Cristal Display 16x2, top-connector, pinout + inkscape:collect="always" + x="-0.0063945028" + y="-0.025135299" + width="1.012789" + height="1.0502706"> + inkscape:collect="always" + x="-0.0080102038" + y="-0.021825226" + width="1.0160204" + height="1.0436505"> @@ -79,7 +87,7 @@ xlink:href="#linearGradient4497" gradientUnits="userSpaceOnUse" x2="315" - gradientTransform="matrix(1,0,0,22.324,-665.85702,-1799.259)" + gradientTransform="matrix(1,0,0,22.324,-395.46292,-2216.2589)" y1="81.627998" x1="315" inkscape:collect="always" /> @@ -336,61 +344,62 @@ inkscape:zoom="2.8284271" borderopacity="1.0" inkscape:current-layer="layer1" - inkscape:cx="93.015892" + inkscape:cx="90.332892" guidetolerance="4" showgrid="false" units="mm" showguides="true" bordercolor="#666666" - inkscape:window-x="0" + inkscape:window-x="-8" inkscape:guide-bbox="true" objecttolerance="4" - inkscape:window-y="25" - inkscape:window-width="2558" + inkscape:window-y="-8" + inkscape:window-width="1920" inkscape:pageopacity="0.0" inkscape:pageshadow="2" pagecolor="#ffffff" gridtolerance="4" - inkscape:cy="200.49855" + inkscape:cy="146.90144" inkscape:document-units="px" - inkscape:window-height="1361" + inkscape:window-height="1017" inkscape:window-maximized="1" fit-margin-top="0" fit-margin-left="0" fit-margin-right="0" - fit-margin-bottom="0" /> + fit-margin-bottom="0" + inkscape:pagecheckerboard="0" /> + transform="translate(-197.31143,75.516597)"> + transform="matrix(0,1,1,0,0,0)" /> + transform="matrix(0,1,1,0,0,0)" /> + transform="matrix(0,1,1,0,151.24892,-252.67709)"> @@ -425,18 +434,18 @@ + transform="rotate(90,320.66501,67.987918)"> @@ -9626,127 +9635,127 @@ + transform="matrix(0,1,1,0,151.24892,-252.67709)"> @@ -10037,7 +10046,7 @@ + x="100.89545" + y="-489.3331" + transform="rotate(90)" /> + style="fill:#9cc6ff;fill-opacity:1;stroke:none;stroke-width:0.00721247;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + transform="rotate(90)" /> + x="80.858131" + y="-489.3331" + transform="rotate(90)" /> + style="fill:#9cc6ff;fill-opacity:1;stroke:none;stroke-width:0.00721247;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + transform="rotate(90)" /> + x="60.820808" + y="-489.3331" + transform="rotate(90)" /> + style="fill:#baadff;fill-opacity:1;stroke:none;stroke-width:0.00721247;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + transform="rotate(90)" /> + x="40.783516" + y="-489.3331" + transform="rotate(90)" /> + style="fill:#baadff;fill-opacity:1;stroke:none;stroke-width:0.00721247;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + transform="rotate(90)" /> + x="20.746162" + y="-489.3331" + transform="rotate(90)" /> + style="fill:#f8ffad;fill-opacity:1;stroke:none;stroke-width:0.00721247;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + transform="rotate(90)" /> + x="0.70887029" + y="-489.3331" + transform="rotate(90)" /> + style="fill:#f8ffad;fill-opacity:1;stroke:none;stroke-width:0.00721247;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + transform="rotate(90)" /> + x="-19.328453" + y="-489.3331" + transform="rotate(90)" /> + style="fill:#ffadad;fill-opacity:1;stroke:none;stroke-width:0.00721247;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + transform="rotate(90)" /> + x="-39.365776" + y="-489.3331" + transform="rotate(90)" /> + style="fill:#b3d0d2;fill-opacity:1;stroke:none;stroke-width:0.00721247;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + transform="rotate(90)" /> 01 VSS / GND01 VSS / GND02 VCC / +5V02 VCC / +5V03 VEE / Contrast03 VEE / Contrast04 RS / Register Select04 RS / Register Select05 R/W / Read/Write05 R/W / Read/Write06 E / Enable06 E / Enable07 D0 / Data 0 (8Bit)07 D0 / Data 0 (4/8Bit)08 D1 / Data 1 (8Bit)08 D1 / Data 1 (4/8Bit)09 D2 / Data 2 (8Bit)09 D2 / Data 2 (4/8Bit)10 D3 / Data 3 (8Bit)10 D3 / Data 3 (4/8Bit)11 D4 / Data 4 (4/8Bit)11 D4 / Data 4 (8Bit)12 D5 / Data 5 (4/8Bit)12 D5 / Data 5 (8Bit)13 D6 / Data 6 (4/8Bit)13 D6 / Data 6 (8Bit)14 D7 / Data 7 (4/8Bit)14 D7 / Data 7 (8Bit)15 BLA / Backlight, Anode15 BLA / Backlight, Anode16 BLK / Backlight, Kathode + style="stroke-width:0.200618">16 BLK / Backlight, Kathode From a858abc07963893c74287bc5902d73d9bf61d1d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=2E=20=C3=81rkosi=20R=C3=B3bert?= Date: Fri, 18 Nov 2022 21:41:51 +0100 Subject: [PATCH 66/67] Update bluetooth_proxy.rst --- components/bluetooth_proxy.rst | 53 +++++++++++++++++++++++----------- 1 file changed, 36 insertions(+), 17 deletions(-) diff --git a/components/bluetooth_proxy.rst b/components/bluetooth_proxy.rst index 3e5bb8b44..5db10d5cd 100644 --- a/components/bluetooth_proxy.rst +++ b/components/bluetooth_proxy.rst @@ -5,27 +5,25 @@ Bluetooth Proxy :description: Instructions for setting up the Bluetooth Proxy in ESPHome. :image: bluetooth.svg -Home Assistant can expand its Bluetooth reach by communicating through -the Bluetooth proxy component in ESPHome. Place your ESPHome devices close to the -Bluetooth devices that you want to interact with for the best -experience. +Home Assistant can expand its Bluetooth reach by communicating through the Bluetooth proxy component in ESPHome. +The Individual device integrations in Home Assistant (such as BTHome) will receive the data from the Bluetooth +Integration in Home Assistant which automatically aggregates all ESPHome bluetooth proxies with any USB Bluetooth +Adapters you might have. This exceptional feature offers fault tolerant connection between the Bluetooth devices +and Home Assistant. -If you're looking to create a device that is just a Bluetooth Proxy, see our `Bluetooth Proxy installer `__ website. - -The Bluetooth proxy depends on :doc:`esp32_ble_tracker` so make sure to add that to your configuration. +If you're looking to create an ESPHome node that is just a Bluetooth Proxy, see +our `Bluetooth Proxy installer `__ website. .. note:: - Bluetooth proxy requires Home Assistant 2022.9 or later. - -.. note:: - - The Bluetooth proxy of ESPHome currently only provides Home Assistant with passive sensor - data that is advertised by certain devices. Not all devices are supported and ESPHome does not decode or keep a list. - To find out if your device is supported, please search for it in the `Home Assistant Integrations `__ list. - - The Individual device integrations in Home Assistant (such as BTHome) will receive the data from the Bluetooth Integration in Home Assistant - which automatically aggregates all ESPHome bluetooth proxies with any USB Bluetooth Adapters you might have. + The Bluetooth proxy of ESPHome provides Home Assistant with a maximum number of 3 simultaneous active connections. + Devices which maintain a *continuous active* connection will consume one of these constantly, whilst devices which + do *periodic disconnections and reconnections* will permit using more than 3 of them (on a statistical basis). + Passively broadcasted sensor data (that is advertised by certain devices without active connections) is received + separately from these, and is not limited to a specific number. + + Not all devices are supported and ESPHome does not decode or keep a list. To find out if your device is supported, + please search for it in the `Home Assistant Integrations `__ list. Configuration: -------------- @@ -36,6 +34,27 @@ Configuration: - **active** (*Optional*, boolean): Enables proxying active connections. Defaults to ``false``. Requires Home Assistant 2022.10 or later. +The Bluetooth proxy depends on :doc:`esp32_ble_tracker` so make sure to add that to your configuration. + +.. note:: + + Bluetooth proxy requires Home Assistant 2022.9 or later. + +Improving reception performance +------------------------------- + +Use a board with an Ethernet connection to the network, to offload ESP32's radio module from WiFi traffic, this gains performance on Bluetooth side. +To maximize the chances of catching advertisements of the sensors, you can set ``interval`` equal to ``window`` in :doc:`/components/esp32_ble_tracker` scan parameter settings: + +.. code-block:: yaml + + esp32_ble_tracker: + scan_parameters: + interval: 1100ms + window: 1100ms + +Avoid placing the ESP node in racks, close to routers/switches or other network equipment as EMI interference will degrade Bluetooth signal reception. For best results put as far away as possible, at least 3 meters distance from any other such equipment. Place your ESPHome devices close to the Bluetooth devices that you want to interact with for the best experience. + See Also -------- From 3253434979b45356936a3982a4fdf28894b15764 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Mon, 21 Nov 2022 11:32:46 +1300 Subject: [PATCH 67/67] Fix indentation for sgp4x (#2465) --- components/sensor/sgp4x.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/sensor/sgp4x.rst b/components/sensor/sgp4x.rst index 313a5cc3b..8e375c1be 100644 --- a/components/sensor/sgp4x.rst +++ b/components/sensor/sgp4x.rst @@ -27,7 +27,7 @@ The :ref:`I²C Bus ` is required to be set up in your configuration for thi # Example configuration entry sensor: - - platform: sgp4x + - platform: sgp4x voc: name: "VOC Index" nox: