From 7022723bc77b802fc2b01af13cc4e5ed3eaf92bd Mon Sep 17 00:00:00 2001 From: Mike La Spina Date: Thu, 2 Nov 2023 18:02:36 -0500 Subject: [PATCH] LD2420 Documentation (#2956) Co-authored-by: Keith Burzinski Co-authored-by: descipher <120155735+GelidusResearch@users.noreply.github.com> Co-authored-by: descipher --- components/sensor/ld2420.rst | 450 +++++++++++++++++++++++++++++++++++ images/ld2420.jpg | Bin 0 -> 22556 bytes index.rst | 3 +- 3 files changed, 452 insertions(+), 1 deletion(-) create mode 100644 components/sensor/ld2420.rst create mode 100644 images/ld2420.jpg diff --git a/components/sensor/ld2420.rst b/components/sensor/ld2420.rst new file mode 100644 index 000000000..ea1770d30 --- /dev/null +++ b/components/sensor/ld2420.rst @@ -0,0 +1,450 @@ +LD2420 24Ghz mmWave Radar Sensor +================================ + +.. seo:: + :description: Instructions for setting up LD2420 sensors. + :image: ld2420.jpg + +Component +--------- +.. _ld2420-component: + +The ``ld2420`` sensor platform allows you to use the HLK-LD2420 motion and presence sensor. +The :ref:`UART ` is required to be set up in your configuration for this sensor to work. + +Depending on the firmware you have serial baudrates will be 256000 for any module with less than +firmware v1.5.3 and 115200 on newer versions. The tx_pin changed from ot2 to ot1 with firmware v1.5.3. +Firmware v1.5.4 and up now features the ability to observe gate energy signal levels and with this +release we can dynamically calibrate gate still and move thresholds. + +This component has dynamic configuration functionallity with a compact UI format. +Select, number and button components provide configuration value inputs and control. + + +.. figure:: /images/ld2420.jpg + :align: center + :width: 50.0% + + HLK-LD2420 Low power motion and presence sensor. + +Pinouts +------- + +.. list-table:: Firmware 1.5.2 and older + :widths: 25 25 25 + :header-rows: 1 + + * - Pin# + - Name + - Function + * - 1 + - 3v3 + - VCC + * - 2 + - GND + - GND + * - 3 + - OT1 + - Presence Signal Output + * - 4 + - RX + - Serial Rx (to ESP Tx) + * - 5 + - OT2 + - Serial Tx (to ESP Rx) + +.. list-table:: Firmware 1.5.3 and newer + :widths: 25 25 25 + :header-rows: 1 + + * - Pin# + - Name + - Function + * - 1 + - 3v3 + - VCC + * - 2 + - GND + - GND + * - 3 + - OT1 + - Serial Tx (to ESP Rx) + * - 4 + - RX + - Serial Rx (to ESP Tx) + * - 5 + - OT2 + - Presence Signal Output + +.. code-block:: yaml + + # Example configuration entry + uart: + id: ld2420_uart + tx_pin: REPLACEME + rx_pin: REPLACEME + baud_rate: 115200 + parity: NONE + stop_bits: 1 + + # The LD2420 has 16 time gate intervals (0-15) with a gate + # resolution of 0.70 meters + ld2420: + + text_sensor: + - platform: ld2420 + fw_version: + name: LD2420 Firmware + + sensor: + - platform: ld2420 + moving_distance: + name : Moving Distance + + binary_sensor: + - platform: ld2420 + has_target: + name: Presence + + select: + - platform: ld2420 + operating_mode: + name: Operating Mode + + number: + - platform: ld2420 + timeout: + name: Detection Presence Timeout + min_gate_distance: + name: Detection Gate Minimum + max_gate_distance: + name: Detection Gate Maximum + gate_select: + name: Select Gate to Set + still_threshold: + name: Set Still Threshold Value + move_threshold: + name: Set Move Threshold Value + + button: + - platform: ld2420 + apply_config: + name: Apply Config + factory_reset: + name: Factory Reset + restart_module: + name: Restart Module + revert_config: + name: Undo Edits + + +Platform +-------- + +.. code-block:: yaml + + ld2420: + +Configuration variables: +************************ + +**ld2420** (*Required*): Component platform. + + +Select +------ + +**Operating Modes:** + +.. code-block:: yaml + + select: + - platform: ld2420 + operating_mode: + name: Operating Mode + + +The dynamic UI provides three operational modes: **Normal**, **Calibrate** and **Simple**. The select component allows +you to choose the active mode. + +- **Normal**: This is the default mode. It sets the ld2420 in energy reporting mode and is availble with firmware + v1.5.4 or greater. When in this mode the module logs all gate energy levels continuouly in a local array making it + available for dynamic calibration functions. +- **Calibrate**: When calibration mode is selected the module will collect the average and peak energy levels, + reporting them every five seconds. The report is provided in the log console for information only. In order to + calibrate the gate configuration, no objects should be present in the target environment. The recording will + establish the mmWave noise floor levels and undesirable reflections or signal distortions peaks. This should be + collected for at least 30 seconds. Longer runs can catch more potential false signals when devices near the module + are used such as microwave ovens and other sources of noise. + + When the **apply_config** button is pressed in calibration mode the LD2420 will be configured with calculated values + based on its collected noise floor data and the module will return to Normal Mode. Selecting any other mode drops the + session's collected noise data and no changed settings are staged. Once the **apply_config** action is performed, the + computed values will then persist. The gate values can be manually adjusted or calibrated again or you can use the + factory reset button to restore the module's default settings. +- **Simple**: Provides backward compatibility with firmware v1.5.3 and older and will be automatically set when the + detected firmware version is v1.5.3 or older. + +Configuration variables: +************************ + +- **operating_mode** (*Required*): Provisions the operating mode select component. + +Number +------ + +.. code-block:: yaml + + number: + - platform: ld2420 + presence_timeout: + name: Detection Presence Timeout + min_gate_distance: + name: Detection Gate Minimum + max_gate_distance: + name: Detection Gate Maximum + + gate_select: + name: Select Gate to Set + still_threshold: + name: Set Still Threshold Value + move_threshold: + name: Set Move Threshold Value + + gate_move_sensitivity: + name: Move Calibration Sensitivity Factor + gate_still_sensitivity: + name: Still Calibration Sensitivity Factor + + gate_0: + move_threshold: + name: Gate 0 Move Threshold + still_threshold: + name: Gate 0 Still Threshold + gate_1: + move_threshold: + name: Gate 1 Move Threshold + still_threshold: + name: Gate 1 Still Threshold + +Configuration variables: +************************ + +- **presence_timeout** (*Optional*): The time in seconds during which the occupied state (presence) will persist after + presence is no longer detected. Any energy detection within the time window restarts the countdown from this value. + Defaults to 120s. **Required** when ``min_gate_distance`` and ``max_gate_distance`` is specified. +- **min_gate_distance** (*Optional*): Minimum distance for move or still energy detection. Value between 0 and + ``max_gate_distance`` - 1. Each increment equals 70 cm. Defaults to 1. **Required** when ``presence_timeout`` and + ``max_gate_distance`` is specified. +- **max_gate_distance** (*Optional*): Maximum gate for movement detection. Value from 1 to 15. Each gate detects + movement and still energy at 70 cm increments. At the maximum value, the sensor’s range equates to 16 * 70 cm + resulting in an approximately 12-meter range; however, accuracy at this range may be diminished. The recommended + maximum value is 12 * 70 cm which results in approximately 9 meters. **Required** when ``presence_timeout`` and + ``min_gate_distance`` is specified. +- **gate_still_sensitivity** (*Optional*): Gate still threshold calibration sensitivity factor. Defaults to 0.5 with a + range of 0-1, 0 = high and 1 = low. +- **gate_move_sensitivity** (*Optional*): Gate move threshold calibration sensitivity factor. Defaults to 0.5 with a + range of 0-1, 0 = high and 1 = low. + +- **gate_select** (*Optional*): Selection of gate value to edit (gate # from 0 to 15). Gate thresholds + are edited by selecting the gate number and then adjusting the move and still thresholds. **Note that when this + variable is defined, the component will run in compact UI mode and the following two configuration variables are then + required:** + + - **still_threshold** (*Optional*): Gate still value threshold level for motion energy detection on a currently + selected gate number. A value greater than that specified for the gate (distance) will trigger movement detection. + - **move_threshold** (*Optional*): Gate move value threshold level for still energy detection on a currently selected + gate number. A value less than that specified for the gate (distance) will trigger still detection. + +- **gate_n** (*Optional*): Provides individual gate threshold number inputs. Range is ``gate_0`` to ``gate_15``. + **May not be used with** ``gate_select`` (above). Each gate entry requires a ``still_threshold`` and ``move_threshold``: + + - **still_threshold** (*Required for each gate_n entry*): Gate still value threshold level for motion energy + detection on currently selected gate number. A value greater than that specified for the gate (distance) will + trigger movement detection. + - **move_threshold** (*Required for each gate_n entry*): Gate move value threshold level for still energy + detection on currently selected gate number. A value less than that specified for the gate (distance) will + trigger still detection. + +Button +------ + +.. code-block:: yaml + + button: + - platform: ld2420 + apply_config: + name: Apply Config + factory_reset: + name: Factory Reset + restart_module: + name: Restart Module + revert_config: + name: Undo Edits + +Four button components are available enabling configuration controls for editing, saving, restarting and factory reseting the LD2420 module. + +Configuration variables: +************************ + +- **apply_config** (*Optional*): Saves both manual config tuning or the auto calibrate still and move threshold config settings. + +- **restart_module** (*Optional*): Reboots the LD2420 modules. + +- **revert_config** (*Optional*): Undoes in-progress edits prior to their application via the ``apply_config`` button. + +- **factory_reset** (*Optional*): Restores a base set of LD2420 configuration values. + +Factory Reset Values: +********************* + +.. _ld2420-default_values_for_gate_threshold: + +.. list-table:: + :widths: 25 25 + :header-rows: 1 + + * - Setting: + - Value: + + * - Timeout + - 120s + * - Min Gate Distance + - 1 + * - Max Gate Distance + - 12 + +.. list-table:: + :widths: 25 25 25 + :header-rows: 1 + + * - Gate Number: + - Move threshold + - Still threshold + * - 0 + - 60000 + - 40000 + * - 1 + - 30000 + - 20000 + * - 2 + - 400 + - 200 + * - 3 + - 300 + - 250 + * - 4 + - 250 + - 150 + * - 5 + - 250 + - 150 + * - 6 + - 250 + - 150 + * - 7 + - 250 + - 150 + * - 8 + - 300 + - 150 + * - 9 + - 250 + - 150 + * - 10 + - 250 + - 150 + * - 11 + - 250 + - 150 + * - 12 + - 250 + - 100 + * - 13 + - 200 + - 100 + * - 14 + - 200 + - 100 + * - 15 + - 200 + - 100 + +Sensor +------ + +The ``ld2420`` sensor allows you to use your :doc:`ld2420` to approximate the distance +between the sensor and an object moving within its field of detection. + +.. code-block:: yaml + + sensor: + - platform: ld2420 + moving_distance: + name : Moving Distance + + +Configuration variables: +************************ + +- **moving_distance** (*Optional*): Distance between the sensor and the detected moving target. + All options from :ref:`Sensor `. + +Binary Sensor +------------- + +The ``ld2420`` binary sensor allows you to use your :doc:`ld2420` to sense presence. + +.. code-block:: yaml + + binary_sensor: + - platform: ld2420 + has_target: + name: Presence + +Configuration variables: +************************ + +- **has_target** (*Optional*): If a target is detected with either still or in movement **has_target** will be set true + for the duration of the **presence_time_window** setting. + +Text Sensor +----------- + +The ``ld2420`` text sensor provides version information for the :doc:`ld2420`. + +.. code-block:: yaml + + text_sensor: + - platform: ld2420 + fw_version: + name: LD2420 Firmware + +Configuration variables: +************************ + +- **fw_version** (*Optional*): Allows you to retrieve the :doc:`ld2420` firmware version. + + +Important Information: +********************** + +Solid objects and noise outside the ``detection_gate_max`` and ``detection_gate_min`` may cause false +detections or result in abnormal gate thresholds. For example, a wall within the gate max range can result +in signal reflections. If your sensor reports unexpected detections, you should test it by placing it in a +completely open room with no moving objects. + +Also, never place two or more sensors in a manner such that their detection fields overlap, as this will certainly +result in false detections. + +Firmware update capability is available using the LD2420 tool provided by HLKTech. +You will need to email them and request the bin file. +At this time only firmware version v1.5.6 and up can be upgraded. +**DO NOT** attempt to update to older firmware versions. It will brick the module. + +See Also +-------- + +- Official Datasheet/Manuals are still in development; for info email `sales@hlktech.com`. +- Official web site `https://www.hlktech.net/` +- :ghedit:`Edit` diff --git a/images/ld2420.jpg b/images/ld2420.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3743d96b8f01eb92febdea21c7b614c090227830 GIT binary patch literal 22556 zcmbTdcT^K?`!yOKK&m20M+nj(6p<=bK$?_D5u}SCy+}t|L4G%rEkt?;=^d07 zI)vUyr~yLw^1Sc)e&1Q=uXE01Wv$HIv+kK|%{}|t*WOodXKq&j_g|=KssRWH2mo*J zAHeNAKm~Azi1-dM(VaWQcSuO?kdoggCnqB#r@co-d7punk&%Ixo}QVN8_3MU`H-HT zU67rVhnHV~p9v`RScva2Hy=OWzmpJD#dAt1$pe7~YBM>Ac z-~jwXO+ZLZaN7+40ssWW_`Ci0hX1dP;2%Q#{gRN9kyGGLsJ##Phk%gqA0k3xVj?2^ z*}?d601-7Y%_C8zI}h}%NjN-cpM=K$B;{1D?4Z;Ci{cV{>-mX{oSuP^iJ6;+mycgS zTtZSx`l*b{b5%8U4b2w@hOdl_Uz?cP*uJx~cW`v_^7ird^ZyVK_BlKv^2=9fLSj;K zO6vEt^xVAsg2JNWlG3W`n%cVhhQ_AOuI`@RzW#y1@rlW)X~fLz9CCGSePeTLduJDY zd~$kreu25X`Zq2D0O5bb`k%=DA8}FR(cn-?#|=@xy-!sfmamiQb`6(j&3< zc);-_l$2IE{%2(e8K;;&iterFUvhdbaU?hT-_ZUO+5fx1KK=iS?0*9LKXJ_gC3A})-YnxZ zoLON1NP!1yT=Pe2XO5-sL+PonK_mNB){oY*;U8-%oMe-99R_nNrBtb@jV8OAv zM~(AEwE-`?3_exM?HHFydGE&=gQG))goeM_?C7`mEYrUa!Z6Ice()xG#w5kWqb%1I zOK@5Sbo7XRq!@lLS)qsDaCc1O77*UL+J1Q%hBl?@IikB)|2~8iG-ibUatkmlLeV0F zc~RYYxPL%WFS2b^pI*pQ;OLj38k^_Tw*UZb#44?IGLS(EQl1BhP>8&}J+Rx8DLNta_f?AAC`-_^XZ;a;M9_3<6)T z7_n}3Ewk!gMk;0UYF8S0Q}?&_D(&s)&teFBr6fzl1BeD$FqVc!z)kk}}a@(~X7H?t^>_ z0VgB+MI@EN25nn;nrQo8r6%tw4n8cmE?(>w!WWev_>?t{h}_d)2$o(R^>Lpe6}0mEAW(g*YFo$9cK zM}~2t(Bjs&Fi&Fd%ZunYMy{8xQu-aXrWPi5G0P1vC{v zn1Q74?tiEeAWH)qF>$E8s_CS=uxo-yRk1xUiM+r~j6(OdW?NBCb`(xLifg&Iug$1b zs&|ZW{T5KDjv+r0Z)mVS+TsTn zy@byn1ChFkeWts|^;@`0y5E;uwQL`bUf%*73~@GA#ll-Y_%%e*ZE<&{@A^|Bj{aU7 zl~g-syMkd%oGAuqRk9ejOVPNX*eyaWwa`kq8;0cre_`V!+-#?WEYNj*=#7)!OhxSa zz4d?aw;adiTz6cO^18_Um{k;8Hr@hUa~8ReTaT+=<{S7LclWTUHE8eQ<(`psV***i zYm2q`d#@%}!YpQ7Iz2*8njXVGZ;Bdrr^V}7= z51q!zbEH#WCe{@#o=)<4nBGnQ=lqC`|(e0WiC4phijk}oZWf^M~t{kVkz4hy&WPbAvw zK1>yfS}3cCNA+1^XhLw6ggy7Re;g7P8q!6u35)OfCpIH_EZea(t7B+vIO0aP0t=G;`+b~3MVu+dYZ z0ag1w0|1&MSW#`_Qxc0>UB|@H&dfn6=*I0TkzulmKov|T%>N$0_Xx8VW8#P-&&k^* zi^!qaRs~CtK)h?UsoU^x2M&KLcys*+ujM0zjL6vu$6 zh50*o?BvV||KQ1HuKFVUM$p#CCL`lya>C;;m!nUxZq)BKj;Xds4hkF-J|D8qcOFTl zXsG#WM9Lbpv#-$&I5r8l`gwWp{oFlb9{Q+S_ATe0`is-JS%?O7?e$b`!{_(vlyQvp zancrBALRjbQ&=lyq7eKP#nyQ=rcGTH)+xH<$Oab zq|bAN{E?jY45-Zq3Lb`F>>#at@cK71{3?I13aJHxgNbY{^W7iW9}h*{XjsV zZ`6}LeVG*kdsdfY6MAWII=$$Wu?4NYFlv6V>#5M~!5>9rSh$khv9+hOAgcYAM7pez zo_XWbFH3^*r#}^}c@uP88F&@W^xrX!%1%D1P<3g(ALsOJxn-@APV5c&$IwmwGmh%) z&cVp;xR;gJC1G=LyK0wv^oj*mciJU-M3$-#_^_m@9(f+cQ3kfbIrh<42#FX?Eug7+ zwkdRxE2%t|OUw0|`F(h@uGr;ThMv!Q0W9+%1~FH2-P+0Y!c{iuQG*+Y96xqgK0DyWeFpUi-y?i5V~jx7 zXppsgfz`rI7KwTyMcfnpJOxwxn7&$H1!l|#n-A^|IL@q-E<5L~Fr81w5=I{NF|)f6 zfu8!mK|(o>O(F2L;1_3ya1OI(3t6y!#r@;*v6*bAX@ndYd3_xSf_K41OlSW)Q zr*SzKEJd0yXLRyOG&?ruoCN08lm)v3 zFW?+-x2L4vrhYC;ic@7T4hmi+2{{{gmh`{`*I3bD%nY1i3fIGdCOq2Gzvs|{vY*KA zR0Zjkbya+!LA>}io*N~cVNwaaoxmG`@Eiz`qF_w zm3O_b&>u$iwd(bvxk{OTfSG2HXvtJxgF1sX>(I644-9Z_1vd`x*4I+|I<1;9 zwG(Z8$4r157TRo$yawlg5MjSx2AgqtSX}%r7%xEi*36YTiY|}HQuwtVU%1WV5PFHP zv&pa|tFk~^lV$T6vnZB8M_S$L5+?sPbH9Er!lQH;((04(+)Z+8&t{Rk8$Au2vTh!# z*|70JzBPDPz@*NQHEk>57SO4hk4fxq@;NQ7UYPxUh%I&0tl1 z085f;a?OIt=$spPa5+9wKKMwsZi`Oec!aY0?45Raz=b|fBOV+y@;<(&a!+)+lnUT~ zchlbe3$qQ4SEy@-p(M<9MEKAfQU%FUL<&W0<1XE7?#W=+*fVY%Fvcb7d011#k?=Yc zB%v38YKEp>*hc^sPSy%77&dUs4FN!(|@a^A>i3yQH*dVhd>n=!bfjxY}J#pG)|bV zm@&5i{qg5BDFd9wtm-LuATP!mYg!s=H7XwYiH23a3cUVP%+Xq=Fgb};LBigSit>Iv zeIHA~Zq9uT5%0K^J`);2{kH17+!Y?xow_GK$V+OYu z&{Obig(!XHYWPb4t|zrH zY1!}9>eG{?IDCpTp8Og6Th)D z`q9k*4h_9d-qF6vyajC9-vTOrLALL-21n8%96CWNqcGE;1D+4T*&Q$*xjsnAvc+8G zz3I!D=$T$!(9;m&oxeQ~-#h!EpGWUky6Qt;udn#Rt#jjC4u<~p&FNk=uFe&8^m`u& zA0M-NBIlNPl0e-JE|hD~<7Um48NEJ_^sBt?1%GGbTL4@Wa{9oE*D=Gi@04!LQZ(sl zg6yxvq#ruz)(u5vhFV}#q*>;eb#v7WycoxP3+Ru^gCH88 zQYgKXWcXcqTZn($=5osjjU78_8Q+O>KZq=j6j!w9c||H#?rtIGd+ z^21u{>L%~-4zS+`&Vvbcl>Axj&oMa4DKRzr)tN~2)13?Jk55+^{aw$KIkc zQm-*#RpYqga_L;&9Cz8q1-A|>4y~)dnOc~40B5w3oN37_G*5p^>{yYUCZQwa-qj*R z+zM){Y8d!Q=9q$}d6}f;LT{Xh3&|dOESf%nRZC8W zxw#$7d$pNv>&NR^bARjzZuX1&uMnTQ&|-ZTL<2n4B~LCy=k0+XO~PZz8wq85;Q|+9d%`*)x<&xpxl^r{Z@8fu{%qxJG5_5VD2^vajF*e03^=3zx%!;R|e2D9#nHvg*oyMXK$EJ&5reE85F z7MMI1)526SYrZqE$|@&Ta(z;IvX^M7zA{w{WK!TLNFFve+R58DdHa5M=Bro#>gSC~ zqnH}G2U<@nt*i|+<_*)s)GlF4=Vjx)@1KCiwNyTV^)p-Atl6XA7S5mCbL^DQU%6M) z&}Y?|8SYt=w<$g=L+%w_9jM1XSi$E&%7u*F(u-@wOeTbFij059<^D^@;=1EhCwe)- z7fw6Ubo$*PNX11uTg2wsE#Rw&!M~L3EPHmKDhQl?x#xZh$YDM=f-~M^v|T_I_h9X~ zPtJ49&Gsm`${-9~C8P4fQ87|t@Ivef7JLif7_GboSmN{GHcy-O1Y~VVF$Z4WqJtmk z{XYY`6Oc*uQ(8kD_4231bm#Gmnw}!qdyy|kf%k!D5pAUy5B&L(G5Cr0tOT;plFzKV ze#Q|wbm20m+p+~`v*Qq!BglR~L{Q@|G8cC`--!!;@2!+>+TLyD~*x_9N@Tv zOi}jHH72Lw!A=THdGG2TaV0v=G1^Oy)p{&3B#ia>o;RsgBVoE%Yv6h` zsc*nk=wW0>jI2(?rg!Tk9Q!k=uAZ7K|C~hLIYQIQ;_r5ec$`%FA`C~1VdlSIMkYd0 zvU_j0!H|j z3zYS$+(-utYVuyFSBRa$N(R)VYzGfAMhiShYcu7BD`P%htsorHf{EphgcXbQLyQOC zcepT2YqKuQi2ez>iwH4^6>c@r*i4Yh>Q-csD)KrQWHjw6q!TUq^7Ziagu5+Yv&y$; zE9p-s5~}a1J7;-#{vNPTDa9AO(1rZ)Kb@logWXf|?0y*G7vCY`n1Ysuv#YH(hkj`8yAexN~Fxw@8G za3%Lh%&&hm4}RYLO+4jge$-7!xBS_M)TW_ERPfy<&4I^8Tx-VZT5C`{@9%aXcR{yM zk&<}%GfjHT{XDt&^nL{HK4wjGV(ENK`xc-U?j;BcU@EY@1qgq*B43Ywbs_UG9Aj4c zdOPHC^(5=U_IXoOiyK2cbw4GExmSj9{w|IP6$>kOGEHie9j~)mkU%6M?=3DHShD6V z)DHL8p*0RTN!KDIhJpcf%aG0%w6-tY6Gzu_zmy@kgYb>d+EdsDP%LY6v9HtpPDX8g z_gxOLEG6oA>`oM_zSB08w_Bbv6xaRX7VxJmZrppIHfmeY8zybOq;tVRo)yiASh4VtG7hlP48Q12MLh}eqMaedZ%jsk3XwZCePHN z1W10>`{*(@`5x*}Twvgm_v0sOmlk#yj>iBi4q8s z1RZd*d>8+~mo;wzJ%(V3ZcVeK;uQzp!0*0$Rga76=|D#PDC6irjN1k73O{}JEr8TG znhHCV+I}$(LBCqjjnS0c4~Q?*6+p-y&HjP(k3x3JfmZ}@TZxmgFmI}_=`70%;e{P` z!sKbH*M*G5zkA8#K?U}haj!2}1;~nWD`}@Nzvj%zZUKK?+7u>lRUryFMmz5xg1f7F zbg0bO@*}u^e)P`0-~fbeFlazd3JGD{T~e6vX$STdiksR#p>VIhZ#L{=!`b!}ZZ21A z4SlKU$y95@+r7rdIIXxhZgoS17?^Xv`i={`G@e!vP(*9*0nfHX@G!i-C~~6>d9jg= ziruH*AJ?sA-_a}30EGsr=bVG$&I;QqFoAd^)%_PqhphO3XT5Fk|N9ZW6qhkVJiimW z)`9c~s^U4HqvGi!OKyLS(EeT8_)FtD+(h;<+h4`KIq(go@t3h-8vE-QY}wwnte*O) zG4AOMrrvPU^$iLbQ8PbKUK69-J9YTB&RuYD{Gq7b!wiHCS{At(hPvpIGOha|S>sOq z>?>~iw;M0(v%TdEm&0NS~)$v_*FEpt4>RSrvzzGy(_W3yf zlZK7MEVy*F@gdhf9!R;$M}h+l8mAS2{txt~xTP4z3kEgiz6&GG$jOeN2W=Esy+1)h z$ke}bT3jh$%5g1PoPmsX#q4g*v6y9GY2SK~C`!&kdB~sOoJw}6o38!p#U;^r;@4#?CtinW#6wwktTBs#4 z;&Q#Z<&NYVPg24nx7u_)(>$~KM&uCToWJp_PX^cBUkSaI38AO(&ml77*t@IOI})|Y zE=RCDu!8i^rK;xjZ?CYdDZy`8V44JlFG2#sovE+&i7Y1e*-Gdbf;Nk<8pRV{V)kp| z%vFDSS448@7@?;YYq)b6_hM=Uy!eQhRqx2Iq#XL^~Mssfpf{F;>Q*$l-4CqI23L++VO zA99`4eR~#DdCBZs?JmEuU;kv#+L5UsKF|DacfvEaG>NpIc}4RS|3G)I4bNAm$1$39 z#pm$ZPR1>CRZVgE+e&+7$mexRXqi;^7?Vz*?_N3MH!w%OBRTTfTM~Dt`s*iE?JUtq#XEc#gB7Eo15WvA8mazDTtleqTi79a}8e#}PV zDO-5z+QSo=)XgOr1s8O+LxKq)0xB?bI$jE`YhLQb2WPviamGNJe{B+_!dpN)KaTbY z^BN~22XTFTalZ&-{H?CpTSnkz`pwM1o9~1?xh85nh$eoUVqf_{96eRk7`BfW%K=9H zYCS%8q9Sy>ZS0$x zy8usjr#9rb{>=zG!FwackRcJOU@3A%dxK;DY~aZp)eQjg>+~VQy>0{A)Y$RrcqHGy zH*yV5x7~i<`+%@-dG<@{Uu?u=*hVFnFu0M(X2H1namVT}A22D#@6{B8!DNlIRvEhf zL4TTc{o%=h8Eo!Xx8di64K>%rG`9bZ!@PJL-nc7<$6+NaV+fj2x#%+1%^6?B}>J~r+S=apAzBlWZ<6=M)cpX6?S4|k8EnI1ur3tN>*pc`ni?Foic33c%aUQ2Zkqopm@-RKxH);wq# zUYXUEao+PGq8+*D)g!|YUORT@bDJwjCt?XHBn)W$WVm;H)?eYw6rdSpL|&3H${XK(vXaS>nxEO>IE_Sc}}+<4BdlISYAdpGh$ ztfUk*4H&F1+E1ILKfW=rY_qKxvqWh&Mz)OC_85vB^p?ze-(_-qQk4I=%MdF)5_I%t zIEV?EIomrFKjyv!?MWYdsg?Zt;LKs`{d~OstN7H1S!sPR7mJz!WZYfIyY73$126j& zMbeHC1r{dHAuf=)pbjpAPgG|IrY{F~+^I6}mJWqB zz6cxJGOX34$o&v#^MUKN7RQ={yvMe4MK9T@IQJA#udShBs<2_w{RagX>=8Ra+WewN zLl`y*Jmrwb_VQj%%J|J%E?UMWuAoz)fb z#Opg!SL(B75J6c-FHkK?iZU?5X7HDlBa}wFWY==tBTDv)x1(`Y(UF^~v z{fO(bAHKU-kogcU7IWR`0z4Tn8R4!Hq-lXP&TnGFD7QQS>4j6!%EMbgbp%y68T2E; z1Td!$TSK>!#g!O5Ih1kGj3;y|61&R)IjaJP5Shki1l*>w%2lo$%r38GPr|enW@#Mq z=7aD%4o!twFVK9lJZ)n~U+afcHu{gOs#K&b1vU*;f??k zNq^s5QX4&)Q-E5MpNSG~6)%SUQS_~@32|Xp+!r~9i6G&lqRtoNX9}Z{sK2}Tu;7bm z#T(zSTfj4keVqv?8c#ukviR`QA?jc0@XKih^oNMbFbu0E_Rzp_a&9yI$&(;FvFFID z#Zx-Z|5Vv8CrGa3Act`qc=)Nusp>f6S~l_Jqs7f(d%*uaX#l(Bpey}rHQh5?2NPW_@U9#T9>=Pu1?i@eJ$ksM`n8l3ZI==8-B!BAAGe{`i#|M=2+p!WKdRmF{ z3*T@^*XACiv%1=|tXL*IW09UZ6H-yFs~hzz2S4ij)n|&t+T3J2``8q2`!RTS6_rCT z#MIt8+WIcc8y+*{FqP%K<4WZ5Y?|EStb-mpxU+Jb)I~p%7d2Q`GXi-UGc|(8?t}}Q z-MFNU=}(?7^SwSkG+JdKY%s`3KX?lFHT+|y>o{ej#vGZN0zqDs6sC{(?4%APEoa9U zZh!B?7$p~G`jD3@z4MV>JM3`ZR9FtqNnZ`pPNjB6pcYl+TgpVnDEsyPto=0jgOD&W zQweao%Cv&M8HeF*iyzlop*%2egy>S=rrXRXZGbuojXklj*i1%Z+N7Q44ByXXQoCBL zeb!2Hq(`vZ%Vo|UO}Ci6VOoQmKFjf#Ys?%CtNy#cZ-rE-Ew16PFa^!Ht|kr>b zS7d{Ni2o`XvW{7&prF4p##X`dRH>ds?n3&kf@k4%cDNM7b2Xo&Nt+0M!jNNWUmE{0 z>RQhR2<3M81Ig07+0{5p^e0$%>(c8|285K6tdtNE+i8uUp8Ss}* zQ)QR&tHn;?3W)21S8)z=v}kDMn`>up8|iHazL}@R1xGvj8eSvHeNPL7(h?R%|%iMchkuE>U=@<{6(oI7;QF@3jgImCgDV{;PAC3wPufo*aT=N6z?zFgI-&Iy44d>5+1J?ODfI$t%fFwX_I5NhF_-bKvW7`L2f7t}hrX>) zF|Vg^SO^gBaU|nCjw*=2C6CSZ^uLE7{fW8wa7rNpSLO9cg^>1cfB1o%;%d%+t6fs# zDC4@22^$6WzmR{cUs7YJlOY&YqZ;uJ- zA?dcWy*}Fhiw{K^C~DE}*ra@Po5goAl5sJ#Lt(Qz!*(fpH%!y%?FSlDP41e%jPJfi zdp_?XW_)-bLTx1IwyfJ;)A~hi+)TTgLqiHg_Y@Gjn)87x#e^$!$;9^U5og`z+kk{% zr|DGxE8jBfU>bFfG}U=;o;%SY0^}i1AgRtrlFS}3O~$-%`VLd(1QiS#qov?Z(vT2Q zkj%VMQhv;^WBFmt)gnl1wN>3Hc5wx|`K&)y>CHc(iLqNuSmzuty#vS}A({2h-`5|) zCq~l7Hf8YYN3HXhBMFwM??TqqvG&4sC>njibMy1k{PH7fooyTKPHsE-(gpf92TfZc zmiQ^Kbg4{|4wol~kM&ZfUCN&Kg~}++i|`j&%F$lXT{XSh(IezWTRra=W+2I4%3ScZ za!-DPwAxGcq5h|Gh}0nExR+slrt79t3&u@Q^Iuu3z(&qDo}dy`L^krfTe`^ofnuJN zy@uMR4+&(VeSd7^5D!+1ex-KL{n*|U*eUeAmi}?Hf6%e#ZK_p}Q(rE&sQ`adey6l;*Z zjd>44aWTAB7vcW(23Bf8?)A`Mcde7Rnxbx)1u?90OWmGM{jPO1m9<6n$XY~PwZn=@ zP}!?3ZKM~}hT1}V&V{ATu-HudOLpUHi2L}yAH>%1(CZEK6=<{9LM7*oiI(evZ1njU z%o{ix5Ai!Kz>UQHqLsT!+*aIA&m0{Eex37HV6Fe_+QL=6Qw9i!2@CtFJr1;efH{N9 zq&O>86fBs&)RDJ0fmF}w@Af}7m0yZXpTLbNO>iW=?v*vNnm0`8hwnFKn*4F9@@Ftf zIC?qhv#3ll)R>pd83lfKEvVI(7|sF)P+l8zugaEzZai^EFKVvovjrPJEkx6r6HL^3 zWCTu4*Z_Y5RrKnz+588J9`0sX?Drlww$6?$@a@I-*e+S9q4w3g+(t>H+0JGy9HY3j z8+JiIBt^|EG(+o@Jz9c~Mq9PnY$y$CbOm*33?=N~A32*QYI{M*8npb7YENrVS-%a@ z*_>EhNd>4^e?T!x!aiG9N7&%$qHX;CYsDFgdAgk?0#`Tp`z-Q==5gvR=`=?kUS1oV z#heuVvavcJ+T&nHu0b9ZN~IRCgHu24>ID%F^+Qz)t1pi#Kk+-{=H%o;`2e|4Q@{kO zbyzZsy)I=-oq6z0agCtb+6;QfYzZ_s*PW{Gkg^1f`TN4Oa*2wm|7uDk;ue7VCKV0i zL}kvII(c#y$Ik-hW7S7Gt_*Ps?bAhQp`Q9^r-~A%cmc3ecjrxelarLYCu>J z`~ATalb0Ft&MFrI>62f}L?cWHkTb#e_!u6jmH3(18Q*l?~*-k%jfm*kKVCL9F+VUuU+jggH zT;R~Z2UL6%u@|YhYY8&($N~^Y#emM_E#PF%{Tk!IAeQ}~D>^a1DzH_sGi5MHQfx~t zx)=!w4+0Hf+>uq?2`+f!D;r67xsb`SW0k8&-oE|=gRd;`^3We*FNCIP&-h}7aj*O3 zJ;z(X+2QgP-G|oSgXyR6=%`G0ybTEV{nzstpk#3`Dqhs@hL63)`(bW%aamhJLchO-PMUifmM}l~1$*uxwxWVmh zFB2bCZKuSM=;I9Oq+Y`hJULyyxKczHSp9>U$Aw=~P5a*hFr^bS+GBgP*J-rLaJ<$J zj$t_R_rhXKGVIDDV*>-f!r<2a!arRTx^MJa`MeA0e5EI&YoZv}IO)1EncQa6 z_uq*2Qg~yX8ze@YDVoq2xIO21^{L!G0^<>N}rbwvL{2M;}M(3I6&8SIzi!LT=+Yu#?s6sCT-lqHBlwTVc@9 zNIB#3`2{S0_67YF1N4YfeGcKlI(zXOyStf+w}O$I1w~G5?2$d`U;dP5+GG(re?{7@ zxSd~->$YeZGRxUQV`2hT{8f;je_hti-2$M@f^JWQQ#pm@y{Z|@fe-zGUA~sYQ9TOO z2)A00WXm;+P`50pi|tilh_}Gs0J?qCg%fSG&XHzwmVm$YlME4FrZV2Qjrk)A??meu zsn3e5HS&e{#Q%=SGOqvmM)Py9e!Ts82pwcV3Wd1wSHY)EDE1&OFBo*Hj(j@SWks2N z^*$0$cy|q4Ag%W&3)8L%U}CsR{fi<3>!t zec#;pbsNPmfGrq*;rME}SCVBWXtVuGpL@5?2X*jMFiyJmH0vom9mhq5X=FaS@v*ug za4LY810}CXBONHlu_UX_wrQt2uw0OOMfUTJA2-_g?AfB5TPwI1e;Ipf@~!e#Xg5mj{1t{^3=TKL-p)wqtx? z{^3hX9@aiY1hg>?o_-ImUPZN&&8ga~kmaV>yWbZzO8}ETzgDo)1rgXa;f7QA3PJXQ zPCPMWEQIC9{nppn*I0?VAFF*) za)KjXa;C23C#IiWH1=u5-{9UhI#b=9A44tO0=hl5cYN%N`y5aYx;TZwYZ(YDR9L6J ze_zj4jd8%#P0OC`yTJa3mkI00P~Hq1=m}Z$x8CW3A?1X}mLAQN&-!lx^3Ht1j>ilj zz7uBDjK3S0Y}Z(9X(7hP{&`Im*)grWd40%PjE$>AcP<}$x_z&250e)jv(M2VqNU*m z7~|DUF{R4piHch1I4Uc13$i;f;-*1u|GuPIqT(@$@tYoRuM&ZDvCk2`#{+tYE=TNY zuDP17i?rF=@fMT!tXB3%f7|YjC*q9;VrQ%Y0tRo9r-MayJ7P7)o}>vb0rChjRkSvA zsYOrvP~IB;6z~__aSp`K*EcAB)eDvfDAZc}6k+LNmqZvBEW}OUq-fk7wvkQcR&05; zO_BrWt!z}i$*MW??}kb=c9>uFg5c9FBBfM!#)>nA#p}}hMl>nEHk1h~%_Gv0r|9|> zwk)%sXrjpDug(dHEwwU*um=<3%U^LU<3WT)JHAVxYq^~_xf-yVW8m=o;2~kLoc&w_ z71@HiNN5PR4pG)yxpS9?87V_qw*b?Vs5mNTW6AMd-z&+StH8r#Vd7>NP*!8Fs6|m% zMo}mD%X4&OH4tJ6p=zssjV{0Ix;a-`)6)|8>13<7qo?mV30+BbT(eHcX<<5x>-R7nQ89*&g^h*- zO}9O^!g$e*HTFQ{p4)R97FWi%kI5=LwOEo9=DpI$hZ;RaH)2;KraplT5Ri9&wtAWp zHHLd?5OUe)dtGOS6aoY{mtuG-mVU83TMFdux#%kN-U4D!a8d*V>SWd>)8PKYm=b z*)8ddFbWmUX5J@kH%H`P0(++C7(OXhG3ZoJay3p`t{#IL{5ZQpYwqj^+<-n$B#M@t zmuX9)oM$}rO|v``wGV|5DVvPaN4e~ zDHtlJ$Q$-{TtblsldUaO1gq}xa&5am|Nhw{7XV2y>x!>=BNbkgi;&p%0 z1%Ld%X)!9`_E4I=13?6k�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 literal 0 HcmV?d00001 diff --git a/index.rst b/index.rst index fef5cd9d0..29735af56 100644 --- a/index.rst +++ b/index.rst @@ -409,6 +409,8 @@ Motion MPU6050, components/sensor/mpu6050, mpu6050.jpg, Accelerometer & Gyroscope MPU6886, components/sensor/mpu6886, mpu6886.jpg, Accelerometer & Gyroscope RuuviTag, components/sensor/ruuvitag, ruuvitag.jpg, Temperature & Humidity & Accelerometer + HLK-LD2410, components/sensor/ld2410, ld2410.jpg, Motion & Presence + HLK-LD2420, components/sensor/ld2420, ld2420.jpg, Motion & Presence Thermocouple @@ -502,7 +504,6 @@ Miscellaneous Analog Threshold, components/binary_sensor/analog_threshold, analog_threshold.svg, dark-invert ESP32 BLE Presence, components/binary_sensor/ble_presence, bluetooth.svg, dark-invert Hydreon Rain Sensor Binary Sensor, components/binary_sensor/hydreon_rgxx, hydreon_rg9.jpg - LD2410, components/sensor/ld2410, ld2410.jpg Modbus Binary Sensor, components/binary_sensor/modbus_controller, modbus.png PipSolar - compatible PV Inverter, components/pipsolar, pipsolar.jpg Qwiic PIR Motion, components/binary_sensor/qwiic_pir, qwiic_pir.jpg