From 8e38095177d0090f4dc8cb02522e5a226baac3fb Mon Sep 17 00:00:00 2001 From: Andrey Klimov Date: Fri, 25 May 2018 09:29:47 +0300 Subject: [PATCH] scmd,rcmd in inputs may contain not only cmd but values, minimal dimmers volume treshhold for ON command, remote command execute on MQTT command (new Cmd.h required), bat-files to flash DUE and start CLI added --- compiled/DUE/Wiz5500/firmware.bin | Bin 102148 -> 104388 bytes compiled/DUE/upload.bat | 3 ++ compiled/DUE/upload999.bat | 3 ++ compiled/mon.bat | 1 + lighthub/inputs.cpp | 70 +++++++++++++-------------- lighthub/inputs.h | 30 +++++------- lighthub/item.cpp | 75 +++++++++++++++++++++++++---- lighthub/item.h | 34 ++++++------- lighthub/main.cpp | 76 ++++-------------------------- lighthub/options.h | 6 +++ 10 files changed, 154 insertions(+), 144 deletions(-) create mode 100644 compiled/DUE/upload.bat create mode 100644 compiled/DUE/upload999.bat create mode 100644 compiled/mon.bat diff --git a/compiled/DUE/Wiz5500/firmware.bin b/compiled/DUE/Wiz5500/firmware.bin index ade583bcee27f66e8cc14076587a0e4465ce3b86..22312ef49f8adf433a46f2fd38b826be58a7c3d4 100755 GIT binary patch delta 27000 zcmb@ud0+6#2)!iGAqgaeB`iV`;L@G2stAZ^*t7#GVbiE+heZY4 zfD3{kj_Bwl;*!OP0YXr5)KQ#7(E*gPb<}{k+_3fS^}b)-4vgP??~nJ#3)HQ>>eQ)I zr%s(Z)f->X9e+#bCUpk$D{Tg{|NZ~lk^lL7xwi~U{u{yv{$J|+Z#(BVN7`j|-h0nL zd~ijmR}F_hH~Ww)Qw${3TQF)%q{46I2J$@|Ymoi@Z^Qpz<5v#--vcwXYNyz0i`)3h zZQ&Gd_tRnuwHkLn9YqSG^yb}9x0KV{H2PJ6i`_Nt`Qj^l{{cIKyg=;JIyGyxd6iuj zfmrPht+Xy^5gO&>7pXNHu?K_VFT8!ksKDFJ=?;tFZ|0@qz=F&a$L8ic{F^TFQhs26 zW}+I~j95;fk0%c0s8uUf21SQ9Kk75|?n=~~^Tmg?1G&tg_^LK5g(Vc6_fF55KE_4z zCUj;yc&Xbjp3&O5fA~dSH<4=zixs*onlD!C=DP0-n<_J0Tg%hGe7`BPO7V6oG<$z@ z3@Xj{8?97`b{M1&19VuFBg$!zh6EDw|LD>=+RvFv4btetrgqY?m_Y%TkB)~W>&<_y zjv}U3;}o0gp*DjQ4jG*0Dg)YE?$_fx)~~DV>q=_UReT^%v6-A`;BHj@L~9_dfhvU8 z@di=?jB5q6z)RVFv(V7oey*gHmo$f1nUYom8Xwa({qn3DgY;QQE9j+GMcksd@&>8a zFE;AOxfQ>mX+pJah0T@bijmfZEv~8+DHTaT`$fN2klK=+$r#u+3~|8&i3sHe5}YRZ zoBWmsjMi9$tbsg1@36QG6sn(vx;LGt0Xd&6Q<^$#CGq=dug}f!Jg4V}M zPldU9+F(K(|Mo4*dcNGyneL>hQQ*6l{)LYY`=LA8(Fc>Z(l^~LDTOJXB$Zw!`E(6& zn6IfmlQRbX4L+{H2!E9?)}d?QUSsIq7$WBQMydS+VBs1DzCidZIEJ==!T%BN7dVC` zQ){M^7h+Sg)x`eP08p@+3shZMQzPe zy8{ItXq+7Dxds5W@E$Aj`ye-}nOKvA`pMBiE9nShpoUhrMwsj39UAb*M%mCr9yYWq zWk3}tVL|2T#CHunE#UY=c))uuLu<9DjY;CQ(lS}hj7g&|ad^xS zw^q7APMNL~^cPC?BvoVl zp?ZPKwwhXXh}q-?t{1B~s|MkIvZsozw+QfA%NVcaD|tavRR-?ep_m0WutKCqRhrzb zMuBA&HR&r2j&zq+(#cg-#IvBv3|eUTQ{ih{i3!*+NGJUoFzI6%FP87f=ap>ZQk&mtEhwo@}D^3#t|G%L=Vmyf-QDBCdFk zE4!Ow9I+_1N}=X>k6DQIkQ7pw)tSC2_Q6D() zn|-`sa2gz0*ehlzlcZ8=7CvcKyq|~7LXpsZuBKG+CU<0_EUQ>>{!&>CC_YuF!)X2y z&T(pm9EV61aBDFYjLRDO=*_3Zp1Aa(Z-$N5B4IRu8K#VOmcV}nDY?Q3gz}UT z(?>ds5!xFb+6$;n5y!^cu|GX1=Q?_t2LiC=GMAsE>LfJu~La?D+h&X8|b3xW(f>^8%Vn4`H(%{hgX5t~% zcns=G3~D?EHHHmJ{7-zJ^rGHDu>rAxjlMpx1XGfG;I!QW!)dILDzwYy(#j^nHX{|c ziq{iXSE7g7vVhc-na8Zfbq0ybnLu_%1utDy*fyu{e7A?j>$l6rOq}UUpAp z=t%-n9ttNq6X5?EGFe9naR{vp$AgpWrT>I1Zoy!#%$7Uo=xHcyY zWOW|kGs2kx@B?tz>L%7V7-vs$q$a{w0kszE_Ke5t%ZC;8NPIAQgh{` z%io;uW~(j~BKG^b7I@g2B+^TDEUjNi3*H>nwZ^#$%|95*1*O&?#D%ANmP;Jz{y{sK zTzsJ8>7L+p$BkIgb3zdD zo>RQpA%ov#hlCdg_&AYjC_?KMXy`37Qd|#LSy#apmI^8K9{G)XY z?XT9Qe;);(Tj$OzMP5g9CTNFPHPVlP2Qt$k&a?2p18u6H&%&p$Un(H$#nxy+w_7hA z3i~qOZ{FM-=NMDt`EM4FtT)1K&F?oG9E&|Sfyfxa&4GVATqzvm(Y0_p5zZG!CG~Z0 zK~uc&L-X_KRwF$Z*z0^A$ArCZmn_Pp%MSgRdW)Ag;3! zzbJS@CUyGyBB4Uy4=CQs@M6~=-6aBrVECTAD(m+0+sjJ8z#%&O?s6`{;7E{(&J$ON8kXrEho8Y?5t|{vwMt$!YH2LcCxRO0YQ;C^MbY zQ0dD6Yi9~VbAwZz74ZKNaP*?>#$YlCX`jzzT8S;>ufbTruCJeqor?=HsG9@krhRgL zA)|wgb=lvKb28rC8JI2+Bfn>s;I=Kq+Oe%(ij}k2hLz)9!g%Hh91V4%;(ao}D0lqj z#y8EvOvo&3;8%V1KbtXZ#ak3$G<);2rp6xg z@*^EttZ}t%#k(Lt3dWvg`*PMPIzXpx%jwvb7q;!uxsy*~Z;nsw%xmVwNtg5!3R1M9 zZf7Y*X~q&!yk392GYVr^9=OTF?_}U+)q6d*#Iy2ivU6q zKv)qd#(7IG{os#zjl1xe#+~oDNj7J)P5jOP9r0uLfVFh6u1mX@w+w{PG*W_wywIQ4o;0EJVUuW&?@7V9+th{6lXa-NJ&g|@qIHphH0u!pS zbyU?e`~sng&X~QoXnpn zPrn?qaJRbU>ZSg{BEgQvPy2RMyw|(~_%H>xJ4&w(qeg~_unxN&8T??^Gnl-1e^2uh zY6+8-HnaV1o1c!@NgJlql>d_aPV#{VuN%#^k^l)F=2_avEsyeLLb25xGRc<)oSVvzt*w_sXqn`QhVrrwVqR{RqHKNOKkV+Ecc+qmniXiXr)@B zL|LJhSfrL%hvUd%lz2bjwg?*G?uz+{xcpx?HK_b5rE9K(Vnh^2?YgGLRt?rWw_Wi{ zJ`GmE=#sR9SkYWbsZ3}P?qG)R|&#F|oRkm|yjYB?xY(EcaB63?={tGmvMAC3Rl%QZI`XP1{kqH?S3 zgPoR-f+YVeUL8mLSLhE2nOpif!kus@;Rwkt-H0R4*9f16`vdM0TnO%cIEp+ox-*R;&l&za%s=YaGR%5$+PB-V*pE<1#VB%yI~8qoQbtoNh>nJtjw zBeOWwXTh0`$1xMipoT#Z8+Fo;LAwwwy`r#@X{1ks;+q*MZnhp---MXUweZ>Lo~>I3 zqtqHJJlY6(1&e36{8;nIW-^4HA?Dd0jfJiBJb8U{QZvar)iK^mhZs5v5;Z&N;N2bA zWec&9(A^yxaj`A28S?OM#!~L~Yqpw&u=kR}^k#~;K-RclXe`%uNljdVwo_Y>(ZzY* zK{&PR8s`ps4}_^zbAYkTu=f=lg(&>*aV*q8Cd-wnM_ZujipTdt*N@#?fln2t!q5>i zVQHvPjPACCfA7|^Q#g}(Crqk*ys^bc%)IcNKnA%V>{7hXf~<+Xwu=sc9#1A!VH{G6 zaIRvo9#WXxt{0A3*`ei%uLG0}-Dl5m%+opFQ0U1V52@Y(zygQUie>FnfP2%gQO zn*?QpPAlYn#c<;kf6AO3(+UAuD}6`9UMVb=^c$d0QK(1pekU&Jm*egXUsEsEp%E$- z9;VXghxD!3X|@@KXhDNJ2l6e zsYNf@kHngxv5~Tmm|97;1*%YjvQ+v#^!63vzS_k*_&g_51M4K^DCu|`jkD2B#fS`0 zNTj(8O*-lGK>ImEsa^`VZO=+`3)WaC6*&`4`p*NXz*6z|EVKJ~Kx;RCYrX!bQUT-9V7#irqcQ(=TmY*Rg4rDqzz_4C*_A} zgB|_`KlGiwd89WlD{L2NgP}qv_4gYZYkD;&U-gcTF|6|l_rMu26^i#zhp9>9&^W1w z;;WN>QK!kBjm!WFnOgf#>F;En{yUVV`frE&ff^#}8U@UyubSEr%J@_2*Gj6I`a&q> zPpO|O$!e+?O8QgkF{ZUb$D2Y7zj2Wq@d+q<7}gZP5Dg7HTUCkhkHgP^zXQG%{%-ho z_?;LSV^}MuKHiw?BDq95Q@7kvQ=ySsL(40vkXB`GS_aB|0cXW~yQ&?zu4Tyk8;%L~ zrX?zi--ev!UAeA1D;A*Kp3o9^Wv(l&YH`Kwh>D>_m1$MAZMm+66}KY(L})?9!b)N> zRi#&LWxUZ|+oU7&1C>4tfCEXHfyJ)hyH_{i5Rk`ro{~u+Bvo&h&NE(xZDNSpFP|Rf`Ns7LvT|LM zD@FkbXGl;%6e@-zRvwxJ5EXBZGT*b2Fpl%NugqBv`aOedDx-BgLJLFdyV;FXF3MX& z6RTONZ+uL}q?0~UON~HidT4Dot%tTG>Yy^Tc+%RyeZfno1`Dz8=%rb{hqCS{zoV=W!mu8i7K^h#8s7okNRg04*A6mrE4F(fPKc5A1W9v$``aCQq5r^+W|BRs`N?v<+o3(P zAbse3Dow_H*_H0xiNxA|PA;X=_`?wf3C?VLO6ChqO(V=s7xj!VQ|QZ2DjFw`aS6d| z+`PWGb9P~*M~5bicdJ09)Br6x)*P~%PLb@KW+g8n@YKZZYnpPcjb|gD5eSbQSDj5$jZY25n{3~5->9aD0&;W~#*R~L? zz}4%d#{)dRYXdrb9|%O%^SE_$W%2eBoIZ(EJgA>ZLv-$XOEv$R23Hg&Tv6~1)RSoD zFuo5JUH$himh&!h;?$ftHRoOA>{oLRAjhcY7}cBu$N>vQofnX!Q*(4`&I=0XWcylU zAgQsiy{#8hY+!CSvi<1{6%?#4FP#qK^V3#b>9Ri%LEDq6F1w~ZGRn3_tq>z5f}dtu z6ShT58DUxwb#{R(p}xO0M!GAQVom_?dd28rAu~>tqZD&nLVcOjjQrWb(u(x@nYBr^ zWZSk{x~;306A#;>-J>gFq{Z?m9Qbw8h(JOETPfoL=?!e1xB|m*ZKVURhyeyi1rlD1 zX_#TN;lAa!05;`C#n=^Z46}H0Fuj5K#Ub`BP`_hBwgz5^LcAgz)xg?$Efj@sk(w(7 zbkeYJmfOizir=3BHo#WM`oPEeeY!HHAnxL%OeM{sdrl+e`^{CRwghP2qddBXc+^M; zaM_BtHl+2$I1<2I75{R{$eSvM*V_OT39;@%P?3!S&c9p{+4*p9OMdCa|G4|2NEqSk zYcS!SC^8W4*lM;X^qmsn`fp-?&p`8?@YCUc20sn{OYl?SABWF&wLS3rz&`>%8UDNQ zli6gDR)IejE>P*G7+~7}jq&hWNe-VE}ukY^lAL{k*@AX$*%UIrq5 z*WsVeHjqa6OOStaVXJA%qm4G#r;z@x1mj>@&`;P}o_N}Z>z&)MU9pV}dxa44PQ)co z$oq}5*mbd6Cw&(j3JhsMUZjKZ;g7+SYjEGBlfDRwV+Uo$9rx*^W9nX_c*puh*C2Zg z(n`!6a3ir&;nwX+pmqDjrIygRMR?i>h{JsAsHymv_{t(cScKX z&@IJ4cBcrp_zMMtMf)0&9t$&ZAg6F(Q?$=hH;muWCCu+P8kH)p77F(GS&6UUrPAep{Xel9Nau^%vYg*~|K))utV1Z71xRR)z1*SQtsG>5P zUS`BGEZH5od}JmbJdRG|Ft^N>fsH=t`oYsU#Rve$C`Jd79)wx}0eYjO7$-ah$J&t~XFb&zBMf(paHit)y9np{p=fWJQsfxw#>nO=B!6xv zvHfQjk;aC7cJAx|VcJSI^t z|;9P%z7kz>5qSl*avn-H6)r9?`MAg zIo%$^-c3y=(YQBeTio_!5ts4Lu5_$)M!yz&AbMx)&iI{4J2lcL!E#UBHWSN#cBx~T zGxoJH!nM4A1&4X~y-OS>QMY%oGg%xBO;@Cr9CQyv*6ofvoI{1Aoynp`iV9_UZgtFa zmS6QOWKx_)8XeT){9ESR*>;QbMvNmrJj*!)J{MjtMQLnRI%$;e#!7N!X=znqTGet- z*n5XUZA(4VD${DsZ4@e{br8^~hqKwLD%knfKED$>Apfl%os{DCF;-&2<=Ze*Jm_(& zT#lwE$~rL3imuYB>@X{Ijt32-g!RpI2)R^WHx3nvZ#cA5yUUYKCtF83ld$eT3YVz< zKLbe(MQEeaudxk)VVbQ9W^SQuPd?JpWO6tOwZE4KsI}8iyNN9Y38!VNnvigsXNDJm zxjt-Y;%o-weJc0G=$@ZpV53t<3}sth)!77)-R2-I;qAAo=Z2E0Gj7rlqspxIh7zFN z`yRr6JbZ}%QoT&B{8Cz2IMl;d#_V3gG`rVF^fpXvT8zY3;f^qBg=5BpjDfHN9OGDw zIsE}Q9m{G7T(x5}ejEP=)QlHr3S~fjlTUDthu`d* z>aA3}hAic+jU-`dW$1wY@6andtb>&)Kkx!`cld;5*01q@);x5<~r+Y)@zi zYNht;HDYWRf6jIB*lsy2$W-T~YKk(uf@`}O6S@ae#-@`^?>dCH!Tr^Z51ZQsgAL>> z%ssQVxXgSwf;>hC*XEtE(>S<1xRG!zaE4Z`bicw$@!*8}p(fFvHGvAAR^qYH3{6^T zxG%1_B<7UUh>M5F?L2-6dd*qA0GzHUB`cESeAuXx|~v!jCIz4Z`-k`W)%C@{?u zlL;8rvd+pBn8cx@sI$!c^;SjK+Y$9C-W${wLf*Hq6JBdW@#@;yL1crh0YPeDYHKLf zNN*ou?P0fcqfsanQ8^Fp3Fz9{;`=Sgw6@TV$jR!xoK|WHB|4Ivob)kv_eA&~LAFbP z|MyU`St}{wcwB*H)G+lK&g4!aeH@N;#sT>c%OP*4%sPdkMU7Va<>)m9c0Zg4X7vZ! z=R?qEBRvO*b|TECfMa1J&hl z#?O%QGAxN<=n={^=YX!C4_T+e<`*fal^4x}k+L(?KMGS~N71bzv9vg20M4T>A~l08 z5a}%-It7g4H8t&za2kx(k`RB%FV+>Ojot~dPj06W7)b{MGz)+*pc!xsSO)lxSiN~X z(r<)Y3HL419$6`VQS9JgES@=R%5YX%hPyUIRsyEd(#VhwCegdgbzf?s5YU1mUR3N8 z&8m^|WpUrIA<181DOy~qz~nrCin9;=&wQe1STgsWPrN#8kejv0U|_H?WHHzn!dQ%ywIisyVJ{)j(A4C;nx45%(m{u5Ok0&*C~3!4 zgn3J2oHP-7SeIawQi9@~5m_d!6zzi|pjUUjZ>9LyhygIGlVq`RL`fVQNh3z`1>Dao z#j7Je&mQid3E^LNA&MBKA^x+n;h6S96#ei*3|Eu3y}4|n5mx8oxsfwyuw_)qKuUw+ zf>A$lXJB$16kTwHpw;^o`(sud8 zqoXt2zv56tz9$~Oa{A>u?gP2boMOfode0x*uB8(-J+(Lel$vg8O`MW~3*fiV^xLT? z<<|$El;0hBQm)tQr8|(;iL{TAb`ojFkv7YxS9>59)(7ihgPf9-p|4`-`SpJB_Avri zyGnd@%m7Xk5I-L?Xhcqc3|NynX_BVvq`Zm1$T0|it7$qhZ_w*cI-rY{0`F_1Ptx&M zy9}O4nF#@L@K_f&EFkV4o6W@s#G_*~xflK7w_}G5SQFSGKUv6(Q&PG<&?SGxYM3xi zXMlxDui9qnC0jroal?o>{hyL70r9~b25_7G;!8KIHZMF>Yw_Ya1tHX-cxyUH2U{F0 zycA&)D~=d9AY1A!DrI&P&V2E@hXH>)(bcNJ98fbwsv#J`sh z<@QY${pBZPwufxBNlnmwN>7EvGZQ}NY$5TriCJk$q5ATIFK{CZ88->$-^@;ymrh~L zPAtth==(=Ewb^REhq3E5=-7Su$))1xNfYzm4eDW&Q3NjVjWVYV_tZgK^RbL~%e7xz z>Nevkg^Z^Z^+y;dYF;hAHtDZM!8cv1nW>YW^@($Y{GlbSA5>}g^7}qmKx|sr6>}>! z3nwg`uztgOc3ItxOIxza_NWF{F*@7JYs^@f;znV_SQsJ;$6Pw;y}%+@=|#@^fo!(C zZq2Bge%W^8tyQrV39i_RrohFE84GcQ8G5D)*NfIYRTdaI&#;J>g+UI@S{N(mab4>l z)(yI=bD?Wi^?7~TSKF&;-WSbWCzq$|Oz?pD*Q{*gtk%_fScWgya_h~DwzS|zlKX-d zFIrDM1W<{$PJUtN6PRUYlB93dRVG-8sIAoD_EG0x21}_*gnijfxDAQ};nYQy<|m5d z978$tdU2)0lX-8L*w5n%gRB3~GN}7ZCM%Ko`Tc0LG}$NK>)bx5D@<)0<%xwGf<1juM>2%d5?~FQ z>*@p?OfQA|InC7?>5p)(!2Angb9Fju^-*@9n@dfLs#}^;)Dr(j&H|J;6Sh4$BhS#8 zsHT32RLhgt9i^%0Mlq zeE`QxXh(~FUx3fdwj%JR0iz6JHqQjD?+>>Kl~!t;fVwl_80w}B&c6dexpgZuQWa=k z-f5CUY>O6hz!p*@&Q~-|FBtLAfR}=@_}P>fK>7z{y-?rHE~a_uZ}Q9C#)7mCW}V7N z^no?vmZ?7^^RS863Omq-VGNg-befl}vRF4Qi-!T0EWR{t+^sp#3Phb{%0-P72%FpN zP{3%U3?ftPMjINaDXvjtwd z5E5UQxu@!U*b194UaC}1oabmMLZ0whnLk!1R0*3AJ00eQIiMY0Iv)OSTf=%<_x7Z?wCI9ySQJj~X@=R7K$4UB4gL~zy!1~14G2ZO%nZqS$rd73 zV4#%*H2NBi?e;yPVxGnr_bEvixHH%@xVA z?^BpMTQRSfAo;R2b`Iom^L_L~k%Tl&*WV*4#aQldbfx~k&npn&cU1_A4xL197<|LP#55ZeE`n$3-|*mC~}iwoxrPBh?N1@fKXYx>MJ z&%#OnQN)+#*tyRY@v}LloEQ@0<_^2#v2Y1Us|8vzbCng7!5BQwlpQkUr5LomBVfYG zT(g?Jd8uiIu!XcOu&F6*(jb*hB`<9X*DNT+PR9-xYXdk4A;+M`)`Q+Tt)tw(LLe<^;_-OuJ!m{_ z$kRig#pJn-{UBsE!PdULW-@zY39}-}%k+h+WeF#J3Cj{DzS)5W2#U2Yz)FVX4em^1 zx(62w^I;2%ODyS2JX$1Mi8%@36G~QojxbfuCYml&C3zuJ{O;C1?%Q!&@9kOy!>(#! z_hgMn@6h8g^d1g@hm|aKnK$w{vw=g_V|=X7eDuj~d}GYogRkbj5gVwTaV6PNFm3aph(XmL|+lbG?#NQ`2sQ8km!A4cls$HPJCPr0CR?nMfI( zr#W?NrnN>>@zu@O1c2AkQ8nCH01guz^p^}B2QxmAyK@YHhK-7^Ahx6$zJdz8BdLm$ zPJpMgiVVtOEq!jA#es@*WbxkHH*!BH;^o^vFP|IcFHF+RS+`N{HB^q-*k;+hmUk-iS1$@|!X;H+q}iby9= zh&2+4{XIy{k(VFrX8ti;Aa4Te;G`#D<;nnNfCgauVEC59lheAsrIVsh4F!fC4*$`; z)U|Bso^oAR-c!T#G+kQH^s7qEd3?h)Kf}tJNJ|oe(e~0y-_>avV$|`q1V!P#tTY1q z^XXTEH6KA`6mLr^&BJ3GB25p9Ywyb%OQdng^w+$OCSrSxls(9N1cnyI!Y|v{m*idS zV#ROAFo-ly{mxOpvx4H+_YFvfiE!|8H+u>JGa|M6w4i9ZKjUU1vBZZ7*J$p$R-P@U!s>-_V8)J=yUXr3@>%a<%JqVCliF!HOR z8XZ#stYbvOtMj0ECu1IneSDX#Vv*}cmsmcwlap42_?{Ro!5NfZsas%oqY(pMlUTa? zRzg4!7rCm1;Z`aVX+yx!MzRxt$uca#TOj{=@fM0m4+n_-A`BnPE^aCsjhuJD^;r7c z0PzeHqMb~474J8yS1}+3Z1WlqHB-E7Lc?;W^sTuD?jz+>- zgoEvzz+0lsIvbI$wnx(AkuJ3toL4YPQXL07kp6gp%;7Gy7L?T%tYuF#aJqUhsO`C# z5b0RJ@^H=q8!leT!X$@rldrHbum>jA%H z7H-lyLlP7hkQ-s75$&)%oPtphsRx??drnx`Pw{S6bi4UN#k)$;tNt40A=e@>QC5+y zwphHTQY@%tgGD(ej@dV2JW@b@$aPBQ&3Z9$Z}gOTF75UxQM0#Dh!zb8Q0f2`AyK`i zJHYSI?J(>xx_2nvBZ_K4k0+FDPE4)yTw5A%cIicG)9iRkjxW^g)m22HI*(^qhV3xg zM|G`Q&j=}i)p55*Ro>`=B_rz4?N7=2Lb_K2t48iM_EzI-Mc@1Co0T2Oq-D!sOrs<8 zf!Wf7tsz&_$uSxXVdKFgTsDjPR%(sy(NnUPNDqk*EbM#dJpn_z#+B5%7Z2HY zPcCUPuT}GLR1>^w{$0&IlzU0_RFJRF6_$d!4u?el!Ymzw8RwI%MJeu0*dH}(4SD*`c~pZ9Mgz-P84Rl6h$@=l zYD=CFCs3S44Y^x|i4J|I5o-G-a=Eh%_8wv7K@XL_Q%KGo{zrY&e{m)lidcOOFdP#c z?bHh+QL0^mAu@FHoHSA%0o^>6-p1wSD3~W>1(wTqv~844TZ^0p$f#E=YfaWcC^|yc zdGu01pEl%=PCDFB@OhUFU{2_?Pxbc8+eC}=>L9WB^EMr8)=b>n+;XLEc}WL0tVMZs zgEpDhQVZTj0v%T}`^dDv(VBu5qoEGYa8g`yw3lD%NI!D6dsU_K*AxR7`ag{#L zR!jTG=;Z&Tx~(Dh!s|Z@qq;4j2-OV=MX2ty?;6!T5fER!Gs_a8x~Ts{>Y>uo&^4*& zviQ@T&&2g(FS_v32e)5XDB}9N$`h~nRZX#(36ViIj3n{vyBy|^k?g{Paikn?SlGqCLLY#$R0;I@P%zv}^scWP= z&#yte6y;{JtqX@ERx$}%S(N4I@KS=>z_arDw*@f$ec9nAqcUS^Ms03QIesq! zw;)xSHB@>nOf7amk%cA2OSgo8TM+L-rAl&hJRWR(0jr6L$`Tqg{I_N%F=pX5dMqr+ z`(vBsaK$%5G2oX|N+84Qddd1>TwRPN`T^jhk&YQv8*l_eUf1K2SIfo%V=BjYN6O7E7snq~$P4@or z4dgNZdGRmz^by#k8KVh}D{_$z--wL-3L^`grFyTj~rAQ3R5@;d^mC_-j`q> zVfdCx_8>cQq~ORwrR?Azklr;7*_fky{p`&Uhhs;pTvIp!8y^|K>ZRjKD&SGfJ`ewb zv3|s%aaA~PiOyII3z@T9B;nVh*X&r2~SnLNM z8Hh(im-sP%Dc^gBrF`I{Bd@3>kD{dgddU-iD*4zMb1I6ydA(?ZF9KVxBK~7VhI^N9 zh%j5u9*-a1X@lJ>`oiy0_!hv>eH8dvr*h$5ZqJ_bo=)^ElYxQe-IK;&zUeL2`-5om zs@nS+bp*rI5j^T!h7l}VRI28<)SP@Zr`C62Y2QN^79LnMRL#4UL0RdqlOv7hs*TQ2 z8;!`Vks}ZL83~*-U?@L8sHzg=o1>YqpX@6XCbHFm86nc9Ix2bn;+reexL^F@$14YL zU;9OAWeL~Dykv3Qs)Y#;`xo8)@dZM5mv1=DTG%W$ts26e_K82NvT~JvQMY>g7`CDB z#;-8oGM4@3Lh*6=^+ICHsX8v#7cxx`lk6cfNxwlMXm)X~?XInpwRp@(r5{_qtZk)J zqwotlAK~_Az{L9I4Sna7&naVk+GE3eBtf%+=@}=im?`to_>B|1rP@8&?7G$s;!Af= zrZ9dyj{3*tCyA+L--Ami7lc}2?Pxk#9KZGk9a|)s_lxV-Zl!0%q=zTdJ>tBF+p)2y zKT_G}Q|y>nOOLO@hGoLW69?;@DDi!o=v9!mti2CNOjP%6lc;SV{LcD+YTTtZc?A*OU zF~9D04mYf4>ayt+QK`!*=o_lD;QeOL&jgp*A>Mk-!uR|e;rNiDCyFvlZo5CO-q4dy zb&^e-x$aAQnUY+oZ_tY;<&xq;0i7lq#IScXj?ANkKdfQzIE2F9l7Kj6eg0I2fzQDv z*d}rsJ`+7=!=DFdgJU~36BOoQ*I{L9CbNH$w3$d_xBM)>65&Ge!}UXGQOlL}&(Is@ zpz!M$HZjDNmZnBzuaDu+K?M&SyF2lq3?8(VvPMX$v9u8WyD55ew)o!0k+G~hR)Xag zirPmj2Qgp^TQ{uGOl6!&TSZrtulQg^p?bDrrxWA#(~0=tqglEcX{zx4!lPs99Pyh+ z=W=83YZ>v_AWB0m3m$)na;59Ve{TvW)Sy-DS{-c83Sr6-FaEZ9Q9>8?3$_nHAb}zt zk50t}TT;YkDGCBqS3(!s?X;bAguY~w33sxn-riD^|PXy@mk z+$QnL6F2GJ3WU3NuWy<5X-v>i$JKc<#G^u{f5tn>|V8zMrs z%8QdXQ>|^n3=`1L$~IgtD?a_^fY`SIF~wZ5@xLv;_vYlpb0}~OPKFD?0nm)Mvf^0s zx4p?o65bk`!jcsHupKMOx~_i5KoZ^&pMEPtE&V*QM!=!;J8#`m&PpHdO`4!48^~Pv z_raN3?QOh6vhV;|3y{gOW6ca;R_9;6bc`$%b@0*H;HF4&b8pSwXBBtP{|F~0A;GacWAg9GW0Eu#*`Q|{OM zTPoho;$qnOgw&DJnH_km@%o`6J}$0whWP!VVZ14>v=f1m_=&vq!y{>@IP>siZd8l7 z=kQXxO4J@%9=`xT+XX#Jondd^CMrEIZaA`tTE*@o{bFHXVBZ22Cp)>tiV5vQXh1A$ zPofvZS?y&7olu3I?4nYfY_Vyo{@G2XC^fXCn_V(8Jr%L{ z{0I&6*{yxZJ1IO}z1(DwMOq#ko}#9N+}=ln>;gCBEe=;ilDunsQwD`6_ol4sO|gV0 z^`+3NBs8RGv_A zc0;gSs6^pWLBnp`8$;ihCqzp95V8vEg(nba(nZL72DR9z*_iSxL*6Xl!U$Ys{0Wp~ zr0I}$JjC!3sTUJum|(rkNKp~W2b0uML^=$4-xT|QFyCFfnJq49JQh@G2=C5r#8q0n zFs~PdM*^(D$avog{G}HQOa9c&8-cTO$%_XnZ<@$%mP6iG0_%nN-A@4UUxRUbUd2^i z63e+OR=5$ZvZ)JUSB_xnnSixWot7s8hTRMU4C0V?eQ)+7fyk&HRDpaPCF0+X=k~LqFLtLtrgxC(YG0Ao zW{bZapYFckXZ41v_1N_O8s(6nG*wFA~{$U8Zh(c9hA z{s^AO1yg%d9`8*V9*q2kNXWZZ?ECjwZWpLvPJ|LV7&R!$Go^|WPeNWf@Op3EvfjFX zs3?jcb@+9VBk}L?b98JH8JyFlx(Oj~whDKIf`V8Pk)h91;r>T}(L~6bZ2r^WVlX(i zR1InxG4BOe;l%ilQv1FZu>D91l&gzhC-^~xem}BCBXqD&Ec>W9_Mg80;@l^$`zY1D zBCxC%_`4wp{&biWymv;km)ouBA!Um9>|s`(nD0dok3rue9lob>&!jibF2#4eH|}*} zy{qyBtUN;A=X~?jb|Rcc2+UPu|DDAf0@v1TFIpmKaI2&@7mKz)#o4s|UHJK&kawjo zGDNGIO3XI`0GA4U1Wze}Ya9r#L9dh1Y-sXgRYnn^f|;dA5WU_fj_Gk6Gve$J@W9`^9GvUo6_pPMjnmG%RL-15@97m-oN>Ey`^4i z8TrXU8ufSl7zkSiCeizkeo>0T;0t+Ai~T-*E};?3pMd!j%ElM;zAAq7=_>oZ*HiNV zebBpDu}EaXgkS!?;{EO*9$a*EGfLZp9sIKa)F*EKteAc$wtqG|wgtw|(mK{b&>Ijf zC;HJB#PKKYG42MT*2DdEbIUs?UZsiOB0T?V1EDaUehaF|go)z4|NJ5G4J7S5XCNQK zh2Z*~7Z-N^o!-`x+qIYC`10WwZQM&fvF^*vxHL!@%+;xW%WGdgtx1>zi-=PN zGvID(asKNkL((bOEs@TWc4o93=*+{hV`EF12ZF(S=UQ(3ex;s%)AHfDXDHn#&iW-c zHHQ!|9e|cM zF9?(~JtbcK)lT1R>Hph5DJ>WO_KM=p-V&PK(XL*8NF9re%YDuebBIHR$u<{8+&Ea;!ZH6np6p8N-isP68D zOyk~`rsWP|P1>5co%Mb8d?H#*5vO0h5c?~B&Xd?!DL+`;WbYeUtP!>v2$?a8A(0Rd z_^}84_zyR~r6p1RS#Mmu1;643w_{5yN8jd>YH^8v_IwI0m2TU>+VguW4}QYoI&@$a zO0m*6!_9zuw`WOw>7_U7SZP-Bgq(TI=Y9TQ5>Izh+I6r&i(0y^C|SDY;1@dj8b|x= zdN_(MGqV0}gPXJE;KeBVCZ%5;+#gMsT`!y%OYIyr>>3kKALTY}Irx4&&EUDOl!O0H zqW5Z||B9+#DOjO2>fr2DxXJFR<-5e z)7kWEP91Y65qH(s zG5%L?(@~~nA;dC~S>@n23?v<_NUnH4Qt$-4RX+t5woruIs;+qVDgW0RKX^KyK1}I@ zyJiojd+(U0&;j&@cZK~u@`{vaiM6)!s#h1jMlBk*hE`mF@g5V3i^`du@J(EdREiXpVS{}|cpZNNk5tKL^3aPqdR zc++@oQ@HA#w(I^v+AsE!Y9knFY}T&*g>=lkZNLh7lC4R3JR_^iPec(mwd@zVu6mFC zse)BqneT02n{foLZ=f}Cs(lJ!mU!_Ao=*q3b*7Rqvht!r@UboB)grk*w3-nupiG#wGfy_j$FG1M681ek9y^)jM4k zKv=1(-lul08$kyyVR$?R7ZI2vK ziQq2~hGTnicsvjfQRu4o)^HuZvsEA?*wyTc9Z6GZzg;;a>G-H8ddC}k@c*go+GC?A z!uWg?dV57uNo@lZ>{e5nLLW#4>|swM6gaT-%Jl%#qS@~5-L1E`d)(ep4ua)Ppgd#9 z_y`Cpe_+xOOw6SL#7ERff(dE^jX@>h4>2)P2|W%){Ow)U3em*P{qCEc=QqFkc4v2X zW;Zg2YG~oEtWq{NL+KxH!(x#4thPitk3nz!tuVnkIT$1^`$3>N8S2H=i*WvDB zDBYD224@I=TShs*;G$Az@vU5&&*C>-w4$76HZKqciP_prACV=NOg%Dt$<1^>kIbcd zXW!jisti9qmwK}2(@T4}>q+{kU+4`#=BA>LSUI8By!37tBPwjx{xTm$fvDvaU)oRpFBrx|FXO zOo^=Jw-uViXQ))dA5>|w5H#arb8A~0Z&s;vf>*MvE;FWxiKrsk#rvc+_^;#pRGPrw zR4K%ZgH%ZkyfH|V$Li9$Y_YYm1Ya4%Je-Im^PwO$RBKVOU5mC?D~8ox9qekawi2C& z8efI267LDM)VOHHrMM=G9xty6QN_4+*)#%LP?QuUwu*a0G__Ea3a11yf;MUGu&=B z3#odPS*R(~O-W%vHO^2GW@pA?>T0G%8A@f@#Qa)_WcQzRYet=HMk3I&j`_k`G^!cF z+S+V3aEbG>RborcTrCtaS4Zv)&@4}__?(##Wy#300m6_?LelkQIjj6X^c8S-fDSlN zh^`r7{zZTmPWM}O@pilZMUEJVnUP@y*ocNpNgBOIC8yj1s{)e1HsCFw&z&j>(@b*D z^1Mo52gOCG|cK~U%z?|4W1mH_4Y$yB<0>=Q4p~3oXYr&z} zV$eXU%B1>&ZvXCF8HQvq%?L1aO<<(nEV(bopc8TqPzp%Eq5T3o4><-Hx&2%GyZ6Lz zTC2rjE~)R5)JJ9Sy#Z~H2rL149ykb$$NnD3iAMyUSx*hA>+31x?7m#@WD`kX&A?Fy zh!8-+!vZTVLsTqGB^Q`|1`=kl3e7t3JhD>-b}bB3F)=g?lFqCZSYr}l+mUVu+&y3) zL=@wBhyN%l_o0BP;Oy+J)57V)cph^T!@yVj?{*WuTXAt4)f67aEdDLP34o0zUbLMy s@N>Xd-BVUB6naTW9cdhxe$C-L9lpYEmE!pT-An<6{eA806&Jpcdz delta 24586 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 diff --git a/compiled/DUE/upload.bat b/compiled/DUE/upload.bat new file mode 100644 index 0000000..affc186 --- /dev/null +++ b/compiled/DUE/upload.bat @@ -0,0 +1,3 @@ +mode com3:1200,n,8,1 +pause +C:\Users\Akmal\.platformio\packages\tool-bossac\bossac.exe -i --port=com3 -U false -e -w -v -b C:\Users\Akmal\ownCloud\compiled\due\Wiz5500\firmware.bin -R \ No newline at end of file diff --git a/compiled/DUE/upload999.bat b/compiled/DUE/upload999.bat new file mode 100644 index 0000000..6f35168 --- /dev/null +++ b/compiled/DUE/upload999.bat @@ -0,0 +1,3 @@ +mode com3:1200,n,8,1 +pause +C:\Users\Akmal\.platformio\packages\tool-bossac\bossac.exe -i --port=com3 -U false -e -w -v -b C:\Users\Akmal\ownCloud\compiled\due\Wiz5500\firmware999.bin -R \ No newline at end of file diff --git a/compiled/mon.bat b/compiled/mon.bat new file mode 100644 index 0000000..895fb94 --- /dev/null +++ b/compiled/mon.bat @@ -0,0 +1 @@ +pio device monitor -b 115200 diff --git a/lighthub/inputs.cpp b/lighthub/inputs.cpp index d096b2e..c5011dd 100644 --- a/lighthub/inputs.cpp +++ b/lighthub/inputs.cpp @@ -27,11 +27,11 @@ extern PubSubClient mqttClient; Input::Input(char * name) //Constructor { - if (name) + if (name) inputObj= aJson.getObjectItem(inputs, name); else inputObj=NULL; - - Parse(); + + Parse(); } @@ -42,34 +42,34 @@ Input::Input(int pin) //Constructor Input::Input(aJsonObject * obj) //Constructor -{ - inputObj= obj; +{ + inputObj= obj; Parse(); - + } boolean Input::isValid () { - return (pin && store); + return (pin && store); } void Input::Parse() -{ +{ store = NULL; inType = 0; - pin = 0; - + pin = 0; + if (inputObj && (inputObj->type==aJson_Object)) { aJsonObject * s; - - s = aJson.getObjectItem(inputObj,"T"); + + s = aJson.getObjectItem(inputObj,"T"); if (s) inType = s->valueint; - + pin = atoi(inputObj->name); - + s = aJson.getObjectItem(inputObj,"S"); if (!s) { Serial.print(F("In: "));Serial.print(pin);Serial.print(F("/"));Serial.println(inType); aJson.addNumberToObject(inputObj,"S", 0); @@ -81,40 +81,40 @@ void Input::Parse() } int Input::Poll() -{ +{ boolean v; if (!isValid()) return -1; - - if (inType & IN_ACTIVE_HIGH) - { pinMode(pin, INPUT); - v = (digitalRead(pin)==HIGH); - } - else - { pinMode(pin, INPUT_PULLUP); + + if (inType & IN_ACTIVE_HIGH) + { pinMode(pin, INPUT); + v = (digitalRead(pin)==HIGH); + } + else + { pinMode(pin, INPUT_PULLUP); v = (digitalRead(pin)==LOW); - } - if (v!=store->cur) // value changed + } + if (v!=store->cur) // value changed { - if (store->bounce) store->bounce--; + if (store->bounce) store->bounce--; else //confirmed change { Changed(v); store->cur=v; } } - else // no change - store->bounce=3; - return 0; + else // no change + store->bounce=3; + return 0; } void Input::Changed (int val) { - Serial.print(pin);Serial.print(F("="));Serial.println(val); - aJsonObject * item = aJson.getObjectItem(inputObj,"item"); + Serial.print(F("IN:")); Serial.print(pin);Serial.print(F("="));Serial.println(val); + aJsonObject * item = aJson.getObjectItem(inputObj,"item"); aJsonObject * scmd = aJson.getObjectItem(inputObj,"scmd"); - aJsonObject * rcmd = aJson.getObjectItem(inputObj,"rcmd"); - aJsonObject * emit = aJson.getObjectItem(inputObj,"emit"); + aJsonObject * rcmd = aJson.getObjectItem(inputObj,"rcmd"); + aJsonObject * emit = aJson.getObjectItem(inputObj,"emit"); if (emit) { @@ -126,7 +126,7 @@ void Input::Changed (int val) else { //send reset command if (!rcmd) mqttClient.publish(emit->valuestring,"OFF",true); else if (strlen(rcmd->valuestring)) mqttClient.publish(emit->valuestring,rcmd->valuestring,true); - } + } } if (item) @@ -136,11 +136,11 @@ void Input::Changed (int val) { if (val) { //send set command - if (!scmd) it.Ctrl(CMD_ON,0,NULL,true); else if (strlen(scmd->valuestring)) it.Ctrl(txt2cmd(scmd->valuestring),0,NULL,true); + if (!scmd) it.Ctrl(CMD_ON,0,NULL,true); else if (strlen(scmd->valuestring)) it.Ctrl(scmd->valuestring,true); } else { //send reset command - if (!rcmd) it.Ctrl(CMD_OFF,0,NULL,true); else if (strlen(rcmd->valuestring)) it.Ctrl(txt2cmd(rcmd->valuestring),0,NULL,true); + if (!rcmd) it.Ctrl(CMD_OFF,0,NULL,true); else if (strlen(rcmd->valuestring)) it.Ctrl(rcmd->valuestring,true); } } } diff --git a/lighthub/inputs.h b/lighthub/inputs.h index 0852ad9..b93c02b 100644 --- a/lighthub/inputs.h +++ b/lighthub/inputs.h @@ -20,7 +20,7 @@ e-mail anklimov@gmail.com #include "aJSON.h" -#define IN_ACTIVE_HIGH 128 // High level = PUSHED/ CLOSED/ ON othervise :Low Level +#define IN_ACTIVE_HIGH 2 // High level = PUSHED/ CLOSED/ ON othervise :Low Level #define IN_ANALOG 64 // Analog input #define IN_RE 32 // Rotary Encoder (for further use) @@ -31,36 +31,36 @@ e-mail anklimov@gmail.com // in syntaxis // "pin": { "T":"N", "emit":"out_emit", item:"out_item", "scmd": "ON,OFF,TOGGLE,INCREASE,DECREASE", "rcmd": "ON,OFF,TOGGLE,INCREASE,DECREASE", "rcmd":"repeat_command" } -// +// //Switch/Restore all //"pin": { "T":"1", "emit":"/all", item:"local_all", "scmd": "OFF", "rcmd": "RESTORE"} -// +// //Normal (not button) Switch (toggled mode) //"pin": { "T":"1", "emit":"/light1", item:"light1", "scmd": "TOGGLE", "rcmd": "TOGGLE"} // or // "pin": { "T":"xx", "emit":"/light1", item:"light1"} -//Normal (not button) Switch +//Normal (not button) Switch //"pin": { "T":"0", "emit":"/light1", item:"light1", "scmd": "ON", "rcmd": "OFF"} // or // "pin": { "T":"0", "emit":"/light1", item:"light1"} -//or +//or // "pin": { "emit":"/light1", item:"light1"} -//1-Button dimmer +//1-Button dimmer //"pin": { "T":"1", "emit":"/light1", item:"light1", "scmd": "ON", srcmd:"INCREASE",rrcmd:"DECREASE", "rcmd": "OFF"} // or // "pin": { "T":"xx", "emit":"/light1", item:"light1"} -//2-Buttons dimmer +//2-Buttons dimmer //"pin1": { "T":"0", "emit":"/light1", item:"light1", "scmd": "ON", repcmd:"INCREASE"} //"pin2": { "T":"0", "emit":"/light1", item:"light1", "scmd": "OFF", repcmd:"INCREASE"} -extern aJsonObject *inputs; - +extern aJsonObject *inputs; -typedef union + +typedef union { long int aslong; struct @@ -68,7 +68,7 @@ typedef union int8_t reserve; int8_t logicState; int8_t bounce; - int8_t cur; + int8_t cur; }; } inStore; @@ -83,15 +83,11 @@ class Input Input(int pin); Input(aJsonObject * obj); Input(char * name); - + boolean isValid (); void Changed (int val); int Poll(); - protected: + protected: void Parse(); }; - - - - diff --git a/lighthub/item.cpp b/lighthub/item.cpp index 0cd0a4e..58a74d9 100644 --- a/lighthub/item.cpp +++ b/lighthub/item.cpp @@ -199,6 +199,53 @@ boolean Item::getEnableCMD(int delta) { } #define MAXCTRLPAR 3 + + +int Item::Ctrl(char * payload, boolean send){ + int cmd = txt2cmd(payload); + switch (cmd) { + case 0: { + short i = 0; + int Par[3]; + + while (payload && i < 3) + Par[i++] = getInt((char **) &payload); + + Ctrl(0, i, Par, send); + } + break; + + case -1: //Not known command + case -2: //JSON input (not implemented yet + break; + case -3: //RGB color in #RRGGBB notation + { + CRGB rgb; + if (sscanf((const char*)payload, "#%2X%2X%2X", &rgb.r, &rgb.g, &rgb.b) == 3) { + int Par[3]; + CHSV hsv = rgb2hsv_approximate(rgb); + Par[0] = map(hsv.h, 0, 255, 0, 365); + Par[1] = map(hsv.s, 0, 255, 0, 100); + Par[2] = map(hsv.v, 0, 255, 0, 100); + Ctrl(0, 3, Par, send); + } + break; + } + case CMD_ON: + + // if (item.getEnableCMD(500) || lanStatus == 4) + Ctrl(cmd, 0, NULL, + send); //Accept ON command not earlier then 500 ms after set settings (Homekit hack) + // else Serial.println(F("on Skipped")); + + break; + default: //some known command + Ctrl(cmd, 0, NULL, send); + + } //ctrl +} + + int Item::Ctrl(short cmd, short n, int *Parameters, boolean send) { @@ -286,6 +333,20 @@ int Item::Ctrl(short cmd, short n, int *Parameters, boolean send) { setCmd(cmd); //retrive stored values st.aslong = getVal(); + + // If command is ON but saved volume to low - setup mimimum volume + switch (itemType) { + case CH_DIMMER: + case CH_MODBUS: + if (st.aslong 0) //Stored smthng switch (itemType) { @@ -295,8 +356,6 @@ int Item::Ctrl(short cmd, short n, int *Parameters, boolean send) { Par[0] = st.h; Par[1] = st.s; Par[2] = st.v; - if (!Par[2]) Par[2]=80; //If RGB value==0 set to 80% - setVal(st.aslong); params = 3; SendStatus(0, params, Par,true); // Send restored triplet. In any cases break; @@ -306,8 +365,6 @@ int Item::Ctrl(short cmd, short n, int *Parameters, boolean send) { case CH_DIMMER: //Everywhere, in flat VAL case CH_MODBUS: case CH_VC: - - Par[0] = st.aslong; params = 1; SendStatus(0, params, Par, true); // Send restored parameter, even if send=false - no problem, loop will be supressed at next hop @@ -616,8 +673,8 @@ int Item::isActive() { case CH_PWM: val = st.aslong; } //switch - Serial.print(F(":=")); - Serial.println(val); + //Serial.print(F(":=")); + //Serial.println(val); if (val) return 1; else return 0; } @@ -712,8 +769,8 @@ int Item::VacomSetFan(int8_t val, int8_t cmd) { } modbusBusy = 1; - uint8_t j, result; - uint16_t data[1]; + uint8_t j;//, result; + //uint16_t data[1]; modbusSerial.begin(9600, fmPar); node.begin(addr, modbusSerial); @@ -987,7 +1044,7 @@ int Item::checkModbusDimmer() { uint16_t addr = getArg(0); uint16_t reg = getArg(1); - short mask = getArg(2); + // short mask = getArg(2); int data; diff --git a/lighthub/item.h b/lighthub/item.h index 72db496..ab7c6d4 100644 --- a/lighthub/item.h +++ b/lighthub/item.h @@ -19,17 +19,17 @@ e-mail anklimov@gmail.com */ #include "options.h" -#define CH_DIMMER 0 //DMX 1 ch +#define CH_DIMMER 0 //DMX 1 ch #define CH_RGBW 1 //DMX 4 ch #define CH_RGB 2 //DMX 3 ch #define CH_PWM 3 //PWM output directly to PIN #define CH_MODBUS 4 //Modbus AC Dimmer -#define CH_THERMO 5 //Simple ON/OFF thermostat +#define CH_THERMO 5 //Simple ON/OFF thermostat #define CH_RELAY 6 //ON_OFF relay output #define CH_GROUP 7 //Group pseudochannel #define CH_VCTEMP 8 //Vacom PID regulator -#define CH_VC 9 //Vacom modbus motor regulator -#define CH_WHITE 127// +#define CH_VC 9 //Vacom modbus motor regulator +#define CH_WHITE 127// #define CMD_ON 1 #define CMD_OFF 2 @@ -42,7 +42,7 @@ e-mail anklimov@gmail.com #define CMD_REPORT 32 #define I_TYPE 0 //Type of item -#define I_ARG 1 //Chanel-type depended argument or array of arguments (pin, address etc) +#define I_ARG 1 //Chanel-type depended argument or array of arguments (pin, address etc) #define I_VAL 2 //Latest preset (int or array of presets) #define I_CMD 3 //Latest CMD received #define I_EXT 4 //Chanell-depended extension - array @@ -50,22 +50,22 @@ e-mail anklimov@gmail.com #include "aJSON.h" extern aJsonObject *items; - + int txt2cmd (char * payload); -typedef union +typedef union { long int aslong; struct { int16_t h; int8_t s; - int8_t v; + int8_t v; }; } HSVstore; -typedef union +typedef union { long int aslong; struct @@ -73,21 +73,23 @@ typedef union int8_t r; int8_t g; int8_t b; - int8_t v; + int8_t v; }; } RGBVstore; -class Item +class Item { public: aJsonObject *itemArr, *itemArg,*itemVal; uint8_t itemType; - + Item(char * name); Item(aJsonObject * obj); boolean isValid (); virtual int Ctrl(short cmd, short n=0, int * Parameters=NULL, boolean send=true); + virtual int Ctrl(char * payload, boolean send=true); + int getArg(short n=0); boolean getEnableCMD(int delta); //int getVal(short n); //From VAL array. Negative if no array @@ -102,8 +104,8 @@ class Item inline int Toggle(){Ctrl(CMD_TOGGLE);}; int Poll(); int SendStatus(short cmd, short n=0, int * Par=NULL, boolean deferred = false); - - protected: + + protected: int VacomSetFan (int8_t val, int8_t cmd=0); int VacomSetHeat(int addr, int8_t val, int8_t cmd=0); int modbusDimmerSet(int addr, uint16_t _reg, int _mask, uint16_t value); @@ -131,7 +133,7 @@ class PooledItem : public Item int PoolingInterval; unsigned long next; virtual int Pool() =0; - + }; @@ -143,7 +145,7 @@ class Vacon : public Item public: int Pool (); virtual int Ctrl(short cmd, short n=0, int * Par=NULL); -protected: +protected: }; */ diff --git a/lighthub/main.cpp b/lighthub/main.cpp index ca96e80..db14cc5 100644 --- a/lighthub/main.cpp +++ b/lighthub/main.cpp @@ -141,6 +141,11 @@ void mqttCallback(char *topic, byte *payload, unsigned int length) { } Serial.println(); + if(!strcmp(topic,CMDTOPIC)) { + cmd_parse((char *)payload); + return; + } + boolean retaining = (lanStatus == 4); //Todo - named constant //Check if topic = Command topic short intopic = 0; @@ -149,86 +154,23 @@ void mqttCallback(char *topic, byte *payload, unsigned int length) { strncpy_P(buf, inprefix, sizeof(buf)); intopic = strncmp(topic, buf, strlen(inprefix)); } - // in Retaining status - trying to restore previous state from retained output topic. Retained input topics are not relevant. if (retaining && !intopic) { Serial.println(F("Skipping..")); return; } - char subtopic[MQTT_SUBJECT_LENGTH] = ""; - int cmd = 0; - - cmd = txt2cmd((char *) payload); + // int cmd = 0; + //cmd = txt2cmd((char *) payload); char *t; if (t = strrchr(topic, '/')) strncpy(subtopic, t + 1, MQTT_SUBJECT_LENGTH - 1); - - - - /* No 1-w direct support anymore - int subchan; - char buf[17]; - //Check for one-wire address - if (sscanf(subtopic,"S%1d%16s",&subchan,&buf)==2) // SnXXXXXXXX - { DeviceAddress addr; - SetAddr(buf,addr);; - PrintBytes(addr,8); - Serial.print(F(":")); - Serial.println(subchan); - cntrl2413(addr,subchan,(cmd==CMD_ON)?1:0); - }// End OneWire - - else - */ - { - Item item(subtopic); if (item.isValid()) { if (item.itemType == CH_GROUP && retaining) return; //Do not restore group channels - they consist not relevant data - switch (cmd) { - case 0: { - short i = 0; - int Par[3]; - - while (payload && i < 3) - Par[i++] = getInt((char **) &payload); - - item.Ctrl(0, i, Par, !retaining); - } - break; - - case -1: //Not known command - case -2: //JSON input (not implemented yet - break; - case -3: //RGB color in #RRGGBB notation - { - CRGB rgb; - if (sscanf((const char*)payload, "#%2X%2X%2X", &rgb.r, &rgb.g, &rgb.b) == 3) { - int Par[3]; - CHSV hsv = rgb2hsv_approximate(rgb); - Par[0] = map(hsv.h, 0, 255, 0, 365); - Par[1] = map(hsv.s, 0, 255, 0, 100); - Par[2] = map(hsv.v, 0, 255, 0, 100); - item.Ctrl(0, 3, Par, !retaining); - } - break; - } - case CMD_ON: - - // if (item.getEnableCMD(500) || lanStatus == 4) - item.Ctrl(cmd, 0, NULL, - !retaining); //Accept ON command not earlier then 500 ms after set settings (Homekit hack) - // else Serial.println(F("on Skipped")); - - break; - default: //some known command - item.Ctrl(cmd, 0, NULL, !retaining); - - } //ctrl - } //valid json - } //no1wire + item.Ctrl((char *)payload, !retaining); + } //valid item } #ifndef __ESP__ diff --git a/lighthub/options.h b/lighthub/options.h index 3ff36b1..49f89fb 100644 --- a/lighthub/options.h +++ b/lighthub/options.h @@ -17,6 +17,8 @@ #define THERMO_OVERHEAT_CELSIUS 38 #define FM_OVERHEAT_CELSIUS 40. +#define MIN_VOLUME 10 +#define INIT_VOLUME 30 #define OFFSET_MAC 0 #define OFFSET_IP OFFSET_MAC+6 @@ -57,6 +59,10 @@ #define OUTTOPIC "/myhome/s_out/" #endif +#ifndef CMDTOPIC +#define CMDTOPIC "/myhome/in/command/" +#endif + #ifndef INTOPIC #define INTOPIC "/myhome/in/" #endif