From 0485feeabe931f6d3a8ba23ad3405150cd77038c Mon Sep 17 00:00:00 2001 From: Dmitry Borisenko <49808844+DmitryBorisenko33@users.noreply.github.com> Date: Fri, 21 Aug 2020 02:34:38 +0300 Subject: [PATCH] web interface constructor --- data/conf.csv | 2 +- data/css/build.css.gz | Bin 15178 -> 15958 bytes data/index.htm.gz | Bin 1444 -> 2008 bytes data/index.json.gz | Bin 0 -> 725 bytes data/items/button-in.txt | 2 +- data/items/button-out-i.txt | 2 +- data/items/button-out.txt | 2 +- data/items/pwm-out.txt | 2 +- data/js/build.chart.js.gz | Bin 12758 -> 12758 bytes data/js/function.js.gz | Bin 17521 -> 19968 bytes data/setn.device.json | 6 +- doc/1.txt | 566 ++++++++++++++++++++++++++++++++++++ doc/2.txt | 85 ++++++ doc/3.txt | 32 ++ doc/orders.xlsm | Bin 0 -> 21287 bytes include/Consts.h | 2 +- include/DeviceList.h | 3 +- include/Global.h | 3 + src/Cmd.cpp | 9 +- src/DeviceList.cpp | 47 ++- src/Global.cpp | 3 + src/Init.cpp | 1 + src/Web.cpp | 21 +- 23 files changed, 760 insertions(+), 28 deletions(-) create mode 100644 data/index.json.gz create mode 100644 doc/1.txt create mode 100644 doc/2.txt create mode 100644 doc/3.txt create mode 100644 doc/orders.xlsm diff --git a/data/conf.csv b/data/conf.csv index 40b35ae1..2d2f8d1d 100644 --- a/data/conf.csv +++ b/data/conf.csv @@ -1 +1 @@ -Удалить;Тип элемента;Id;Виджет;Имя вкладки;Имя виджета;Позиция виджета \ No newline at end of file +Тип элемента;Id;Виджет;Имя вкладки;Имя виджета;Позиция виджета \ No newline at end of file diff --git a/data/css/build.css.gz b/data/css/build.css.gz index 4bf6e06001ba59fb28f775adfad194fffa985f28..b62ceaf0eb9497581ba5f66f2c28377154594560 100644 GIT binary patch delta 15964 zcmX|{Q;;S~kcHc}ZQHhO+t#!(-GAG*ZQHhObJ{j%=k7-A>p78mzQ~HIm#j(m)!$Hr zQBY9g;h=^IPy~Qw`i+)~lv~nXQ{I=WWnDCB>1JwW3~Jd{+0QM)Y%&EE6~4LI)uby6 zs{F2nGY7U>2qT_f3-FXV{j{M9c72{%?wl{9;HbrjS7T0kPawA=xTC(*qz~CnXEcfI z`#*9CIJCw`y@ILKW2%g25A#1t6HwBrSOe!Iq*Us3Dv5y6aa<4nyS>`E$N1u~B<3_^ ze#I;1f;$ARVD+7^C+jI_KA-Ll=%XLJKyddl*xfEaB)eE2{7=p*pud?bjJgU~!KTa& zuuuUs-CkK1MI0{>x&eYuk-l@c&qp&Th3mMV4h^Qfiao!$usg%Cp+aD>Lq!n-xP5)_ zK-(J<>XiXfOT;3X_ctF4RP~0OyuxRE_6vq16>DA(zzI&NrSOBC#Kbi2ppK&@$YSZa zWP^lomJVFm!!o-P0%JN*Y*vWI>LiGbJ?B8uao0rXj9+JArhnm~<|O(Gv5>qi-xxOo z_HaoEB6sI^3bm;^&c=3$Ojx8-#K_p0RL7yLz)t~05Q*Jm(rBMMYb5Nb7{RIJhZg(8 zyU|X)*q-_yK4(DKb|m3+3qZMUfd?6>HndE1#1}|EFCgCcqYbxT@^oP{${Go@VPi{! ztRUE;nuF3{KxZcj#teTYHxmXEetPf_p2BvuXvs2Xpu@>*jIalssA(hq2;MsVK!6;M zfT#ir`>MFVuQzuR8$ai^wg7oxnCHMD8pAN6cEWgpFn5ltk2MrjEd}2vCLeLw7%3Rp z{@s%IT)!XM&t>1IFcjz&d@-j}WQwrmovxw6J>e{XPmpuLqD25$eUEnZ9&z-8?b|`0RDDxoefGb?wg9Bz3Wwn$TP7_ZKu?ZY$lL-nalN zb{!4*e-$h0TmHe<6`s$@-QG3^{PcAzIwLi%CyQbR{N!~k?wTXEniIB~Gq##jwlym> zX}te6)Bn#=9I;iLuvMI~Rh+6)uhQ6w)XNy^?#sNO9=O84ZtB8@>_ za<@Q*m+#`k#fC!L!DLB9w*d9O8c_7QfW$SS8Qc7m7H!97wSPK#%THDu z)Usmf(sfK@X#Y-LW!^m*A@&=5V0b&fid2+86&>)i5w<3p-sUTSz ztpUV(?v554I4++&gj%;6BX-MZ;%66gAT?Cr7FBlE)b(3-gj69GOLmKb^y11o)=WZz zrl?j`_UuXhU9N=GQIXoxKjY-)xDbKw*j-xkDAO3{k}@K~0$V74g&$v~=Zz>xt$Kn= zP|LjK9B$~&`vZO|XikP+=F<7{=ZI)xJphN*^Ssc?YP|%Z^1KV~eU9%)e8|m%zf#u8 zGnslq3U$E78mK~yaC(kV{PbXY8W4OhVUY!995psQD^x2ula0k%kP2KT$Dnavs^6C~ zt%JcOzl-D1j$OQ$SLj2cT(#YjLx#)*l)zd#wQDOT$8jx*%kyxpYAB!?oX<(g3jkOK zn`B7s7-bYrc4+!J|9HYDl$>;oX{vJ&{C=R4&w?Sl&K<*+ogoAuj2Bf#RX3TRwT zbLM@03D=Ku1;NC*UhYO>QCh!05+>wmR=wEySD2j^aUIHBksYx$R1T!6@*m(pvYXAHpAj33mx z7a}EdWJ>cN_cGQW(wC$D&&M9rSbfKAI@B18P*?$ek6r5ik$PjqDW}Mc3xDA4ZbNTH zQKe*FdK#iVSjHE8|1yX9Z7q)KeIWkF6@Amls-15yGRL`MC)-K@ZF_!wUY zRw$T*%5X78YCw&^pqC(Q`pti1><0;70%pd-MIJ~SjOD0P#-j+|>%jquC`=O`%Q*4B zfGwH&|40%Uv9cnO0*32IZwd39KFS1P?GD$Yy0xT0WpLk!n2{U#aRN31`Ca|jgvDC3 zC%8b=g<#uu)6w1`t-$AH+X0Oslo7XJ6VIJ5WZ}?@6tOBdp|fN(A43J4qut}@5i3fs z;Kjj0d)lVpMVdy(F0B9og*}&C|HzTbt^5(z7PBi7YoA7PX6*~L0B)6aCzdnMBSnA% z#reo{=uGf%(XP0v$?pCwt``epcRw;9_*V|Bcipi41vneFPVh^ zJFrR`TV=gD=rN8=0If~1oq)BDw2!b#0lkuYN`o$tXrh{C9{^B~Jq@75cRlb}Oz>m+ zZpIv$g&aL1^DXA5c@fqJ)!Hj`bszW${FGg7^X){SG#z8D4WMOa7(FN(EE8q)yw6YK zob8Tyt%(0(XddguM@x6eIw*p9+n*IqUvX|)rBbIoMjAQQsc9v5i_h!YVc^IIIXzG* zn{b}$RM2CPHwHveSi4*}38vY|mzf@MRV-|Q4*#nqcDIRm;lMfaTL!zn%*E`vP zNOH)dl99ok1GCKjyGVoib}lfaeyR%btC_FEl#4eDWJ4v(Bw7KRu;{C8<2;n8OeM$ij?m#s z*YppBV*_l0j4Z^#e3viA;e3}TA+idyqVll{v!Tkd3bUi?`P)#4XG&*SsFY_U+fa;T zT6b9J)MupHm5OIsZ&>KGPr%WX*%405hE0~P*vuphCy>Zh!zn4n-WRkBN^m8*%4^S7 z?5}T97n@arrE28yIwN7Fo5@9fg(5!+MWvzMhZyZtwTm<7@0-s<>HLG)#sG%mO%>#n~3H}>+i{xA83AUV>6+kF#>p%No zyI+M#f94IZBLYksO$Hn?F_heai>ddjpELlA0XSzt#g^~avTdvw9xh}p_!?X$040ks z0OGkDk83UU6?}=bvVreRIA152*-%da`Eb8pX8;KWdNlGBTa}fP+ z(MK$>6iH-C5{W-5Hx$$`4kZH>6&4~R$OeNdFEC*e6(YB)3?|$E4&-mLIF9dXHPI&1 z3XiriPcRb3f(>jnCE^8n4w`61)O3>a0boaodRMzA_h-mSzqm0`52=@!Cp_V}j=}_M zR8@;vv9m#yG@4U0%aBK##12uPszinR*3ME{`?9pMOxRSSL$&%swG2du9ZJ_{n!8KG*U;{Ds10Q4TF6b>#I6!k3WppA80aRL z=pq8`3`&y!CfeyF+NY2m(MYeVCr($X`K5Wl8`&22WUTX_ZSpM1VcBBFq&5hRmSgc6 z!}%{z6cK4`iaAt(r6bQ}OP_F@0jLPv$jFo6Hw($*^(fYvXY9!pXyt7ao7rHZiPwlS zT1o?Tax7T3SEO{*NAyz6G}OA)r7SWI=#l*+IcXqMTj=`a^$Cv#usp~0U8rZ{{I}| zD49_2c^YgD^#ZfZur-=__X^#z9xO=rl`wj!SRVSLzJ{1$2AF18aN4l>8R{@klG5c-5Ng0i1urs$Mfc z6;{o)FtCk1B8*Nme>nj1pH)d?$CyyQXaJWwyQ=4(62s_&CM9Vy?H`Ga&kRan0XGDv zke&d+>S-haVwX4jGAoBjivzEK9s_Y;9Rrb)&yMpigzaC*LO;$wVO5U}=U>Qz5U@=Q z1dI+FPB~=Fg1=m)?Ep3KSB)AT%ur^LysCfZ4R+}kGGL-q%7${4@6J2dbv}5*2l?D- zi|z}h+(t8M!#1A7JlzeEXQ+0d&*cY%*ÙsAI$QaN=Uym*@a6mj!J?P?8kS@+ZR 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 E0O(?Z-~a#s diff --git a/data/index.htm.gz b/data/index.htm.gz index 139f0040889174476a6bea5be844dae04d7ea073..073ff4ab3b6a4ee662c584f6498d1ff3a03a8752 100644 GIT binary patch literal 2008 zcmV;}2PgO+iwFplsn=cr18Ht#Wq2-VbZr2=S>bZqHWL2tr$E`sNt%k3X1AaW(b1_>SjO13k3hW1U`N6Ed>EdWv?W!D)?_GKm!31W9Ye7o3P zAmc9%|8;Qs@8j1b(J6nqH+DZ{oB)mSmyEyg{k``vC5Ny8E^?4V@(wbp75O_XBydIA za21dr#ZAF!XYYh*7@{(r4|~1kav6v$;w-uh_+sxsWST~LNLV%#Z(;EhA?+uM$D#T^Oz^oh$B9Zpi(%&=v*JA2sDx5lJIw__b zlio;?4#``p7mRkv50s}2B;E6UyYv(^wemjvr(lcFGYf!B`x=pYByw+|r{PNX3~?h8 zB~&WVVWDUK3(sodEW5;2@z7I=kUAVHSEbx-hQ+{^NA0 zNU~g$7-k@el2PbgsNS?-JPwRS9bBky7lS_sgZ*H?KX~D-aCjwCnH5>2naDQX-*mSPmfp1^BxIdX@l=~{89Ku1+cRXpPIS>|yUgFzlW5_<#k>8Ek%peOY$%PWx zJ5agE6pYN^l4Y?ld4dZXlaN%4YIn#7^POM>l^d_!nlY(#t78Q}8l&rlj(cU!8c#)h zZ4t$6Vc}-5v>}A=cAS*RVwsEu6>ry(N)I7p_dEA%%X-fb_MZBvU#G1gZv8h=k{0RG-CRC*bfFq zQIFwYx>`i3)c~L@!@w|Hf%K}nCSQo${uC!42Bv3 zz#(n7R%;AgY~CDYFb4#H_Q#m)ea5CjI zySzU#`XgjW$l;g$KB_3A^}b5h1FEhkM?z0#jKf4-D-CIH$u1eDAH!?txq?XEo3UD? zCctwWsy671L>YKy!{a8V5@dc=@QRKutO}U6JOXkU# zWjWT|^+Y>G6;T8x8JBLbnQ!=Y|5*)|$(A)w*YlA1ZnDE_wPEWmZb_ESgCJ;)Of%5T z8C}vMDBuw{+xx-lcDZs|Xf3k)@y0ZpWAxq!SJ4I3;F@HM2#&G6P+^&5kr!$Uh5{<1 zBv8c^YZ#(#4={3b&TwgeXm!r|=OYtshZx)%lV7j(Rl8F4ZS^p0F%#ph&R4C#_$HX& z-~tt7@kC<31WHc~EE^GBv+Q;~AiAGdSj)cKBxM_9HO5aYJ$EurH`z7~>IT>QhU-`$=!PUpQlw#ImnQy=O`*z6eQXe<`JR3#`0A!iu z#tI=tdJ|yTEt{BN5-dF!qlt-U%5iS^uV zx{h~eW-7UK;+6Z+K}^vpcL*wN`26yiWAcP@h@2wYanH%#smPMpwRXEK?xrFx@VzWv z$zTWB{T*cgxP$E1JIFrYLH1AE%bFP6R=P`Vf7z8~7wWwTQiAg!l%L~O@7}N+-jGbe7&`U%XLO-u{}xl0%A7=B{xWTI^QPA zq%@L3?S!FF)q1$VYQ8I@=7_O9rKa^UM}-|CS1D{ScW|mmQ>O1%z+&&^fo)C*HYX&f z8__)OxeVc6rm}gUthYZb&k9}jB#qv_-n29h%8l;HZUvHa8bKmBp0`8q)Ov%M%t}~B zu0JahU#e@k z&e~41aVMswonh4JAu(<2XcrEyZ~5ZHjoo8=dwUp!O=JJWj7{1{hn+_twMfgNbfBf{D|KFcK{o;T6HTdZ#pPYXfbocv@v5Crh(nRtPJ7`(x5>!LX z>8n>BC08fR4cnOQ9(<{?x|X``k7wYaS qfZI0!E8UydcK^S-xc9ZYxXtST{B^h7>+j|Zy8gmI5AM+v z7E-QGILMpLD3$BD)4tElgKAMrY7|{EQ&fvRp?gZMr{oDW8%9UuHRWptiVniiU40FP zI{gqnS8S7b_5vVGXb`DK()w5888|YrC2mI2f+`IrsZ1VT^_&&X#0qc46HgaXnY1#5 zp{hr$mBeFfx`g;BtoI59dE(`CV}C~YsBP#}vC@zXa!^F8H1R&^cu_H)Mb@KQspf&fnv2*wQD7`gcAs<%~9pmOVoL+K7{K%JyDA zg!)hP(ZC@!uTYmNpih{9z^z6cmrtwp zkbJE*NV5@!vwFkYcAJ_c#OXvE$}5O;$(aef55gPvMK#Kp=h8}#M+8KM>pe{lVrhz2 zDVHj+ibqyshOc?;t`WnXgM$tpVR?X(3F&|@(DG{btr6$|93&)gmfjzIY>XXDc38i4 zm^+lUcw>5})LLv*Ed(12i7$66ORl5&r4<~KQwi}Zfw_ftGOvfd7SCl`>0k$h{LBbq zX}$hR?yksC%0cgB6qrg0VpIit7j2Jn%5{78&85kfiA>rN!X>pP+oTB^B)hg zGo_91z&p!b4dAjFXY+;3j$P(vY(r8`wZ=lUV+jdS#JT|$E|%VP=YL*t!ZK`Miib_X zc&%2!vJ8aRPO!wwki0cYL`yJtIoRc`}V$LyW*tGM?Ewt?aa|@iyjqL8=x}^b+_9@vYpa;JgU(NToesY#m_CVcGVa6J ztvVyQlsKSK=*J_-nE5}P)%Tz_>6Ui394hht!Bjk^E4k4$ekp~_^TRjn9y`?dDUufPmaSNP=Fa%cwe$9Q>#loV zanIYmoy+cdr`?&HxjJ#rTI*_9;>eHigW=4Dd*?iYL9)Q_I~c_JKt|b)GvH;&)=SGW zyKYbCF>OdNP1kH?v0<$p=}L0T@(PZt5k;clgQLdZa$agWa&DkF!eI;<7 z7GT5TDzQ$mos9M0`rFGTP)aH%)TP2+-Y$#?mr7P8v8x4_>B>gZi7`=DrYGn`bd{!{ zbraTROieG2&-7r~Y1T`oelx&x+Y7qeCjJvFZYGvd6!|mzu@?Bfvi3*BC#c|&TH1S! zw%f_QsEm=~_jofZmY{wMSJMsj;M(?%2%cju=%nd%$P0A?T?18V5$S4y-x!EGm<*e- z=AZS4@5di!Hhb@2$2Ac6v47B7I`AVKh-mo*Z=RV##$lX#OQ8*jAhG>K3oAS!);wl96ER8?w!04NJfAmJD6KkAIlhD&;Th}Sb? zpE+k{oQ)K*3O;w-QfTE?QiNDp+oQasmuyhau7^IiQe-s^2ZbvZtcJM&4@6a3<~aZ{UI?ayu|_JI^;{xLR0OLX-digb7n@%Le#>XZI@h8uIIA_ziJ1JQ!)N<>VeH@*jk(S#hT-K zY%Oesf>rH?TX9Ec<%z}uQPVb^{iCiS`ro08U4pcbUk@1mOd5O!B2KPcJve!42;*Te zjiN}N57Tcn8rha#7xg^T8fqSGd2T4?aG6mx{ObOg zzZ5*BPOt=m-k94&b|G(1&sy|1X@h~iAua+Xk=ld`1M_{H2zhGwqrwZEW|--Y7NN5o zn`t)s9*Mxa`+~@r;2hy;gy@@gUhg0R9_ZK5MZ$gX^dal6JcXNphiPK9P1FZ4I*AW; z#cD@&Mu_|hP`U|`4(=fgmi_|ur~ik2Wc;8Owy_z(tLK@9q`>LjAg#_34~s^e%Q_|x znR+Y`M6a0!4Y#17>w@V{~b6ZZ2wb0PH<~ciT3S|NB#*+_xdM`emohZC4hh zP4lDaHfj1|_u4zl>qn80#F!#=BxPIm`g7a|x-WJ!1Aqi6ilUNSU)!r+V@tqbFf$m; zFMw?SFGoM}DSOUuco404JYes5=%fkzmfyrYNSMX%dh9==pVxuYIy&=HK46P9T@CvE z+uPe-6uN=$UiX5Vqi0c=I&L~(emINRg_B+~t@rGDvx1>9B7gk1FP|Kp-}-5a^Zosu zv;5iT$w!XrmYmeKY09zr^^0?JV47{w+&0Zt2dNi?ieX{Q9dDDQPRiYd6VCbe z$`E~bJpw#KKp>NSA-Wo}I&)xEh*!px>;mIFbR&;@rd)2Zwid2k zD_`$9Pq&tvmN#4Te4TM6fR=azBQ7ohE6l_!Y`x|i*qn@T6XgWfTdk9YCCK>U-8avo zC9n^)TL9i_o3`1m=tCSA0C3robZ2Ubw6!gP8JL@=i!m&ETQt0n{LnHVnXLgXdqzCz zL?>JaN)2+(SL@$5=ct=IIFFLw6ze)uxH&o{#&rhCS}X%Jl(q|dIORWyZ_*qB{*3R+ zezIpf3^MIWiF}tuMuS|2D_Uf8%Oaa4i!6qMRTlh!5x4?UgR9hEf>9(7Ll|L6Og{IM zl$)aYeG-M=J9D0Ydnav*O64U??#$cxrg88s=rgtmN-&E z7F9E-yVfd}`8lk{^Eg@+U1)LQWbeeFld^jiljxuGnX?X1ZE>T4hLILuAz@a!@RJTm zJ&=T=D#1om3m8PgbmVt3I42bj>3SSPJs0uBk{jz>o8;`p*{_QcrJk7peB2yBUL z|CWHztFIH{RA`Yz*QFV!>oi3=dOmD{_|^HF*S0wnith$alGw&H4H^9FPJz2?`s4`- z87kbg4N2|9gl*lGvYi0E2Fhy9ZR4ruQ4l8k42FIhaMSF@2=JrO&HxPkkOTt zk-l)a&$TWYMC(l#CPhA%&?Qz`TL}>qwP45MRLR9ofP^^a-Zv0@-d*M@Aq_>|xh56w205BS5OBDGaZfhPFuk zGygUR! zs%I-BshQ9B>Su!f>N)a(HQ1$%te-*wRnJpGQ8U>x^49y*PQp}ARYX8D_4@@Mr2Cz= z{g1P^-}QvU^k*C0+@Qtm_qY54Cd7QX5}nYNL;(jUJh#e#t$zQAMS+LyFo-5vIWYu5 zWnYdnNx+MY%1aTwmk25i?UcxuSXz+Zt^x<#SKoN(^yiS9!rw_a!6nGLE;|NwT|$o` zsL+ZSjH#p)0xqNi&8!F@I`)RS-?B z3nhTd4k&6$1u!$^cWIv}1*dx$TP2nt$=c>=A5-!t3k?@Bp8=53AJ@~N&_5JKN6DWO zgrZ?T%tJ@UibrA>vKyb@p2OY=z|m#frK6`tI8a5Q8i^zrh;U@VMeG1-T%^mO7_fpu zGwQ02TOt0b3xKYYMRco2L3QC-L5Qnxje!~#e2|nl3U&l*kkVqnMt=A;B#ac!EPT)7 zA=)~+vNaeV~0I#9BzXa{t8IHcIcb8Z2=^%YyT0m3hLd{#P9NK+Vq< zBwmMCBAUUP4zZM%Bcv7lkx$Pukj!bw2#G=VeTyY|Ohh3-i@miUM&_l+cN8WtPiVy| z>be>X84fI^VgobVIQMfj5af_Zcg$hnkA}(02~~a=I8z=l`rW;C;t<@QG5Yar*hiod z8zxI92u5Zbi*+Wn(pR<}-^=6@N(o!D;E0 zd#y*e&UnnZUwr&1Vtp5FWF3~nATyb&tvsrVER}C62Y6wJyfR*k;i8H4WtUa*Z~rkR;wlz5i5#?aHK(| zS}GLI&>Do+I2A^%ShyD!Okssw^rav0@1pc&v<@L=zE?Vk(7LL}xqBUz}%_*hu4O(!2{Ly&*@bCc4gfK@fK$(h zjp=L#ehApO!BQ~iJhcsRRDx!^o~U8pY2rm5A0M-~-)@BvA~Do!2(%uMP-A_AL5Pr$ zc_Q1T`m1( z^mzm6Gr7ksb>8HubJvAMj=TP7VsR|p|({E~!4AXP?6s=(q zwo8ddhm}zjC#dr-nG#MTZ&NJZn3?VBdr=6fLvN8TGczSBd)>Q)6%AI%!{iV`2U z$YAE*aqn~*rD?PrK$UDx#{{#u%E-eKVoLP5byL}gSB~1bc}bj4@~jbY=PyP zfax-Gmsmc0$iiC9ZK{eQE}sMTGQM)7V7&xrtYhlRS6Y0L0BJ6}kU5p%D*W`8vuTj^ zWjn7N!dD&9l;+DpFf|1J=#Rd+*!G!FPF=%%Qv6Vv+n~u3=Y|^{gRVgsZ9`r%*dYSt zZ>#cn>3OOX|B*WFqE%oaIHnmoCd^gA4VSVq12m=RscM8zyJ8wsab&nS5uUFCCv%+; z=S4yFU;+RgE^x@>(SJm1>}4nr2LHua;Ut*Hy1wqX=CajayzjEh*%lq^uz_E#iwi&p zcPIDFLR83Co5#+wT3e2s0S7DIM%ya?)pfH$~&K`13Gj`o3pby`qHvmbYQ0=skNRTxqrV8 zxC0Y8p2wt82|Lq6oG`6XJ>ZXn1@mw_%Mr^REj*a(*B$cQOejNyaA6v2IVQQ;VWJO?a{QKOYt_7o_5Os zCmMTxZ1?N07>GmPj5ff>l(30A z*lx(b=8(Pl&w0U4C{-@1Ew#$RQwSBa6bx@;AbQ&tC0Ptw&9N-c4oq?34wMd>$0GeL zQ6;jlo++-KsvNlhB*RNOA}L%ccqrT*5Eb=KetNGJxiL?CL-&0waqTDR%z(!HUI%;; z{fP?sN@aIBEPvQUHc(wXbDo6sGn;i! z0JRf=&A5tIX-2v)E7c`>)o4M|)*W+v96?muEh-80{Dl5yvx;L5{SNj0kt(f&1oqKxVoA`+N@~jJOgH02l8sWg0D`tIzP3wh%Awz=F~hQYZn_$-!It z1mc$B6*!zM@cSBU9zu&Q&3?&qt}56<_LJkqLyj8U*sYC000~V%_a@%yvCWQ5pbCViwWLi-kI3*)-NZmr21pKf1Jb&kB&* zNaaBq4KBGG953`jj?NV&2f*87*llAcev!I}eWF&NrLLbyJ2k}WmN`=f8K+Qtocs&= z{eMtGoQ0bCa8|P8g^;w!LN=3Z`mhO0gO&Tpq@%=1m=bF^gyy9cZgO| zHrryhcD5z36K_CC#crF*k3H-l;Dmg5vF&k1+vgQ+UsSX`sc8GRy-b>IHKJ{PB)fYy zttcsypVuedBPJ}%XN+N3ns-8P_K50UK0W`Y0ec_LR39eT!wMcQI5Bt3Lb#W^f>zNj zn2_S&9g=9B+J^odkbDGaVnU22rIMSH&umR7j~?Y6W7A!FV>enZozSz%aJJ2f;txFp zBFw!6cD6d$rrSAcHPjZXk@dD@M?)n5ka5mwo!aTwCt=WT<-^LRX8gzM0=i9EQP!?J z1`MDI{UQn=Z`to})GA}-n)wS{bj8uA$@;v^@uMPX9)JQ#&R?sG6kNT{D>f0#x{?MR5G-!tgF)1_KKp|1cXiv!ROicB>qf(=N z>ZYE`Y^rSXG0fklrs>2VsAjobRNB?rPQze|WwcKCdi86SQ0;En-X5j>qrNJZp{aS~ znCo&=<==jCceft93+`S|qq|&_#S`n$%02z)FH4|2jyJ=KSK+iQ(Pk&DdmVxNXr5|k zL&d#vzpZfeiWA$wk~8g9-|L7E65DuUo=nWa#5|thapSK|X|ikHTI@Cl5&`q9gyV^*?BdycqFr>RL7M{WgEsP*Q;Za{>kr9uXN5D z=#`eIh{Fl_Dgto$H+U3Y(l`yg09Vn&VkUSNwuG`Dp|EAm+iO}S-h70vj{3~kVKhw) znThBffwK{ZGt{B~78?sUz?_WPzEdnF4o*q z0w0^=?q9wHg0!-ml*LhX0g)AwE3PB&S^%3o)Pt*W@ykaKE!%v5h2RLvDeLz8F zn-^(2$Clhb=}J_)TH@^;zn9IuH*3(TKQL{eW2Tk7VUuYxs)2Z@SRM(G%r$cSM0)^2 zK<1_Us&h68lV1gqlhO{6pBu#A;uT?NwKAo!ZD<^WS(0yTkutBfML9*{438|5pd!Di z^-viwp<0Te8tl?Y5Of zKUvLeBI?OWV^wOPDB>As3QTk5k<+yI-B#1rI9t}zog`fm@ezRhR{vf#JXFWw=TnI7bCDVt;wzX;nV#;xzAi@}#q{yfRwS~f9+4>_0T2$pFylZRpMc{f~BJY8|& zy`z@4uMLD*I;KCfs4HGtlL?^R5*~cv>EpJ+cJ+PUHYS*o-EVt&Xzzpn1>V!K$8UU> z+tD=wtC!EgXW8Ecyws!J+|OTga=#n?q4W3{e&7Q>1~M`9RV%$!E?K)SPm+nMB20`5 zp3a;b4jjp#b|N!ASZ||3`!%Z|!*`(uCr|#o^>h-wL%C!$s$OvC2GQEvwg~y9e*)01 z{TFtF3woAjn_;M3>DTGrXHO(Ebggo5e2NcC4V-lv2}?r+V7fzQy@mt&@WTpsC|SJX zB?ZSt%h%cJkg8f?7BgwrNTXu^Kg-FG_EbIw--P_<@{!^XVW5}ZrJs}uMa(uE@?M|X z=5-W})lt(VoeM+y8_?CgRGRul5TE^6WuN2-E}hkhu{XMfbmbu82!(GgQ&y| z+bK}h1}HrXSfFZ@mrU~Pv{W+5JH}>i%vaHBy^@w3mTn}Id2uHjp8%i`qG7;JjFO5S zV571(*&I3%y@4-_XTh)7(v0OftA}zjQq&~{P2Q`YhHa^DexaEAC?#X6$0#&E<|L%~w zlMjW3tjxv?y+lfBn`wM_fuwlnuUu-U$55JAtn1ezzlm3Pb9iY(S6)*o=gt%JAj(u7 zS#zEfbVa$m+xlzBKlGNva7)SX`5CKR_1xuWlbio-?^~POII_jQ>sO4%do_SDcv6yW zKp;z&Xj^+_S&`)R?j^V^5EznUff(EwKqM`*>L!06NmZ)yGxDfxRq`Rphx`HUKgxOZ zbEaniK4h=A?ye;P=x4wFIrP+lpPDeEEAWNf))!A6nmTiDYiM;W zuCiC@X8X!?h`wtF%j5vM!HeY;IvcIg09_f{RfrgMAnOVA$?HEDOmM>|B#h4>oYU4E z5x4TbrytN{ziZ#dpki%v9!_w_Q^RZ%-F=r7HF`!ljJ(=;coD|oPZSe2@Wd;zBRWjb zIIl1zAQwGu+f3n{_#*O<;mHXFz>(!BsVY0&tIV$<-$tXKU?WnS9Np_s~M5z7Lw z&|IG2kAiZ#hVB=G$5Nr79gm)}3!O+z)dG%D0AftGLbuTl{CU07;h$YiP^kvhPSKw? z=)#|GlZ_fIR}uW(gFkOp(IySfK)MctE%@_;$n3PPhm#fjeII*(Pa8BiN@Mu@0sQ$2 zK2_f!Ucl7efK^pJ!G&yclnI z2mAC}{eAD!&s+Z%28hh&ej{kPRBOUBz7h1j&S(A37yYe{+GaU*^B0|e$Oo=+y;w<2 zw92kx>#PBYadhz^BN0MsPVM-Or;~E!9t8z|{ZWZa_j}7@+Z{!*(6M$V9tHf?&Ux~?EurqTr`6h1*ev;^FloI(u`1Ns}b+ zHNE9UTp3d8&f=q}32Rd{jnU%JY8}{M_}jC&d@U4OB$ZT$zT^_<5ZToSJi&JnTTIfA z0M4;1VPoNF*s#WYh_io(dQy{B9}v!M6Ne4wZ@o_&9hi6!Je5aoh24ii^~EUz!$4M} za~_R2x*5y01X=?k*biSO=@$s`5FoZhfEY7Vfc(qXaatjQi!h{Cw|~! z=e9A=(0ShN{_~2qQ*Bt+hBvvEkK9*n;BMIPQF+5{XTxukG{T146+I4pPiE+>=-W~9 zUF!Z_&GXT)?kazs2*ZbxnXDO*nA3Fzw0*4s-E}YLi)5()-?f&sl0L1QX({Q^ZZSlf z91Y$t(x4JPEZG7<+DFQ@#0|;8dXg0p!z^+v$969h0Wj7@Q{0MeNkFRq9LQ5DgZ#-u zmK45Qlij#O$)Lkhqd^bk>4` zIP!Qt6-oQJf6m#Lqmb;hf>0h1p@>N}T)PYUD0Lfh;5E0X- zBsh+g5S!4dB3mQ62Rgx_cU(HAASX+OpeY{PvsT3;_3E+B8K46RZ zPxzerCYmks!Z{T*PoSj7=b8YGAyImkm>M5(e?>vn#xBlp6I@EXNVvHWwFc&_Q92WZ zs1V-5=_n@}n3HNEUG%OX9~=P&mwmEA8P_@5vCQe5+%Wcw%#<@euJ8S8yH9wrQm z;qGs91f)Kx_ez;-(Nv6<6(84aj)c$XV$DVVLwiAu%*poep?c3BY+_<|I>ub&8$Fa? zS&^cB&$P=KPWoHXr|=NUA3j`cAGGU0t+AuySmm3aHyEwcA>gf+CrKLrG?ptXjX)~+ zQSLhPAjeIv7y73}ZHz$|C@g!4-gw>ZeyyJP934;I)9OPJ2%Daq zx)*0&Jf9?K3j7zUUOKPYB>x4bhIoz9it62Mq-J$sP6t;|;Ph}jd5iZeI9eykEJ^#H z9334Eav|TB$wC@mcLvfHTg8F@sYwwl`(MES28;0&Rr7didRufKD`A8s8}%$cim%0s z3@;f?Mp8D6rxpG)x#Qm;!VQe%2{xarNCL=_et;?DOTu-2HrgJI+F{jv6sVD9x|TDu zA1S-E4ZU=X;rX`h_9ts>U`EQ#$>q^=)d(N&oQ}NZ((k(XT(+C=b;ED1eQFOdEU2)7 zv~WdvAMQdmUzxP{Ya;;mToK}2F8kLp_633g{LPP*`9X;pVv*da*|r_velm;3sgz)> zY!~u+C}LLTvTYG!WIB?*${wIv*G`gEnqj80z0Q7k8qeutcR$Rc34QGCS0C}|@!>TY zhlym6p;o7dIU?J(8ydA2X@mi5l@vq9>*LuHkH!k4^z{@d;Z4T#cjK%;3(ZMZcF!HP zxy>)NA$_N4%Q=o;ef=d0whBC&g62%N$XHbSSBoDkXKA+mTr0@NSq2xejV(U8IzQ(9 zE!cDBF9y$Oe6?T+4E|#LHhGtg+pm*(a&&a?L;O{Ike$WL$w?6UhOczJ;gitcU5hNd zS;WiDu_fyN?V{@m5Ab8*YZ|>PyFRRQ8>m8#@|Qxr1}EvMw!GKZXKZ0u(zEl;rgsS? zZNR*mtHl)XQPjPt!SRbjPFz}~@hMz7i(L7Yx$R63Jdo01`5{C4u4r0Y=$ z*zMP%24<5f1v8BfR~0axVlg+if-S5ISnRJB$0?AgUsoaREt4VF14XrLNtRNZ2$X3A z!gq5#n@Mr<%N3^a#`_4;GKrE@TC}6g%aq^qByLGyR0Gqwd*XSM?_^sKI*aq17>Rl? z%>Hs5!;yN}0tV8q-kNQ}W7?h4^a`7<(*b~}hl@X(@M|NFuGRwNosmzpq zoIAj7QS)eNj`#LNDLqMwpjP|)7=EOvZg;zZ7I3LbO5do(lBGw$BIHM}?eS;t%{SeL z@a>1V`Bm(_hP7OJoLOfbyhU=R0KQDlyjtn&dAWfBh@k#9$UI){hu6K&yWKYZ(`&zo zl9zCio_WuApJtWKo7qWx$}nDk^Xyx%_Mr2i)82Z}`@G%zeCt7Z+aJfXWR=CR>whmk zl}{M4(oB;CIwA};U%}_n>Ubk>rV&V(%?I!NZQQWlEBxv`cvsp8*#8PP6|mrM#i!zf zfQz4t<-g~qiqhg}{Aj0w!L9+@Nj-h@QyH+}0xinQM`+BF*@+5&y zUw-%cjW4|4U;^?8jph?pdY!^1ix+_0Hi^u_d8}lsnommT6H+#O`h1>A%Tw8@U|c5= zv8=5vU|BG-NwfeK**c8pxgN6B;i=<1w>ZP8x(9quop^_M3Yq7XVg$p2+quOLN5Q~3 zLL>AAV#tYceMa57%l73Rm2X3&e!0VcI8qCIT9X(_3&vEzqCVqw0mTi5WT$E3bQNfD z$IqfC$(fKZk*3~7Pt)=7Q#gxjG9e9&NSF%A5Ky_qH2Ko^A~y=Iyp^-mvTb`jo7H5* z@PW>t5)V7!ESe9wwMrrM2tH6EAsi@|VPc)}bh`TvK;v{Gz)~$BrEm}$fin=tB1jbz zBh0!>i@_O;s-PXtR_R(`9RZA!(rdh^P*xxSV@n|;VeXZ?LvOyC%}|v?&W7kPk**Le zoNEbV|NGq9w_xTh(PerVTt7+x!(o%W*n8xCHt=~u|eWim>VSf_NHG4kwtU zyyuqGWCUPsfu4cMKY!!vt!(L4Zm9*#lR3D4tIxl++eNNt_Q4&I@RA;MHAwqKHxD&e z>U_UP{iR)+Edj(D1SXRYFos&->obMwj_I5Yad>Sc;HRyMEZUD<$r zaNPCttZK2!PHOM{c>y?tcJAGZx&R=IlCm=FbNe3^5z<4*#UW{MV zBv$Hr(*ag-Ww9AO#5_aQC{m#)5c`fk5AiKqmK(y8Lge65W1hO#krQ>Dy!2tj$E3AW zfibmG)jArlyg=gl2(KdLi8OP@8@V`>++3{puNsJyM^X}m^iqn15{GuWTdrEQgUB-< z5qx8m%fzM|>j zIZ8+KpGWgi`ZNBUwvR)9G=~#KJYC}FQW;FZbx2-Dw|M%?nt0z4fCu7Dl!wbc08$a5 zI=kS`E_7#8)!BtkF6juWYJxq%u%4p%-o-uuqg~!Sd~p26m`+8U=0Wc?St<$aK{R?x7jfkQ~`Z zB6@XU{F@BaHoM|sicqRzP-TO~&`P4(aHzA2?C9(%YA}cdZk!Z0h z^Tp1j`g}FDNa_wqJySK6$XK{j_>?SKWi!U9vj|SLjqKzo++^>#3@iPZ#B<`0LJvmr z49SgHjZ2YhQw5VIq)R7=(_ze!W$3(x&uHkUy*Q=wryu%z^gf)zMwzcp58=|g698Q{ z@fOki0*Lf+^PfKa*XCdU{fGb1{P17?`XBoTEe~T}?Z5Aaa96nW9fx627RQmW9IC^R zgv{`Pmk@RrVyG7mp95`foy;LwMgN!(ks_@q)cGgQ>6aKA_v z@UbHCm5?ahu%s#v&VDoZ?b_N#q{pJnK(vg1%Ft`XRk5RFpnH@V<+p@}Ncp1HK=l_i z%oV0!ZL**Q5Nd1CK631^Ag}W65!=zq1XA6{tvJfaXS8H7p2W+Gey7zNn7+gk?*)^3 z=`<>&X3KX)IyE_M=v72^*Aw5?lmN`d5)3Ola!lUjyb8bZH z-Uu%)=AY*7)<(ds!W*88rJvllO<2@&lYK0l5^SOGxhu7W4wjj8b&Tr@5>U~sO9Np$ zXu&iDBOfFqlaFLbibf7yC>2qF9<>kG)qFa>DAp5u!TwpFY~mp{D?6T@T)(IgbetD- zo;kyv$xvrytVl#UbB8LU8>}$84+eM4TX;NIW8mWj&!P*uapSd0mWdlKCUUfR)6fw^ zizAHj8?*%0y&^CX!HZ*$*`RvY1I1CvY*1U*1I6*mY*6>FIVy@|W`lZgJy0Cu%m(%F z+G|MB&k)$9dT2Hq5y9UvXuj01Tt*5iduPlk;5+5I`A+G>k&Kol8eT`H#EDhD{|J6~ zfcG`rlY~)~-(`PCK3c()az&gY0HlgMOGOd+4&M`Wj3Uxhqculmwvs{|4a`VVfbR-5 zY99W#f_u1sijD&gHD(uEU)>2+b9)#+<_?x>My6-Klbk z*7zF*Dps2vuf-cxA#tRzIJ!kNs*{a(y8UdjcBAvX(+Y9+8&nIpXCWTaq|dSnQia=% zte?zMBh-#n&Y*RS6dhJhm)POvZlQnh%oV@`~2@jj;KGWu@#JO1V`?CfHp5vd~b>*HFz z_wXI97~jg)|H}?cg*5i^f>gAvIKy{t5W%c&N!?5YAo}8$;1+~y%ta5OJg*eHqhnFKaG#2r()UhSa?8$9yDgg;bAzbzZasQ+3la>X#@KL zL>psn_`idxV{n|>q`u?({qbczcftyb4-;kVp6=yCb(b1>7zgLZ$0Hj}<(>oReT6*z zaAA#D3Ru8C)W#Dl>;2mFtopOp7Kp{y-Kxs?5X(=p-0WDivmahOet97Gurg60Y|~% z9Ppy~x|STatk4vnv4DZpkXf})VSXZG3~OE_!rw*dGM?aZOCD6qWHIo64HaSKvHQE; zFRd(OG>w$pE1n*e^j1JrloMn zBt=NJs`(XSzLms&T_e%wXv(R3u01Hl7BJ3k zd)3HszgFlt*HJAp(G;o1Bp4%{oYyv7z6djPI-nqz0bM?x{y0W;3rcjg;4p&mMZ0+W z_4NJtcI`2;TQtb9Ube5KPEaNqnmzjxf&PuP3YpgX6nD1lhvJg@4PS*Otvc5+Mldhj zjm~onO?ZhNQHBn>YdRh|ajY%{8BNoIl4-+=OtY{4c|%hhCKX{ zJ`SjaKywAU(|PYN9Y>`rjyS7r;U+zf=b;MCr>!rz+zYrZf#Fnxgdp+zaN`VypFzu#_hZ%U&HlUBG`1SR`Lr6qgQ62vb|U@ZeT*G zamyVQ;|F6mp+4F6tS-6suj$Q}t};`+;+6;TVwiid^npU&CG_a+`Srn_oKi)#(~GD> zLa0LW3SAv$%e2-BtzVT(mGE}r$94(g-aQFTSEO;U|SboZ&DaoCLYRJ!Gp)SStn*2^!Ru=>w@8AkqJ^gxRla<_jL3n-4S13HD!^yk)tHfs7ddRjaC@l%k|7HZ(Qta&fC-eFYS|nhxApUTK2^K^ zTKit^eBAhUM9X}(-Jr2dlnaLd?UINpH!F)n(2*HUUAc(zP+-Xe+iFb=&LQIxMt9RR zp?7%&_cCV`Czhl%LPvfj_SEw3J4do9nk-1d^QRnd<+a&bgRjq}rX_{uI!g$()R@VU zdM#eGP9iiD-BF*!`|E0E1UX@u6OJ&1>Q^YY`h4`fJtjEjByp8 z0yO_sks~X8BiS+g>dvZ&MjT(2|DzdOMAkQK-D+%}M^UwN@-}WwY^c%()X~pw!v<$j z^maPF2t@oB+w`i+#uEV0St%dXj64N6bdsa_&1MrDD1ufne}Z2(v3ydEi{VdP^mz-0 zrsXk7#QXo>86ir}u|c?-d=p6srIeDdxFN-qG%wJQv)(3DRndVv%+4=FVyu8bS?vI2 zHS#Jy5HZE+v$4HoPwGY4UOL`0?(bDBo-hZlnazBDFIea_JH5S z5aAp`C5df0hPO_#yaoO&_$ds}vO2aFL_|%od8EmuO4r=F z-7dAG+B$Q*v3^XaD^LFcpfvhOtv$lu+n+PLvb`qI1iP% zS&s$T;uEIbm=qg}Gu zDJHkF;e+sqpkE}*SH1-313-Tt(^%PR0LGJvC>zT~igTmdz8L0^U5wCGz`8`NezYlz z;6~VortMGfh({01S^4rLS)z0~&MxK?9k5ju)mRvtMN1UcPM?mKW8s7KmH0~D+gQF3 zprRIDqA(R4tI(-dYrI%QaDnqFn?lHy>Dem1pvfZylzGNy;~4simXniOK-r6e(0k9R z8~PsSZU{XLDA!lOIVvv(kw|7yYnB|>f^Xiud8r(dD2Gfx2-6k@1YKnuFm*Dp`+$jPV{o**kM3_bCyC|irHs0sLVsLy!EV>A${mSAIDVsfO;Y!o9z;?v9GGfO z-dcbS9V?h)0UH<|>ZKT{B8^`4@Ijo6SDerBc02b<3jJ_7@udilB~f3WxPUSp99a$% z39cqlQbmk}Xqy-*mM;!SuY@Qmzl4%>g6+(75%j}dGY(c=DW7HYiXhR3!y`cw?*wm{8#hN{x|gF}N%OCvy!8 zIQ>!voU0FWwOxQoU1b5LU-E$Y&BKrtTFdbnW*N>@=Bt&nb=yU5;0-GM$n2#$Ljnu6XE`h50bmbrpOrTg&Hd4kKQ&fmiE%Mv~`WbB#%4G8c3n zp8_tX-g5fYcp5#MzoN{4&fZ~LHj6RGrkQDQ2^Y5v&lgIl zJ20{jVgmF5+{2eq6FQhgP$4}X&kClKx;ycfR~mdwF98Vk7|k8-4PRk0c98EyP^o?( z%-@2#QoxtCq12o3-QyqnL9f&CzWYbvUdhg{NUAD;Dj6tD=h^q^tgBZRe`&($(P;_P~5v+GsNu4hUC*1p3E$Ud!U z_ts6@38DcjS1fs%q{}j-+ysn;GE3SC0wwEgD*W7{Sc5~!$uXVK6N|IAr%(8zWGR~o zmTbjsH$}98KETakc-uN^tfy~)&U6%6UG5WlXWY^BGA`VWc0b#mOb1Uc2gdQt9L zvYdurDb3wLoTH|?8>d7kYHD;|L$(tzF4y+@diVM66RTUt126p#JLHE&6ED=Cs^fUg z;wA?Co24|V%vYlOE6G`6A;mzjGjYj=7!-1{yO1SicbSltOA32cg5klU0fK`K(A=<|3ruh}(1H?^G#-b5{VbM1(B687M0+eFHF=t|2;ZaBmo!mxiqJ)?nja-yU*W;p-ymmeF*z zSxEz*cAF>>BeZb6#X~>_bAC(t3p4N#}-ETcQ zP42)R8zyUAj^lY&QywX1<`e3OHi?m0S1S_I=rnm3)eL7AvvfQKQq?gh-TP7ZAc2(h zVF0pwusU}>%;2W^AwG%`cU=3~G(&93cQP+;p=w#Hjg8x$5ncildbhI4crILm*4y9U z7)rI7vO;SfEzgqlZN?rxW(YhL0IxP~O%G2|=*NHSJKcV*b|`)t^H0rgzXM00vd6}$ z7V^9?A;*u3ealS6R^lz3@oTujk2NG^*ljf@lE%>ty(Xs4%C+n?A9jMlWT~0X%3Y(C&YT62eOpgk<*plexBB zm4b%GA$jf=f|oguppsd^>Oeo!FHhC+M4^rj%jz>0I4HkqkgqZ%Ae%J>Rg(R7@UMP> zy`XOC2z5)|5Aj#A!D1TaG+-|!<-9Mfuw#*&q42&TI>I?Rrc`R8_a!E;uTctnOyZ1Z z8fwbIRXU>|)r$}^NcrOie39T*GDfOV%@C1_ks;DMq2P#=eH>XL|9EAd$lVrrp%f&) zlIG_i3bfk_s_ug->7RM=wkvmj58wv&0;dt_P zwP-EU_+11t$GbM*sSP5tSP_g$O7&Zv^Dn>bbUFt|urE#yviPUyp!@A%tM}mHKOP=1 zJ>l?N~I+)54d^;jjQ=Cy-1CWSQn! zgiNS^n9QaFmAX%DB0(>e(H37tM?iolWYQ#;86Co@Q}3Slng-+5Xo?=p&ZF7Yy$z;U z-|cR(CMEJYS{6bI zw2xGQ7D&GuT{uTv-=Q^hmN^$iog*3-P2JB`juwv~pxWz*VzZguRa_dE2k2RI@KZ8J zCnI@JIzC-~ldRHASa&={2VaWvfk|$#?sq_&!0zkqhn-KG-GMNhLs0(&r9r45VAs~8 zUAzeGn0p8gaBDO$N0>%vuZbDwPOvmQjpuN$ohTC@SQ{9mPB|B-T(f<;zELZ5F=XQ& zXii_c`!uczed)pbdq?%ktLt!46>cVk@~PMCDm@AwTW?u(va-VGcJHH3f5 zn?YfpWEz6c7f)f?2_`_${*hrb?n zAIL95zd@ju$=Bb$k(e6@8&|S?LibG#wlx?sgx*um!WI z-+&$#V?ch}FA(_DK!qY~{IdIR40yuuYBDyp7u>6SDjEc38jH!;ol#*qJf!IRzj02$?!dHf<9qE<-ERVe|awtnKYc%Hy0)P!ld!wTwE|=sg znmwM)7+aZk7-1x2rFaq9p`Cc)rX|RcODbv!G!fT}Dj$OD)0xsdmMf+QHWli$MfiAJa_zR>itj2 zKDPbm)~B_aj^bbc`FHj9@u|yw%Yb8CT8v-mT}l&Rk2iR`tu7|H(e#MK^UZlvN$320 zn=Rwr&f0Qax#cu?cd`K+mid*WFcW}&rnXdsIa{ZbG^c*2{I7C-d3GcDrqleam_Sh(q60YK&Z3jgi0Y z8zJnsxfLri%z{yS&P9jmw$IlAf&-WR!&C~N=4-o6m98~cus`wI7%D@aI9^^ko3}FK zei?^(#DR2QLYsW&=+*BIgHOC*#~0WKK?UctZ6gwf48ol;O>Z;mgLY2(%k3EkKO6?H zcAr1~lkrsToN~TpyuX8bt+H@o7$ksl$9s!--b^D5tIf9*F6luDG8e0eFc*uovs@{e z1NK%64z5LE9_ThBfCFr3ig2(w!x{yl4tTE9-RFpzt+ECjG%RQcp|&tbfyc%cfS|3V z!<_AL+HYXVtplC=8#8|Q9$Z?1YjQAg^LaEZ+d!mjdEPvJ^36wC9km9_@#G}81ZAjK z^?wC4e+1mVeD>ly%R1!tX&?T;rNT}8R@qIdpMm{m$^SN2pm28m`gFMdFgMPyJGP;4 zS&OA`F{jXpL1Qzy5h#V6Jlw~-3z?XGNA!dPG{sy^m&$UC@4PR}D_=YdF0#PN zp#B7|=To?A083Wc>I2w3pGYB$U--%O_z9bqSBd&|KiE#$(pjvgSkHiO_+E!W&Tu6+ zOX5N}%iILXg;*Kq(>sk(V`zLaL*zBkYz8n>7rO7fr|txkYJI;T%bC;hggohJ<~f4m z#9d91+s|-q^2>DB@}jtdO^1F1pf~)cF9O$)&l%FC1}sv(mfj?*a>o{+$grfD2$ds3 zx`n~IY*O$gTK3$*bE#~L9w6%PT}klTFk-;ha%W0e(T2%e>k(3vHUTE5(Nj7??G5+7 ztoCKtV;}F!LAj!umh-8|iDoaTzQeCuF?+49l$OynxxJh79AIOybtw*u3m0%IVyXV{ z{<~RBi2(G-ccod)xJI$(-i2@q1 zH(*F+P+o3HwS?{-qrx?LDJxDS9X3%kLl5GsG^1f-UxlY^!}wX_#}k!V9y(cT#!M{@ zD`sqB**$DJ(Of!4Y9&TnkW?6%dlJ?Aj@vm+8*!zTOvb!3*ThAAp81rry4l@;Y=Se* zScQO9^qZ-e>t?ItN<9hPVPgiJ>X@r85-(p8IK!3ZR(=*jOge-gq^fZA9{&Hju`{|H zUBakNl@JH@1UfY0hlut^P*Ua=3*s`Anzp=NvnM3=cDoQBBA%)kkT4{2V@VaZjO?w! z`}aWu&1x<$fdw8TRTtpMPOb`wT%mo7C;APvl9T{#7sETIc`zc@a+|n!4}Q8k#CHh# z$g`925>%`RmO@j(?yR5&vJMo>h1dL0lm#MTU%M^MS~eKZ4t(NkQ;~qaMhoCg31$!e zj|8(n+W)u&QyPxMvrJQ!ih*|e`EsaSKpc+3!=Z8@k=J5uB5RoubvO=*JA{t9acU(< zu_NIhWA!t~uomCHdiEqa1zL+lo)F~@UEdh^o83RYdHibk@y+48@L)$VQT40$)(8k= zw8#5v1mrQ=mwOCA*A1n+-b*I2Tf!TqqkZ-Dmw1^amKnLUrx{Cm|yeb+@~N1H+r`?mNIaUUMVBdQF7WG4Fu1#@PNOO->_mQEDY*QSnEh z|MQ{xHn>oq|1=QJ03a1cN6GmeMNrUqHok~b*_OXhQ~Jm)S6TFguvKHEg)rREkm&9( zdjuH@CNe&b@O6DGkK6@46Js+Jvgq=64w77N%DG>jVFL>PaUOaXq1T1~>MaDI?xlp$ z`g`P+OaxwfeE25$COWSz;6fWN_PY32Z@*sG2DXw=a&oKyP?O|iG0C04G%jJip5}`R zq87~I3-_ol^>|>j$6X8W5@>Wukpult{6^WRiM{jnMaJ>C)H^^UKbnPv-VpT&2pusG z_g_-EVGwI9{b)WuNYO@TIVD>Cqn{dlhS=?i~&le59x5|3EP(FybpgY@M;ax&^r#j zLo;JWuIsek$o+C$_~p436#dsxR1NXVGFgz=$_Fge6r1!VJ(Tkq zHcglr%eDdKqXL;=Om?mmR?l>`Snh1CueU zO=7cWK<}I6)$w5sKA3h@%s1PA{$!`NH*Ow{ru*-Em-VvGziY>>=scPb6uqVlXNTmS zzRst`KjZH4fCP{W9~Vn|y7aJEy2Yh1!G6(FM20Mmml@PwBw0A2Z%<$=FD;8@itv;5 z+wJipZXL&P#vEc`+%~mp<2?!fr7-^lt;*wruX3Uy=NqsuY$%tCQC%e>t7wu7%KFGN zr)0)vwTDo+l`P8rzm)mBw#1*{b)*TBfss3$wGLuf{BFx#w#KXFNs_kMGRt_%?RNMc zS%@uB0E9?907|CF%HtH4Xy_jt&c^e%(yr3g?`f1}z}K{u<)Y+`pb&sI%iv5AG!oMn zMI$7K&`(xS$bf$n*d1JhmKeZ#QZhR#QW6in(t@6=RGZMR7Pwl|gYgm#>Gd~hPOpC< zqk6M~X8**KF0*ob;+295!ePZ4Sc>;Crt`_Hg* z7~FQTF1-&J)@$8Phn#lo&1|-)+RGpQ?}z{M;eY(~U*PZm_Thhj_{)dCpxd3;y)qlL zd0ol*_|g)XyHmvef8?3FSUy1MdLN4$TBNG>$mUFNQ@oX|i{O0Tqj zZo)21i)y_Z^7-#+Nd%ww*s~<`3>OUe0@a?PX$A0)EmU058!m@!_)L$0P#^Tea{J>4dV`i`rdsVd57F`1b{y!D-EC~e7E@Cv%U2| zpsE~BKTv*zfdsmVXOT8@v}R>;H{t#-c$;7pu)%U!ag@EqrMYSBJr`$x7|-JA?_pS| zfDB^}=q{C~25C#xsdA?jH}52!QVw1+vsX^rQV1#yo+&i2o>ak>g6%ENy)1z-dKh8Y z>Z9}sCUXVk!I33#vJYvh{;COzB`-0Op^tm;sUQA$|a0PCX-Ea{bCLXJx!`! zFztVGSVIp9L)~Djr*JGXjw#As7q2O{7D#9J>te8~oWl$w@9Ke+LZy~b160MnK-$Ze z&xG-QfVL5jysp&2Vg(e)+ENmMLo9lgB+^{w3EE@S)Q@DIfj08!Y9v*&$gxoGBx_M* zTd6&@G`6BQ8kH$Dc+PQ3_$2K{W0fg`5NO!zE8TewYZ+rS6fIkI0%6T6S6gbhj2U4K z9-LDdYzHP^E`UcwOMbgW{H~2$tmEp^Qj8Sf7-Rc{PwFsA@=;#Re!{ga3Iip}AKCUBjG_r8C&8~a|hjwMYt@YAJbK$a#|C6*i&F7yEJrj%r55yCV%Ix3m8Me*d9(JAinJv<1?ZRY$>goy05jxx?}>er>gotADR z5!xRClfxA;J)$YtW33q35OxT{d3I707O8N`(Q6-}1^?pAf5%Zv_Bo_R;z`E{LZ7c# zZ@2GYTv`0x4oXPAugEN#oRkT>5fzKQ00r4-x z_HpP1@b73&c5 z!a`5UWfhGh+|O2H+ToiuCc+GJ{A;tOGvpIiTjCs>G)@*qyJWHHJg2!?PV)^FG2?>| PF3kT2-j(9{2V4OF<@%y0 literal 17521 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 M1Nbs_X6-rw00Qs^$p8QV diff --git a/data/setn.device.json b/data/setn.device.json index e400db6c..e494cab8 100644 --- a/data/setn.device.json +++ b/data/setn.device.json @@ -40,7 +40,6 @@ { "type": "csv", "title": [ - "checkbox", "html", "text", "text", @@ -50,12 +49,9 @@ ], "state": "conf.csv", "style": "width:100%;", - "action": "/set?delete", + "action": "/set?save", "class": "btn btn-block btn-default" }, - { - "type": "hr" - }, { "type": "link", "title": "Удалить все", diff --git a/doc/1.txt b/doc/1.txt new file mode 100644 index 00000000..d08be432 --- /dev/null +++ b/doc/1.txt @@ -0,0 +1,566 @@ +*** +![](https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/blob/master/pictures/1.png?raw=true) + +## Возможности + + - Объединение различных по типу и назначению устройств: управление, получение данных, и настройка параметров - всё в одном приложении + + - Взаимодействие с устройствами осуществляется через "облачный" сервис с использованием протокола mqtt, позволит контролировать их из любой точки Мира (при наличии доступа в Интернет) + + - Поддержка нескольких профилей и их переключение "на лету", дает возможность объединить устройства в группы + + +Настройка (после "прошивки") производится через веб-интерфейс, чтобы получить к нему доступ необходимо соединиться с WiFi AP устройства и набрать в адресной строке браузера http://192.168.4.1. +Далее выбрать типовой шаблон автоматизации, произвести настройку под свои требования и задачи. +Основные разделы интерфейса: конфигурация и сценарии. +В окне конфигурации задаются "объекты", "элементы управления" устройства (dashboard) - им устройство будет представлено в приложении компаньоне проекта. В окне сценариев задаются реакции на события и изменения в параметрах работы системы. + +*** +![](https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/blob/master/pictures/1.png?raw=true) + +## Команды, назначение и применение + +Команды служат для настройки и управления устройством и его взаимодействия + +**`buttonSet 1 1`** Изменит состояние "кнопки" №1, установит его в значение 1 + +**`pinSet 13 0`** Установит GPIO 13 состояние 0 + +**`pinChange 13`** Состояние GPIO 13 будет изменено на противоположное + +**`pwmSet 1 500`** Настройка pwm №1 будет использовано значение 500 + +**`timeSet 1 08-00-00`** Установит для элемента ввода времени - inputTime значение 08:00:00 + +**`digitSet 1 56`** Элемент №1 (для цифровых параметров) отобразит число 56 + +**`stepperSet 1 100 1`** Шаговый двигатель №1 - вращение 100 "шагов" по часовой стрелке (для движения в обратную сторону используются отрицательные значения параметра) + +**`servoSet 1 180`** Сервопривод №1 принять положение 180° + +**`timerStart 1 60 sec`** Установить для таймера №1 обратный отсчёт в 60 секунд + +**`timerStop 1`** Остановить таймер №1 + +**`textSet 1 Привет`** Установить для элемента текстовое поле №1 - "привет" + +**`push Внимание Протечка`** Отправить push-уведомление с темой "внимание" и содержанием "протечка" + +**`firmwareUpdate`** Обновить прошивку устройства "по воздуху" + +**`firmwareVersion Версия прошивки Системные 1`** Узнать версию прошивки устройстве + +## Сценарии + +Элементарный блок в сценарии состоит из набора команд и триггера - условия для их выполнения + +**temp > 60** +digitSet 1 60 +stepperSet 1 100 1 +textSet 1 Перегрев +**end** + +Условие: когда температура превысит 60° +Запустит: команда шаговому двигателю, в приложение отправить сообщение и цифровое значение температуры. + +В сценарии может быть несколько блоков, при необходимости из приложения есть возможность "выключать" часть из них. +Неактивные блоки сценария будут проигнорированы. + +Для взаимодействия устройств между собой предусмотрены команды mqtt и http + +**temp > 60** +mqtt 154348-134 digitSet_1_56 +mqtt 154348-136 stepperSet _1_100_1 +http 192.168.1.10 textSet_1_Перегрев +**end** + +*** +![](https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/blob/master/pictures/1.png?raw=true) +## 1.1 Объект "кнопка" + +(эти строки мы пишем в "конфигурации устройства") + +### a) кнопка управляющая выходом (пином). Пины нумеруются по системе нумирации gpio для esp контроллеров. + +`button 1 13 кухня освещение 0 1` + +**"button"** это объект создающий кнопку в приложении +**"1"** это номер этой кнопки (необходимый для ее аутентификации) +**"13"** это номер пина которым будет управлять данная кнопка +**"кухня"** это название кнопки в приложении +**"освещение"** это название вкладки в приложении на которой появится данная кнопка +**"0"** это начальное состояние кнопки при старте модуля (выкд 0, вкл 1) +**"1"** это уникальный номер и номер сортировки данной кнопки. Этот номер должен быть уникален для каждого объекта + + +### б) виртуальная кнопка - кнопка реакцию на которую можно задать в сценариях: + +`button 1 na запустить таймеры 0 1` + +**"button"** это объект создающий кнопку в приложении +**"1"** это номер этой кнопки (необходимый для ее аутентификации) +**"na"** абривиатура not available означающая что эта кнопка виртуальная и что пин не установлен +**"запустить"** это название кнопки в приложении +**"таймеры"** это название вкладки в приложении на которой появится данная кнопка +**"0"** это начальное состояние кнопки при старте модуля (выкд 0, вкл 1) +**"1"** это уникальный номер и номер сортировки данной кнопки. Этот номер должен быть уникален для каждого объекта + +### в) кнопка включающая и выключающая все сценарии: + +`button 1 scenario запустить таймеры 0 1` + +**"button"** это объект создающий кнопку в приложении +**"1"** это номер этой кнопки (необходимый для ее аутентификации) +**"scenario"** слово означающее что эта кнопка для управления сценариями +**"запустить"** это название кнопки в приложении +**"таймеры"** это название вкладки в приложении на которой появится данная кнопка +**"0"** это начальное состояние кнопки при старте модуля (выкд 0, вкл 1) +**"1"** это уникальный номер и номер сортировки данной кнопки. Этот номер должен быть уникален для каждого объекта + + +### г) кнопка включающая выключающая определенные блоки сценариев: + +`button 1 line1,line3, Включить#отправку#push Оповещение 0 1` + +**"button"** это объект создающий кнопку в приложении +**"1"** это номер этой кнопки (необходимый для ее аутентификации) +**"line1,line3,"** это блоки сценариев нумирация сверху вниз. Блоком считается выражение от начала до слова end +**"Включить#отправку#push"** это название кнопки в приложении +**"Оповещение"** это название вкладки в приложении на которой появится данная кнопка +**"0"** это начальное состояние кнопки при старте модуля (выкд 0, вкл 1) +**"1"** это уникальный номер и номер сортировки данной кнопки. Этот номер должен быть уникален для каждого объекта + +## 1.2 Команды управления объектом "кнопка" + +(эти строки мы пишем в "сценариях") + + ### а) Команда включения выключения кнопки по ее номеру + +`buttonSet 1 1` + +**"buttonSet"** команда управления объектом button +**"1"** номер кнопки которой будем управлять +**"1"** состояние включено, 0 - выключено + +### б) Команда изменения состояния кнопки на противоположное + +`buttonChange 1` + +**"buttonChange"** команда управления объектом button +**"1"** номер кнопки которой будем управлять + +## 1.3 Вызов событий объектом "кнопока" + +(эти строки мы пишем в "сценариях") + +объект button может быть равен либо 0 либо 1 + +`button1 = 1` +`button2 = 0` + +Пример использования: + +`button1 = 1` +`buttonSet 2 1` +`buttonSet 3 0` +`end` + + +*** +![](https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/blob/master/pictures/1.png?raw=true) +## 2.1 Объект "физическая кнопка" + +`switch 1 0 10` + +**switch** это объект создающий физическую кнопку +**1** номер кнопки +**0** пин кнопки (при подключении необходим подтягивающий резистор) +**10** задержка для избавления от дребезга с мили секундах + +## 2.2 Вызов событий объектом "физическая кнопка" + +`switch1` может быть равна нулю или единицы, ноль - событие отбрасывания кнопки, единица - событие нажатия + +`switch1 = 1` +`buttonChange 1` +`end` + + +*** +![](https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/blob/master/pictures/1.png?raw=true) +## 3.1 Объект "широтноимпульсная модуляция" + +`pwm 1 12 яркость освещение 1023 1` + +**"pwm"** это объект создающий управление шим в приложении в виде ползунка +**"1"** это номер этого объекта +**"12"** это номер пина на котором будет генерироваться шим заданной в приложении величены +**"Яркость"** это название кнопки в приложении +**"Оповещение"** это название вкладки в приложении на которой появится данная кнопка +**"1023"** это начальное значение шим сигнала и ползунка (изменяется от 0 до 1023) +**"1"** это уникальный номер и номер сортировки данной кнопки. Этот номер должен быть уникален для каждого объекта + +## 3.2 Команда управления объектом "широтноимпульсная модуляция" + +`pwmSet 1 500` + +**"pwmSet"** команда управления объектом +**"1"** номер объекта, которым будем управлять +**"500"** значение которое установится после выполнения команды (от 0 до 1023) + +*** +![](https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/blob/master/pictures/1.png?raw=true) +## 4.1 Объект "окно ввода времени" + +`inputTime time1 Во#сколько#включить? Таймеры 20-30-00 1` + +**inputTime** это объект создающий окно ввода в приложении +**time1** переменная в которую будет записано время введенное в окно +**Во#сколько#включить?** это название окна в приложении +**Таймеры** это название вкладки в приложении +**20-30-00** начальное значение времени после загрузки устройства +**1** это уникальный номер и номер сортировки. Этот номер должен быть уникален для каждого объекта + +## 4.2 Управление объектом "окно ввода времени" + +`timeSet 1 08-00-00` + +**"timeSet"** команда управления объектом +**"1"** номер объекта, которым будем управлять в данном случае окном ввода с `time1` +**"08-00-00"** время которое хотим установить + +В окно ввода можно вводить время в приложении но если необходимо изменить время автоматически +по какому нибудь событию то можно использовать команду выше - **timeSet**. + +## 4.3 Вызов событий объектом "окно ввода времени" + +`timenow = time1` +`buttonSet 1 1` +`end` + +`timenow` всегда хранит в себе текущее время, и поэтому исходя из данного сценария кнопка номер 1 включится в то время которое будет введено в окно ввода `time1` + +*** +![](https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/blob/master/pictures/1.png?raw=true) +## 5.1 Объект "окно ввода цифры" + +`inputDigit digit1 Через#сколько#секунд#выключить? Таймеры 5 2` + +**inputDigit** это объект создающий окно ввода в приложении +**digit1** переменная в которую будет записана цифра, введенная в окно +**Через#сколько#секунд#выключить?** это название окна в приложении +**Таймеры** это название вкладки в приложении +**5** цифра по умолчанию, после загрузки модуля +**2** это уникальный номер и номер сортировки. Этот номер должен быть уникален для каждого объекта + +## 5.2 Управление объектом "окно ввода цифры": + +`digitSet 1 56` + +**"digitSet"** команда управления объектом +**"1"** номер объекта, которым будем управлять в данном случае окном ввода с `digit1` +**"56"** цифра которую хотим установить + +В окно ввода можно вводить цифры в приложении, но если необходимо изменить цифру автоматически +по какому нибудь событию, то можно использовать команду выше - **digitSet**. + +## 5.3 Вызов событий объектом "окно ввода цифры" + +`dallas > digit1` +`buttonSet 1 0` +`end` + +`button1 = 1` +`timerStart 1 digit1 sec` +`end` + +*** +![](https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/blob/master/pictures/1.png?raw=true) +## 6.1 Объект "dallas" (сенсор температуры ds18b20) + +`dallas temp1 2 123456 Водонагреватель,#t°C Термостат any-data 1` + +**dallas** это объект чтения датчика температуры +**2** пин датчика температуры +**Водонагреватель,#t°C** это название виджета в приложении +**Датчики** название вкладки в приложении +**any-data** или **progress-round** или **progress-line** три разных варианта виджета отображения +**1** это уникальный номер и номер сортировки. Этот номер должен быть уникален для каждого объекта + +## 6.2 Вызов событий объектом "dallas" + +В сценариях dallas можно сравнивать с переменной окна ввода `digit1` (>,<,>=,<=,=): + +`dallas > digit1` +`buttonSet 1 0` +`end` + +Или можно сравнивать с постоянной цифрой (>,<,>=,<=,=): + +`dallas > 60` +`buttonSet 1 0` +`end` + + +*** +![](https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/blob/master/pictures/1.png?raw=true) +## 7.1 Объект "analog" (аналоговый вход контроллера) + +`analog adc 0 Аналоговый#вход,#% Датчики progress-round 310 620 1 100 1` + +**analog** это объект чтения аналогового входа +**adc** это переменная +**0** пин аналогового входа (для esp8266 всегда 0, для esp32 пока что не доделал читаться будет всегда пин 34) +**Аналоговый#вход,#%** это название виджета в приложении +**Датчики** название вкладки в приложении +**any-data** или **progress-round** или **progress-line** три разных варианта виджета отображения +**310** начальная величина читаемого диапазона +**620** конечная величина читаемого диапазона +**1** начальная величина выводимого диапазона +**100** конечная величина выводимого диапазона +**1** это уникальный номер и номер сортировки. Этот номер должен быть уникален для каждого объекта + +## 7.2 Вызов событий объектом "analog" + +В сценариях analog можно сравнивать с переменной окна ввода `digit1` (>,<,>=,<=,=): + +`analog > digit1` +`buttonSet 1 0` +`end` + +Или можно сравнивать с постоянной цифрой (>,<,>=,<=,=): + +`analog > 50` +`buttonSet 1 0` +`end` + + +*** +![](https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/blob/master/pictures/1.png?raw=true) +## 8.1 Объект "level" (ультразвуковой дальномер JSN-SR04T, HC-SR04, HY-SRF05) + +`level Вода#в#баке,#% Датчики any-data 125 20 1` + +**level** это объект чтения датчика расстояния +**Вода#в#баке** это название виджета в приложении +**Датчики** название вкладки в приложении +**any-data** или **progress-round** или **progress-line** три разных варианта отображения виджета +**125** расстояние от датчика до дна бака в сантиметрах +**20** расстояние от датчика до поверхности воды, когда бак полный, в сантиметрах +**1** это уникальный номер и номер сортировки. Этот номер должен быть уникален для каждого объекта + +Подключать дальномер нужно: + +| | trig | echo | +| :-: | :-: | :-: | +| wemos | D5 | D6 | +| esp | 14 | 12 | + +## 8.2 Вызов событий объектом "level" + +В сценариях level можно сравнивать с переменной окна ввода `digit1` (>,<,>=,<=,=): + +`level > digit1` +`buttonSet 1 0` +`end` + +Или можно сравнивать с постоянной цифрой (>,<,>=,<=,=): + +`level > 95` +`buttonSet 1 0` +`end` + + + +*** +![](https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/blob/master/pictures/1.png?raw=true) +## 9.1 Объект "dht" (Сенсоры DHT11, DHT22, DHT33, DHT44, AM2302, RHT03) + +dhtT DHT11 2 Температура#DHT,#t°C Датчики any-data 1 +dhtH DHT11 2 Влажность#DHT,#% Датчики any-data 2 +dhtComfort Степень#комфорта: Датчики 3 +dhtPerception Восприятие: Датчики 4 +dhtDewpoint Точка#росы: Датчики 5 + +**dhtT** или **dhtH** температура или влажность +**DHT11** или **DHT22** чтение DHT11 или DHT22, DHT33, DHT44, AM2302, RHT03 соответственно +**2** пин датчика +**Температура#DHT,#t°C** это название виджета в приложении +**Датчики** название вкладки в приложении +**any-data** или **progress-round** или **progress-line** три разных варианта отображения виджета +**1** это уникальный номер и номер сортировки. Этот номер должен быть уникален для каждого объекта + +## 9.2 Вызов событий объектом "dhtT" или "dhtH" + +В сценариях "dhtT" или "dhtH" можно сравнивать с переменной окна ввода `digit1` (>,<,>=,<=,=): + +`dhtT > digit1` +`buttonSet 1 0` +`end` + +`dhtH > digit1` +`buttonSet 1 0` +`end` + +Или можно сравнивать с постоянной цифрой (>,<,>=,<=,=): + +`dhtT > 50` +`buttonSet 1 0` +`end` + +`dhtH < 40` +`buttonSet 1 0` +`end` + + +*** +![](https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/blob/master/pictures/1.png?raw=true) +## 10.1 Объект "stepper" (Драйвер шагового двигателя A4988) + +stepper 1 12 4 +stepper 2 13 5 + +**stepper** объект создающий шаговый двигатель +**1** номер шаговика +**12** номер пина количества шагов +**4** номер пина направления + +## 10.2 управление объектом "stepper" + +`stepperSet 1 200 1` + +**stepperSet** команда управления шаговым двигателем +**1** номер шагового двигателя (их может быть не более двух) +**200** количество шагов (обратное направление отрицательное значение параметра) +**1** интервал между шагами (мс) + +`button1 = 1` +`stepperSet 1 200 1` +`end` +`button1 = 0` +`stepperSet 1 -200 1` +`end` + +*** +![](https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/blob/master/pictures/1.png?raw=true) +## 11.1 Объект "обратный таймер" + +Прежде чем читать этот раздел запустите пресет №3 на устройстве. +Нажав на кнопку "Выберите во что вы хотите превратить esp" + +Можно использовать цифры из окон ввода: + +`timerStart 1 digit1 sec` + +Можно писать цифры прям в объект: + +`timerStart 1 10 sec` + +Можно установить часы минуты или секунды: + +`timerStart 1 10 sec` +`timerStart 1 10 min` +`timerStart 1 10 hours` + +Используем это объект в сценариях вот так: + +`button1 = 1` +`timerStart 1 digit1 sec` +`end` + +Смысл в том что при нажатии на кнопку один запуститься обратный отчет, на величину digit1 секунд. Если напишем например: + +`dallas < 60` +`timerStart 1 digit1 sec` +`end` + +то такой же отчет запустится когда значение температуры вырастит больше 60 градусов. Таким образом обратный отчет можно запустить реакцией на любое событие. Итак теперь обратный отчет запущен, обратный таймер уменьшается, и нам надо назначить действие на тот момент когда он обнулится. Для этого я придумал выражение: `timer1 = 0` + +Используем его и в общем получаем вот такой сценарий: + +`button1 = 1` +`timerStart 1 digit1 sec` +`end` +`timer1 = 0` +`buttonSet 1 0` +`end` + +Когда таймер закончит отсчёт, кнопка станет "неактивной". Используйте преет №3, как пример подобного сценария +Например: + +`dallas < 60` +`buttonSet 1 0` +`buttonSet 2 0` +`pwmSet 1 1023` +`mqtt 2653450020 buttonChange_1` +`mqtt 2653450020 pinSet_13_1` +`http 192.168.1.32 pinSet_14_1` +`end` + +Вот что может произойти на разных устройствах по одному событию повышения температуры... + + +*** +![](https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/blob/master/pictures/1.png?raw=true) +## 12 Журнал (лог) данных + + +`logging analog 1 100 slow Аналоговый#вход Датчики 7` + +**logging** объект для логирования +**analog** или **dhtT** или **dhtH** какой сенсор будем логировать, можно указать любой +**1** период между точками в минутах +**100** количество точек (старые точки будут удаляться по мере добавления новых) +**slow** или **fast** метод выгрузки графика в приложение, slow - выгружает график по одной точке (меньше расходуется оперативка, лучше использовать для esp8266), fast - выгрузка графика сразу (больше расход оперативки, подходит для esp32) +**Аналоговый#вход** название графика в приложении +**Датчики** название вкладки в приложении +**7** это уникальный номер и номер сортировки. Этот номер должен быть уникален для каждого объекта + +*** +![](https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/blob/master/pictures/1.png?raw=true) +## 13 Взаимодействие устройств между собой + +Устройства могут между собой обмениваться командами. Команды можно отправлять по http или по mqtt. +По событию на одном устройстве можно вызвать действие на другом. Например на esp01 стоит датчик температуры, реле стоит на esp02. + +Настройки esp01: + +`dhtT temp 2 dht11 Температура#DHT,#t°C Датчики any-data 1` + +`temp < 40` +`http 192.168.10.25 buttonSet_1_1` +`end` + +Настройки esp02: + +`button 1 13 Включить#реле Реле 0 1` + +И теперь когда температура датчика на esp01 станет меньше 40 градусов то на esp02 будет отправлена команда на включение кнопки: buttonSet_1_1 + +Если вы хотите отправить команду через mqtt то сценарий будет выглядеть следующим образом: + +`temp < 40` +`mqtt 12343442-12413131 buttonSet_1_1` +`end` + +где `12343442-12413131` id esp02 той на которую отправляем команду. Id можно взять в веб интерфейсе на странице конфигурация устройства. Или в списке устройств в сети. + +Теперь рассмотрим вариант внешнего управления esp с помощью get запросов. + +`http://192.168.88.239/cmd?command=buttonSet%201%201` + +Разберем эту строку. Сама команда в ней выглядит вот так: buttonSet%201%201. `%20` заменяют пробел. + +То есть что бы составить get запрос на изменение например pwm нужно: + +Взять команду `pwmSet 1 500` +Заменить в ней пробелы на `%20` получится так: `pwmSet%201%20500` +И добавить ее в конец строки `http://192.168.88.239/cmd?command=` где указывается ip адрес устройства + +В итоге получится http://192.168.88.239/cmd?command=pwmSet%201%20500 + + + + + + \ No newline at end of file diff --git a/doc/2.txt b/doc/2.txt new file mode 100644 index 00000000..529f22bb --- /dev/null +++ b/doc/2.txt @@ -0,0 +1,85 @@ +# В этой инструкции будет описано как с esp отправлять email и push + +# Часть 1. Привязать email и pushbullet к сайту pushingbox + +### 1. Необходимо перейти на сайт: [pushingbox](https://www.pushingbox.com/) +### 2. Войти с помощью google +![](https://github.com/IoTManagerProject/Wiki/tree/master/pictures/push_instruction/Screenshot_1.png) +### 3. Перейти в мои сервисы и добавить новый сервис +![](https://github.com/IoTManagerProject/Wiki/tree/master/pictures/push_instruction/Screenshot_2.png) +### 4. Нас интересуют два сервиса email и pushbullet +![](https://github.com/IoTManagerProject/Wiki/tree/master/pictures/push_instruction/Screenshot_4%2B.png) +### 5. Выбираем сначало сервис для отправки email. В окно `Name of your email configuration` - вводим слово "email". В окно `Email address` - вводим ваш email адрес. жмем submit +![](https://github.com/IoTManagerProject/Wiki/tree/master/pictures/push_instruction/Screenshot_5.png) +manager_modules_firmware/blob/master/push_instruction/Screenshot_6.png) +### 6.1 Привязываем pushbullet. Переходим на сайт [pushbullet.com](https://www.pushbullet.com/) +### 6.2 Входим с гуглом или фейсбуком +### 6.3 Идем в настройки +![](https://github.com/IoTManagerProject/Wiki/tree/master/pictures/push_instruction/Screenshot_7.png) +### 6.4 Создаем токен +![](https://github.com/IoTManagerProject/Wiki/tree/master/pictures/push_instruction/Screenshot_8.png) +### 6.5 Идем опять в сервисы и теперь выбираем сервис pushbullet [pushingbox.com/services](https://www.pushingbox.com/services.php) нажимаем add service +### Берем токен, и вставляем его в окно Access token. +### Окно Device token (optional) оставляем пустым. +### В окно Name of your Pushbullet configuration пишем слово "push". +![](https://github.com/IoTManagerProject/Wiki/tree/master/pictures/push_instruction/Screenshot_6.png) + +### 7. Теперь наш email и pushbullet привязаны к pushingbox. Далее можно скачать приложение pushbullet на телефон и войти с гуглом или фейсбуком сответственно с пунктом 6.3 этой инструкции +![](https://github.com/IoTManagerProject/Wiki/tree/master/pictures/push_instruction/Screenshot_9.png) + +# Часть 2. Создание сценариев отправки email + +### 8.1. Сценарий для отправки email. Заходим в My Scenarios: +![](https://github.com/IoTManagerProject/Wiki/tree/master/pictures/push_instruction/Screenshot_10.png) + +### 8.2 Пишем слово email (это имя сценария отправки email) жмем add: +![](https://github.com/IoTManagerProject/Wiki/tree/master/pictures/push_instruction/Screenshot_12.png) +### 8.3 Нажимаем add an action +![](https://github.com/IoTManagerProject/Wiki/tree/master/pictures/push_instruction/Screenshot_14.png) +### 8.4 Выбираем наш email который мы зарегестрировали ранее и нажимаем Add an action with this service +![](https://github.com/IoTManagerProject/Wiki/tree/master/pictures/push_instruction/Screenshot_11.png) +### 8.5 Делаем все как на скриншоте и жмем submit +![](https://github.com/IoTManagerProject/Wiki/tree/master/pictures/push_instruction/Screenshot_15.png) +### 8.6 Возвращаемся на мои сценарии +![](https://github.com/IoTManagerProject/Wiki/tree/master/pictures/push_instruction/Screenshot_17.png) +### 8.7 Вставляем токен в веб интерфейс esp +![](https://github.com/IoTManagerProject/Wiki/tree/master/pictures/push_instruction/Screenshot_18.png) + +# Часть 3. Создание сценариев отправки push + +### 9.1. Сценарий для отправки push. Заходим в My Scenarios: +![](https://github.com/IoTManagerProject/Wiki/tree/master/pictures/push_instruction/Screenshot_10.png) + +### 9.2 Пишем слово push (это имя сценария отправки email) жмем add: +![](https://github.com/IoTManagerProject/Wiki/tree/master/pictures/push_instruction/Screenshot_19.png) +### 9.3 Нажимаем add an action +![](https://github.com/IoTManagerProject/Wiki/tree/master/pictures/push_instruction/Screenshot_20.png) +### 9.4 Выбираем наш pushbullet который мы зарегестрировали ранее и нажимаем Add an action with this service +![](https://github.com/IoTManagerProject/Wiki/tree/master/pictures/push_instruction/Screenshot_11.png) +### 9.5 Делаем все как на скриншоте и жмем submit +![](https://github.com/IoTManagerProject/Wiki/tree/master/pictures/push_instruction/Screenshot_15.png) +### 9.6 Возвращаемся на мои сценарии +![](https://github.com/IoTManagerProject/Wiki/tree/master/pictures/push_instruction/Screenshot_21.png) +### 9.7 Вставляем токен в веб интерфейс esp +![](https://github.com/IoTManagerProject/Wiki/tree/master/pictures/push_instruction/Screenshot_18.png) + +# Часть 4. Итог + +При создании такой конфигурации как на картинке: + +`button 1 na Отправить#push Push 0 1` + + +`button1 = 1` +`push внимание кнопка#нажата` +`end` + +![](https://github.com/IoTManagerProject/Wiki/tree/master/pictures/push_instruction/Screenshot_22.png) + +Если мы введем токен для email то будут приходить email +![](https://github.com/IoTManagerProject/Wiki/tree/master/pictures/push_instruction/Screenshot_17.png) + +Если для push то будут приходить push в pushbullet +![](https://github.com/IoTManagerProject/Wiki/tree/master/pictures/push_instruction/Screenshot_21.png) + +Способ описанный в данной инструкции более сложный в настройке но зато очень надежный. \ No newline at end of file diff --git a/doc/3.txt b/doc/3.txt new file mode 100644 index 00000000..31226847 --- /dev/null +++ b/doc/3.txt @@ -0,0 +1,32 @@ +*** +![](https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/blob/master/pictures/1.png?raw=true) + +### 1. Скачать архив из [релизов](https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/releases) или из закрепленного сообщения группы телеграм с последней версией прошивки + +*** +![](https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/blob/master/pictures/1.png?raw=true) + + +### 2. Для ESP8266 c 4 и больше мб памяти (все сделать как на скриншотах) + +![](https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/blob/master/pictures/esp8266_1.png) + +![](https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/blob/master/pictures/esp8266_2.png) + +*** +![](https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/blob/master/pictures/1.png?raw=true) + +### 2. Для ESP8266 c 1 мб памяти (все сделать как на скриншотах) + +![](https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/blob/master/pictures/esp8266_1mb_1.png) + +![](https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/blob/master/pictures/esp8266_1mb_2.png) + +*** +![](https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/blob/master/pictures/1.png?raw=true) + +### 2. Для ESP32 (все сделать как на скриншотах) + +![](https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/blob/master/pictures/esp32_1.png) + +![](https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/blob/master/pictures/esp32_2.png) \ No newline at end of file diff --git a/doc/orders.xlsm b/doc/orders.xlsm new file mode 100644 index 0000000000000000000000000000000000000000..4a23ac94ad00840bd3a086137099746ba89e7367 GIT binary patch literal 21287 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 1)sCmd.readStr(buf); cmdStr = deleteBeforeDelimiter(cmdStr, "\n"); } } diff --git a/src/DeviceList.cpp b/src/DeviceList.cpp index a65c292b..68b05d3d 100644 --- a/src/DeviceList.cpp +++ b/src/DeviceList.cpp @@ -1,9 +1,13 @@ #include "DeviceList.h" -static const char* firstLine PROGMEM = "Удалить;Тип элемента;Id;Виджет;Имя вкладки;Имя виджета;Позиция виджета"; +static const char* firstLine PROGMEM = "Тип элемента;Id;Виджет;Имя вкладки;Имя виджета;Позиция виджета"; void addElement(String name) { String item = readFile("items/" + name + ".txt", 1024); + + item.replace("id", "id" + String(getNewElementNumber("id.txt"))); + item.replace("order", String(getNewElementNumber("order.txt"))); + item.replace("\r\n", ""); item.replace("\r", ""); item.replace("\n", ""); @@ -13,29 +17,52 @@ void addElement(String name) { void delAllElement() { removeFile("conf.csv"); addFile("conf.csv", String(firstLine)); + removeFile("id.txt"); + removeFile("order.txt"); +} + + +int getNewElementNumber(String file) { + int number = readFile(file, 100).toInt(); + number++; + removeFile(file); + addFile(file, String(number)); + return number; } void do_delElement() { if (delElementFlag) { delElementFlag = false; - delElement(); + delElement(itemsFile, itemsLine); } } -void delElement() { - File configFile = LittleFS.open("/conf.csv", "r"); +void delElement(String _itemsFile, String _itemsLine) { + File configFile = LittleFS.open("/" + _itemsFile, "r"); if (!configFile) { return; } - configFile.seek(0, SeekSet); //поставим курсор в начало файла + configFile.seek(0, SeekSet); String finalConf; + int count = -1; while (configFile.position() != configFile.size()) { + count++; String item = configFile.readStringUntil('\n'); - if (selectToMarker(item, ";") == "0") { - finalConf += "\n" + item; + Serial.print(_itemsLine); + Serial.print(" "); + Serial.println(count); + if (count != _itemsLine.toInt()) { + if (count == 0) { + finalConf += item; + } else { + finalConf += "\n" + item; + } } } - removeFile("conf.csv"); - addFile("conf.csv", String(firstLine) + "\n" + finalConf); + removeFile(_itemsFile); + addFile(_itemsFile, finalConf); + Serial.println(finalConf); + itemsFile = ""; + itemsLine = ""; configFile.close(); -} +} \ No newline at end of file diff --git a/src/Global.cpp b/src/Global.cpp index 4d6178e7..89237a46 100644 --- a/src/Global.cpp +++ b/src/Global.cpp @@ -39,6 +39,9 @@ String all_widgets = ""; String scenario = ""; String order_loop = ""; +String itemsFile = ""; +String itemsLine = ""; + // Sensors String analog_value_names_list; int enter_to_analog_counter; diff --git a/src/Init.cpp b/src/Init.cpp index b5e79442..99c1d98b 100644 --- a/src/Init.cpp +++ b/src/Init.cpp @@ -62,6 +62,7 @@ void Device_init() { removeFile(String("layout.txt")); #endif + fileExecute(String(DEVICE_CONFIG_FILE)); //outcoming_date(); } diff --git a/src/Web.cpp b/src/Web.cpp index 5cc4c119..fe9942df 100644 --- a/src/Web.cpp +++ b/src/Web.cpp @@ -38,20 +38,22 @@ void web_init() { request->redirect("/?set.device"); } - //-------------------------------------------------------------------------------- + //==============================list of items===================================================== if (request->hasArg("element")) { String name = request->getParam("element")->value(); addElement(name); + Device_init(); request->redirect("/?setn.device"); } if (request->hasArg("cleanconf")) { delAllElement(); + Device_init(); request->redirect("/?setn.device"); } - if (request->hasArg("delete")) { - delElementFlag = true; + if (request->hasArg("save")) { + Device_init(); request->redirect("/?setn.device"); } @@ -235,6 +237,19 @@ void web_init() { } }); + //==============================list of items===================================================== + //server.on("/del", HTTP_GET, [](AsyncWebServerRequest* request) { + // if (request->hasArg("file")) { + // itemsFile = request->getParam("file")->value(); + // } + // if (request->hasArg("line")) { + // itemsLine = request->getParam("line")->value(); + // } + // delElementFlag = true; + // Device_init(); + // request->redirect("/?setn.device"); + //}); + /* * Check */