From ead83e63dc088fb9e4b6b0379af2df1291912f29 Mon Sep 17 00:00:00 2001 From: Albert Gouws Date: Tue, 10 Sep 2024 09:31:20 +1200 Subject: [PATCH 1/9] spell: Update lvgl.rst (#4239) Sort out spelling mistakes. --- components/sensor/lvgl.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/sensor/lvgl.rst b/components/sensor/lvgl.rst index b7c13e252b..81a63087d1 100644 --- a/components/sensor/lvgl.rst +++ b/components/sensor/lvgl.rst @@ -5,7 +5,7 @@ LVGL Sensor :description: Instructions for setting up an LVGL widget sensor component. :image: ../images/lvgl_c_num.png -The ``lvgl`` sensor platform creates a semsor component from an LVGL widget +The ``lvgl`` sensor platform creates a sensor component from an LVGL widget and requires :doc:`LVGL ` to be configured. Supported widgets are :ref:`lvgl-widget-arc`, :ref:`lvgl-widget-bar`, :ref:`lvgl-widget-slider` and :ref:`lvgl-widget-spinbox`. A single sensor supports only a single widget; in other words, it's not possible to have multiple widgets associated with a single ESPHome sensor. @@ -27,7 +27,7 @@ Example: .. note:: - Widget-specific actions (``lvgl.arc.update``, ``lvgl.bar.update``, ``lvgl.slider.update``, ``lvgl.spinbox.update``, ``lvgl.spinbox.decrement``, ``lvgl.spinbox.increment``) will trigger correspponding component updates to be sent to Home Assistant. + Widget-specific actions (``lvgl.arc.update``, ``lvgl.bar.update``, ``lvgl.slider.update``, ``lvgl.spinbox.update``, ``lvgl.spinbox.decrement``, ``lvgl.spinbox.increment``) will trigger corresponding component updates to be sent to Home Assistant. See Also -------- From 5b9be96bd09b39026ab4c560305746ca8f036b34 Mon Sep 17 00:00:00 2001 From: Albert Gouws Date: Tue, 10 Sep 2024 09:31:48 +1200 Subject: [PATCH 2/9] spell: Update host.rst (#4240) Spelling mistake --- components/host.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/host.rst b/components/host.rst index 1013bdd30a..51b02eb2f3 100644 --- a/components/host.rst +++ b/components/host.rst @@ -13,7 +13,7 @@ configuration to Home Assistant (the native MAC address is not readily available .. note:: - HA will not automatically discover an ESPHome instance running on ``host`` using MDNS, and you will need + HA will not automatically discover an ESPHome instance running on ``host`` using mDNS, and you will need to add it explicitly using the IP address of your host computer. Many components, especially those interfacing to actual hardware, will not be available when using ``host``. Do not From ededa55cd2ca7b98e72b0930bd8b78cea39e4a51 Mon Sep 17 00:00:00 2001 From: Albert Gouws Date: Tue, 10 Sep 2024 09:32:39 +1200 Subject: [PATCH 3/9] spell: Update atm90e32.rst (#4241) Spelling mistakes --- components/sensor/atm90e32.rst | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/components/sensor/atm90e32.rst b/components/sensor/atm90e32.rst index 000ccbd9a7..251f4cba58 100644 --- a/components/sensor/atm90e32.rst +++ b/components/sensor/atm90e32.rst @@ -67,7 +67,7 @@ Configuration variables: - **phase_b** (*Optional*): The configuration options for the 2nd phase. Same options as 1st phase. - **phase_c** (*Optional*): The configuration options for the 3rd phase. Same options as 1st phase. -- **frequency** (*Optional*): Use the frequenycy value calculated by the meter. All options from +- **frequency** (*Optional*): Use the frequency value calculated by the meter. All options from :ref:`Sensor `. - **peak_current_signed** (*Optional*, boolean): Control the peak current output as signed or absolute. Defaults to ``false``. - **chip_temperature** (*Optional*): Use the chip temperature value. All options from @@ -155,7 +155,7 @@ Active Energy The ATM90E32 chip has a high-precision built-in ability to count the amount of consumed energy on a per-phase basis. For each phase both the Forward and Reverse active energy is counted in watt-hours. Forward Active Energy is used to count consumed energy, whereas Reverse Active Energy is used to count exported energy -(e.g. with solar pv installations). +(e.g. with solar PV installations). The counters are reset every time a given active energy value is read from the ATM90E32 chip. Current implementation targets users who retrieve the energy values with a regular interval and store them in @@ -179,24 +179,24 @@ a time-series-database, e.g. InfluxDB. id: ct1RAWattHours state_topic: ${disp_name}/ct1/reverse_active_energy -If the power, power_factor, reactive_power, forward_active_energy, or reverse_active_energy configuraion variables +If the power, power_factor, reactive_power, forward_active_energy, or reverse_active_energy configuration variables are used, care must be taken to ensure that the line ATM90E32's voltage is from is the same phase as the current transformer is installed on. This is significant in split-phase or multi phase installations. On a house with 240 -split-phase wiring (very common in the US), one simple test is to reverse the orentation of the current transformer +split-phase wiring (very common in the US), one simple test is to reverse the orientation of the current transformer on a line. If the power factor doesn't change sign, it is likely that the voltage fed to the ATM90E32 is from the other phase. -The CircuitSetup Expandable 6 channel board can easilly handle this situation by cutting the jumpers JP12/13 to -allow a seperate VA2 to be input on the J3 pads. Make sure that current taps connected to CT 1-3 are on the phase +The CircuitSetup Expandable 6 channel board can easily handle this situation by cutting the jumpers JP12/13 to +allow a separate VA2 to be input on the J3 pads. Make sure that current taps connected to CT 1-3 are on the phase from which VA is fed (the barrel jack) and the taps connected to CT3-6 are on the phase from which VA2 is fed. See the CicuitSetup repo for more details on this. -If a mulit board stack is being used, remember to cut JP12/13 on all boards and to feed VA2 to each board. VA is +If a multi board stack is being used, remember to cut JP12/13 on all boards and to feed VA2 to each board. VA is fed to all boards through the stacking headers. Another detail is that each voltage transformer needs to have the same polarity; getting this backwards will be just like having it on the wrong phase. -Note that the current measurement is the RMS value so is always positive. They only way to determine directon is to -look at the power factor. If there are only largly resistive loads and no power sources, (PF almost 1), it is simpler +Note that the current measurement is the RMS value so is always positive. They only way to determine direction is to +look at the power factor. If there are only largely resistive loads and no power sources, (PF almost 1), it is simpler to just create a template sensor that computes power from Irms*Vrms and ignore all these details. On the other hand, one might be surprised how reactive some loads are and the CirciuitSetup designs are able to handle these situations well. @@ -468,7 +468,7 @@ Harmonic Power Harmonic power in AC systems refers to deviations from the ideal sinusoidal waveform, caused by multiples of the fundamental frequency. It results from non-linear loads and can lead to issues like voltage distortion, equipment -overheating, and misoperation of protective devices. The ATM90E32 can output advanced harmonic power measurements +overheating, and miss operation of protective devices. The ATM90E32 can output advanced harmonic power measurements providing important analysis data for monitoring power anomalies on the bus. **Harmonic Power Example:** @@ -503,8 +503,8 @@ Peak Current Peak current in AC systems refers to the maximum value of the alternating current waveform. It signifies the highest magnitude reached during each cycle of the sinusoidal waveform. Peak current is relevant for sizing components and -assessing the capacity of electrical equipment in the system. This advanced measurement is avaiable from the ATM90E32. -Peak current can be displayed in signed or unsigned format using a bolean parameter which spans all phases. +assessing the capacity of electrical equipment in the system. This advanced measurement is available from the ATM90E32. +Peak current can be displayed in signed or unsigned format using a boolean parameter which spans all phases. The default is false which is unsigned. **Peak Current Example:** From 8e5bd437845dc63cac8f6bc78f9138ca5cba8c9b Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 10 Sep 2024 12:54:57 +1200 Subject: [PATCH 4/9] [bme280] Update configuration variables list (#4226) --- components/sensor/bme280.rst | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/components/sensor/bme280.rst b/components/sensor/bme280.rst index 36c597df52..e049d1b299 100644 --- a/components/sensor/bme280.rst +++ b/components/sensor/bme280.rst @@ -66,13 +66,22 @@ Configuration variables: See :ref:`Oversampling Options `. - All other options from :ref:`Sensor `. -- **address** (*Optional*, int): Manually specify the I²C address of - the sensor. Defaults to ``0x77``. Another address can be ``0x76``. - **iir_filter** (*Optional*): Set up an Infinite Impulse Response filter to increase accuracy. One of ``OFF``, ``2x``, ``4x``, ``16x``. Defaults to ``OFF``. - **update_interval** (*Optional*, :ref:`config-time`): The interval to check the sensor. Defaults to ``60s``. + +I²C Configuration variables: + +- **address** (*Optional*, int): Manually specify the I²C address of + the sensor. Defaults to ``0x77``. Another address can be ``0x76``. + +SPI Configuration variables: + +- **cs_pin** (*Optional*, :ref:`Pin Schema `): The CS pin of the BME280 sensor. + + .. _bme280-oversampling: Oversampling Options From ebdb1bc053694b5653b6c732a137e977eab8ce1b Mon Sep 17 00:00:00 2001 From: Maximilian Mewes <45098772+itCarl@users.noreply.github.com> Date: Tue, 10 Sep 2024 02:55:37 +0200 Subject: [PATCH 5/9] update jsn_sr04t page (#4238) --- components/sensor/jsn_sr04t.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/sensor/jsn_sr04t.rst b/components/sensor/jsn_sr04t.rst index 7e78484e13..cbf2a86e65 100644 --- a/components/sensor/jsn_sr04t.rst +++ b/components/sensor/jsn_sr04t.rst @@ -60,7 +60,7 @@ Configuration variables: sensor. Defaults to ``60s``. Not applicable in mode 1. - **uart_id** (*Optional*, :ref:`config-id`): The ID of the :ref:`UART bus ` you wish to use for this sensor. Use this if you want to use multiple UART buses at once. -- **model** (*Optional*): Sensor model. Available options: ``jsn_sr04t`` (default) and ``aj_sr04t``. +- **model** (*Optional*): Sensor model. Available options: ``jsn_sr04t`` (default) and ``aj_sr04m``. - All other options from :ref:`Sensor `. See Also From 0a0b2d89647672d8a1fce96c5083fd69662881cc Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 10 Sep 2024 13:23:09 +1200 Subject: [PATCH 6/9] [bl0942] Tidy up example (#4242) --- components/sensor/bl0942.rst | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/components/sensor/bl0942.rst b/components/sensor/bl0942.rst index b2757725ee..7918747fbf 100644 --- a/components/sensor/bl0942.rst +++ b/components/sensor/bl0942.rst @@ -16,31 +16,18 @@ to some pins on your board and the baud rate set to 4800 with 1 stop bit. .. code-block:: yaml # Example configuration entry - uart: - id: uart_bus - tx_pin: TX - rx_pin: RX - baud_rate: 4800 - stop_bits: 1 - sensor: - platform: bl0942 - uart_id: uart_bus voltage: name: 'BL0942 Voltage' current: name: 'BL0942 Current' power: name: 'BL0942 Power' - filters: - multiply: -1 energy: name: 'BL0942 Energy' frequency: name: "BL0942 Frequency" - accuracy_decimals: 2 - - update_interval: 60s Configuration variables: ------------------------ @@ -49,7 +36,7 @@ Configuration variables: All options from :ref:`Sensor `. - **current** (*Optional*): The current value of the sensor in Amperes. All options from :ref:`Sensor `. -- **power** (*Optional*): The (active) power value of the sensor in Watts. Note that some power meters will report this in negative values (probably wired backwards), so you may want to use a filter to multiply it by -1. All options from :ref:`Sensor `. +- **power** (*Optional*): The (active) power value of the sensor in Watts. Note that some power meters will report this in negative values (probably wired backwards), so you may want to use a filter to multiply it by -1. All options from :ref:`Sensor `. - **energy** (*Optional*): Use the energy value of the sensor in kWh. All options from :ref:`Sensor `. - **frequency** (*Optional*): The frequency value of the sensor in Hertz. All options from From 9c78d967ebb54718f89ee8e0c264e8b364dd2f61 Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Wed, 11 Sep 2024 00:25:40 -0500 Subject: [PATCH 7/9] [contributing] Various additions & some minor copy fixes/tweaks (#4229) --- guides/contributing.rst | 93 +++++++++++++++++++++++++++----- guides/images/update_branch.png | Bin 43361 -> 55535 bytes 2 files changed, 80 insertions(+), 13 deletions(-) diff --git a/guides/contributing.rst b/guides/contributing.rst index 4a71f82f96..f66c5a511e 100644 --- a/guides/contributing.rst +++ b/guides/contributing.rst @@ -455,30 +455,89 @@ check fails, please look at the Github Actions log and fix all errors that appea **When will my PR be reviewed/merged?** -ESPHome is a big project; we encourage everybody to test, review and comment on PRs. Despite this, reviews can (and -often do) take some time. +ESPHome is a big project; :ref:`we encourage everybody to test, review and comment on PRs.` Despite +this, reviews can (and often do) take some time. **But howwww looonnnggg???** Small PRs are easier to review and are often reviewed first. If you want your PR to be reviewed (and merged) quickly, here are some tips: -- We would rather review ten ten-line PRs than one 100-line PR. -- Be sure to follow all :ref:`codebase_standards` as you make changes -- when reviewers have to spend time - commenting on/correcting your PR because you didn't name variables correctly or didn't prefix member variable - accesses with ``this->``, it wastes time we could be using to review other PRs which *do* follow the standards. +- *Keep PRs as small and as focused as possible.* Smaller PRs tend to be easier to understand and take less time to + review. Large PRs (many hundreds or thousands of lines) by their nature (of being large) tend to keep changing which + means reviewers have to revisit them over and over as they evolve. This isn't a tenable practice for project + maintainers. Break your work into multiple, smaller PRs and link these PRs together with comments in the description + so reviewers can follow the work more easily. +- The above bullet paraphrased: *we would rather review ten ten-line PRs than one 100-line PR.* +- *Be sure to follow all* :ref:`codebase_standards`. When reviewers have to spend time commenting on/correcting your PR + because you didn't name variables correctly or didn't prefix member variable accesses with ``this->``, it wastes time + we could be using to review other PRs which *do* follow the standards. - If you wish to take on a big project, such as refactoring a substantial section of the codebase or integrating another open source project with ESPHome, please discuss this with us on `Discord `__ or `create a discussion on GitHub `__ **before** you do all the work and attempt to submit a massive PR. -- While we realize it's not *always* possible, avoid submitting PRs which are thousands of lines in size. Such PRs are - simply too complex and take excessive amounts of time to review. Break your work into multiple, smaller PRs to make - the changes more tenable for reviewers. - If you are not sure about how you should proceed with some changes, **please** - `discuss it with us on Discord `__ before you go do a bunch of work that we can't (for + `discuss it with us on Discord `__ *before* you go do a bunch of work that we can't (for whatever reason) accept...and then you have to go back and re-do it all to get your PR merged. It's easier to make corrections early-on -- and we want to help you! +.. _can_i_help_review: + +Can I Help Review PRs? +********************** + +**YES! PLEASE!!!** + +While only maintainers can *merge* PRs, we value feedback from the community and it *is considered* as we review them. +Put another way, when a PR has several "This worked for me!" comments on it, we know that the author's work is doing +what it's supposed to, even if some other, underlying aspects might still need some fine-tuning to be consistent with +the rest of the codebase. + +Testing +^^^^^^^ + +Often, the easiest way to help review PRs is by testing. Many (but not all) PRs can be used as +:doc:`/components/external_components` and can easily be added into your configuration for testing, like this: + +.. code-block:: yaml + + external_components: + - source: github://pr#2639 + components: [ rtttl ] + +...you just need to update the PR number and component name(s) in the YAML accordingly. + +If you test a PR, please *share your results by leaving a comment on the PR!* If it doesn't work, be sure to include +any messages from the compiler and/or device logs so the author can troubleshoot the issue. *Comments which state no +more than "it doesn't work" are not helpful!* + +Code Review +^^^^^^^^^^^ + +Beyond basic functionality (*"does it work?"*), here are a few other items we check for when reviewing PRs: + +- Are file names & paths appropriate for/consistent with the codebase? +- Are namespace names consistent with the component/platform? +- Do all ``#define`` macro names match the namespace? +- Are all :ref:`codebase_standards` adhered to? +- Are there any calls to ``delay()`` with a duration longer than 10 milliseconds? +- Are any class methods doing work that they shouldn't be? For example, let's consider the ``dump_config()`` method: + + - This method is intended to do **nothing** other than *print values* that were retrieved earlier (in ``setup()``). + - If this method has (for example) a ``this->read(...)`` call in it, it does not pass review and needs to be changed. + +- Is the component/platform doing *exactly what it's supposed to*? Consider the example of a new serial bus interface a + contributor has implemented: + + - The author has implemented this component with an action called ``superbus.send``. + - The author has concerns about too much traffic on the bus, so they have implemented a check in this action which + blocks duplicate message transmissions on the bus. The effect is that, if ``superbus.send`` is called repeatedly + with the same message, only the first call will actually send the message on the bus. + + This behavior is not consistent with what ESPHome users expect. If the action ``superbus.send`` is called, it should + *always* send the message, regardless of the content. If there are concerns about (in this example) bus + utilization, perhaps messages can be queued instead of dropped/ignored. + .. _prs-are-being-drafted-when-changes-are-needed: Why Was My PR was Marked as a Draft? @@ -563,7 +622,7 @@ Note that you can use this procedure for other branches, too, such as ``next`` o Using ``git rebase`` will result in your changes having to be *force-pushed* back up to GitHub. - **Do not force-push** your branch once your PR is being reviewed; GitHub allows reviewers to mark files a "viewed" + **Do not force-push** your branch once your PR is being reviewed; GitHub allows reviewers to mark files as "viewed" and, when you force-push, this history **is lost**, forcing your reviewer to re-review files they may have already reviewed! @@ -750,6 +809,8 @@ the provided methods. Finally, your component must have a ``dump_config`` method that prints the complete user configuration. +.. _delays_in_code: + A Note About Delays in Code *************************** @@ -818,8 +879,8 @@ ESPHome's maintainers work hard to maintain a high standard for its code. We try - Components should dump their configuration using ``ESP_LOGCONFIG`` at startup in ``dump_config()``. - ESPHome uses a unified formatting tool for all source files (but this tool can be difficult to install). - When creating a new PR in GitHub, see the Github Actions output to see what formatting needs to be changed - and what potential problems are detected. + When creating a new PR in GitHub, be sure to check the Github Actions output to see what formatting needs to be + changed and what potential problems are detected. - Use of external libraries should be kept to a minimum: - If the component you're developing has a simple communication interface, please consider implementing the library @@ -834,6 +895,12 @@ ESPHome's maintainers work hard to maintain a high standard for its code. We try - Components **must** use the provided abstractions like ``sensor``, ``switch``, etc. Components specifically should **not** directly access other components -- for example, to publish to MQTT topics. - Implementations for new devices should contain reference links for the datasheet and other sample implementations. +- If you have used ``delay()`` or constructed code which blocks for a duration longer than ten milliseconds, be sure to + read :ref:`delays_in_code`. +- Comments in code should be used as appropriate, such as to help explain some complexity or to provide a brief summary + of what a class, method, etc. is doing. PRs which include large blocks of commented-out code will not be accepted. + Single lines of commented code may be useful from time to time (for example, to call out something which was + deliberately omitted for some reason) but should generally be avoided. - Please test your changes :) .. note:: diff --git a/guides/images/update_branch.png b/guides/images/update_branch.png index 9d375fdea494fa52e0d6b18d889bb881fc1a6df2..f4de7afc080bf0c62816a8d14a4a21aa31578d36 100644 GIT binary patch literal 55535 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

!Dsg@}J+r$*B-NIy|yMD@3%pu>ssGquPju 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 E1J2bO-v9sr delta 40338 zcmZ^L1z1#F7cMG_fPjL4w16NXpwclQB@GHv(hVZrF&veW7Le{1>5`sNx`z-Lx*1|< z7@E1q@B8EX?{hCaoaZoSpS91~d+oK}^}ZW+DsC(cU;jcyb{z)?M@_MM83*T%ppCTj zD;qPj3O>F&xFR_Zy<*?r;Q?-$D#^*l_Pp5f`EST0}pA(lK>fj8#(2Z0A6n;NFkXvF8@G)(FsAu1JW}7`8YO!ML-zZTx za4Uppc&|cwcXjCX;+Erp5ow@x&oPs;PbOS|IA+4La!*YBu`x0=#k_vYsndl`{*BCA zZ>h!oj8{byTI!*56dP^YS{JATYm;(ukU#C<~hdwa} zO7FrHY+#3zgB^)Dt6v)Y9$dhxxGq??g!g9K_J;u^8*vwC&vUsV5 zTeKxuI)5tmIBJ_Qw@_)=m4G!mkb94(BJe?_S+W9t*QPw1Mz&$+j}QSZ80XBVu}3FG z(pRH*)e@%(Atw8FzdG`UCLYE|@auhp+nwd1Rk$agT|VqzT7aLv_Df*9xVtU^D4!YJ z?7ZAfcv|l3aBTJD%5BKM?{)XBd-FVeYPQpAZ-wzXv-mocH}%S{)VjmV;Y{`5Z4PW- z7y?dOTj8=;wR_m>We*JG&=GWQFdp@ArZFa-Y?f!7ICBs05vl5O74{gYev$v^a{Er9 zXx|H|$gu&L-TR^pztzn4jo8~afIwj*&7rA+4!6pHis}`6St zK3*?gL3tu21)^Gr$d<<2_yL#FV|zGEt&(*;q{BsZVJHgk(>yodMVFag)JgmRJFB%A zE|Zw)c@L93n#SzQn1{exIGsM8_M=0YPe!;UM!plS?@PbR8H$Qi*=Vs5+DVE(R~fPk zZ1b9Qd__c!K#JX`Ajn;R1*{iO1$Ml6PkY8!ifd~@dUkt_DKYw$#pj@`LC~ zvE)&v#ur02xQ}HZG3m@&Ar>^`t`$y*#R?aRGxF)My{X#|J{FrZ29M%eyfuv`E8wF0 zIPywN{^12)lci)~E}QEk9rZ77zRd-+e3oJ&jaS%R58x*)CKCX*)W7GRT&Er3 zupuZ^FCZGeAF!>c%~$Mub;>JAnxNIK+tKDt#T3{3^O*JXHNq|LEIeTzhfq>i^9p^( zke1b(`EO-NbO`9BE0pRbcMtB$Qks@L;V^OMddn_}M_eppn;Fzsn%x_k^1BBzJT^;0 zn?lSwYM|dvl~VgYy6a&Y(3dsPQ}l9Zf@4l}?zLx%uT^ZviE0<-1^&>zk|nZ1#q3Y2 z`k7`~k=$p=rA1W95_N44g^4pQKg48~(S*~rX5+Pp4_^EXAmb2IP$1Jzv=P}*Fg9t# zH%q6m6xuc)vH*nENC|7UDcuY5`Jwp zedtf&n#-mXELkBkLosX3Zmx8ah=23Gj6LpnCP1FDj=y}6L3#6K!m%6u ztjBNul;cL{y2TJqhDWDg+Q~%357%0Aw>}qFzc7nUw22#YT2CVW^6*~rpa)Zw>4?&{ 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 From 922ec42bf461daa3d4d31bb9f20cb2efb2c8eedf Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 12 Sep 2024 10:11:50 +1200 Subject: [PATCH 8/9] Add note about service -> action change (#4244) --- components/api.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/components/api.rst b/components/api.rst index 398c46b146..5301302655 100644 --- a/components/api.rst +++ b/components/api.rst @@ -19,6 +19,13 @@ The ESPHome native API is based on a custom TCP protocol using protocol buffers. the protocol data structure definitions here: `api.proto `__ A Python library that implements this protocol is `aioesphomeapi `__. +.. note:: + + **Actions** were previously called **Services**. ESPHome changed the name in line with + `Home Assistant `__ + but will continue to support YAML with ``services`` and ``homeassistant.service`` for the foreseeable future. + Documentation will only refer to **Actions**. + .. code-block:: yaml # Example configuration entry From 02d9af543c4d25d4ca57d770dac97c4933eda610 Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Sat, 14 Sep 2024 01:41:18 -0500 Subject: [PATCH 9/9] Add a section about custom component deprecation (#4247) --- components/binary_sensor/custom.rst | 6 +-- components/climate/custom.rst | 6 +-- components/cover/custom.rst | 6 +-- components/light/custom.rst | 6 +-- components/output/custom.rst | 6 +-- components/sensor/bmi160.rst | 14 +++--- components/sensor/custom.rst | 6 +-- components/sensor/mpu6050.rst | 14 +++--- components/sensor/mpu6886.rst | 13 +++--- components/switch/custom.rst | 6 +-- components/text_sensor/custom.rst | 6 +-- custom/custom_component.rst | 6 +-- custom/i2c.rst | 6 +-- custom/spi.rst | 6 +-- custom/uart.rst | 6 +-- guides/contributing.rst | 66 +++++++++++++++++++++++++++++ index.rst | 2 +- 17 files changed, 121 insertions(+), 60 deletions(-) diff --git a/components/binary_sensor/custom.rst b/components/binary_sensor/custom.rst index f983584cb0..64dff13755 100644 --- a/components/binary_sensor/custom.rst +++ b/components/binary_sensor/custom.rst @@ -8,9 +8,9 @@ Custom Binary Sensor .. warning:: - Custom components are deprecated, not recommended for new configurations and will be removed from ESPHome in a - future release. Please look at creating a real ESPHome component and "importing" it into your configuration with - :doc:`/components/external_components`. + :ref:`Custom Components are deprecated`, not recommended for new configurations and + will be removed from ESPHome in a future release. Please look at creating a real ESPHome component and "importing" + it into your configuration with :doc:`/components/external_components`. You can find some basic documentation on creating your own components at :ref:`contributing_to_esphome`. diff --git a/components/climate/custom.rst b/components/climate/custom.rst index 1544fa9f1d..e84d2a12ad 100644 --- a/components/climate/custom.rst +++ b/components/climate/custom.rst @@ -8,9 +8,9 @@ Custom Climate .. warning:: - Custom components are deprecated, not recommended for new configurations and will be removed from ESPHome in a - future release. Please look at creating a real ESPHome component and "importing" it into your configuration with - :doc:`/components/external_components`. + :ref:`Custom Components are deprecated`, not recommended for new configurations and + will be removed from ESPHome in a future release. Please look at creating a real ESPHome component and "importing" + it into your configuration with :doc:`/components/external_components`. You can find some basic documentation on creating your own components at :ref:`contributing_to_esphome`. diff --git a/components/cover/custom.rst b/components/cover/custom.rst index c623a54f99..6c73147d8c 100644 --- a/components/cover/custom.rst +++ b/components/cover/custom.rst @@ -8,9 +8,9 @@ Custom Cover .. warning:: - Custom components are deprecated, not recommended for new configurations and will be removed from ESPHome in a - future release. Please look at creating a real ESPHome component and "importing" it into your configuration with - :doc:`/components/external_components`. + :ref:`Custom Components are deprecated`, not recommended for new configurations and + will be removed from ESPHome in a future release. Please look at creating a real ESPHome component and "importing" + it into your configuration with :doc:`/components/external_components`. You can find some basic documentation on creating your own components at :ref:`contributing_to_esphome`. diff --git a/components/light/custom.rst b/components/light/custom.rst index 0ebf965646..841a4b8609 100644 --- a/components/light/custom.rst +++ b/components/light/custom.rst @@ -8,9 +8,9 @@ Custom Light Output .. warning:: - Custom components are deprecated, not recommended for new configurations and will be removed from ESPHome in a - future release. Please look at creating a real ESPHome component and "importing" it into your configuration with - :doc:`/components/external_components`. + :ref:`Custom Components are deprecated`, not recommended for new configurations and + will be removed from ESPHome in a future release. Please look at creating a real ESPHome component and "importing" + it into your configuration with :doc:`/components/external_components`. You can find some basic documentation on creating your own components at :ref:`contributing_to_esphome`. diff --git a/components/output/custom.rst b/components/output/custom.rst index ad37e1bf05..7df27556cf 100644 --- a/components/output/custom.rst +++ b/components/output/custom.rst @@ -8,9 +8,9 @@ Custom Output .. warning:: - Custom components are deprecated, not recommended for new configurations and will be removed from ESPHome in a - future release. Please look at creating a real ESPHome component and "importing" it into your configuration with - :doc:`/components/external_components`. + :ref:`Custom Components are deprecated`, not recommended for new configurations and + will be removed from ESPHome in a future release. Please look at creating a real ESPHome component and "importing" + it into your configuration with :doc:`/components/external_components`. You can find some basic documentation on creating your own components at :ref:`contributing_to_esphome`. diff --git a/components/sensor/bmi160.rst b/components/sensor/bmi160.rst index 0b55c6143a..7b5c4cfe1b 100644 --- a/components/sensor/bmi160.rst +++ b/components/sensor/bmi160.rst @@ -7,15 +7,13 @@ BMI160 Accelerometer/Gyroscope Sensor The ``bmi160`` sensor platform allows you to use your BMI160 Accelerometer/Gyroscope (`datasheet `__, -`SparkFun`_) sensors with -ESPHome. The :ref:`I²C Bus ` is -required to be set up in your configuration for this sensor to work. - -This component only does some basic filtering and no calibration. Due to the complexity of -this sensor and the amount of possible configuration options, you should probably -create a custom component by copying and modifying the existing code if you want a specific -new feature. Supporting all possible use-cases would be quite hard. +`SparkFun`_) sensors with ESPHome. The :ref:`I²C Bus ` is required to be set up in your configuration for this +sensor to work. +This component only does some basic filtering and no calibration. Due to the complexity of this sensor and the amount +of possible configuration options, you should probably create an :doc:`external component` +by copying and modifying the existing code if you want a specific new feature. Supporting all possible use cases would +be quite hard. .. figure:: images/bmi160-full.jpg :align: center diff --git a/components/sensor/custom.rst b/components/sensor/custom.rst index ad52cbeb55..f772b449ca 100644 --- a/components/sensor/custom.rst +++ b/components/sensor/custom.rst @@ -8,9 +8,9 @@ Custom Sensor Component .. warning:: - Custom components are deprecated, not recommended for new configurations and will be removed from ESPHome in a - future release. Please look at creating a real ESPHome component and "importing" it into your configuration with - :doc:`/components/external_components`. + :ref:`Custom Components are deprecated`, not recommended for new configurations and + will be removed from ESPHome in a future release. Please look at creating a real ESPHome component and "importing" + it into your configuration with :doc:`/components/external_components`. You can find some basic documentation on creating your own components at :ref:`contributing_to_esphome`. diff --git a/components/sensor/mpu6050.rst b/components/sensor/mpu6050.rst index 101b07f908..a15ea330e8 100644 --- a/components/sensor/mpu6050.rst +++ b/components/sensor/mpu6050.rst @@ -7,15 +7,13 @@ MPU6050 Accelerometer/Gyroscope Sensor The ``mpu6050`` sensor platform allows you to use your MPU6050 Accelerometer/Gyroscope (`datasheet `__, -`SparkFun`_) sensors with -ESPHome. The :ref:`I²C Bus ` is -required to be set up in your configuration for this sensor to work. - -This component only does some basic filtering and no calibration. Due to the complexity of -this sensor and the amount of possible configuration options, you should probably -create a custom component by copying and modifying the existing code if you want a specific -new feature. Supporting all possible use-cases would be quite hard. +`SparkFun`_) sensors with ESPHome. The :ref:`I²C Bus ` is required to be set up in your configuration for this +sensor to work. +This component only does some basic filtering and no calibration. Due to the complexity of this sensor and the amount +of possible configuration options, you should probably create an :doc:`external component` +by copying and modifying the existing code if you want a specific new feature. Supporting all possible use cases would +be quite hard. .. figure:: images/mpu6050-full.jpg :align: center diff --git a/components/sensor/mpu6886.rst b/components/sensor/mpu6886.rst index 0714d779e4..b0cff14505 100644 --- a/components/sensor/mpu6886.rst +++ b/components/sensor/mpu6886.rst @@ -7,14 +7,13 @@ MPU6886 Accelerometer/Gyroscope Sensor The ``mpu6886`` sensor platform allows you to use your MPU6886 Accelerometer/Gyroscope (`datasheet `__, -`M5Stack`_) sensors with -ESPHome. The :ref:`I²C Bus ` is -required to be set up in your configuration for this sensor to work. +`M5Stack`_) sensors with ESPHome. The :ref:`I²C Bus ` is required to be set up in your configuration for this +sensor to work. -This component only does some basic filtering and no calibration. Due to the complexity of -this sensor and the amount of possible configuration options, you should probably -create a custom component by copying and modifying the existing code if you want a specific -new feature. Supporting all possible use-cases would be quite hard. +This component only does some basic filtering and no calibration. Due to the complexity of this sensor and the amount +of possible configuration options, you should probably create an :doc:`external component` +by copying and modifying the existing code if you want a specific new feature. Supporting all possible use cases would +be quite hard. The MPU6886 is built-in in various M5Stack units (e.g., M5Stick C, ATOM Matrix or M5Stack Core2). diff --git a/components/switch/custom.rst b/components/switch/custom.rst index 5e08231717..7d69aaca89 100644 --- a/components/switch/custom.rst +++ b/components/switch/custom.rst @@ -8,9 +8,9 @@ Custom Switch .. warning:: - Custom components are deprecated, not recommended for new configurations and will be removed from ESPHome in a - future release. Please look at creating a real ESPHome component and "importing" it into your configuration with - :doc:`/components/external_components`. + :ref:`Custom Components are deprecated`, not recommended for new configurations and + will be removed from ESPHome in a future release. Please look at creating a real ESPHome component and "importing" + it into your configuration with :doc:`/components/external_components`. You can find some basic documentation on creating your own components at :ref:`contributing_to_esphome`. diff --git a/components/text_sensor/custom.rst b/components/text_sensor/custom.rst index f0606e19d1..05486e70bd 100644 --- a/components/text_sensor/custom.rst +++ b/components/text_sensor/custom.rst @@ -8,9 +8,9 @@ Custom Text Sensor .. warning:: - Custom components are deprecated, not recommended for new configurations and will be removed from ESPHome in a - future release. Please look at creating a real ESPHome component and "importing" it into your configuration with - :doc:`/components/external_components`. + :ref:`Custom Components are deprecated`, not recommended for new configurations and + will be removed from ESPHome in a future release. Please look at creating a real ESPHome component and "importing" + it into your configuration with :doc:`/components/external_components`. You can find some basic documentation on creating your own components at :ref:`contributing_to_esphome`. diff --git a/custom/custom_component.rst b/custom/custom_component.rst index a87dcb1040..0eeeab1a38 100644 --- a/custom/custom_component.rst +++ b/custom/custom_component.rst @@ -8,9 +8,9 @@ Generic Custom Component .. warning:: - Custom components are deprecated, not recommended for new configurations and will be removed from ESPHome in a - future release. Please look at creating a real ESPHome component and "importing" it into your configuration with - :doc:`/components/external_components`. + :ref:`Custom Components are deprecated`, not recommended for new configurations and + will be removed from ESPHome in a future release. Please look at creating a real ESPHome component and "importing" + it into your configuration with :doc:`/components/external_components`. You can find some basic documentation on creating your own components at :ref:`contributing_to_esphome`. diff --git a/custom/i2c.rst b/custom/i2c.rst index 87940b8be2..1eb79b94a3 100644 --- a/custom/i2c.rst +++ b/custom/i2c.rst @@ -8,9 +8,9 @@ Custom I²C Device .. warning:: - Custom components are deprecated, not recommended for new configurations and will be removed from ESPHome in a - future release. Please look at creating a real ESPHome component and "importing" it into your configuration with - :doc:`/components/external_components`. + :ref:`Custom Components are deprecated`, not recommended for new configurations and + will be removed from ESPHome in a future release. Please look at creating a real ESPHome component and "importing" + it into your configuration with :doc:`/components/external_components`. You can find some basic documentation on creating your own components at :ref:`contributing_to_esphome`. diff --git a/custom/spi.rst b/custom/spi.rst index 6407d1d58a..eff5fb34b1 100644 --- a/custom/spi.rst +++ b/custom/spi.rst @@ -8,9 +8,9 @@ Custom SPI Device .. warning:: - Custom components are deprecated, not recommended for new configurations and will be removed from ESPHome in a - future release. Please look at creating a real ESPHome component and "importing" it into your configuration with - :doc:`/components/external_components`. + :ref:`Custom Components are deprecated`, not recommended for new configurations and + will be removed from ESPHome in a future release. Please look at creating a real ESPHome component and "importing" + it into your configuration with :doc:`/components/external_components`. You can find some basic documentation on creating your own components at :ref:`contributing_to_esphome`. diff --git a/custom/uart.rst b/custom/uart.rst index c4426cc2d3..22c2b8836f 100644 --- a/custom/uart.rst +++ b/custom/uart.rst @@ -8,9 +8,9 @@ Custom UART Device .. warning:: - Custom components are deprecated, not recommended for new configurations and will be removed from ESPHome in a - future release. Please look at creating a real ESPHome component and "importing" it into your configuration with - :doc:`/components/external_components`. + :ref:`Custom Components are deprecated`, not recommended for new configurations and + will be removed from ESPHome in a future release. Please look at creating a real ESPHome component and "importing" + it into your configuration with :doc:`/components/external_components`. You can find some basic documentation on creating your own components at :ref:`contributing_to_esphome`. diff --git a/guides/contributing.rst b/guides/contributing.rst index f66c5a511e..ab7598ff79 100644 --- a/guides/contributing.rst +++ b/guides/contributing.rst @@ -647,6 +647,8 @@ The C++ part of the codebase is what's actually running on the microcontroller; of the codebase should first set up the communication interface to a sensor/component/etc. and then communicate with the ESPHome core via the defined interfaces (like ``Sensor``, ``BinarySensor`` and ``Switch``, among others). +.. _directory_structure: + Directory Structure ******************* @@ -742,6 +744,8 @@ A few notes on validation: obscure shorthand. As an example, ``scrn_btn_inpt`` is indeed shorter but more difficult to understand, particularly for new users; avoid naming keys and variables in this way. +.. _code_generation: + Code Generation *************** @@ -782,6 +786,8 @@ Next, there's a special method - ``cg.add`` - that you will often use. ``cg.add( C++ declared in the parentheses of ``cg.add()`` will be added to the generated code. Note that, if you do not call "add" to insert a piece of code explicitly, it will not be added to the ``main.cpp`` file! +.. _runtime: + Runtime ******* @@ -832,6 +838,66 @@ it then attempts to read back the measurement from the sensor. For any :apiclass:`Component` (which is nearly everything), the well-known ``set_timeout`` method is also available; this can be a handy alternative to implemeting a state machine. +.. _a_note_about_custom_components: + +A Note About Custom Components +****************************** + +*"I read that custom components are deprecated...so now what do I do???"* + +ESPHome's "custom component" mechanism is a holdover from Home Assistant's feature by the same name. It existed before +:doc:`/components/external_components` and offered a way to "hack in" support for devices which were not officially +supported by ESPHome. + +ESPHome has since deprecated this feature in favor of :doc:`/components/external_components` for several reasons: + +- Custom components are very fragile: + + - There is no validation. You can easily configure a custom component incorrectly and there will be no warning. + - Types are not checked. You might incorrectly pass a variable of an incorrect type or unit to a custom component + resulting in compiler errors, unexpected behavior and/or crashes. + - Custom components are difficult to use. You have to manually copy all of the custom component's files into *just + the right location* on your system or else you will receive compiler errors and the component won't work. + - Custom components almost always require C++ code changes when you want them to work even *slightly* differently + than the original author intended. + +- :doc:`/components/external_components` initially require a bit more effort by the developer but are ultimately more + robust and easier to use and share: + + - Just like any other ESPHome component/platform: + + - They are configured entirely in YAML. + - Their YAML configuration is validated. + + - They do not require the user to: + + - Manually copy files onto their system. + - Touch/edit any C++ code. + + - They tend to be more flexible since they are configured in YAML (as opposed to editing C++ code to make changes). + +**So what is the difference between custom components and** :doc:`/components/external_components`? + +Custom components are typically (more or less) just the :ref:`runtime` part of an ESPHome component/platform. On the +other hand, :doc:`/components/external_components` are just like any other ESPHome component -- the only difference is +that they are *external* in the sense that they are not "officially" a part of ESPHome. + +In terms of implementation, custom components just lack the Python part of an ESPHome component, specifically: + +- :ref:`config_validation` +- :ref:`code_generation` + +As such, most custom components can be made into :doc:`/components/external_components` simply by adding the required +Python parts to make the custom component into a proper, complete ESPHome component. + +We encourage all custom component developers to extend their custom component(s) into proper +:doc:`/components/external_components`; doing so will make your custom component easier to share and use. As you do so, +be sure to have a look at the the :ref:`contributing_to_esphome` section above as it walks through ESPHome (component) +architecture. In addition, it's often helpful to take a look at other, similar +`components `__ and adapt them to fit the needs of your +custom component. For common hardware devices such as :doc:`sensors`, this is often a +reasonably trivial exercise and `we are happy to help you along! `__ + Extras ****** diff --git a/index.rst b/index.rst index a89c4cbea3..0f09741f47 100644 --- a/index.rst +++ b/index.rst @@ -1120,7 +1120,7 @@ Miscellaneous Components Custom Components ----------------- -**Note: Custom Components are deprecated in favor of** :doc:`components/external_components`! +**Note:** :ref:`Custom Components are deprecated` in favor of :doc:`components/external_components`! .. imgtable::