From f1b31e85b7ac51699a262fe864ec852e2985b82e Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Mon, 22 Apr 2024 23:47:09 -0500 Subject: [PATCH] Add documentation for valve component (#3763) Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> --- components/index.rst | 1 + components/valve/images/valve-ui.png | Bin 0 -> 15963 bytes components/valve/index.rst | 262 +++++++++++++++++++++++++++ components/valve/template.rst | 118 ++++++++++++ index.rst | 8 + 5 files changed, 389 insertions(+) create mode 100644 components/valve/images/valve-ui.png create mode 100644 components/valve/index.rst create mode 100644 components/valve/template.rst diff --git a/components/index.rst b/components/index.rst index b9aba9769..a3e62fc17 100644 --- a/components/index.rst +++ b/components/index.rst @@ -29,4 +29,5 @@ Components time/index alarm_control_panel/index text/index + valve/index * diff --git a/components/valve/images/valve-ui.png b/components/valve/images/valve-ui.png new file mode 100644 index 0000000000000000000000000000000000000000..33c91f984527c25d11531c2f2d4514c853ab5b26 GIT binary patch literal 15963 zcmd73WmH_jwk`?;0wKZOEx5Zk1eXB8A-F@3#BfZ$FNG)REp5P}7FckhM< z-pbzl?z8W?=lyzPy!T)@2rD37&rzr<4*~@g#v^grFZ4KGDz2IH@d&^yC%^Nnd)))kA)ytc=GO zJ$$}1-A5RS-nn*O_3Ojjqgl+;`21lsq^J)fsp-R`?_o$tzJmHM$DRbUY>k%eL=}_j z6)=V)%d{IrPi{58jn>}sjUQp+3P*FJKvH3&j1!?knjTIl-SL?G6#h=CH%=x`8Y7sT z%JL*9r(7aZoAz6{5Pjt5+mBN;p1&VUGR3L}*NSnh;KtVSgJucrL)#+=smZfWRrPPy z0}+f>Y-H=JqvG#*pH6*50uecztxe zuMD+uf_tEZS_%mfb36g}z-Fl2;6}H8Fi#iCLooKsx{?p&v;-Jpw^_HVx$VrjuEC_m zPe670JhBYmeoF8pN~jrh z92>B1ak~G!l3=WBDPsF~^YlCM{6PkScc{7Ix5Wbs3tOLw}zP|`Kh zO}8L&s0kX0mzbGagEWQ*K(EJd>Fy-{gg-b%asIrvva3)2<9CQLgSz|2t%}UCKThTB zbl;!e$V7J8()!H$6;-zs0!z}+fysmFfHHupbKveA#$UW*-<8Fd#Y$Xkw>gpNs<=8i zCsWhI(wbb9%#ZZ@Uj6~@Pr$h#jGKFXviL&^=~N6PBH{}ZCvm3?{_b*mC3TtGXxmjS zOBU=A(Twlbk<;^;1O=f|)-9}tLyF9AjcgwC`W!_XBNEk(_Sx(33A-*YuBVgT zPIX9xAzF1PRmiF441Z9(gO|){>`@fElwF@1qo#Lzxsuf6xtyY0hWM=Vf1rIC8vP4b zvX``8`Vf~n^t~?wvJxqN$V)m_B{6!rmjh1LbXw6Vbg2Wj#l&+llrrk{JBjL>Lg%=9 z@}>;=Z(iuW`uaw83ZE*L?+p`q^v_SpzdSw3-v$$Z8vcd(<>^wGP$Ba~%&ym$=Yj9B z&5^W!dh!sAP+OUEaNw){{LRBFM8e)ZR8L+-?f8Bi&NdTvWkKUcuimrQENR@`?JF_X zSGwkL_Su)Q;|aKT;j|Ja+fMVSP=Nme!y6R`C7UNNK|MpAg(-#L8y+^kdXG z-4+yASyycq6PBe^z0_gTVbh;4_k6t<{hR;uxV2XU+FS^w@^+$KQhIVzlF>l=z|!V8 zAyza|UktwDU@=F5&YOMKQq~(5a7t>bTIy12Q7YQdMJjvB4NJZ@v<#ssuid8?_L)yp zzOdo7P2143)CD$hnN9`cbb8k7(IT#*87&P>nm1Bqzjdf|<|-tn{VH@TVk`7@%qkM6 zIi@n+B~N2c4NYHHnrIzpGglf_G){@`drVhO;gqlF(EKWJ_&5G*R}H+&w6)cB{|yq^EL}>BHSX`rg3?@f%DygWwwQp zO~4@bSC6j*f2x}fDCJ4FKq?{?wo_^WL;)p%9f7&`vglM1JP|SxOcCitql(P&rlPlp zyWlvkxVbnZs*|`0N&>zT*Vn@tv+Cc}jZ4`|9j(f(p7f7VEJ$3ZHsl4Pki z57VdXrPtQD)L72?&zcH*G!ZtvYs!AXsX%DOx{)K^y)+(}cZYWqPhCUpM|~&paQ@|H zA zk`9f7T6Ts&PYkK6M5_oMGJ+C>+bm_I!0{?yGL z0&c*XGxp|elj`NPR#!4AQ?Yllx7jV?S>SOqP!%Dk#_wQ5n1;%S@)WY-%QZ0Q%P+?_ zL}w9uiDZ#d5t$I(3)sFMIm~FR|MG{mUfgP>58lTa-$ntZ;*J8Vy;04`c$0k!nvkmJ zsCPu{o_YKxL`=tKaa!+vG-On%qL6 zFn*gLOgcth8@nMA^_QjL{0T$q)#^t(4b6@%+`b*{)9t1mB%L20IY!y5IjWhL*aLO_ z!QmPTehT@)jAexFLodb_GvFY0KF5F=b8ky;**GnAl`*!`!fC|x5aw9 z@k7^#72CDO=Ek>n*(0VrcWac}IintlE#)3YJDH>GS+kN-_78DrDQJezq1>Jv9PE%b z9ybfsM2iVTVSgv;y_SB}TMn*{mI056pM5aP?)5lEtMn?P^XgE2_fJ#xU)nE+wT^#3 z?~H?gU7zi?aTpd$YvWp}`_L@Yy#7-qKUI84UpR68z zl}+Ku;W*TU+q4PxYZbIOm|G$3oOYR9(Q7?A@Ls#Fq2d*vf4B6`(TDud*fe5BdEehh zZPClG>G62m|L%4aOAPCCKo|93-cEq__3|H*)>U)Qm%%H3IHJ(dKK~&Gv>D0IT>^(stK_K&_2FNA%xBtx) zOnY{|a6wExA`j%lbUISrIMUcZ?w2d>zPy3>^!(#J(pXb?+VHz8CtRI%xc zT!Loaor}LkYcBo}<+C%_-kM2z#0DO%Uqv3|3a^6~TSd=oXE~Rv^A_fs%$5c_FW|?B zfY1QOo9UBuDIVW97ZIa0SSB?liZr)UPCf0e+u4}{vSY5IxT(f!6@{)Ja7>GJB~Pr50rPG0^6J0*)vlzW9yiQIKzo=kCx5HRtq8-wg;eSJO&eA1dvR@ z=)qa2NLYE}ECic7QiiWK?exe{9-j@5M>ecuN=qVw;*UdugoTm+G!jvF7Ie(ZAr+P( z^|n0mJp8jJ=BbyQ%ll_(PEPrrj9L`a=tvmag5Y#~rtW2E7 z6lpdF%C>51NNhkF0|^ZoAL$8@LI!@3kjatI{*gvPQbDHpcUlXXG~Y2+V38PY3lS!HG5scq$MW8>ms z5B3~&C^QB#p1CR+dLSVYGyeS`D{H+xMM6TEbJG*EjjW(9WUvakkQ+Hm`AX9NqlOre{+rEBPy3H5o{p0A25N6;Wx?(?v_f1wTs-t3 zOj=r633qE-F)cZTe~AO%BU>J+L5#IuyS{B^>hHc(Ee@L!V>J|DM?TNx1)dm{BxW(z7GG@lZ(f{ zrUgup`)>(1FBcE@|0L$=VEca~_P6ApV*i-eKf9Co+nCrJ2VWZ}133q0V5xzjf%rvu zB>vIO|55T^1O2C@u7{1gEZ7+k^aTCayZV>#e-{3C!GCmV_+MR$^89aI{zu7wNdBFI zn3jzP*vaef66(4*c!KyOxc{f@|1M?tUt%C$0fB!B{b%lfmoWGrCH^z_ze{MiI{@oo z@pot--hcJ*pLzePFTwry)&GYo{8P{Vkqamq2vdUl-%1O@jMT>6LPFw_P?me8CxS^bFlx7U%D zGHAUVRSjijEc6BVi%aZ_xwS#xZzRQijtA{*$2`X;bvoHHN<)nMTpXYV$@ysag8Byq=?9(+eF|c)Mc0AlOqjGPex4k6j zZ=<>@NL5Fh_$m4Mmky3*s*RSSiP(SemO*BXJ=7Ay+I1`ST2k5dv7-y`L{W)}i5I`l znl5w)L{NDTEIA*q9FI7-K%XeneNCiZrQ=4&>~f3e2?22xeQ4iP1H0ouR-Y_o2|6yu zLobVP^AFtb@pwLVT;!fKXD@Ct9Yb&0@&jhumIZMy9<&bHC}R5}dTslJo#!{9XEA2Y zX15zZq#oz)?@xkof=|9osvloBb$)MKI&#@@2|O?oA9EvaqNsX&xap)C>e2MuRFE}? zLYMC^@*iLHFP%VdCg?SIJqdfq32rD>VBrBL0V@X`x6`%PVOZ=BN$KsqRQ|i4s17vx zSjDJEXTKkNQ4tj^+*|tQa?5w+wHtpfCyjB0sK;JD-mN??qJvJ6Z>sDhhmRV^K~#`< ziF2i<1(!Baj&ZYxbCR14n#Vs&y9&bYoex*FRK&Xk`LNJ{5i9D+4LLfVRi&C2}uLj0YneY!>{k>skNRsL9m{sj=ST7x_MmKer2t9=iSoDV%y5S%T4Au zRbQIy=*gu9163K$-{r?-U)JwWe{c1$m_W}A(c_VtcgHTDeDUv_@G74OL*`GDh2{4GOx%*rSBD=Zkh>&vvm{Nft6kL$rq zHQ;ARH1Yd>h%w!a6F(MddVIKR)7Fp_6o@UuU=pYC`4z-~9NKH* zJ!f-F^9YM*+pnlZf&0z#RQ1=fxMbMsf@sqH{erFnQ#g&jg}U?8drf99PaQQ3bG(-aABS$f@I#ojc{~5=scAbVcklYj zl8at2ajaYGPsGGa*>OaDzTbVEZ3n*Uxz9&zGUqlAoTddSLw#dx?5P0Nr8aQ`OaqpX_y0gD3%l8Ow0Iw!V7l!hoJ=O17i{gRq9g^ ziM9;I>m8{_KX1fYzg-6kN1_*C2;u=NcgyL{%k84#M_(qzZhq+sXEL=ZgJx>o#=7oi zJ0DV)_SAj$S0nt*j{l0`idX+gLeMy)Zr93kbR?keFbJqgIGo9Ul|#4 zfnH?$a1`r)30ou>I)|n;wWo{b z+Dg%u@qK}IW_tR81l93lI~WcD-OY_-&)x^buF4)lAP+{2S8Bt!+p8fsV`Us2&(Z^T zWod>Gw6Y=t*=y2oA8afzP88?G;Lm|a(me+4f~1N68d>ESSl+8E)>vg*C2AH&E8-YFDaA| z?JA#ChzdX(*pFpr>gS5iuM^|Rv>cKU;ROtB|*(=zU*HVYytC>R9`=YaTBN_&IL$mM zLwjFRd{zvO7mS33hVmp#`Cx`5tsu6AeNb_wf?Rv@wDgn__F5PkBE!PY-b0>U$mpn< zJNZFS4B0Rqzgezp?dVau#~S)jK||O$WSc*Pl5IkK`7F*gKR=Fxdv@&JUVmGBgbq^gRHp2`*U>b&S{Z2n)aLS}n!f>;shgwDOf5*=S)31hU zlA3DGjVLQnRCwpTpo@CW)!gN$x(D$XKKil|x5mjM+&qq<{BUZF!Jq{88#ekuVf`Zz zfR-08^>|}!zJ@g-c5Ty zTxHV*vO(b!?l1XDoW48e8Dv0mzpQ96Ro|3M!H;y0p7N$eF|z~M{UZ`7mIGjMUoS?h zYHS#(8Pp%5R@<*miiw8v6$m>0{crS=b!*J-_x0(1fuR=^H&X=a7@=z@a;#zu4E#iH zFN)63V}0;M*vF{@4)G%2r4IY3$l4TGW*h(B0a?(^PAJkGQJ+OBdNM8heS4bOd4B{B zIms8WC`&&TNe+|1&Q{#GqjgEo^})74Bs1xJa9s~7!-c+NPRMm^YB_Q~n&DeH<;_Qe zKMvCi9LiYrpT&rfl}FE3iYZ1F?=6hyzJwTwv!ov^r8v!Iuy1B#zE=V^cqZ1!gg@m3q_(LsrZmX>rY@q%#KsDdsCS@B0_`t0+_3%JLL$e9bF*RT8d8#Xhq!sR zY7@NUy8xut1)L}6Q@Tu~taV9l(&4z>wC_mfo>Yaik|>No3^5cRGLmAAI-%di&w2@Z zjE-GDjpJ}XxtVvYJypoIO&68oqIpPKd4ePH%VbAv_Sw$8>w(YsrqBdf;EYZbJKq7l zgMSNQ09O)GFC>jr$ZBkCq*H6`>ajMjZrZmkKYBv8o=8(E(yn_g8$O1^8E#l?`@Ivu zcoA$$4eUG&oPa+)IYG)ZQNxm(M*PtwBVi<_16%Lowm*t4A7(W|lKOQ!R(PLzGc}e& z8KS_!lcwM2MqP*rS0gZGnK4yuddX1t1v_MYqVn~meX%)&Y8NA7H9#2PP||BzA`E!` zBcgP&<{NYR7D>w{a{o)QY^9z4y(Pb$+#PkP`%9j-l)C|oa8~qOwGwlqhr|%gu2P&I zByXU9W-VIKb+y*tP@f9g!Ha`V&7>w%?~EHSIgBx(8&Ts{nRrhrFOD1nu-$QS`oNdD z!U|TtPO>aw9`MlP=uynkg zcN)sv{MXAm&R#*-W;iKI1)pFJ+_9UUMXTQq6d1~b9IknqBA^3hW2X%ezLm%htc%2q zpsDf1N7AM9Pf_71DAM&pfZJ){8)|mqKkH$3`#b#u5xMnf6-ELMI_oijXyI$1u~<*U z$(B;Sr~SK(o(gi!qqob#_&lN?2fYNO%6xIj?e@-5yR)|QX?w$hVFqqu8Bmqr3+^JB zev&7v{k!6+@pT5ap!#BnNC(;WZ9&MX_vUbqD~nkbUVh1E!J;Z-y2KyxspYOMXQi=B zpxvbf0-AopjlbUQF|dC*hzQ$6BroEq@I6-&&-AX(-(RKn?Zx{vm-Kx8rj|8ZlbDhy z_{=ZMSY$xcQvpRvo_2Aab%VJk>;$Q~D{!6n_@S2>G$FbB3deor{@6#>V7O_p&WBXz zPn$2hx>*SGvmzc5)qFZ_%8h&Ix&dt!*;54Ky%RRuN2&*zQkmn;I}OjW>e_Ar*PJcZ z9F7N4(9DaGm6)|4t0?f0co+LjC*F%5Cl)w-JP1lUDD5VKVU9k;!}y9N(siM)e)odV|7_Kd_IVQ?#uObx(b1a}+8I|lB>CeKktu3`%@0kfbr>eFC!)O;QVmn?k9>kT`h zr+$mF)TwjU@Gd%Pjj%`G-$s7baBKKRlnh#-;SUmf=-8XcS@xjK#829fGeV(76AB$N z)CkEA-JcWs1=?y6nIdW27lZNna-<3+zJpyi2aMjI72`CjJnJEh=)sYa7}hYXL(EN?OQDi)@={Ef z_-qcV-G*NEq|hxcEMI>cb58CPK-G8%rqQOzNHX{E7khtC<7uhQ=%nKHTAR4+bF6m> z?&DKI7Dsd`pFFaJg!e6%BQ_Q@v>jj>Yv>>D#l~kw8vehN#V$6~(uhdueGhWrZs)kA zvk=IS1t;Zf9%5U&+qo1W@#MRQ$)6+fNvMX75VWsznQ%|%-;|A_tRaIJ8}Q7Nk?_pS zk?TusbiNhJw_3#86RYRvKhPd~zBq2qQPMr8310*jCP>-Z(`WmMg?0z827%qE69*fk z_p+1MI=~eKEGx}vo@G$D&wMLhWIeKg@R0=vgn8)2 zlReQCBg^$#0i?=u>o*=?%KXp-0FCPcMwc>(I;}(hE&MbZGt^bW6dae zk@k@++13Qh7Xm^#qsg?pUVD1RSu@B-)6jnXwRZH_BmWMS@nW-UD{9;i1Tr)KWWHUo zGx?cyy?>s6<;0kQX|L7K|;L!_u$NCfN2j)58oLv7- z@9;Ey$aobsu{z9}ZJRS5F*tMwrG8^S_RDD`J(Y<>gQLXwF0tnHJCdKx_C9T{} z-dc|p_J}+jy{UuCa=H7auVp(}gjaysyfzEat=GDKntm|s$l6zwhe*rei7=Rp?49!~ z)teN)@G4iTvwS(wtu$DGFl>Kyjv@S-G+FUh=>2HT*1g3UgLmM>#_IS_eJoBnvN%L-Ke ze5&HB4MZ8TE6BDgwScNBYpJItK+r;1mw!nAGf*}42m6|uJP@F$uuZ8|0jjcx>Ho-% zmS!MHdBXa2RB?7|Xe$hpXaq@)FU~#z--h8F;24*(EZk z30lirF-U<9_7^16;Ee%ROr`dW32m{8nVMPL3{x-dYsKEYIZWY?Th6N^lxe#sVo$HY$2U|Lx z6QsW&`yAE;BPLm?2@AdC$48-mP;%wO8o|V>8jcFMKQN<7JLQ)lo=p*unMA!s>`2jE z|2%JFeHx=q*-5DUr+bMQD$mrGUZ+7+DT@2_2E8+-*-V1n$-u%PjN+E;88Tkb%jUGF z;fov%xBL2?Vot|h@5a7U_S%}LcA^;mL5ZZ&G(gT2JZkB0V1jm6)V;0ed~q;)`pgmB zFjmrX^RV*R!VoXvZpc4)JWPWPv?h|%8vY~tal&ZTDo*sLolWCBl&hge7UhzW`0VTkB)+J2|9ZqN@lYy54f zJ(Pz^R{#xHknW`+uh>GS13g#eExhBWgxZGhLzy6}4bjt^-|?27X*ZjOa0rLa$PGHtoG1eIO&4470lVxvyadbvWK zB>J%#okBtz1@HD2ht_>oDfi+zfERRyGh+JXkmbiMEP=#MjS6Gj^vld%*cXJI+TApC zhvdhET;W{r?G;pWwvHW>0)&w2?Bq<1c636w)_9uO(FwX;B09VK#J`${HxA(tarX6= zsrPQh%U9Si{rl)&qFiP_g5V&89kit>(CW2bN%?k z*tHwYf`;?kaW|FMlxEzRE0kG5PiY%8n)w7{&VPA@!JEp&suyRj=GnZyX<7 z!0V@Ke9!xFvoCn5#-~m1W9h{?V8+A!o&|CPaoQd>v^uG1ZzwwX>;s+?uLW3X&r-$i zPlbK??LY`DMA6izk*P3XFCqD@QmP5qUaVFGpEe0lVxq*Jt3U_r6e?6huT6jwFS=?^ za-ix8ix&&O7f>?$|Jz2=a48A)oQKWSJ(9PGphu&;{I&M#y)@D&X}8-323=+t!-0*v zm7EAM+S}fyyXuk=@*MAxk*Z6haF+#v`81Avk+V=V`>&fH-08>@S`q00l10zk+%jc7xj-InU}(otD%1)?zlt^pU<17LrZr&5ErTK`_QG_e4r`#<$EfDP z3&&^>ym)AYRb2kF{nNN1*5?`Z%G9R&&b@h z2}=Ff4U?Hu>Be@W;u%${?+qnm`&E&1y2a5*1kdV0fQT_Y7oP_TO}~- zXUnT1W{{pz4G6WW$jB^ux|opj%ul@XTcBVu=}V%;ZYf(pR@>h3rxLX*$ysTEXz=XF zFe_4L#>-Kv)A+elIfpZ3lhK?#y!@1I8p+=M!k3_eekW&3Mpe+tDox{AR1%EWC`-c6 z@{y*I8YoOt=*gI@7Fy+wF)PAG61VMg46QgXww#goBsO!t8-hz{q15j)sI2#6UMqc! zrseUE)FsixmqJnh!W2UfRjY_2+Ra)mm&`P{!prTeHEC4gQ3g=@<#dG%mJDFop$W&# zQGj(ey!ET^>CjH@FlSd)AM8_A$PtodGfaIwyOrVD__bj(#kk$NcW^zuSY_F=;TuA9 zCuhTZCGcj|WBG{FL&^~pos-l6O3W}&^s+u<*19_%_=fo&J}ldODo1*$QwQ7jNuCUK zOcvTJ(S2%&NJc~rnm<mtyNLaK=05};M7^^H3bYkMq`NraVb{5%wurv^Q^8xc4 zJf#p5+O+k(XulZq_#3i}j2IW4m4Ep3iG#5qoL}{QeJ8Hc=<{k-u9jXZpGCLhs>U&Q zAhH%IzE_+qM)bZuC|qP~|CKax=hGZIkXjZNg%Ij*8sHS+IGVl26{dqyQ#q&|Lhr5| z2@~bHY?1`VFSwg!q5AW1w$|(f8w4}=`AKHiY~r&d2+Q%vy(3?)dPNok)D|?y`sC1g zQr}N~+)JS0*-sr%C4Mo&9|DZ7g?oLr;00bMC_(v|7WgdSC$;bD`{N9&xMxut9%EjK z9j1W;>$8!VRG7{Yex;_*Pq$iWHNuUF#aogWWvQsG}2 zt3t(qu~D(?-}Pijjv;Qf^i;xwmlw(L8R52lqvJ6)F4$CaA=qLACO~j-&6#UQ$cLF` zW<5K7T>|h$uf1m3Y}L9uK=w?;|x=Kii{^krdvT^ zJ=815KFk`glS$CgQeRCPC-L=2YeFB5OgH9l3S>jX@}Cs{2tUrH?Qbbrk)c>&(j%>r zW9vnDNZcEY6L02q3u-WegGQdRsI1o-w=`7pdDfevTF%I(^!ESmo&Q#qo;CgX=|cl- zdTl|MFOA9eR~s=~L(E_MYy4d&6kOvC9qr;~LO))mxzH9KD#3>FI}6*cmdeh#YoYl7 z7A~&_5%ejMmHcb{A%RNMpp|S(;tVtJtBm(m1f|jCt$oz(~UN?cUwudqv&DO{*Hi>C0dz`5&32HM8;pzw51RZ9g;LeM9ro&Q^B#leQNF zvnp&E{l)e5n^iP9KY1|?e??(Svp!l@AxcxC`bc&mCXn06hxJ(jA}& z+#)=@+$I!&Y7xEDql*D-S6|Mzsx*SLY-1r>iNcg78+>OgO_SXedM)7irG3EL#tQZCLm~-L ziuU=olIWlocvulmn^a{1j!+e!>u>xIA#Tz1s6$hQ^*xoC?J#Lc4xBugPwZgazEjv` zwvad*<&R7Ct?ZsBOB2s%77NUz+7f?RU)GXoT z38Hg;l&5j!T2i9x<9A$RzR)aBM2BFcYg@gQ#gUeCwrn9D6KLWyo7h_?G6 zu9W(lQH;pne^s=*hVtt=PpG;SSAVhbV=Fv z5Pa@K_Z0LfQG{qc4Z6gwj7fq8Q#XE%O67n4#g*;Tc%A@2=B9Y4ydxKL2Pj zCe7cCeNAO{;+9^0J;ZiH{20-fX$b3NP&r1Vnh%~PnMb)nbFL?h_EvJG!@D5TzN1G z695x7FV;pIU~=hU#hY>f&7etbO_^)J1(=MCmV2R$bdi`~c}%+I{qn%Rjjmd>!E1%y zT2gSfkH@sG{#D?6o4LAEZ>~;qz!cxP9w{vWBVXidJ6ykB@-b_=Sq|{2A$jDnS^M#v z+cPx1lKMT-@(=52W^Gf!q@&>m@qRYO%y?~Wd=a3AF&qCHcmiHH*7pTLt!`xf}+qrLJ^ zAkd?FS!k*E5%Au4yYN?D0|T?&mv5;6)}hlfn6V=h*gQt3V%&9kQ6})rio}TcE#=PY z_hox&G$$}SfM`w-D|KovvS*dK{?nlp)c&gHh6vU~rc`SyL754>d>o<62?hQNH2^*1 zU}cnDf_8STn}A|ty-Ddkxp}tYx%aDP%Ie>^`TFy_zuGxE-}}4wh5x9lZW1MIcwHaG z8T`qBLRw$EQ&>TF85sabcsYfQHu~ptWwVhkedUn~n-FnW|6w6hN0#{HC+g-H*km`T zcu0%#-SJc<(y6+|vlM$y(7pn4!|fG5O}jk8pVusn+*xhLGjZDN|4YoYsr37QfSHOZ z|HjNYlYpbI%Ix*}aK-N(y}tuC5*t*rU@X`+4PL(lXN?)oZ!GvkCZcQ{^HVs#zeK_ zwtD^zV52v}Uo%s}oijTkrI@l7UL0vTikFn}7QMRVEn>@x3D7NIWpkz2>uqPPFfS}l z&M6kcqmN$vKcNx0^7P4;s38)t3pu%+{{dTLH{#1}zju)nG>6L(oT0N=PO(0J(i;nD zTOq{At_iMXeO~mclJz-SJ8c$IIgzyTDZs&XDiTd5lL)N+(&@hfyxWAP(9=R;{Xf7n zYWC!)uL!F)ezYl&zX14qLBALDPxvJI{~dhpBXgI^-MW`y#;rc9DQ~fk9KW>qxi5d~ z&Wf40irK*mlc37XhLK`Z-c*GurYyhw{`#@z_i6;%-U>I&69x5Rk=bpj65_rQVN4^N#pO` zJe03#SMJpuqC|we{)zO^LAK(?{*)zU@xXsk9D*}dEk-$;)U{!*wvpVx>$&b7$Q0(A zw49`9!8apiTNEsHB}nwpDCq?R(H*hxVu^~Oy9&o!4b6?T`qHi}mq-{9k_j={P?Gj5 zydo0Tb;Vj4B6CV$-**Ax^<)2080n<2h5XZ3Ba>rEV5IdM1M%{UUPKzaj$fX=vVWVU3*Gu$JIP zJ_Wd2l5UvI&gfCA*TG_5!10{nyZ91pRVVPDx=)i+7V6`NhfbyCR-+W&Bs)>{fNxOE zq}c#{of8RGN;#DE%&r8kPYm(_chasGz@0X^Mm4hjz-5(nJhK`xV3DHh!n(W-@DsA} za_(>EB!8Z}- zr%>Or%K@E44nJ&<%nH3sspk+?>vwz$Cpcr5?x>2eH*{xXvAm?0N9^jBp?nMh^bh-8 zG=U`GzFo5EApd+tE4HpN??8$EvTrX|y6P79EZ{)LCmf&{G$_SzcSJd`-iot`(-t2|ovQWi2bx?xZxv4uzT zJA}EpWIKr-G?aOzI)A38nHI!X@qtF9QGcj@8eyb&XRORKjstO&|JYBTQIm#Mxp*=Wik#1q9f?WwHKGAYUaCFdmKgUj9Pe z)6(#|4NHVk1EPI}KtTSO&y8(y%Lh+nPyO6aPjlTf1R%ctFT?|vbKhD_r&ajF$@KEB zB|_r^q4(#%uR4FTtv^8s5lmskAgz%FdSO**=?C4YKYG0mg1LKcS$lfRdE0j=YCkEvA4xnhQg2 zhOj)*>lDwVNky; zh5&8hrZ2qEqXjNb%Z##F;{h9UWaQZY8x0_W42LFXuKz%>f&Yg` set for your device and you want the valve + to use that name, you can set ``name: None``. + +- **device_class** (*Optional*, string): The device class for the sensor. See + https://www.home-assistant.io/components/valve/ for a list of available options. +- **icon** (*Optional*, icon): Manually set the icon to use for the valve in the frontend. + +Advanced options: + +- **internal** (*Optional*, boolean): Mark this component as internal. Internal components will not be exposed to the + frontend (like Home Assistant). Only specifying an ``id`` without a ``name`` will implicitly set this to true. +- **disabled_by_default** (*Optional*, boolean): If true, this entity should not be added to any client's frontend, + (usually Home Assistant) without the user manually enabling it (via the Home Assistant UI). Defaults to ``false``. +- **entity_category** (*Optional*, string): The category of the entity. See + https://developers.home-assistant.io/docs/core/entity/#generic-properties for a list of available options. Set to ``""`` to remove the default entity category. + +MQTT options: + +- **position_state_topic** (*Optional*, string): The topic to publish valve position changes to. +- **position_command_topic** (*Optional*, string): The topic to receive valve position commands on. +- All other options from :ref:`MQTT Component `. + + +.. _valve-open_action: + +``valve.open`` Action +--------------------- + +This :ref:`action ` opens the valve with the given ID when executed. + +.. code-block:: yaml + + on_...: + then: + - valve.open: valve_1 + +.. note:: + + This action can also be expressed in :ref:`lambdas `: + + .. code-block:: cpp + + auto call = id(valve_1).make_call(); + call.set_command_open(); + call.perform(); + +.. _valve-close_action: + +``valve.close`` Action +---------------------- + +This :ref:`action ` closes the valve with the given ID when executed. + +.. code-block:: yaml + + on_...: + then: + - valve.close: valve_1 + +.. note:: + + This action can also be expressed in :ref:`lambdas `: + + .. code-block:: cpp + + auto call = id(valve_1).make_call(); + call.set_command_close(); + call.perform(); + +.. _valve-stop_action: + +``valve.stop`` Action +--------------------- + +This :ref:`action ` stops the valve with the given ID when executed. + +.. code-block:: yaml + + on_...: + then: + - valve.stop: valve_1 + +.. note:: + + This action can also be expressed in :ref:`lambdas `: + + .. code-block:: cpp + + auto call = id(valve_1).make_call(); + call.set_command_stop(); + call.perform(); + +.. _valve-toggle_action: + +``valve.toggle`` Action +----------------------- + +This :ref:`action ` toggles the valve with the given ID when executed, cycling through the states +close/stop/open/stop... This allows the valve to be controlled by a single push button. + +.. code-block:: yaml + + on_...: + then: + - valve.toggle: valve_1 + +.. note:: + + This action can also be expressed in :ref:`lambdas `: + + .. code-block:: cpp + + auto call = id(valve_1).make_call(); + call.set_command_toggle(); + call.perform(); + +.. _valve-control_action: + +``valve.control`` Action +------------------------ + +This :ref:`action ` is a more generic version of the other valve actions and allows all valve attributes +to be set. + +.. code-block:: yaml + + on_...: + then: + - valve.control: + id: valve_1 + position: 50% + +Configuration variables: + +- **id** (**Required**, :ref:`config-id`): The valve to control. +- **stop** (*Optional*, boolean): Whether to stop the valve. +- **state** (*Optional*, string): The state to set the valve to - one of ``OPEN`` or ``CLOSE``. +- **position** (*Optional*, float): The valve position to set. + + - ``0.0`` = ``0%`` = ``CLOSED`` + - ``1.0`` = ``100%`` = ``OPEN`` + +.. note:: + + This action can also be expressed in :ref:`lambdas `: + + .. code-block:: cpp + + auto call = id(valve_1).make_call(); + // set attributes + call.set_position(0.5); + call.perform(); + +.. _valve-lambda_calls: + +Lambdas +------- + +From :ref:`lambdas `, you can access the current state of the valve (note that these fields are +read-only, if you want to act on the valve, use the ``make_call()`` method as shown above). + +- ``position``: Retrieve the current position of the valve, as a value between ``0.0`` (closed) and ``1.0`` (open). + + .. code-block:: cpp + + if (id(my_valve).position == VALVE_OPEN) { + // Valve is open + } else if (id(my_valve).position == VALVE_CLOSED) { + // Valve is closed + } else { + // Valve is in-between open and closed + } + +- ``current_operation``: The operation the valve is currently performing: + + .. code-block:: cpp + + if (id(my_valve).current_operation == ValveOperation::VALVE_OPERATION_IDLE) { + // Valve is idle + } else if (id(my_valve).current_operation == ValveOperation::VALVE_OPERATION_OPENING) { + // Valve is currently opening + } else if (id(my_valve).current_operation == ValveOperation::VALVE_OPERATION_CLOSING) { + // Valve is currently closing + } + +.. _valve-on_open_trigger: + +``valve.on_open`` Trigger +************************* + +This trigger is activated each time the valve reaches a fully open state. + +.. code-block:: yaml + + valve: + - platform: template # or any other platform + # ... + on_open: + - logger.log: "Valve is Open!" + +.. _valve-on_closed_trigger: + +``valve.on_closed`` Trigger +*************************** + +This trigger is activated each time the valve reaches a fully closed state. + +.. code-block:: yaml + + valve: + - platform: template # or any other platform + # ... + on_closed: + - logger.log: "Valve is Closed!" + +See Also +-------- + +- :apiref:`valve/valve.h` +- :ghedit:`Edit` + +.. toctree:: + :maxdepth: 1 + :glob: + + * diff --git a/components/valve/template.rst b/components/valve/template.rst new file mode 100644 index 000000000..f3d3ffb5c --- /dev/null +++ b/components/valve/template.rst @@ -0,0 +1,118 @@ +Template Valve +============== + +.. seo:: + :description: Instructions for setting up template valves in ESPHome. + :image: description.svg + +The ``template`` valve platform allows you to create simple valves out of just a few actions and a value lambda. Once +defined, it will automatically appear in Home Assistant as a valve and can be controlled through the frontend. + +.. figure:: images/valve-ui.png + :align: center + +.. code-block:: yaml + + # Example configuration entry + valve: + - platform: template + name: "Template Valve" + lambda: |- + if (id(top_end_stop).state) { + return VALVE_OPEN; + } else { + return VALVE_CLOSED; + } + open_action: + - switch.turn_on: open_valve_switch + close_action: + - switch.turn_on: close_valve_switch + stop_action: + - switch.turn_on: stop_valve_switch + optimistic: true + + +Possible return values for the optional lambda: + + - ``return VALVE_OPEN;`` if the valve should be reported as OPEN. + - ``return VALVE_CLOSED;`` if the valve should be reported as CLOSED. + - ``return {};`` if the last state should be repeated. + +Configuration variables: +------------------------ + +- **name** (**Required**, string): The name of the valve. +- **lambda** (*Optional*, :ref:`lambda `): + Lambda to be evaluated repeatedly to get the current state of the valve. +- **open_action** (*Optional*, :ref:`Action `): The action that should be performed when the remote + (like Home Assistant's frontend) requests the valve to be opened. +- **close_action** (*Optional*, :ref:`Action `): The action that should be performed when the remote + requests the valve to be closed. +- **stop_action** (*Optional*, :ref:`Action `): The action that should be performed when the remote + requests the valve to be stopped. +- **optimistic** (*Optional*, boolean): Whether to operate in optimistic mode - when in this mode, any command sent to + the template valve will immediately update the reported state and no lambda needs to be used. Defaults to ``false``. +- **assumed_state** (*Optional*, boolean): Whether the true state of the valve is not known. This will make the Home + Assistant frontend show buttons for both OPEN and CLOSE actions, instead of hiding one of them. Defaults to ``false``. +- **has_position** (*Optional*, boolean): Whether this valve will publish its position as a floating point number. + By default (``false``), the valve only publishes OPEN/CLOSED position. +- **position_action** (*Optional*, :ref:`Action `): The action that should be performed when the remote + (like Home Assistant's frontend) requests the valve be set to a specific position. The desired position is available + in the lambda in the ``pos`` variable. Requires ``has_position`` (above) to be set to ``true``. +- **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation. +- All other options from :ref:`Valve `. + +.. _valve-template-publish_action: + +``valve.template.publish`` Action +--------------------------------- + +You can also publish a state to a template valve from elsewhere in your YAML filewith the ``valve.template.publish`` action. + +.. code-block:: yaml + + # Example configuration entry + valve: + - platform: template + name: "Template Valve" + id: my_template_valve + + # in some trigger + on_...: + - valve.template.publish: + id: my_template_valve + state: OPEN + + # Templated + - valve.template.publish: + id: my_template_valve + state: !lambda 'return VALVE_OPEN;' + +Configuration options: + +- **id** (**Required**, :ref:`config-id`): The ID of the template valve. +- **state** (*Optional*, :ref:`templatable `): + The state to publish. One of ``OPEN``, ``CLOSED``. If using a lambda, use ``VALVE_OPEN`` or ``VALVE_CLOSED``. +- **position** (*Optional*, :ref:`templatable `, float): + The position to publish, from 0 (CLOSED) to 1.0 (OPEN) +- **current_operation** (*Optional*, :ref:`templatable `, string): + The current operation mode to publish. One of ``IDLE``, ``OPENING`` and ``CLOSING``. If using a lambda, use + ``VALVE_OPERATION_IDLE``, ``VALVE_OPERATION_OPENING``, and ``VALVE_OPERATION_CLOSING``. + +.. note:: + + This action can also be written in lambdas: + + .. code-block:: cpp + + id(my_template_valve).position = VALVE_OPEN; + id(my_template_valve).publish_state(); + +See Also +-------- + +- :doc:`/components/valve/index` +- :ref:`automation` +- :doc:`/cookbook/garage-door` +- :apiref:`template/valve/template_valve.h` +- :ghedit:`Edit` diff --git a/index.rst b/index.rst index 3c8d4b96d..c89beaad8 100644 --- a/index.rst +++ b/index.rst @@ -733,6 +733,14 @@ Cover Components Tuya Cover, components/cover/tuya, tuya.png HE60R Cover, components/cover/he60r, he60r.jpg +Valve Components +---------------- + +.. imgtable:: + + Valve Core, components/valve/index, folder-open.svg, dark-invert + Template Valve, components/valve/template, description.svg, dark-invert + Text Sensor Components ----------------------