From 213e8d8095512b0d8122052ac14070f5e59711b6 Mon Sep 17 00:00:00 2001 From: arendst Date: Sat, 4 Feb 2017 17:09:54 +0100 Subject: [PATCH] v3.9.11 3.9.11 20170204 * Fix command I2Cscan * Fix not allowed spaces in Topic, ButtonTopic and SwitchTopic * Make all TELEMETRY, STATUS and COMMAND message topics unique (#4) * Advertise command topic to be used by iobroker (#299) * Fix butten (non)detection if no GPIO_KEY1 is defined (#13) * Change WeMo serialnumber from 7 decimal chars to 8 hexadecimal chars (#18) * Update web page with Build Date/Time, Emulation and mDNS Discovery and Advertise information (#21) --- README.md | 4 +- api/arduino/sonoff.ino.bin | Bin 457808 -> 460048 bytes sonoff/_releasenotes.ino | 22 +++- sonoff/sonoff.ino | 223 +++++++++++++++++--------------- sonoff/sonoff_template.h | 9 +- sonoff/user_config.h | 1 + sonoff/webserver.ino | 254 ++++++++++++++++++++++++++++--------- sonoff/xdrv_domoticz.ino | 2 +- sonoff/xdrv_wemohue.ino | 11 +- sonoff/xdrv_ws2812.ino | 20 ++- sonoff/xsns_bh1750.ino | 2 +- sonoff/xsns_bmp.ino | 2 +- sonoff/xsns_dht.ino | 2 +- sonoff/xsns_dht2.ino | 2 +- sonoff/xsns_ds18b20.ino | 2 +- sonoff/xsns_ds18x20.ino | 2 +- sonoff/xsns_hlw8012.ino | 63 +++++---- sonoff/xsns_htu21.ino | 2 +- 18 files changed, 417 insertions(+), 206 deletions(-) diff --git a/README.md b/README.md index a5e309f9e..8f1b01512 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ ## Sonoff-Tasmota Provide ESP8266 based Sonoff by [iTead Studio](https://www.itead.cc/) and ElectroDragon IoT Relay with Serial, Web and MQTT control allowing 'Over the Air' or OTA firmware updates using Arduino IDE. -Current version is **3.9.7** - See ```sonoff/_releasenotes.ino``` for change information. +Current version is **3.9.11** - See ```sonoff/_releasenotes.ino``` for change information. - This version provides all (Sonoff) modules in one file and starts up with Sonoff Basic. - Once uploaded select module using the configuration webpage or the commands ```Modules``` and ```Module```. @@ -11,7 +11,7 @@ Current version is **3.9.7** - See ```sonoff/_releasenotes.ino``` for change inf See [Wiki](https://github.com/arendst/Sonoff-Tasmota/wiki) for more information.
See [Community](https://groups.google.com/d/forum/sonoffusers) for forum and more user experience. -Starting with version 2.0.0 the following devices are supported: +The following devices are supported: - [iTead Sonoff Basic](http://sonoff.itead.cc/en/products/sonoff/sonoff-basic) - [iTead Sonoff RF](http://sonoff.itead.cc/en/products/sonoff/sonoff-rf) - [iTead Sonoff SV](https://www.itead.cc/sonoff-sv.html) diff --git a/api/arduino/sonoff.ino.bin b/api/arduino/sonoff.ino.bin index b4306d1dc00189b07e3f6a53c6cfe378cfa67061..644b8b625ce90af3111c8d1a5b7d1afe961cdb87 100644 GIT binary patch delta 105603 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�ecpfJS8(tr}D2Zr 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

vsTR8g@8LER}TssUIrWxdT< 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≷OKEBBVZ{+2B? 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ðQ_>#{K2N}ugb=!1>1J;zrsu>$kbd5yU@ALetx8R3!8{$;T_`g(gh&o5! z2g0}KoI)=s&a-PoN}r~#5_Q6vg0ysnrVsK$K}{H?O6l@1pf;<-044jl)+!G9ix9YL z@&|R1yVUF<{;=MffL<6%OdO|Z{zxQl9qx?jMX#PHjR`BO+3ms;lGL|~tq?h50Exzt@c;;k3if!q^^PknB68N4|eusZdYVkCuj$Jf88 z&1lJEhk38pJ-~~cY`j0>&IQQ}9)18BbN2aTXV%1F{w4VRApD(1*o3xdoim-f;=8RW zajo@tA5P2|w{b*-!|T11zmZQ)<*W6Mv`q_!g$hlFosEZK4THqcs+4IRycZjlUhZvd z5gO38#v2gt&T1r|TpB{4!ZaxUp5HR~=T<+ti%q?lU&(P65pH>bb)TsC%+ zpfxn11CQIqw2rb8EN5-VGIMhWHy<({ZwOYCjegS$sQsUiG#@6CW!1t*^y2}Qe)Rwk zd${03e{`0Siq4(Qz3*?jb$PRduCC(J^js8B7AD@!dGE^q3U^le-4&NmWZg4CU0f9| z54chrS+m{1<*G^MRU2HUcQLGCa5&=2$z6{4IE1!Qzw;*bJBZ~ry-T(Cb^k(}=`OUc z*Hm%mYMC`(6}9xG%aF&BwFq*5;!tA7T^P+542i-J;C$YnJUnX~h+;EP^;YM?xR3xb zI-l{Y;mSWLF~?f(Mk=El`S_G#zM9qQheI7B)5jJ=SRldN&;eB7&G!}aYrXMDi;p}? zlB4$jC>70~1vP?!d)SZZ#fD1ZA(Gs6#B8Il;3K~_-*aQW=MRdz(C=parnjIfAj~IR zyPC1jOx#*RCZlXav+G0hpi*KKF7;Gh>Y+ily3benM%{s8xKa^z{*3ykNQ(zR{@tX_ z*kpI!=J$MkwkU0xmI!>PDA+ir&&=y#HTPrUqjd>+{(>pzOi%U-A|-w4DA=6Uf(u>z z(PcU+-9j+BA&8p|MmLxqB}Q*ji{J#IpLZ4fcCPGvQ@n&`Z07bJ#cV}ff3-3>5NW;X z9*UGsNgSj&jXv&?VCIG+bL~Zjc9bxZaVGg|R$>Y*B&rG2Y6);ZQ38;}aI^5$Q8uC3 z<(?8!WN-)L4E5K%j5v}Ir$+ig%|wZ@;CBCp)!gQzh&avxo7oh#W8!Bnv-0tnu0My_ zI@AqjE^`c8#^s$GZzy5fgBi8@-Gi1b`SP%5O;g?vG=n0>|ErRXG>#l*=DqhO4jYnZ z(doE1kX;NVdK9KaeQfESI&k0DgVU7gUhe(F;=Oj0745WN-d#N=%tAYRK=4f>==Y5r zW*RwquuAONqYm#rP-~%y6Nu$a(s9cW)_|~!{b8=Fw9fXJCg_ASJ=FP>9NmgN6MqSp zcxZLXo|`evcX@}5+r(hd8n*@_j&>WOp%q;`QxEm~pxhdJrq2nV3Vm-FB~SO z7Hhd=>W%&_k5UD22o75hTN00JpGI5jE=Dxx_h6!kzxd(le0~r2(phZYVwU5uNjI5u`KIh7t$0_2+w{AJtP5CE+yA=l9e;!}T3T zqYV;1Ta{^)3 z(v%7u$oo2KJ^%;Krh|?KBOl_9HY^n0Q<)j7GGhqQI*o_WX$%qWKctTC=$NU)RL-|^ zv1%a)E62ZjOeg|jl^TBp#rJbrS9nBCyQLAaXSssXxIvA7!=K|fwsVKn_|Eyk z5}3#4J>=JchBTKXe@vxe7+}qc!&2ssl#aRW%brZh%o~6S`KI_W#h7J1@P?sgntpL^ z_zQ0sN~h{E4x>FLZuy1Bpm^t5eLYdAEffYGs-bE#a#$O>Va|SthN^~k?(0Sj%G$J= zYFAEA!GJ@iDUhOsp>X|RA)C0^s^w$=2_i9LE}!=0|BI27enyi2%t+>0{UsnAmkNB?>2D;#dQDMu zp3yG~CcfcMiGQypE`Qsf_;1|>UmvWIPWR}96W!Dsd9<7HAFH^Xi#`SI)p;iRtSe6y0VbDiBf3dcLF|qqWS0N5`>9 z;Y;3t6Qr_dxbM50U2Suxq<6_$20qG7hurIgoP*qigVhz6^qsUND>Qc%Gmij|s%`7^e$-#PXMGk{3Y`RPx^gFKS{Izt zIOlX1Z0^zmF$FH3Th6peVVLP*j}u#)zv|`OZm#2ybNiVhgU<6wSHZ_!CB~)JCl}8u zU$Xt6XG2%X&Q|9X_+7h%9DxjTDGdLeB8AK|h`)z%fi8?h(LPGpnWF_O7s9xhZUk#< z^(-w^J|D)-p{&4z8m!uF6yYzy2xr5bW4jRms#q5&XTsdrzp0GdsuW|POj{&32EQr; zu5hoCECTt{_X8@M&8ru^fo)l9>LTTbIl0B46dLB#PP^LZOiZKF$c@Z=~z(jH%3?pbrd z=PicMl7i;bPqQ(pun{~QR#kWq+wCl~u?_Y{^VoQIdA1E_v+_Zh*yvaLP#Np|XXmNy$^WzrJ@MDi3s%i`5 z-H4paUx#7uT^VFA*PmKsc(1Lz=+xK=mrtedi+34x9SN8p8E_5(BNw`K6GyV55=QDD zVow)N9#4^V;X)mb|CMf=32SDMVs!TM-%bsaw&1K~D`4`sII;rd0I~qv5!U$)PLu%f zK?3IB(51dD0M9PGcVkuT5i&P|rx*BmY4JR8npJ+WySy8-ab%hvldJr0PO4(R4o`^8zLnvw;BF_LnQY_eQ+2vn|uMiYi zYRI^#8&tN+4}Z%_%5J-hyH^uTwlUu(|7_;DX`fss| ztg!hCIGcos z8&n1!));vE8V0_-mVw%98AwB9m$$rqOW0s#Gw}chvKiRpD!Y(;j<~S3JodYoSaBT^ zB-e(h3G!Ms#kF)CrBvF>r+=3=jCl>IIk@?$lwWb<)#NVS7B5zr%m4iyHxxWylf}&- zl+7sLA(0zJPiy(l-^Ij~a^65{gpmDbC-+KmnRU8@u?_ zL(a41`@VNsQXXNS+@sj zS+=+k+Uz9ns}!0UML{KSDH=eiTiZ&fNgp%n5s+`au0z>JmgbwXj!;T?bo&LgA|s)OAb z%ndapacw;oi5JBeA*hnNLTgSK6n#k_4;WP zipwT<)ZFMA%P3#*9q=^l(A2tl@=Tv5?f&HdHKJ<-f9r7;b6P$KU+fa9j}1Jxs? zcWMv6PRh7Pjkx<1eAkw6*_TJLd9?M*T?|0Cj?8J&bfawYFR*oqWW1UH-)OFzM14q);5ZwH^NI zjOk5nWL`AHRTX9alsOTIZVBNzll~)OCFp+K-U>UT|Mmwg)XTP3OmNV(vGdpuJ>g4W zU=*g>HD&8Rh1$0|>Jl{xESGXYc2MX@nw!2@|W}jRXV3 zl05pC`_qPvlc|*~_0aR!RTC$Vom@_d9=qxxU4Fz4R-d^BJ*1VcGGLj9HFW82yL$T> z^N{^drcjxBT|645X3Smf;c>Tn)z^oi_&18>4*1yNyg{%0wUyi5H-~ksPshz8<4Nld zy`EwYQ`NX9bZLr#)f}(YeO)IsVsfAh8?ulsS|^uy zlic2j*DHPHwWmi6UFTy%ioExxY)ZbpNW`JtkA_L*tz1~(*;Ng%A1=3_d4Or_6PW$w ze?N1pWa)5C)Gd2F-4VWEVkGQDxJ@U=8|vW<#NOg9G)3x;c>^uA;XZHSf)%m#n;Keb zM>NB&l}(p;Gn7N*J6dCpUitU$rdDcSiP<#E6z8<^cBA^PmuI)eUc9oV*>o;|3p~RU zCk(>nx3gMbpVok1Z{O?)(cP&3@+VXR-t%@PeT{WxV?p}VbWN(kTtOb zANWF_ZAiyG<)_;T|1%vY?{}~!+F5v=O58;$Wx)iQ*Np*-BiR?0WF!U%1a?eh2&Rll8J zdFNS}LhEqdHj6v<-eRAW58AooCxqq`&f_Ppb?H4oLd9ewnUWqk)-N`SXrTiW6FLs-(zSI(j1HRx~LrsEs+4#Njr*Ky4G9gT3m zeLL6wiwp0bBoP;XLZ93=$38nUhY!=OE?H984)yTD!8CXy0g3s^&hk)aWQ<+B_daGc z@}Y#-GVQ50EvL#LWKT(<>`k`S&+s|CBd{)J?rb~e_TjJvlW6RJC=b&8O*kAph~mAR zuw_W66i3-(`T!8&<(d z&#gN6OIi>a!=*If&NqxCy2u>e@QU~(PSaq5)073Uw@XmJmiL{Hv({ke3R?O}Tuejx z@C(Bw+1L(0f!ylT5Gc1eApfI%$^9p|>wHBX1Ki0JMEN|NZ%G7NvX1v)6-;u(6dYW_ zX5xJ3wX3{q{c@a!+tW_CKfMH~1NktQ)V=~H+f%gDhy+a!i<=ehGF&}j#+7# z4jwefdnfs@kGmZ+a4zSx%ex4=G~=XAM%7P^u%V3~s9W8lo>8FQHoCdl#~lV3ESB9X z93r!mY1))RNIwq54g6Ka5^i93PEk)S8QQ!jFicOzu(s-X(M&PYS8^RaxqN zjRx1yW#^aX{Y?imk5M7BR`g*DPFk^#W^{B-V{9!}zZewN{kPw1S_0hJEVxp-wAmBss%p{g&Zo&OjT@fM;r-lQ%#_->AL`I!LNX+lr z+X6{!!6V0GdC4=heiUvgKu+bqVTBd$oPttG!L4*^=ESFhgvDKGwSV{!`jZPGQuu|h z(oJX?y7oXI4}*FZ?BYc{a{*q2uL5j^hUvPu`X)?5*a^7J*n)U3O8BrCa35d>U`3@4 zTPFsORPA}j=Xtu>v#iDQ5B&oFR?IG8msNcqf3J>Pa@4`=aP!u9!-8_Nu<$6ZEDWLB z41QG|KV_&5ihJmk%ljCbm^A~3V&le`F)F~LR3vkxi|cK!nq22X^);F#?%q>Ca%>~N z(?FSZ+~{r$fexJ8tt*&!iXVi@HR-PLGhxD`V=i>jO=vSuv4aW?y6LmhJzEaKi;dd_ z?F!wpmK;8PJ|8}POgS!D!Wj^TQ~8rNF0;;I7{GfA;RT&3xYE*Sbc8MCy;m@5*MAw1 zj(rta;F{Kn z2HUNaB3K|{r7=sFXVf`|)$vAFA2~!_BaCEie6*d z`F3FR)ufm^DIM7O#bhY2b#l)@A#c}s1M8+GtpPqf(6uapopsC5tPRc=uwfCyi!<%G zD1i;Z7{FI-fM?<-`!MY(tF-bICp9kzZT6V3KgmAJ5OCOZv)1<2KUscV>kU$~iw|>0 zm$*3le(_U#bc>T)R3|L1)2GscWR}B~7eWU>;+8gSEkZ2(W4clc&51A}`lbs*QNcX{ z*Y@6=+)GFnLc;x_({qf-YH*~w?E+Avlr8zri5bNz$T8JtpBej8aM#+ zES=SCfJJB%T+fh|7f%d*mc^ZI5ZBwI`7G|1I$>I!-mEcnqv<^Oab{t!YU$Y%?pt-S zN9*dA3V-og$-O)dF%xfogB@xb37n7j0tcPJbV@Wd@pD7o^*a44l&Ym`8gClP@EyXCcJE4!JF>A%`RZ9hn z4>@;_=az!)#4ik{hJdiVF)3s~AsI{_Ydz-t4)Zszu(fvW9AoYM1???!nCP+0WMe%O zsGZ@w+*01%HX1i(l_$4z(k}-fIdOKI^RdPx;{vE)K2q3 zY8LBEt026px|Sq1x^M(W9`?ORYZ5yWuC`v+l@7&fs`~QLKDcEu@V6ORTVAw|`%j%X zf_1Dtt^a%vGF8Wy#2#f{Y7w^VW@`)y}FupcEWB=Gn5BygtjE zo%^;g$*|hx{FaoXVNn!s=N2^3xvL45{M8j(cUM8dI5nA7rVMa?jyp0IlXI*~%rLC` z3J5gNHgW^Kx>Z0i*_Z;2qFw1Sq z>k7DRI%@*z7oCym0yUjDjzD{74QzrqwYxMV0QwTo!EGA?rgYatQ9!B?nW3~%|-jTL6KGSNqkK(Ip1s>nR6N$Z3ASL!$ze%6J|De*@}-F0B-;$19AWf zfOtSCpsfyuD}bGVOm<|>c5C_Wt{4ff3gmNvS?*ECw)m3l3mgL&MORaS`UA@}@+maR zhWp*%^(TZp<3WxFo95wq2=fe?>0crbPM26rr}5O=RHHvxXVd&84^jR>hWHnOqg-I? z|6PaiCi=6e%WwMN{$?jms+3-d&BoV!Jrfq1Bvhl>Rl#>Ti~SDeEW2SfHorQ<@I&lj z^Yz(b@HWH(P26}H4Fgp@uM3QwhUk=2ESzzZ^aUFmS2Gqz&-6=9x1r5ofvNwdW-D66 zI_$o|UfHJlP!@UOUpm3U#|32+jfbvTWJRm?T~@tMG_$zbiay^!q}X+J84>B}^Qo}% zauk16X?AwcjZ>VNzgC(HY34uTb2ixd;YAP(tEei+JB>{Wr9RcA5H96iU#O;L`&aj;M7Jj3NRDSnj(Y`=`>8B+QO(NE!4a@mUfZSZ<_x5K9p^z_&0eI{Bbbd@T3K zWwiqg0h!}h;D(A5!-!-(iM&D!Aa@i@9RlPpu25XYMge=-Bw@8LsQ^Z_aJUWjnIWhX zctX0uU21ltZK!TMw8`&KzoY%lrWcvo-w^qwHq@EjXgNc~-7MWjD(Q5aP;;lFrYBiP z=DcVbnKR!!GA9bavA)Qvtw{#+oG;i6{Eu^Ta`B@{{-{|>mleT%Ai^ZL&Ja$}n{2TOxQGpTvJk7xGi~@U z{=oj>dutUKoexH92aL>FjAt2s7XzLGECnnE+y|He$OWVW5&-dlC_pGc2k`I38X0gN z5Y~u)Te<D;eup6gE?9QEiAImfXJv#_rEM0=utwgSS@Q!P~N8@C?^T~eHOlF2;nlAq6{&=v2^WRRj!1dXXF+` zX=6Zu#Xm59XZf(DDN*WvW_mW6|1&q(SvKY4-5hTSKNV@n6Jc#csPcI*gFIoN*+qFJ zvcIaCtRQbQMC|NUj2-Ld%5=2st5R$x_6-o&S%wE0= zEA?)_@SOVlBhA@r+10EbG zf$v#|r1GuoQxklX6&9%p{K`6qqiA#TH&T6g&ZY?sLWe^cV(2If9Uk6m#xPiVBp}>N zfy&PiKFmUJTg4XvVLk=P=y|B=<}#F_T;^6(^IY*Y*1*M9b1^>dx@Kf(|@mvLX6fg#B)oJtuq~m=lTEdIe5&-L0!?_Z|m*YJX;hDyfIidKy3ctPd9k3Cw z8L$s;RR0o$cRh6gk6F7odS-aV!CI+7z$THz-tS%S11j^xIJLnvGP{E-i@7?XBWVOma6nlm~h9+LypS5k+yNdzQGAHS zZeE!D&y{No`k_({dAVG3KtDq90}L*LG@$5#w{@)WDqO5m={?3CJNpwjg-F1H@+QQw1C}4nV?NMei%U-@U$eoihX3WPKcx$C!byEH0lRSY#=_Zm?>i;({5C^89_w|4FDZIzyKhkQZjF{ z-0528FIMb=7sS*$4V252fxyYM2|D~B8Ily#>V=jd-k~wG(bX?3%nMXD#XLNLu86GA zg0{3y0+m^;(78too~cDdJ~wLlRO*5eTtNaZRyau!!Pf1pa9oQgk`$2pKjMi$YVpJg zT0G@u%qq2b5QK0rnBJ|@|3*XyuCa2H7E!#374`%ZoQBt6g17u{JPehH2PH!hR~o7% zGL99#52gsWQr`ztoODe@R1M@G69p}%JVuMj&~vA7t{1X-n&rOTn*;|?7PTmZ7C$sz z>FY`Q`VT_H^Y>Qmna-}L2!H$feg}=gE3L5N!X6DAWWv@OODJ{qq=xCRix(pQ=W5{j zpGM^DL?5ZskIXrQXA|Hw;1Zw{pnC(R@c?e+UaX9$-yDqYQqBmJ!XXU#@N>@brzDqKtK}+ zRZjQ=Q+by#75I>W2qRd*(@UbcixuY63$;a*z)x_qo+XE2h#jo0_`*?i4JhI`Jg4bK z=Hv!On> z!#E-CqN%eO8898Bsq=C45FyOkF2Oo<*Xbsh1|n zuTnJ&Sh3Ede;9$nS zOo*XcCd4!~6B3;#7YtN$G2xnA$iMgJLV1|z9i?0-ji4HPQEXIm@iw-#=*9}PXf!?- zalxFo3e$HZxpP*{pK${709Dh&R^;N471vkbdB*C9YuLlV`@ezRbElJ5CAgr6mVyU> zCLge>H#W(qtk@HD#4RIC5k;gSGKEC10fCyd=p-tZ32__&kErb5teaqdb#J zcn3t8B<`@ni4(#Uw6>q|k|ZCra!Ynq`F1z^jP?5h4!b*_P0v@W6m#Gz39*1kY$FoP zHtS{Tt#eRQSQc)ai0nSAu!n@~(_%>Y%-o77;#M`vR;#*(Oj7Es!r@&AuDeQExdmv- zcZ4Q?XT|Cf>HK6BT6a-WKUrN>NmNof;uQ3nN#eIu0^eHU!xUlYi*SWGMciX`*w=F( z28i|NvW>kG_I||OSJRM1O5-b40AE?vo;yk0NpbR79B)w+;P3bY-$nSFRQyd=_$#HP z6~d>@puY4UpTpMCb}OVyJxGo`fzUry(Lc3v!**3mYhPi9?yj!EiH5oo%wf8%LJ5&k zwpwG4@>OH7m%C0rOe9=YV<>-^&{U0)KO!Q`M^>kVTjf)*3opMz;SjYdA@WYSg=FGT zBQcoFfU^$}X^iq;D}0Pn3g1{a-jN+qmr;z+^sHj#Ykbbp5@Kk~9wWX_sVMJRxspBD z^GW>3U^);G?nC4pv_Iifs!$AGU>gR;E>d*45Vbo;UTa;sxDdT(F>2@~)Yi>7j%=fv z`yy&Go_>JtO)T~B{q&FU(1iCUxIYZVlLdqWq5xie8-iyXARaIczZ39G0;B-a0b>A} z03E*hYq6&ZxCCgd9Wf;5dANqk!pGGJcmpsWJEffa$CdAf>93Oph!uS`EGFvpgLcz# z?^>8P!1LexRyx;rFhbX{+CUYpE|x<{+}_E`|FOEf%So9#JSJEE(v;+Eq0Px~d4&}? zbo{ZxT6=xo$07KYZI9s*qf(0zo(my|i=QJ3GyBp71O0eSqF6D!@=vREH1;mP#Np7p zA*iV7JSJscgU(eIUjK2R8R{k{Qjt0~>;DZAhokqlD<6ZBrpF$!>r`Z-8)_+Q!_S^f zwPRTVRdVJX)EJy!hveJgoa+`|`OxIx6sWQrcabW)GN=Wr>=I?!n4F-LTKTo%AQ3+T zhwPMuBCFB8#qq<78QBVbnA^pWma-C|V<+jxFp(|btp$siHf%VihMk5>Rh2V)ewg?l z;!M?XKd}=!?jYMz+1cGLJgp+iud9?R&nFMRB;6LDZ5J!S*$?dX#}4iUXLgZoAsu&^ znVe5f5TCa4m822?#$;HPLTKuLO1TBg_J64350V$lwB%{+{_m^l*C72wh@qvjsk@b~ z_yeZ=5?TeQH$drG!Zmnc_-!!oH5mAM=QLu#2nLWOP?AT8Pk@0YkboTIr78nUDZZL@ zFz~olm>R%_RhalZ#xL*(a&KNOne{tQMJ9n%OXW`FKZkCN1_RG(0@xBiTq*{?kiZHs z@Hso|@;fAfFwuXR%nZQ57D!+r7}yCKB!Nd&1|CI?qRKS28O%Onouhi?wYxp_%rdK+ zgC2G`sem)DUS&fD8!4{JjmXB-|1U0F3$q5uoc?qn1#17;B0a+-m zU<66S^eTCTavvBW5>zAbjyiHLNrGx;0&}mGdu*rE67W2*bIF4{=h;R@WZS#YX zRqe`#R<%$o#IocB)NWuu1Ge8s?Vdprw27zt881T--T}r*ZHtOcz|3pxP;UPYG92A;IeMWU$@7&d zD1uBdlc`BV9!JcGX`5kKed??TAfvHB0^L*nf#Tn zM(blGalBes74XQAPg;soQDvV~F8q!m24*{#Yxw*%t8XWsfPr->cnZ~c5);(YQvdhY z*Wp%Sp8qt9u8SF?CS<4jB9d@ITm~J>kBb^9%<%K|28=q2fRrT=K9M}!Rd2vL$Az?? zW`5JsZa#|Jc{Y@_s%f7<=Qh-ecntnS5^?>-(oWW3u~aTDe`*-YTu%9;T*Acc{-nuN z30n!!13NU;C5-c@8o`0fQ!mM*DE}@LOGPcl^Dyy7F!7{vRAYj_^@CvUYr(-FD_?O) z%e@>$e27u~b(IE~ftbpDz->7MrE8at`}PoaI-&Af*Q@fy48MjiW(@Jgpb1Gr;*Qyo zqlkryty3q$FH)+plLcc;ycH?&6`R0X@`&s(B^^~|2|MU=3{@2^t8ZUMby|HtA_EUS zmS_coTOlwESF%NA&~jB!V9-o*`Y6axjLHvsRdnTH%nkj5g2$L~Q8;D;KkFf>%3e65 z)kMV%zACBJBq=2kl6pkk14*HG<%!n8MBVMr|Ksz#XV6Kl{Cd`FFZz8hcU z77MAWc$y5pTafD^7lXYt0@7I%Y;iHHU zfjr)$YzkJ&{PnAES2Or1GI$;td3XS<;#K8>FjLLThW<77!pa-{$k7Ecyl6=Js zw2Bj8U_Mf$Nyl-O0rh{dPY|0e!Voq8Vyi`+^$-I_Vt@=QCE@uR%t(=1OT}b}$`)kc zl7;9ur~=4>0Q6wscFcO7BnHC7M}lK^MHYJPMldiL6ll!;S!Lj7OR(3*6jwZAL1pXo zYqJ>0=8svApGlImW+>cWGdnUFVsKTYqt;(Q|A2!zw8GOtL7={oBodTP#=+&YgO1Iv zp=L-kBe_s(hN?gkPz>TeFq9sYh)-q6M+||yIt{BQhW2X=Nlf##9JMk*xd;;>mK0Y7 zbVY*muwB6%{7RCcOh7o8gze##-@(!(OvA=PHp(6Sl3_6o+YLsD0!_p4j>@`=Vq-vP zN+@P_Sqer;DZi-I?Z}RF&^61s@$cw)r&A^qQuXU-5&=0i*DQ5>-jHJG*pgnJGl$mgv%;^X0d@PX4o_k+l?Ou}#Xur=}M@GomgY3BQJ>_^-aMBcGB z4pv62a=-$wK2Q^r(Y^Hc;A^v`;MQG946ZDIA|6ABUOFM`3Sl%+nqX^dH9UATGg`RL zU8FV$B5zn~fTq;;VyS`bQQ?)Zym-AnX5ca`{-@DS0iNjq&arD{Y`p$@Nlxw*rg!jO ze+(}xmTK=M{EA6Y)>yRr<<=nA{(OB*7Cv8xO(o?OOH7LVibXhu{cyxl8Z1IhkNS#+ zA(*ddl+aWNsq0I^Kx8VxZLGa{^ zyROk+`DbrwJmtTGHsR&#JB5S}+Oqz}B83d{YbOKS{3q zDQKDH4}F%-J0!UhUN3%h)~D5IbCBZ569SA2_sFx_01 zDo>9U$V)Uai%Y<{{9KQ4q@Aw_4dl)~ zVUWf`3y$>F=*9Av7GYWs-ci0^ScKO)v|#27iVljSTAV+qrOMnvVqT`9G7q6tZ(C83 zQ!R0~`nddNZdwa>i&nhFkj@N1Iv@(rxO+s-I>3W~96;wTgaNhy$^c^kNdWGdoxy5A z*OuTshFREKI*lZI4w6-RugKqA7RsSDP@lL9isQoD?a*1Rat&ctS@4dk0nw;O4a#Cm zP`3&53kd6OR1M~Ci@LWvM1J2=C7p!cFxnoS*9?*0TRDHYKE|M|Te)nwev%}5Eu@Wz ztw>0a^w5+QAfn8$RLwgHYv2vdxNQpI%D*iRR!?}$KQugXIq*cc1&7kOUWzEcV(3X*&l&dvPaxa-*uf2#Ci!H(aY~3*?!- zrsuS(hPEO8cBS63^VpXCnb1&Tjn#G?^LT&#QYKqg2U@(BGHo$wF0W2r!njbEPzkXN zj7d}Sz$tSFiZV)Q*dD`+vn^1v-vRCEaXRk5D}PSVCrC<}h1+@n_gkT2VY@GSI3s-B zthg=MFAUZYx5a@Pl7X=lgC05#1HCg_EwQdSX}tFmDs>oo8KePC=9r9RPK2B&n8~K9 zRb!=$d>c^mDY6>%TgwesqjF(Pbuex+7n31BNpZo4I36$57iF$|cZ41)$Pa^~9cs`{ zn>fiL?8XlyBIglV7hZE&2Gm*R7DoG!p%Gv*EW+0Qh{{BZ@Vyq1nfN~u z0Wo8P9gvvUUqM73{Q<*UqVMVNfSO0^WQWBC;i^55JW;JOXbDUhx*zd+$^!~O8Af$S z=n-CPQ#%N8rbQB#x2Yu{kG7C{om$AFsgV1NfO;ThJt&}Llo(AKVvI$YqsfuE0RxK` zPfq^dc;bJwc;euG4x%ljP)D6#F*DyHWDcR85K_E{qT;#lvi6Kxc`8vq^kyS9p>aF< z&;Oww?eh$3_C&RK2I49nC8pOjStt0nQKRH6T+cS8E3~S<0o}Qq)p_bxx{~yxBTUoo zR!3zR^dt_iujvV_d^QP_F0_ZqRfw2vR76WGZl+&)<$FEWCamttitSasHG+M|9u6wc zgDnEP1C4Jm#w?cEBVh6n2PJ34h@MF{S_G4dCJwR)4A7LQt7!6dKobqrff+Dqs8Oj! zV%AWD;K*dPpF>r%iGzt;09TmG0W)mVosa&CD&|I(R*}xO*tb$IKy^lUX~&414X8%7 zcy0u|2v`P~4wweW0mK7XKvNCW$^jbz>j29DivcqLxqwVS9DoH}QZPaS8UdRD8vri? zmI3AhrUOzG3B>WzxgE%Woq#QXHvlgJ9tBJWWC4Z%SisJ0zyYiRlmQ+D%mt(a5&&)0 zI4cBf0;~rV1C|1&19AXS03)EW3g?Ux{&@k*0gnRa0;U7F)iwX$wZp`;`Sb3FV%=vn z0zH4FYW_ABJ~b3ysPI)Q9c>IjyTB_Z7@cO}1Dw-|o#x=QM1C9%ML9`Da?*_Z0D&wi zXdr9pO~gy3I*g=Rgr6D^BJ&nujXG+iSX33wAxsJgz{SyCTwVqQwc#mEX57w11d=gn z73)J)jqb~44I_?H{KbsJbYL(^7FA7ih@6P2(|&ecW{8B(11#DsCnvi<})c<6tAm=`uA1-U9tmD2>aZ8XhVxQaE77t;@tf zyhT{5Mz|iqxD@kny?pYW!Hs z#t9MK8T?u=%=EKU^?Ndy=3tg>ASLfL2bHX^Lvzfzv{c}>lQGhS4>a9s8O?7F5t5j} z7KhDCEXQVuS2Pl`nMmw0d?Z5Gdnhem<+WDQ`GMREtlWfjz#=o zys4gY9uz>Y86y9|ER0f-%@!evUQi-P zFN|5ES4&&$0haikWEOb(s+iQTN-QzMhYCa0D2z&9j?w6c2I*fR`d^!cL4+fQScE7Q znYtt_vE;!jw#;bQOgmwJX%<)&TW1lh^n#8Fwdv9XiSSj1QLm0nV_>8((1vWT-HKfNZbkmF6ZT1~CIEF$e3i3J<*4uqBTNjzo7f8p1@JoFR4&?n}ySvaa9gXczifiEu1Kwg(ZgC-dJG-kzS zFw3kn3k@p83ua-T8vg>Y#kcyA>w?I?lE^B|q}vCI;B^<;e{iR-H<_v}-IrfSWg)F2{dmGe( z!i{2~E-#KvP~e3%?SY__7(w7Qh6a%n+XZB=E#1%`97*0Rt6qwo^@DtC^I< zfrX9<6FZQ_%gPRLQfiK^MMSdmQPx~dRn`$TrHBf>NZoD064zXJ-s>1$hYwg|t-gw@ zppO8Di;2TUX5o2IRf^4y(Q`410#p9iRZR4H2$B~9lUa!BhrBS)nE7??y2jG$3QR{kNm%aRHR@s%6UR(?xCpi-R5%_N6saeoWi53$lo`sLur)!7`n$0 z$51d94=WAk1*96URSM;_O5iS)z@28*-XVqhq35VR;W}!eM6FnrKuBQ*qmiXBbIgX7 zA%Z?iI*nR-9?%Bx1Hz&2G6awSC|;*pAVSOb+F3Spi+`5yx~kFJp#hr7I=1D=kDIy5 zA5{CI^$Xyw4Nivi3dtZHR#{tcdn_u|baUC$2w;jkYi6lt`c(cIU;zg+Mm(d zKyeenn~2~|>e}GWMn}aP?y3X^4y+-|@g#V8yw-{4p2Hma8_cr-(*Y~IO{($9U#jxz zX%c7fjPrTMDyi6kl%KMYk4;R6Cm5p9Rl|H8d%Hph=5la~WQMcha1fd9&WXW_S}aEML?+(c=g6`#aDiEyH8X!sEdVXY}V%xxPP_a(;g<#hWPk-cZUVRs_LZ ziifYsB{Stuxl~@zn879oI)$!K;Uh3ETeLtiQu-6;jI4z-SAeW^gbHg(A_IaHBL9So zK2Oc1*alqY|FHEXa7`Xf+}V8+1Plm>h>DsgAOeDtfQSg1M1!cHfQlDZKt#M+wN`Dl ziq=@G*s8UTwH`?EKC0Fl?*bZ+78Pylt+lpZtp{Ed56Ji5fWGhheILKykY{J_+1=UM z-Pze^&W>g^uNTdFgBgvYma#`b$3GBEu!P4b)~{kiPke}eTH!obg55sRBaIy#gH`pr zOG%sZy78*I10M2byxKa|j#pc_t1;|p zuC+VW<*=6+iD}CK7$~N%Wv%d>BR(KT%1f_6hJ-MAE>md6_;B|U=W>kAJIp7QW_Duo zOv`g;-QPl{ceyaT=GZMHuC3e`h9J8-WUvstGH(NYIJo~qW^QeSD+FqEQ@|0osC zZIT>SEUe1d>*bs9Ykv4b-v1M7Y|}oZ{jn@8WX4{k5RWq{ZGktWGGR9|6t*9e8nDU2 zCkVF+lHAmd*!z145BIj>qxVvD91Cu~yckz@aEC|LO;LM?Cr=^%1Z@`=(~LM4+Q7C< z{#gh6IrIHbaanzZ_Qf$xm~FLAbLtaqVY#J5e5k#IsASZ@(B?tmHZPR%Utgle4I$ff za_Y@ z^%LVMc5)wW>&!Z~>f%7*-mn${&~w<>QiMq>#TnmN?GXr08kSp1^}DbZF}B%qj#mJz zrXbytv8sQySoz_@@~`$359REUph{YP_1vR&g=LDYFSw{F)p$hYp`J9n3kbCIBFz`S zs(rMx3+vFt@{T`V9#>oL)pMQ@raqDBRiY8r4irja2G*#)bwAS6muS^qW|9r8C9{#y zz#6k~8f0L{nVMuHtQK84K&!0eUhLRSSt#j;PfJe3{PeJI)~f1KRxF!k%sf&#rn959*l zwcgi-x3dmpl)W4_Hyrg-QDJwcZDPBj6@<2p`TrBTSX5XLnp>#4I|zN6nkTT<+;)-T z6IdW>I1WFdeMF9-k{Xt|oRINrIf)}f<(mu@ifj@b1Z1_{p&t`i6Yrm3nQG&8yn(t_ zfvI1c*-0KRKpJZNI&*qZD(5g$>@CjWE97o zFFQ8E@d;+3S}3EVbQUzn?^yAxm7{!86@rl*6n-59PA^B+_g5cj9f4!_NYz@cyj~ax zOoK_uvl^}3-g4Vs&5sFlY=|&KM35`RgGXuFs`y)Wg@VTR#IBKwHuq$$<18KIFz8F* zjY4NGw_G9~wl0-hIQY4P=9ZJPvkrHbH9@-C4xmt+1o<<}vf)G{a_`0byjvZDI)rM1 z9sSs6SB(rq2@O@$xfhE-3s3CDTJ^C^lvUehOOY&JfgkkY1oz7^sbu9L+e^E1ZNl<7 zF*0CHrJ+hbE9!$WTaKK{0C>lR{f6IP0p}ah?OrUCYxYr(L^hHiG}Ep`7TjXrL1dd| zx2%)#0<2oo_sjfS+R|5=*iZ6@%exNJi$vzvQZ+?B?xmA=+Mz06YJxFf*r39C^tczM zKUK2_6q&>l!2o6@u?}o3?Mq@KqjC>M8y6VOz3eMZ;LL2`Z27_YB)4D|qzm>8Qx~fg zwH9N&O2XYLuA+Eb6J*2K-jvpx1vapB>R6Vg=1!hy3WaSAE$Gesd{iM(*l&PNswE^U z<*q%BCBf#TiVpQ=@B1{kg~kew4N^yIk+!6`P?*MCZ&7?7$TVA|Cmjh{ui-O_{%=M~O)HsFpaLU85yx53xU|+YXd2N*D#-y~< z)j{e@)6MszK-ol%{K#(mnSxVUc9`l~`yfB_xk!}HFF5p=lR{qr%TBCgsHG|rXUC}u zY&+U6w-+`!%Ok063Tr~Yq_U5Bi`|skm;K~g+(R}j2ZZ;ezGn{y z5O=BZ@j!g2@NpkX>MHuMAN!G)6RrM``A~9y);~n`tUdBich>!fwaiJD4PGTTcxJtm znU_*-W-707%WJ!Z&h%$3%(i*$MUAzPqZC*c!3?KuNqfyrP1$Vlya(;)D$%NFO6@q6 zZFhU*4YKWO|K{dx?WB`&f%IuiueEJz52YHlZCiV6CZLvPe2jkcfs1f3+%q?gUH10f z@91sTn!4UrD6jgJCJkT%B=fvTTD%%n`D+04aJE6g?nEg2tqDgDyeOViPvAP=c%TNOsRp#59Q&*@A1hp^6VZHXPkuu5__ zYdX|&8FfSF37TI%33EGI`;VY8&|twr+sSSXX=D?gqZg0mXpbfUSV30I`je z(b)PVo1JDp{ZNQ>z*xXkz#PEx<#axWwdcOSliNtlknX=*qeil&%zLAFZ%*&0F4q>f zj_^hwvt;~3*K>+ced!yN~C{f*@0u&Ljv}vGW4xkD-Ou}zE zpc^0(5CHH6ylxU`xY2}WjDe`J^cU;?G2q&~`!DopEZY`U2G6~KB0xT15+DPR0Eh;J z12h0%z@m!~K9G^J37s2J3rHueMlWWyO@ zA)zB?LzPGBg&5*x^mUZG)=SUT@@iVjU;E%>YLbZrtV@|ku8F}3gJXx|-q z4zZn30yg;y(FZJ&=U$;xAFxsU_7;ks%<}lLEwq0!>%#YJp;wdHD*pU3t(d~T=R40? z`%Gm?j8}Xkx>pY73DrkzIP;)UAF;x+AQvzY&)@rVv&3($qZNdtFR!DMguZih9m&gCG?oVU(zL#FhoWHOWf-<=opsD|mdzw{ z%3V75HS3J#^IX9q_{xT~*hC2Ou;TZGD8Jct#~>LRkPWaIcJ zMb^Mo%#-n=BI>xB^#=$1Vl`{+VrddCn6a$`{kWPL`NSgPYgl&(KRwqlf1d#&ovEG! z<%@0~%^u&sIPGJwTQhyKhDCX)c!Z_`+n9NF2e);%)zHstSaX!^-Wqm>7po~z zb+puRt?s7><|B|BjMwbAB5I-4MeLxj#j3BJHq7hVy`47lCqiOe$9~t^Uf&60Y;_IF zs(sH(e_}$1Z@W}<#ViQ_- zQ~~wf#J=Kt*V5mc*b0{_^d0Y2Py@3r+{~IXZrDJZwyNvwd*NxI}7FQY}9W%>*8%$kD{cR8tK>8$ggU`b$M*odfFgDez@Lx zY&-jl)ie9H6B9k{+`)bcn6ySVcwn_T55N8J>v%o@yBm^tRpOd-Zx(Z1MH_cw={@;d z`gxWXvy1@b((_%cyUK)5BN@NP z8nPQL{GN5e%J$UvsEqAXl6K=#ylp9U*p2R+O$&Fke%$sk{VC8-3#suBSVO7T7elT& zyM--Yiw|6(aA&NZ16Q_%~!Q-OPc*P}32W{B>!-pdnJ$L>G-NI1)@ zHMhMWEDOYBfv8sB_F~oU2qP9;69wx0O@+hu`g@yZ!WHMX%;8qEF~SqpLSw%TYrsYc zhi=O9U>p#z;lh!B6WtT%<}62)K`8Lb?h$V6TH z9nIJv5$PIt;8GlE@3R|cW-Ql4ejnx*?=IHCh}lECZ4*{eaSNOo-WIIq@&r%kox#c=`9;8qwHFuPomDj<*xRviPzD4VbavP< zo)oTi+2Po%$m^0!XZJwcy2J7p6L2u%?y{4~A{QSoPn~`_NUagB^G_7Q{+t`j7a7hK zGn+8B;>PZacRZGz6L)xy7mM|sr6Cv2|1^BOPwgrmy$gHsgciDmS0gj=RUJl%E z0;lc6-#pt<1x|&9*gVSI%Nj*nv`s9x*#EU-;wa7Y%dcB@~jh8$XYx#Pj zCo=V%7wm;68*-4I?`PfBKl~V@HRwI$zjqk_ri25mrBCA(h*hk4#@2|P7mU)v7$Hg>VYyD7i8rdFhmKFIuB&13Ii z8JKQseuv&U$Xa^aM%^jH#Ni~NDMD4aMQ--ELyHeGjaD`C&ec>bpX7z#h~15?*entT zdNIks)>x>@(%=sLa*#zzHupQ^dI(8bhSf%x{KRva9^Zrx9bkjP1zxpup5EsZ(KI`N*%Y2#7sb5^gUKaaAl{PYT1Y-7>9cm@4zVviL?w3rT<2UrQ%0XPb{2)GM)4e(eC;SP`vm`BRdeNM6{U-@7iP1gL+oYs$4oy24m_$8e^2?;*=YkGVVEf??jZAuY8 zv2Y%+oJRb_W^luobn7S9j(@j|e13*pdTkjE_?bm|`g{rc1%(EOsl_%JyS1EF{*3kC zh-DO4hG41$ET}=Ba6R(kW6P;sAN;! zrU_>u>$LcW_MK(fT=fmLJO}ktHKm+mD?FwUDq9u$@(I+|8!$BEt8*;WD_3CW$>%Ukk1R6GD8Orm2;XeHT;6C{O;Ku(qZVq~y zMO7Mr)sS0Ma-KEe zHB0I0c^2F01kylw1QtTycZ!nNcIZH-O;p(89*eCtg*mm-;-^r(7DK0QPvwND{2xoH z?*-;BTl(CpBPx?7=>upL$xyzCF z%CoZJVn>C+1LZDvQ`D7Rb-i&Mmp`oXJIY!Ky66k{s5z??X|W zwo8rQw5d3tD!(`DfztTpmo(!d`^YU3(_;d_0O)2_U1EJ)qkmtG1 zUXoK^4B`go@$ga8g~2dl7TgkV%|@sQH3sptS#7SJbmpanlj;FClexQ3`?KQExtJ8Z32s6gjtLS@1& z%<01vwt4}5aF=!W@)7u{DXRp&-q$jlw}4LHWrf=NnBuD1*}I&;!sai4?`o{D0e69) zgx?*jX~{h-aT69<&);KzGeb}{EWM%G4G>Z?0DEzFBoDuf0MR*)u6okbg`w9xx8I-6 z4hovdPwjqRs=aY8Y0Y1DpG9@t?7;qEhlZR3y{^t}`&ogPqwyzSwzIVkh{6bo)N*z$fHW%Lgol?+B)e55O$%|4o-4fX_$dllmbGYFhpf zD>jtP`#4@B!TUoS0R@P^d=vG?k$FXd*Q{l64?Q96*?|nx_55XiYbp9cB zA}mz-kjb9UKSRK1Pi^Vz1a)fRGn2hm!O_!_Rg1&(AU~;NpL0I6otH74Sn$PLe3Kkps#pg)e$!@njwC_Arv#X8r z_!y16zlP0P0KB}nMt7j5jt0{g(4z|0N^=o)!uWJyY*UT1LE#b*sPU9xFZTz#Y3)4r z{^u0=m<2iAKqy5BWj$twdaA|I&WY;T^iBx(^I3;)#h`$|MxOElyKVs@9b-K|rz?+H zXIXVPTALWEDVS6igLjF}MW66=W_9N`3D4~I@DPf5!emq-{RvBxEmBAG1St+L4PfVd zTJ!^6tWn54@v327wAgyIeMrANVQm||n)m*XfqW&lc~N?`gk$<-5TAy z2)vhtEu=n`Yy``rA1c`erlE!ZvQ8c5pxe|Q=Yr}-M0a>g7eyXQu?Qgli}~Y5X(l_D z$?xe9Zr^8Q{};VTMJ=mv5O2$jxLL|CPM4S4Z`_odUAt*=y6MG(VCRVyeo7;%n9gJI zo0M_#tmZgeSziTVX4I#2tcnfnGG6$~o9xCcdo+W!|9)JpWTPEXJZl@N2*s@J8H4Rw z1&+s+upa?~Z7=OC^D`Ryf(7sapAoKQM>g#7CM)qG!rmI}m4(nxFW5wvFLc7U@CV%2PltLVjd0R4ev(`7B*K|1nsOW*Sy_&~eKCcAh z0WpgKM^PJvyCUO$wQTLB59dwiT0d~&ub5{5YPATp3wn*|>IrH{vz+;ns1X*#me;(3y*RaU=YUr! zKigT(yj0cbwI}Tg)!F2NFE_Pe=^~KrPEB32uiZ)?x$t-Svgg*nUHCP|=U^kTK9Au~ zW|K zv5oXzJdGD`qxoJu%BcbbxDi6fy!bZWXbyeQkauw1vkhCUz$@BV_cY{29_qAdc0mOO z-9&%OqA4DEQ#9gxxFz%bJba}3TQd3!OzLopaZDch`|xdn_3}`zX4<#CcX=ypw180+ zUjkph46|wYE%<{feRv$VZlv~&`6|_+Pj>P=>xITVi7^AUYQlT*v`=Va6Mmat-e?`% zl=tBL*LVwH?*n;T4~6iw{Gd4Y!k&zH zYI+>Vr||0^)9BW`jmw2RN7pI;m{zyuK0ZHxjKJoNiufwKA_Jjw0R!96Ppx?+FTYQv zL0r!Z?o(wD|H&y=g5>sqjs^1=23?U5Y|dJw_O^QM-x3+J41_oZL=>)3*UP}MZNCuS z%1zbuZIFUCG&h8IXr!KoeE)Y!$}XUDA-r7++p_lR;3bJCoLVb#S~bBwD?3|(z}f;_ z@58BC%Qjr=`OindI3_AnXf$Rj=!CT4!59eB+i*-&?ZW@>iE2X|z8IsbV<=Axu#IT{ zVuBeL2SdH0{WM|4s%tn7ME6OUplzEM?PmZ(ze3-K@{mSzL^l6h%BySWNhlxEz~nH;0BtQOJ&Z^D1b|2H00sAAKo{e;9B`uzZ4Tp2eY;ObT4C`S6ki=1i0Cj2eo|epzgPKi^GbwrKj2R50UuW$>qT`3U0^S@QOB+){eI| zT@ZnTnEG3_aze!G+*9gC<8w5lPO)-&J;;@(MePnMPGQZs5tG6r<;U z^|cNUoE>PUQKp`wyHBI}dj65$BFIbVsq*$}%!|B0!A+5P6c*DYtN4gC5xi;RyQ1Np z>n0naX`#pn4K##NN(3_g^&?sw!MpP6X>>kdmjOwt9@TVlBF{)Zo-hB1K8fUb z8*3_Mw&#EIRv%GP6hDwuDe7ED>#eV6rM%2Nu5OeEavx_8g%{iK+Nr)G4Eke&=6?&6 zT=*K)(`p;Czo)=i*NmR*=7-e31Mk2Wh0^C8cqIR01|99dA9M6YYcxNr%0-EsX<Dm{+lJ(}iD zPVxUJ!5bqqNSUnl2-gZ;AFSN@&SdJ>nOFE0fc|e(&=gGjkI46%m%2NY-h~J8jp!y_ z_yvAtDh)I6j@YOA+Q9qpf`|0C0TWx+6zgCk_hNz#n|Nb3l`JOSj;F`c9uq&JKR5}g z;Xt&WSKHQ69_qf@bN^~fzh-*`I$nYI^6GdWdw}QUT(#`%B-+xImjs?bnRWm!0u(Su?k?ka>_3@*zB^A#L0M90EI0Kf{y= zu|%;$sZc)w9y_tipVO}H=v_Zgrqu~Nh3}b6j}!R!zP&#{=`xESWI3hf1U55=zg(HB z_QEs0bg&1;{nW{HuLsWnujtv62XMa+Xnaqu;bqThNlzZ-?Ia@0(RO{Pi>W{%mL!S~ z=xR?M)7;XbtvvWq^vaGhdpZ$;W?i<=b9ROm_$8$ zqkzpO(fHm_bXC#n-aMf(6IsVA71N)Fhlj^#n`!lHquJ{TRNb2o;1IXc`hXwurIW1F zQurm-&~hdqShuw_2&~@ZS3kNTYch#O_QiawqEGwsV7@YecJ<{$_@no!K|kIsWSdAn zh~W{Y1S8v6>(Fl~uU*19oW`-wr~fr!K004ND3RntqWm30<2Ili?RN3G^>jbJOXBAy z((HkJE#EYeS`Fe0_}q!sU4wWJ#v>+D^YL8DgHC)XZ>@cIJPIivy{EI?LmRPNhqL&e;Iah@%nu{RQ?H?X1@Anb z?hNIFcmFR*BX3j+dKRV|2yxAlssRmJ-8_t7XR2S2O`jpv>b!* z#(Oku81L<5{@ow1lhgOZcoa(U_b|Q-sjbT3-TBP-=ynDl!?WL`zM0&}cP^o2nOy6n z%+?y_Wm^wt^34nA_Zjgbe2xDvM~}{Poc-zd?A;n zP~HfL(Z5e7&m0JfCnwXW959xHlWCRs{cbXy&EW%F641x0?FvOV(v9Td{KNzrK9UFW zLlbDhNdA|{Clf4d?9QH7v%=KTvT@b~nwiVj^QM!j^(b^EgSG!CJ_O7^%(`nd1T<7; z@K~P6PmH6DWBF%o*N+2T^d%lav((vRw5(7#ivwG>&*=)6NZqe0welw1SjpIHZ zU;Phu@i?-KLwBDuj`oh@T0U(YT^+~$cySoL9LL)-r8W3n{-=uXuCTgK;$EEh(~)*E zFLZs4QGNq$uV_oBC-c>O>;!su3h47{G+m#8m_x!JZ=Y1!xl_}*RrWBY{+KV~Sq0wdg~Kh<`QG7v{?`57XmbCM zoB68I*8U&zy{zG*(YqSgFN9fyk@a?L&RgDiXSyWgZ~gAHw0JR+NRC!dms1&_X-hp=aW4Iw$N$vM6=?nGh`Lap2Lm0!8Q2z1e8#Ho4^Y3GdUiv527c!^-)x_Jrrf+AWjtw%9weT0Y_4 ztm)b8#S3yn6qv=P)_=R4`LKS<@oek&b5KmxUNC)c>thR7Nqlz>Rn6n^yfB9hpMk~Y z=UBh~j4K)Ml|yUh^B1b=7zdMR)dFtgmqu8#^Z8Jw{WNQqF^7BA-{s}H(aZG!a>{kh z%kh9h(*PQ0qK1=n}(%(OZ$=BF8t&8CY>AnB;Gt$V)YDyBM-F>7`<6))w@_`wXiwv_j( zzi~Jcbm-NaDdH=>4{MzVU-9ASFDc9T=U^u{mSGNniXHK3u4PlS2HbBo9v(sS2@B2S zwsedjbuHRQPRlV*-OZw)<-DDyFcXPl?Ss3iO14Tk94spgj}M>Fu@#v#WjQZ#&0V22 zRDq!mTtTLHOEcMMx({ehtJU9!eG^9G29VXXjq_nJ8J3U*5k7jpf{zIAPFbQi~NB=RuhiyMl*# zwh%#aD=?^!TG>m>d^72z75oEk8%2*-@WUQu8SsWg2>os_?h_gG<2O9a$zz$;kcdNp zZ}<$Szfk=03YxrX?=`4ffIv9(IkQc*0)R$f zRFt`zH$h`f!%xFWpqM&4P6(57wH~}d-Yewondjdk zm0qEG*%RY7g54QL?TR4kD%x4K>##WYRNbj>YT%Sw@G7~RhpCT~t&*B-lWUvL8VAnH>0vwTZDQ#lP|j_&q=rL z+sTz2!}{>|+=tu7(fRLrzmTJY>m5*)7G#(9buT^Ti?VJS>?ocoEFkuX$=hAs$PiJ2 zWD5sd`|SqTW@~8o54?LDi*Nn${(}AHp*E;$HGP%uPIWFQpykn|bjI;y-e|Q!+Yc z#S4o0k$(vap8k>hgCjoq5g~1pD5{uiU7w*e287CJM_I)@*3)*`C5vU`_~1^Sy52-% zhK0TZnp+3bgJM3SC$4qoc-5Cn?YdTv*_xkF;!N-J6RhQ6=UF4GRhjVJj+f;e?K^OQ zgA_XVN|3j2t>X=OlLyes5~Q1bkS>?-UA*jt_487mrQ~~GSf3n&J{ZqU`F>CcUypw(Yw1tmNv%uzAtC+RXQCm4 z5>KRPOMTe^fpa!`IW9LX5+fheNEvwNHsN7@X0KbhU9@QpJK9l98Tad6AiRPSMRdof zS{an6Zj_}B@cT2%2Nq3zGa^dZauEn7WGa(A@H`Jn{-r?J9@w4S6=0a`3mnmx@m@Zb zO{n!Ba__s?wz55`iGPkRd2t`rl=0-iY!L+v*DB%<6Ani&cYFbjBO@gn)Q=|Nh>556 zBRa*y+nPl%D2u?q`v6CmH44m$l#7{l)r8M6#6)L~=||5`aSQL;-#Yy?cV;arK!EUY zah!6)#ds<6WXd&uN`lQ=ZD|E7?@NVeAYeZ1M_%Q8BUt=_avtoOjNsz|i^8oB%dzFh zbNf-qIsP$E=trB*Vb8$t6m|ZUH=}jGVDVb+aD2oj(Y{}K*IIT(IE!e?xAdjvzo8|+ z?Q4zujYqP8A;}XO_1ooDztGEdiIzc>M2{TkGQPh@?Jn*h7hUgU>sRNo5AITq{3`%? zbn*h0b^oT)L-G4Cl^R~;`$!`3EaPoQkl`}#hczHAy9`00TPp3n%ndv; zm0n)vGq`sueRKs|x-6BBU*RM9?Gy^X3c=!h3XQ+YJ9!;X0X6f>^0&viZwX6Mvm+^V z=qexLI$nqT0sZu(y@m~iH7S&MjiA%nr+aoIJELD4s)ohj2`Pi9 zt1Pk->;JT;l} zZbJC!noI|8V*MA9Ow~6bQ6)!E(?78WYMD&E|AdfX>q2Ayu6J4U7qd(%yeyeo{)w(^{S>cYC5X2+8#3VOlr~1&czpy^?{+&ACLSI-E zLECTfHa^p9Bl@U*fWd+m>TddyNo-0VdUQ)Lcoo&V%`dpeh%nKtS7_o<)}asGzs+ZJ zpFY;{clcJu!|zyI+~dWJ$MmKffAcF`>P?6K!M@e=B&z%e%e}KnWVz30c=$+q;klZ}p{@kJ0Ti6RG!0wS zIA7L_CO+rKctHfkR6^y|W>?YZO8%m8lU|}+EK!LEr_{~Qjm5d_R_5Ky`q96TH zJHku_3rWD?mV^rt*ScE=C?#*s2Xv=#PEv?hVs{Z*2AQr4qZurrJ8g230^GX@e3IKg zq0vSb+nugBNm<;#J9ViiP3KZ~I#f?8^tv36FzPwcvw~8FL=4fg^YJvnS!(KWM&P3t z2c?86uV`6WJbmLVP2d#~_ck)HFMc+$B_5j;R?&2g1XtcA0Pg^{2y)1b2` zYh6M5vLLuvJRPeq9p-1v*12kF7xTzABk+*UK`H7v$T-7H3GR{~A7rK+cWEq-Gh2Uk zmtKMN-RP``WDCjf=1AKkdKUW9kw`XAxI>l4cXOvpcKzvLN$Q)YV6m9Z?ncF)(gu%# z!vAgZ{kvJGcuCV3f8LdzHIzPS{A*Wu$GM5t_BM^}j8k}&@l03x+*=CZwyw0>8`Rp` zm3$jXK^}!7u>Mq}qa(A`T`9Sdq){z`kdkNppb?T~3G~=U>epNr0p-u^p$eDTbyHsX ztC}w70XJS#R%5Am11AwA+Ed0-3O4|{(vOX$G2FJ1LVcyCvTc);x#G5sNrdZxz0UED(J_^EGt%iMlD}t69Xh2J z-N8t_skEJ|jn-XFrSFxziIGOOl*Wcs8;}+>KpLPfFU2=@Z$VTTh|Xq}4nHU;;rpq9 zs#{9h)_>RG+`x72i0^plEW5+;m%~GiS9z4|4+F((q$nqkNZja&q}dwLB134SMrz9s z8mt#J(m)s?SPxm#+FmRDEb;J2D-V6xYgJh z&WnV}N6FBF;*fVxig;5@$(GbP_I~N0!548<5G1warJbn+VVmvhjIio#U7y`SI=%la zy(vIj+Dc!Rz_xTIzhG$qw;iSrg3(LNk&SU5(a<=I_0lac+Pw@&ugDShz}4uIjl_4*AGnnU z12{r~4Vt&Cfg=F)!FRdWQ_tCPD12A%dd#)6b!{7Ih>{mXT5H-#t0k2ILk*%NdFG<_frjnj{)UWbNI!rba2xQe0Vn`BI^fJ6PyomS zWB?2R4L||75e0uh0U!^M0Z0af13Ul~NUt1_p6g+dZ`s4|O5oQgXI)x+Z|#enE)(dx zDCv}Bi9TbU*+FW=0$*d`6mL|r1Y3Zi7(J#OP%Mgt?f(k=F30xs(i++yE#(Y0Uk~`> z$nW4cw}qCMJnSSa1XXhuG`QrvUA|z)&C*zxP|J0NEyTwbqV}V?R#>``5V#qH>(s=|qqTpej*GXX9$8|HpiyG`v~(#wv+Q9o~XC7LF5k`i5Q&3#mhd5#xO7>;+6hC2Cn3^X+DNFlLc z^4K{Z7Ap_4l99ea9N1upMxPBZbbDWGC`<7-gvR+B!p{X5vhjOc z3}1xH1MC1ii>2#brJmdtLm}Oy5RYr3*1JOWSI5BqQ^#!<$_5r0e9=wn=wX}FXlJo~ zSAB&~GgX+otpQ!^ChhEMo7!kD?w;44pF_1quhnZxHCNvc;^w)Hba{3;4|Kg3E_t=k|MvMrHN;d8f|3zgv!iPzm8&nIXlc^L2t^L2P!;qw5fXq<)>y$CkTKc zCN`T`KolJRIk``!LGjX=jyDYG`l!CT5Jf>W?Ccx|L+atd9*OYkZn~09=pb7ESq8^3 zoObvuZIOcAi=xc#QlIWi5p|%+->{=opdl7r6Nx}cGnlz}TKfE5=4Jl+Z`%itwoWXm zw3n8>=4!=NkGHGn1MNln9z0Q@nn+TD)H>Vt=_C11D4q%r`44P#xjLBPW=Ft=`b1x@ zZlW$~rcfv*@x&(ecDo6Ux|QVSd60i z0=87s=LwSRY99HhY$Awg&ZT_`VD08M^m~HjKhx&Tjy<=V)r$CMcKLU^UOiE@h{Zp) zTTZcKkL>32EdHV0l<1mP@$X!0v8i4DD70VAzyKU8is;PFB|6{Lz1;y;MgLtUES^|q z{SDh9lOBoPoh%U$AL8&G%eJA8sx_ZmVRv+dwhG&@e`XpHs(9*J9uXOed4Cgr-VH?KW|FPWf zDsvLGmQ%0lo`|VW;c)f2sxQcP(4;yNzHj>Jc=Rjf`yK{u(Hvbh`g8#@5vrK%y{`}o zipY8;uA!S|7R_NPqDoj1V|g}*wHBRMcVuI<6x1*}f;|!pGEQwOnxieP1|`i6aPtB? z$)>ei*btG@TXjI(VVQ$G;+TufV#PjB5ObC_q3!E7Qx)=#En4jiO;9&%t=>T49F?|o zt+DUXyZKer^Kw>u)s-DH9jou?oLuOAI|8bz?Z$#FrhpmKD-20Wjq=N|w>6zd4|++R z*?J01l%{$qV!@RFd4LRn2FKHhQVV`(0G&^io@*>OJWttb*L9^XNs@n1`x9>|qk5>Y;mF=A z{+``@$9@W`wel%DTOp$9bTmIn>d~gje}%q-2O{jpZaS)0t0JqqY~K^A#6<&FMT!sA zBuQPE6Lsz_>0=gQAXe&OWg7ai+OE&zQ9xyw5+!>H>lV-5Dt4fr1%SPPV!%PbQNZq4 z+T2?To*6F+!G7PY)y$YKg=;-@mp5oLX4JK?lW1XG`SG_EvHhyB>_5Um08t2RWk$I5UCk6k~Q9~Z=uhIW9npW9C;nx9A6(cKEvf-?5uTP z2kJ*h_D7IC@>X{PQ=EIvE=bhU;cXS(@h|MS>BX8lFyFt8pl%3FhPjXJGA?^Hbogzh zb$z7Py$eP`fp&k(nZekP}(L`I?ImH&&_u$6ex!L&1H;zQ|-~i-vU$DX8Gp=z3K;QodZoO(NnVBDqvn%^qop4=>Nar zjkYwuH;fTujAts$$(mY3o&tZhI91C3i?f|-`TvA7Q;Ru{}eRQSkTtu zBf}D=Vm0(`swA`Lv?vvW^){VJl|tDSdJSZZrdq8unVGg=jxJ&YVg!FHj$bfrghTJ2 zhr9j);emOm9Nk(GC%8xX$+abiXh2`7O}*>Yrf>gYKhS4=rRJU&3W~8gRT?x)_Y2U^ zAWT^MN->eu>wqr#YLon{oxK#_&WY;5g@$u`6XlRCg}us`@L77Em(wINr=jRbip#8z zom%yiT18$xh|nk2Ixluy2vk7-U?W6I4-`U(mO}eI9N)}_U%2vU$iR8nU)9wCJYnR3~+Tlhpq|M}$CZ#sr?JI72+~{a@@jNMC0zI!O)#0u4 z!r3yKktTKG|Jdn3niL%H{$`<y=uqf|s3Bd%Du+A%=#o7u50S#G&m!zy0o7wQ#KPD7RX*M{u=DHjbnr_7g>616pxs#~iqBtrYB*ii>vJaA)&YV~ziY;UT^8Lo*HG_DlQUbk34OpP+!Y-oK+s0#j|!h3@6 zpA;o1gIRQBkT+{tOP&PwhCI*AK??RaEgvj}4f-8c`W-~9FG5ALx6`HBN1;=GU)oiX z)7%Z(P!iI<#Xb;etG!Oh7j<uu-+Yp_Z z!A^Ya<5+;S%6X7-YwjH%_ z{^6BreE@5{nAkq4A$3WYng)DSMnTICV%{cDOISH&kjHFyK{A3ss5sXk7635WJnCbnF!vMlwctfUP6k}hq!`1W>(3R8EWdvCWtHnSoNWIt>5s&+TY`5w zl6N4|*^OF6X7TF^-TC#Vbw)f`05t%1xtdck;@RLcKl{K5=eP-MKDlOM5U&H6>?AzOIu|21fzDrHL6*tL(ea9789V zu_xal2FqQ~HM4RQ-a#z1E1SC&C^@VgMEyj3GTNwBe5{uCXu00-v2MtlwB|V~lX~Po zo)tCH%3{!7{aYynl|LHufKqo?pa~9gySZ$T+z_9EJ@R#F?`3c z`N9{;{6U+6Y!dMTv@s}cPv4wpim4F`qA>b1OKQcBJ|@@UQcst1jKVUg|K`%r;gXgm zQr>W>(@d8_q&3@Z*74;^wU-lK@JX5_e|EySYF)JFK=#KCdupqesqd!rjOZwbD)qlO z`ot>1DCA*hqGhzBK&7*<1!{-dGwYgNtup>%PmMp&(_m8Or54x+c>Bx0pVWP}PQ-W8 zAGsP6&K5ctk}~x=o0)3MGnpSAV~UB_nc63-`@6;=+fr(Td?d%8S#r(3_OqJe{0h^E zYTbwH(6N6}>5mv=qBqZ*?VLBe#{)J^q@>a)EIx|4XY7h4II&0NaV1onsbFK*=`)$L z!9}*1!Cr&5rUuE3ZCH6zuSmQ4CHRD=skr&GOsD~=QqvTw+0U^w(EVqoRUCav=d-2A zhDm6KH(mO}7syZ7jhc_Z=2a|p9wCLKMz7-q*$VYp*K68q=!dav+y(@?%A-?oZX+=1 zELUI-mNqLZE}nFJ^@$UnXJ=O3)tz%wRvB}eH`ld74vuC{btK=M_K(2y&>SR-(dx#Z z)Sh$FmR@BVQP=o?YBvTLYqXAQl$eKX?NGU)K7}f%4D}0Fw)J@S#!$=HJxx6UI zBo6PtbPU&1MS6dw-anF_dO@8@b*CD91ku$hwUZe-qf#TEVx;WCEKM<%1GQfHPl8zf zE*XYRM@ky^dR1a+p%PV8$V!?&QflG7u?ST6$zys=fVQAz{t?JY?sRaZk+c^#AK8yp#`~49ssKu8jF{QOHLRWRNV!v~9idox z4(0%{Khw?pS4|wtohAQKX>yWMogjr|IjK~I)G=4`XTQ4`AVDW6wMzF=99aEr zbEfP8TB>_wEXyGqEu-e_lR%AjK!MdfDYg31rPXC;H8t^d?^Zy5(OSWaX3||$FxLKp zY+M{)P`5pkOr$cOW#SWVlgf~KG3hDapQGd?Pk)3Mea#LCrob&!zjwo^YrosK%TbsJB3G6p?rObe z^!&_rp2f*6P;Mr%w-ZObr?XDGK++DkBkOMjMfNt6xA^)gN<>iS-F0Wz%hHZB<5!o+D$iypzgk}5@Gn&?hjeYkcB2$G zae3RRN~HI<>ut%kSE4^`ar@NYBJ^y~-v(#DA$net>aS|1`f8^5E+yR`)Vew9<}_HJw+2M04F| znzj7YRHd`#@x#iM>o0xtu>L&J>Rv5PvytV=-ZhT*a#F(WBk!9@F!#xA;2;Y%^}t)hQe6?UK)L*Ve?=>wIOMzntTH z(_Wvo71hfY)r+wfwDviVeJxT@TFB}wdd{gLfkiE|!dND=#Jid;U)SgOYULgEWn}fP zrV6_Ex-tj_b10IKXDdc-`;vhx- z%6sQ2T}VC8&Qr9R?D}nNTO)BV2EQ29N`PE}($l%~QH{>+x`#6zI4d zMyDbnuiPZ=f!l!4L|!$ANMyb6!m5E?O_RRm3C=n)U91!1`KWxwH%|F#u_V=JX@t7%G?c?lqNxM-x+9<z2=V> z(r62xBt>ue=kY=-GYG#yI)Rd@e%BpH+R;3LgLqs4fhx7RbN;_Ap z4dF5xt&;s6<--or$}$r98{b-hv$Se{sX)P=I=J5*wIWniCincXhE*XZG7=` zMIUx>y|}TG%$DA$F1`U})#SzZLnuynB=KtRgu&0gj|3Si4%39L+e2-q(hZF8JJYdI zOW_?}SG=57d>JP7QUyA~kd=BdcAjtWL9Z*mYWAdw48C6z2dRm_iw(p9Mo48`Arx6` zE8VUgRkQkbJcKVxpF%!>-KMPWV;Aq4)>YOefC?6m8TT#(gGqG1JQ3^wPx>L7~_Ub zv(pwd1{UU&+08-YT5Ca8YYCLGR0;1Z4dVuAZfM z1jdyKsxz~d>I^CqRA;83IvBq}q!(j zL=}m;O2u}dE4B|TbMBav(YOCm=hE(_p0H;{#i>=meTb6Chf9Iwg#=2fGlP7B-F7VC zvu8u>oW@IME9!ZT*xNbwdv^A;8(*~vy4z$xDe_|0QK>Yl)UR_lF!p2^7hx|>r2fR6 zS&?e-10g=wfBxsQ9@q{cp?>S1#oPYUoGi`%{A60Wl-PYOX5Rw81-VNcQ^{8-m$b<{J|&IeEKm8f`AQQAW&xK z`ImDPzmC3wXA8pvI2g)h5Al1F#sJOsbh7p#|8tHKV82oXLU*hSbjRL($O8+NR~%=E zFbu+YJb$ZFActRFs3f_S5p(|pbcid?!Iwm##lpUDKi*QPc&dhp1`CTtZK0~_KUeA6 zE=u4qe4m0FN1l{K2%lyGe{HVP!L^4-tj!skEZab%NM$Vhk<{=H<|^Kyhn65lwE)@> zWxo@@XUWbB%QHxIogA=43uA8jLuQ;mzRrK2tMt$o4`_1Ks8#QgV8PeG48CqCB2|_m zcY^yT*}UHyN;r9s7rvo*k!Ad&Hmj~FG{II+xyU~1?*<(tq0 z_keTTWffLXbVfQkB#sOYz(N`ha??qr@NHW^sixxvttMJEf$T8#DFP`Z3wY*yWg5va zotqEAfJTkJ3IiknvH*(!Wq?}1O@PEZEmR`iqD_CrSV{PosfLDILwH5x6*Jq-3l>5l zihap9E>yyBMsZ=G5{SjXYLOBwv#s2)2ot}Uk6DC*TzTOlWw>K>*p0$fBKy`|C*kOh{2a=kI>Q~jE!A31H;_mxJaWo``liymS1_uO5 zv96u9B*7oZQ} z#>GlN;Nw!Qrqj%U+Nxe@0j}EAj%aAwL|5V>q=~VJ>)5%wkrD_}RxDP$=H2=e!4O0m zG#$yHHTaFsY}9m0?YTot`=rc{hA8N7OeE=>5r;&G3n4~2hFlaGVIu2bbL!M}Ldh;U z`f>AmO{aVn%^%#dV%x^~!#*x)HFuHKtT}2X27$dYeO>X*W=Qh;?21dqa|FE0n@SqG zbj6$KyfS|DO=UP4$vu}S#pE@di3Jh=uBk@D0%vztK!g8`i5@c8*ym zZ51SC{iNn0A>^aGA}=`ZssrQ$@f*^Qs+ud<{HzkbkS;ImpR5#ql^rC)fdeAFz5wM- z?>IzDmi+_4lDoYBGG$mt*VYCd{?gn4Ej`aoFpdHU1%&ZWmnnYX{fdDrFmCxuOzBN3 z(#PT**Xp$=FIl|0R<9%JX7T2iv)j?QLPDNOM-(jpPTht%*7*KBv77$+;@6gF@*oR=pRkuKj{YA78qu@Y8-Xd7q|W5uzOD4~ibD70zUdS32_R>gPlRKU zPsBF32Npu7a3OblNAaC!Eo%9_tg_R8`WKNt3R2waA?r1kOQd)sVpMq1t$J~bwkE_v zrOe{fLC?hVM`6Y-*BGZep(9U4V0~P(w!C||y>U}2xhIw}a_hq&Pd8b`puKkE!{q$7 z#s6s`*FFr=x#0~RbyCfM;)!N*W!{HI_3#?k>O6Dnhzin>jiM2O8vSvhZL(f?EKyg2 z^kl6iN-tL^(jeO_3-8QM6MDtT!fa>&+A`v(dyin8=)#upW`0r zDK4*yzV2PclMLYd-&KOU-rTOT)A~4HK4nIJ2jiw)q`Szkzq-ACg0r@Zz=}{4 z>1rvffxDI{K0SPer+&(e))tcJ7fm`qj4yuIlK$ei&Cum3kfil(b zx4dWZFD++vrG3M}FaBlRbQZFrHhg`F(o=Tq&(D=$KXy(~MF^2#K2=+lN0P+{>lk9( z)HK>&fB$KH^iDEVe6m~eHk^RqOeS6=fVy$GedVpE+jr&&@6rVMnI!&rh$wYB`5LSfO;bud`%n6;Vd?=UrAp zUiKj$yi(~rWUMGi!?)pEuB#p$*3NMy>jsLH&!{ z<(A|xTOz-?3y#{&w?%W;Of;fQRXthup>Ut`au)8F&v;MCC4Km{_mp^#<(4t}z54PG z4G`htOs6swXJ(5VdHgDzPNeh6tCWhsp&}8K*DL2?gbdMk>_!HO5J>ASA=)Ze!*@<3 zs*#U;ANq~@Mqd8DqLBj|`JwlfDA~P{w^^;Mad*3gJQrlu26A7l$-yEp}MX z&s-a&<-G0#=w%o4;5ACN-2D!Je~r?$#|I!<8v!=~+W-duH2_Df3+Lfp0obS|>Ar9y zF#5!LVS2Jg(aA)|A($EkOQdhWk)`?k=Taq^+%R=ni!(0rk?FN{%CAH&>CXq3DPBGv zMd%FJvBXR$Z%f(AlEHf#{DzPkXyV@IdGr0B>c*fa4{b6Rm% z2;3ExEbA;;UM1gHvgrPq#rqcjqg?4MyWHX)>y?^_VNh*qcIof@Xx*G^WnI*Q-X zGJaFoF~;v=g5ON5v%>Fc3BRqh-+LNrJi-3L%#`m2rF-N!QBYuC(7y8TRCZ@|WV8r4 z+cz*y1XYs}7H?eOIN?1)5-i?vfjPo^?3x~|*qRN>aZ+qb->AGo;C{DBnP$~#nUII7 zo~uy^<_9kZXsddH*EhY-y-zDX9%}ra{jX$Yn4}f``8(T`Zu5?c1GnPMS5(e*X(gD< za!9dS60=%cRwhp_CMhL|$HQDRTM8RaUnYn!gcM8Ngp!b9axn~qjS>l>H(kN^w3QHQ zM0AvhHcl?qmL-s3miP@EjXGmG<(08+`0`T+8WwgU{Qp zJ3 zK%Si69Hw{kY1Y<=F6hjQb}Lz~PL`N^O^Dgh)EcAO(zIJ40S)L0*k?ADWuWU?Rr&(+ zNyuzqg5ti|?PMNxB0=0|4>l1h&i8<+P`=?bkPal=u5O!g~{Ehit z9KMH=dEBs933fG#G?Qv3UHEplv!fKmm8~> z|07m0mIq?Ak`FAg@rdPl`xIB*3X6X{7UiY?NX?Ap!5G72sffL%51f2PBXaEAr}QA_ z`S1Ib0Qsk@+;P7WtSMe_@93?w`fW`ryH-0Fni_vKS<_b?s@?Ix`)RfQ2aTi`HqziYdQ2JP@4*EoVb)F|xKwZrq zx*||pYTCems8D=g86za5*cm6$EK)H994=(W)KPb~e&s;)8nofeXzD$=_Mq9bP&t|&i z2RJ3Wvk>B`6vy0Mz4DH}`%|rMgmLpbB!hQ9sSI~9iCl5wj;|JPl~fgzFE8;APbwYd zZI`&|q|�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 diff --git a/sonoff/_releasenotes.ino b/sonoff/_releasenotes.ino index d0ee99334..e3a59587e 100644 --- a/sonoff/_releasenotes.ino +++ b/sonoff/_releasenotes.ino @@ -1,4 +1,24 @@ -/* 3.9.7 20170129 +/* 3.9.11 20170204 + * Fix command I2Cscan + * Fix not allowed spaces in Topic, ButtonTopic and SwitchTopic + * Make all TELEMETRY, STATUS and COMMAND message topics unique (#4) + * Advertise command topic to be used by iobroker (#299) + * Fix butten (non)detection if no GPIO_KEY1 is defined (#13) + * Change WeMo serialnumber from 7 decimal chars to 8 hexadecimal chars (#18) + * Update web page with Build Date/Time, Emulation and mDNS Discovery and Advertise information (#21) + * + * 3.9.10 20170130 + * Add WS2812 Color Type selection (RGB or GRB) to user_config.h (#7) + * Hue api changes to support HUE App(s) (#8) + * + * 3.9.9 20170130 + * Add command status 10 showing sensor data + * Fix hlw status messages if hlw is disabled + * + * 3.9.8 20170130 + * Remove GPIO07 and GPIO08 from user selectable (#5) + * + * 3.9.7 20170129 * Fix possible WS2812 exceptions when using emulation * Add command Emulation to dynamic configure Belkin WeMo and Hue Bridge for Alexa * diff --git a/sonoff/sonoff.ino b/sonoff/sonoff.ino index 4dfa6853a..b6bc9eecf 100644 --- a/sonoff/sonoff.ino +++ b/sonoff/sonoff.ino @@ -10,7 +10,7 @@ * ==================================================== */ -#define VERSION 0x03090700 // 3.9.7 +#define VERSION 0x03090B00 // 3.9.11 enum log_t {LOG_LEVEL_NONE, LOG_LEVEL_ERROR, LOG_LEVEL_INFO, LOG_LEVEL_DEBUG, LOG_LEVEL_DEBUG_MORE, LOG_LEVEL_ALL}; enum week_t {Last, First, Second, Third, Fourth}; @@ -93,7 +93,7 @@ enum emul_t {EMUL_NONE, EMUL_WEMO, EMUL_HUE, EMUL_MAX}; #endif #define APP_BAUDRATE 115200 // Default serial baudrate -#define MAX_STATUS 9 +#define MAX_STATUS 10 enum butt_t {PRESSED, NOT_PRESSED}; @@ -927,6 +927,15 @@ void mqtt_publish(const char* topic, const char* data) mqtt_publish(topic, data, false); } +void mqtt_publish_topic_P(uint8_t prefix, const char* subtopic, const char* data) +{ + char romram[16], stopic[TOPSZ]; + + snprintf_P(romram, sizeof(romram), subtopic); + snprintf_P(stopic, sizeof(stopic), PSTR("%s/%s/%s"), (prefix) ? PUB_PREFIX2 : PUB_PREFIX, sysCfg.mqtt_topic, romram); + mqtt_publish(stopic, data); +} + void mqtt_publishPowerState(byte device) { char stopic[TOPSZ], svalue[MESSZ], sdevice[10]; @@ -943,14 +952,13 @@ void mqtt_publishPowerState(byte device) void mqtt_publishPowerBlinkState(byte device) { - char stopic[TOPSZ], svalue[MESSZ], sdevice[10]; + char svalue[MESSZ], sdevice[10]; if ((device < 1) || (device > Maxdevice)) device = 1; snprintf_P(sdevice, sizeof(sdevice), PSTR("%d"), device); - snprintf_P(stopic, sizeof(stopic), PSTR("%s/%s/RESULT"), PUB_PREFIX, sysCfg.mqtt_topic); snprintf_P(svalue, sizeof(svalue), PSTR("{\"%s%s\":\"BLINK %s\"}"), sysCfg.mqtt_subtopic, (Maxdevice > 1) ? sdevice : "", (blink_mask & (0x01 << (device -1))) ? MQTT_STATUS_ON : MQTT_STATUS_OFF); - mqtt_publish(stopic, svalue); + mqtt_publish_topic_P(0, PSTR("RESULT"), svalue); } void mqtt_connected() @@ -958,6 +966,12 @@ void mqtt_connected() char stopic[TOPSZ], svalue[MESSZ]; if (sysCfg.mqtt_enabled) { + + // Satisfy iobroker (#299) + snprintf_P(stopic, sizeof(stopic), PSTR("%s/%s/POWER"), SUB_PREFIX, sysCfg.mqtt_topic); + svalue[0] ='\0'; + mqtt_publish(stopic, svalue); + snprintf_P(stopic, sizeof(stopic), PSTR("%s/%s/#"), SUB_PREFIX, sysCfg.mqtt_topic); mqttClient.subscribe(stopic); mqttClient.loop(); // Solve LmacRxBlk:1 messages @@ -973,24 +987,23 @@ void mqtt_connected() } if (mqttflag) { - snprintf_P(stopic, sizeof(stopic), PSTR("%s/%s/RESULT"), PUB_PREFIX2, sysCfg.mqtt_topic); - snprintf_P(svalue, sizeof(svalue), PSTR("{\"Info1\":{\"Module\":\"%s\", \"Version\":\"%s\", \"FallbackTopic\":\"%s\", \"GroupTopic\":\"%s\"}}"), + snprintf_P(svalue, sizeof(svalue), PSTR("{\"Module\":\"%s\", \"Version\":\"%s\", \"FallbackTopic\":\"%s\", \"GroupTopic\":\"%s\"}"), my_module.name, Version, MQTTClient, sysCfg.mqtt_grptopic); - mqtt_publish(stopic, svalue); + mqtt_publish_topic_P(1, PSTR("INFO1"), svalue); #ifdef USE_WEBSERVER if (sysCfg.webserver) { - snprintf_P(svalue, sizeof(svalue), PSTR("{\"Info2\":{\"WebserverMode\":\"%s\", \"Hostname\":\"%s\", \"IPaddress\":\"%s\"}}"), + snprintf_P(svalue, sizeof(svalue), PSTR("{\"WebserverMode\":\"%s\", \"Hostname\":\"%s\", \"IPaddress\":\"%s\"}"), (sysCfg.webserver == 2) ? "Admin" : "User", Hostname, WiFi.localIP().toString().c_str()); - mqtt_publish(stopic, svalue); + mqtt_publish_topic_P(1, PSTR("INFO2"), svalue); } #endif // USE_WEBSERVER if (sysCfg.mqtt_enabled && (MQTT_MAX_PACKET_SIZE < (TOPSZ+MESSZ))) { snprintf_P(svalue, sizeof(svalue), PSTR("{\"Warning1\":\"Change MQTT_MAX_PACKET_SIZE in libraries/PubSubClient.h to at least %d\"}"), TOPSZ+MESSZ); - mqtt_publish(stopic, svalue); + mqtt_publish_topic_P(1, PSTR("WARNING1"), svalue); } if (!spiffsPresent()) { snprintf_P(svalue, sizeof(svalue), PSTR("{\"Warning2\":\"No persistent config. Please reflash with at least 16K SPIFFS\"}")); - mqtt_publish(stopic, svalue); + mqtt_publish_topic_P(1, PSTR("WARNING2"), svalue); } if (sysCfg.tele_period) tele_period = sysCfg.tele_period -9; status_update_timer = 2; @@ -1106,13 +1119,9 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len) index = 1; if (type != NULL) { - for (i = 0; i < strlen(type); i++) { - type[i] = toupper(type[i]); - if (isdigit(type[i])) { - index = atoi(type +i); - break; - } - } + for (i = 0; i < strlen(type); i++) type[i] = toupper(type[i]); + while (isdigit(type[i-1])) i--; + if (i < strlen(type)) index = atoi(type +i); type[i] = '\0'; } @@ -1122,7 +1131,7 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len) mtopic, grpflg, index, type, dataBuf, dataBufUc); addLog(LOG_LEVEL_DEBUG, svalue); - snprintf_P(stopic, sizeof(stopic), PSTR("%s/%s/RESULT"), PUB_PREFIX, sysCfg.mqtt_topic); +// snprintf_P(stopic, sizeof(stopic), PSTR("%s/%s/RESULT"), PUB_PREFIX, sysCfg.mqtt_topic); if (type != NULL) { snprintf_P(svalue, sizeof(svalue), PSTR("{\"Command\":\"Error\"}")); if (sysCfg.ledstate &0x02) blinks++; @@ -1241,7 +1250,7 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len) snprintf_P(svalue, sizeof(svalue), PSTR("%s%s (%d)"), svalue, stemp1, i +1); } snprintf_P(svalue, sizeof(svalue), PSTR("%s\"}"), svalue); - mqtt_publish(stopic, svalue); + mqtt_publish_topic_P(0, PSTR("RESULT"), svalue); snprintf_P(svalue, sizeof(svalue), PSTR("{\"Modules2\":\""), svalue); jsflg = 0; for (byte i = 11; i < MAXMODULE; i++) { @@ -1588,7 +1597,7 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len) else if (sysCfg.mqtt_enabled && !grpflg && !strcmp(type,"TOPIC")) { if ((data_len > 0) && (data_len < sizeof(sysCfg.mqtt_topic))) { for(i = 0; i <= data_len; i++) - if ((dataBuf[i] == '/') || (dataBuf[i] == '+') || (dataBuf[i] == '#')) dataBuf[i] = '_'; + if ((dataBuf[i] == '/') || (dataBuf[i] == '+') || (dataBuf[i] == '#') || (dataBuf[i] == ' ')) dataBuf[i] = '_'; if (!strcmp(dataBuf, MQTTClient)) payload = 1; strlcpy(sysCfg.mqtt_topic, (payload == 1) ? MQTT_TOPIC : dataBuf, sizeof(sysCfg.mqtt_topic)); restartflag = 2; @@ -1598,7 +1607,7 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len) else if (sysCfg.mqtt_enabled && !grpflg && !strcmp(type,"BUTTONTOPIC")) { if ((data_len > 0) && (data_len < sizeof(sysCfg.button_topic))) { for(i = 0; i <= data_len; i++) - if ((dataBuf[i] == '/') || (dataBuf[i] == '+') || (dataBuf[i] == '#')) dataBuf[i] = '_'; + if ((dataBuf[i] == '/') || (dataBuf[i] == '+') || (dataBuf[i] == '#') || (dataBuf[i] == ' ')) dataBuf[i] = '_'; if (!strcmp(dataBuf, MQTTClient)) payload = 1; strlcpy(sysCfg.button_topic, (payload == 1) ? sysCfg.mqtt_topic : dataBuf, sizeof(sysCfg.button_topic)); } @@ -1607,7 +1616,7 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len) else if (sysCfg.mqtt_enabled && !grpflg && !strcmp(type,"SWITCHTOPIC")) { if ((data_len > 0) && (data_len < sizeof(sysCfg.switch_topic))) { for(i = 0; i <= data_len; i++) - if ((dataBuf[i] == '/') || (dataBuf[i] == '+') || (dataBuf[i] == '#')) dataBuf[i] = '_'; + if ((dataBuf[i] == '/') || (dataBuf[i] == '+') || (dataBuf[i] == '#') || (dataBuf[i] == ' ')) dataBuf[i] = '_'; if (!strcmp(dataBuf, MQTTClient)) payload = 1; strlcpy(sysCfg.switch_topic, (payload == 1) ? sysCfg.mqtt_topic : dataBuf, sizeof(sysCfg.switch_topic)); } @@ -1672,17 +1681,17 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len) } if (type == NULL) { blinks = 201; - snprintf_P(svalue, sizeof(svalue), PSTR("{\"Commands\":\"Status, SaveData, SaveSate, Sleep, Upgrade, Otaurl, Restart, Reset, WifiConfig, Seriallog, Syslog, LogHost, LogPort, SSId1, SSId2, Password1, Password2, AP%s\"}"), (!grpflg) ? ", Hostname, Module, Modules, GPIO, GPIOs" : ""); - mqtt_publish(stopic, svalue); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"Commands1\":\"Status, SaveData, SaveSate, Sleep, Upgrade, Otaurl, Restart, Reset, WifiConfig, Seriallog, Syslog, LogHost, LogPort, SSId1, SSId2, Password1, Password2, AP%s\"}"), (!grpflg) ? ", Hostname, Module, Modules, GPIO, GPIOs" : ""); + mqtt_publish_topic_P(0, PSTR("COMMANDS1"), svalue); if (sysCfg.mqtt_enabled) { - snprintf_P(svalue, sizeof(svalue), PSTR("{\"Commands\":\"Mqtt, MqttHost, MqttPort, MqttUser, MqttPassword%s, GroupTopic, Units, Timezone, LedState, LedPower, TelePeriod\"}"), (!grpflg) ? ", MqttClient, Topic, ButtonTopic, ButtonRetain, SwitchTopic, SwitchRetain, PowerRetain" : ""); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"Commands2\":\"Mqtt, MqttHost, MqttPort, MqttUser, MqttPassword%s, GroupTopic, Units, Timezone, LedState, LedPower, TelePeriod\"}"), (!grpflg) ? ", MqttClient, Topic, ButtonTopic, ButtonRetain, SwitchTopic, SwitchRetain, PowerRetain" : ""); } else { - snprintf_P(svalue, sizeof(svalue), PSTR("{\"Commands\":\"Mqtt, Units, Timezone, LedState, LedPower, TelePeriod\"}"), (!grpflg) ? ", MqttClient" : ""); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"Commands2\":\"Mqtt, Units, Timezone, LedState, LedPower, TelePeriod\"}"), (!grpflg) ? ", MqttClient" : ""); } - mqtt_publish(stopic, svalue); + mqtt_publish_topic_P(0, PSTR("COMMANDS2"), svalue); - snprintf_P(svalue, sizeof(svalue), PSTR("{\"Commands\":\"%s%s, PulseTime, BlinkTime, BlinkCount"), (Maxdevice == 1) ? "Power, Light" : "Power1, Power2, Light1 Light2", (sysCfg.module != MOTOR) ? ", PowerOnState" : ""); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"Commands3\":\"%s%s, PulseTime, BlinkTime, BlinkCount"), (Maxdevice == 1) ? "Power, Light" : "Power1, Power2, Light1 Light2", (sysCfg.module != MOTOR) ? ", PowerOnState" : ""); #ifdef USE_WEBSERVER snprintf_P(svalue, sizeof(svalue), PSTR("%s, Weblog, Webserver, Emulation"), svalue); #endif @@ -1694,18 +1703,20 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len) if (pin[GPIO_WS2812] < 99) snprintf_P(svalue, sizeof(svalue), PSTR("%s, Pixels, Led, Color, Dimmer, Scheme, Fade, Speed, Width, Wakeup, LedTable"), svalue); #endif snprintf_P(svalue, sizeof(svalue), PSTR("%s\"}"), svalue); + mqtt_publish_topic_P(0, PSTR("COMMANDS3"), svalue); #ifdef USE_DOMOTICZ - mqtt_publish(stopic, svalue); domoticz_commands(svalue, sizeof(svalue)); + mqtt_publish_topic_P(0, PSTR("COMMANDS4"), svalue); #endif // USE_DOMOTICZ if (hlw_flg) { - mqtt_publish(stopic, svalue); hlw_commands(svalue, sizeof(svalue)); + mqtt_publish_topic_P(0, PSTR("COMMANDS5"), svalue); } + } else { + mqtt_publish_topic_P(0, PSTR("RESULT"), svalue); } - mqtt_publish(stopic, svalue); } /********************************************************************************************/ @@ -1827,84 +1838,121 @@ void do_cmnd(char *cmnd) void publish_status(uint8_t payload) { - char stopic[TOPSZ], svalue[MESSZ], stemp1[TOPSZ], stemp2[10], stemp3[10]; + char svalue[MESSZ], stemp1[TOPSZ], stemp2[10], stemp3[10]; float ped, pi, pc; uint16_t pe, pw, pu; + uint8_t option = 0; // Workaround MQTT - TCP/IP stack queueing when SUB_PREFIX = PUB_PREFIX - snprintf_P(stopic, sizeof(stopic), PSTR("%s/%s/RESULT"), - (!strcmp(SUB_PREFIX,PUB_PREFIX) && (!payload)) ? PUB_PREFIX2 : PUB_PREFIX, sysCfg.mqtt_topic); + option = (!strcmp(SUB_PREFIX,PUB_PREFIX) && (!payload)); if ((!sysCfg.mqtt_enabled) && (payload == 6)) payload = 99; + if ((!hlw_flg) && ((payload == 8) || (payload == 9))) payload = 99; if ((payload == 0) || (payload == 99)) { snprintf_P(svalue, sizeof(svalue), PSTR("{\"Status\":{\"Module\":%d, \"FriendlyName\":\"%s\", \"Topic\":\"%s\", \"ButtonTopic\":\"%s\", \"Subtopic\":\"%s\", \"Power\":%d, \"PowerOnState\":%d, \"LedState\":%d, \"SaveData\":%d, \"SaveState\":%d, \"ButtonRetain\":%d, \"PowerRetain\":%d}}"), sysCfg.module +1, sysCfg.friendlyname[0], sysCfg.mqtt_topic, sysCfg.button_topic, sysCfg.mqtt_subtopic, power, sysCfg.poweronstate, sysCfg.ledstate, sysCfg.savedata, sysCfg.savestate, sysCfg.mqtt_button_retain, sysCfg.mqtt_power_retain); - if (payload == 0) mqtt_publish(stopic, svalue); - } - - if (hlw_flg) { - if ((payload == 0) || (payload == 8)) { - hlw_readEnergy(0, ped, pe, pw, pu, pi, pc); - dtostrf(pi, 1, 3, stemp1); - dtostrf(ped, 1, 3, stemp2); - dtostrf(pc, 1, 2, stemp3); - snprintf_P(svalue, sizeof(svalue), PSTR("{\"StatusPWR\":{\"Voltage\":%d, \"Current\":\"%s\", \"Power\":%d, \"Today\":\"%s\", \"Factor\":\"%s\"}}"), - pu, stemp1, pw, stemp2, stemp3); - if (payload == 0) mqtt_publish(stopic, svalue); - } - - if ((payload == 0) || (payload == 9)) { - snprintf_P(svalue, sizeof(svalue), PSTR("{\"StatusPWRThreshold\":{\"PowerLow\":%d, \"PowerHigh\":%d, \"VoltageLow\":%d, \"VoltageHigh\":%d, \"CurrentLow\":%d, \"CurrentHigh\":%d}}"), - sysCfg.hlw_pmin, sysCfg.hlw_pmax, sysCfg.hlw_umin, sysCfg.hlw_umax, sysCfg.hlw_imin, sysCfg.hlw_imax); - if (payload == 0) mqtt_publish(stopic, svalue); - } + mqtt_publish_topic_P(option, PSTR("STATUS"), svalue); } if ((payload == 0) || (payload == 1)) { snprintf_P(svalue, sizeof(svalue), PSTR("{\"StatusPRM\":{\"Baudrate\":%d, \"GroupTopic\":\"%s\", \"OtaUrl\":\"%s\", \"Uptime\":%d, \"Sleep\":%d, \"BootCount\":%d, \"SaveCount\":%d}}"), Baudrate, sysCfg.mqtt_grptopic, sysCfg.otaUrl, uptime, sysCfg.sleep, sysCfg.bootcount, sysCfg.saveFlag); - if (payload == 0) mqtt_publish(stopic, svalue); + mqtt_publish_topic_P(option, PSTR("STATUS1"), svalue); } if ((payload == 0) || (payload == 2)) { snprintf_P(svalue, sizeof(svalue), PSTR("{\"StatusFWR\":{\"Program\":\"%s\", \"Boot\":%d, \"SDK\":\"%s\"}}"), Version, ESP.getBootVersion(), ESP.getSdkVersion()); - if (payload == 0) mqtt_publish(stopic, svalue); + mqtt_publish_topic_P(option, PSTR("STATUS2"), svalue); } if ((payload == 0) || (payload == 3)) { snprintf_P(svalue, sizeof(svalue), PSTR("{\"StatusLOG\":{\"Seriallog\":%d, \"Weblog\":%d, \"Syslog\":%d, \"LogHost\":\"%s\", \"SSId1\":\"%s\", \"SSId2\":\"%s\", \"TelePeriod\":%d}}"), sysCfg.seriallog_level, sysCfg.weblog_level, sysCfg.syslog_level, sysCfg.syslog_host, sysCfg.sta_ssid[0], sysCfg.sta_ssid[1], sysCfg.tele_period); - if (payload == 0) mqtt_publish(stopic, svalue); + mqtt_publish_topic_P(option, PSTR("STATUS3"), svalue); } if ((payload == 0) || (payload == 4)) { snprintf_P(svalue, sizeof(svalue), PSTR("{\"StatusMEM\":{\"ProgramSize\":%d, \"Free\":%d, \"Heap\":%d, \"SpiffsStart\":%d, \"SpiffsSize\":%d, \"FlashSize\":%d, \"ProgramFlashSize\":%d}}"), ESP.getSketchSize()/1024, ESP.getFreeSketchSpace()/1024, ESP.getFreeHeap()/1024, ((uint32_t)&_SPIFFS_start - 0x40200000)/1024, (((uint32_t)&_SPIFFS_end - 0x40200000) - ((uint32_t)&_SPIFFS_start - 0x40200000))/1024, ESP.getFlashChipRealSize()/1024, ESP.getFlashChipSize()/1024); - if (payload == 0) mqtt_publish(stopic, svalue); + mqtt_publish_topic_P(option, PSTR("STATUS4"), svalue); } if ((payload == 0) || (payload == 5)) { snprintf_P(svalue, sizeof(svalue), PSTR("{\"StatusNET\":{\"Host\":\"%s\", \"IP\":\"%s\", \"Gateway\":\"%s\", \"Subnetmask\":\"%s\", \"Mac\":\"%s\", \"Webserver\":%d, \"WifiConfig\":%d}}"), Hostname, WiFi.localIP().toString().c_str(), WiFi.gatewayIP().toString().c_str(), WiFi.subnetMask().toString().c_str(), WiFi.macAddress().c_str(), sysCfg.webserver, sysCfg.sta_config); - if (payload == 0) mqtt_publish(stopic, svalue); + mqtt_publish_topic_P(option, PSTR("STATUS5"), svalue); } if (((payload == 0) || (payload == 6)) && sysCfg.mqtt_enabled) { snprintf_P(svalue, sizeof(svalue), PSTR("{\"StatusMQT\":{\"Host\":\"%s\", \"Port\":%d, \"ClientMask\":\"%s\", \"Client\":\"%s\", \"User\":\"%s\", \"MAX_PACKET_SIZE\":%d, \"KEEPALIVE\":%d}}"), sysCfg.mqtt_host, sysCfg.mqtt_port, sysCfg.mqtt_client, MQTTClient, sysCfg.mqtt_user, MQTT_MAX_PACKET_SIZE, MQTT_KEEPALIVE); - if (payload == 0) mqtt_publish(stopic, svalue); + mqtt_publish_topic_P(option, PSTR("STATUS6"), svalue); } if ((payload == 0) || (payload == 7)) { snprintf_P(svalue, sizeof(svalue), PSTR("{\"StatusTIM\":{\"UTC\":\"%s\", \"Local\":\"%s\", \"StartDST\":\"%s\", \"EndDST\":\"%s\", \"Timezone\":%d}}"), rtc_time(0).c_str(), rtc_time(1).c_str(), rtc_time(2).c_str(), rtc_time(3).c_str(), sysCfg.timezone); + mqtt_publish_topic_P(option, PSTR("STATUS7"), svalue); } + + if (hlw_flg) { + if ((payload == 0) || (payload == 8)) { + hlw_mqttStatus(svalue, sizeof(svalue)); + mqtt_publish_topic_P(option, PSTR("STATUS8"), svalue); + } + + if ((payload == 0) || (payload == 9)) { + snprintf_P(svalue, sizeof(svalue), PSTR("{\"StatusPTH\":{\"PowerLow\":%d, \"PowerHigh\":%d, \"VoltageLow\":%d, \"VoltageHigh\":%d, \"CurrentLow\":%d, \"CurrentHigh\":%d}}"), + sysCfg.hlw_pmin, sysCfg.hlw_pmax, sysCfg.hlw_umin, sysCfg.hlw_umax, sysCfg.hlw_imin, sysCfg.hlw_imax); + mqtt_publish_topic_P(option, PSTR("STATUS9"), svalue); + } + } + + if ((payload == 0) || (payload == 10)) { + uint8_t djson = 0; + snprintf_P(svalue, sizeof(svalue), PSTR("{\"StatusSNS\":")); + sensors_mqttPresent(svalue, sizeof(svalue), &djson); + if (!djson) snprintf_P(svalue, sizeof(svalue), PSTR("%s}"), svalue); + mqtt_publish_topic_P(option, PSTR("STATUS10"), svalue); + } +} + +void sensors_mqttPresent(char* svalue, uint16_t ssvalue, uint8_t* djson) +{ + char stime[21]; - mqtt_publish(stopic, svalue); + snprintf_P(stime, sizeof(stime), PSTR("%04d-%02d-%02dT%02d:%02d:%02d"), + rtcTime.Year, rtcTime.Month, rtcTime.Day, rtcTime.Hour, rtcTime.Minute, rtcTime.Second); + snprintf_P(svalue, ssvalue, PSTR("%s{\"Time\":\"%s\""), svalue, stime); + if (pin[GPIO_DSB] < 99) { +#ifdef USE_DS18B20 + dsb_mqttPresent(svalue, ssvalue, djson); +#endif // USE_DS18B20 +#ifdef USE_DS18x20 + ds18x20_mqttPresent(svalue, ssvalue, djson); +#endif // USE_DS18x20 + } +#if defined(USE_DHT) || defined(USE_DHT2) + if (dht_type) dht_mqttPresent(svalue, ssvalue, djson); +#endif // USE_DHT/2 +#ifdef USE_I2C + if (i2c_flg) { +#ifdef USE_HTU + htu_mqttPresent(svalue, ssvalue, djson); +#endif // USE_HTU +#ifdef USE_BMP + bmp_mqttPresent(svalue, ssvalue, djson); +#endif // USE_BMP +#ifdef USE_BH1750 + bh1750_mqttPresent(svalue, ssvalue, djson); +#endif // USE_BH1750 + } +#endif // USE_I2C + snprintf_P(svalue, ssvalue, PSTR("%s}"), svalue); } /********************************************************************************************/ @@ -1988,7 +2036,6 @@ void every_second() if (tele_period >= sysCfg.tele_period) { tele_period = 0; - snprintf_P(stopic, sizeof(stopic), PSTR("%s/%s/TELEMETRY"), PUB_PREFIX2, sysCfg.mqtt_topic); snprintf_P(svalue, sizeof(svalue), PSTR("{\"Time\":\"%s\", \"Uptime\":%d"), stime, uptime); for (byte i = 0; i < Maxdevice; i++) { if (Maxdevice == 1) { // Legacy @@ -2000,40 +2047,14 @@ void every_second() } snprintf_P(svalue, sizeof(svalue), PSTR("%s, \"Wifi\":{\"AP\":%d, \"SSID\":\"%s\", \"RSSI\":%d}}"), svalue, sysCfg.sta_active +1, sysCfg.sta_ssid[sysCfg.sta_active], WIFI_getRSSIasQuality(WiFi.RSSI())); - mqtt_publish(stopic, svalue); + mqtt_publish_topic_P(1, PSTR("STATE"), svalue); uint8_t djson = 0; - snprintf_P(svalue, sizeof(svalue), PSTR("{\"Time\":\"%s\""), stime); - if (pin[GPIO_DSB] < 99) { -#ifdef USE_DS18B20 - dsb_mqttPresent(svalue, sizeof(svalue), &djson, 0); -#endif // USE_DS18B20 -#ifdef USE_DS18x20 - ds18x20_mqttPresent(svalue, sizeof(svalue), &djson, 0); -#endif // USE_DS18x20 - } -#if defined(USE_DHT) || defined(USE_DHT2) - if (dht_type) dht_mqttPresent(svalue, sizeof(svalue), &djson, 1); -#endif // USE_DHT/2 -#ifdef USE_I2C - if (i2c_flg) { -#ifdef USE_HTU - htu_mqttPresent(svalue, sizeof(svalue), &djson, 1); -#endif // USE_HTU -#ifdef USE_BMP - bmp_mqttPresent(svalue, sizeof(svalue), &djson, 2); -#endif // USE_BMP -#ifdef USE_BH1750 - bh1750_mqttPresent(svalue, sizeof(svalue), &djson, 3); -#endif // USE_BH1750 - } -#endif // USE_I2C - if (djson) { - snprintf_P(svalue, sizeof(svalue), PSTR("%s}"), svalue); - mqtt_publish(stopic, svalue); - } + svalue[0] = '\0'; + sensors_mqttPresent(svalue, sizeof(svalue), &djson); + if (djson) mqtt_publish_topic_P(1, PSTR("SENSOR"), svalue); - if (hlw_flg) hlw_mqttPresent(4); + if (hlw_flg) hlw_mqttPresent(); } } @@ -2041,16 +2062,15 @@ void every_second() if ((rtcTime.Minute == 2) && (rtcTime.Second == 30)) { uptime++; - snprintf_P(stopic, sizeof(stopic), PSTR("%s/%s/TELEMETRY"), PUB_PREFIX2, sysCfg.mqtt_topic); snprintf_P(svalue, sizeof(svalue), PSTR("{\"Time\":\"%s\", \"Uptime\":%d}"), stime, uptime); - mqtt_publish(stopic, svalue); + mqtt_publish_topic_P(1, PSTR("UPTIME"), svalue); } } void stateloop() { - uint8_t button, flag, switchflag, power_now; - char scmnd[20], log[LOGSZ], stopic[TOPSZ], svalue[MESSZ]; + uint8_t button = NOT_PRESSED, flag, switchflag, power_now; + char scmnd[20], log[LOGSZ], svalue[MESSZ]; timerxs = millis() + (1000 / STATES); state++; @@ -2096,7 +2116,7 @@ void stateloop() button = NOT_PRESSED; } } else { - button = digitalRead(pin[GPIO_KEY1]); + if (pin[GPIO_KEY1] < 99) button = digitalRead(pin[GPIO_KEY1]); } if ((button == PRESSED) && (lastbutton[0] == NOT_PRESSED)) { multipress = (multiwindow) ? multipress +1 : 1; @@ -2225,14 +2245,13 @@ void stateloop() } if (otaflag == 10) { // Allow MQTT to reconnect otaflag = 0; - snprintf_P(stopic, sizeof(stopic), PSTR("%s/%s/UPGRADE"), PUB_PREFIX, sysCfg.mqtt_topic); if (otaok) { snprintf_P(svalue, sizeof(svalue), PSTR("Successful. Restarting")); restartflag = 2; } else { snprintf_P(svalue, sizeof(svalue), PSTR("Failed %s"), ESPhttpUpdate.getLastErrorString().c_str()); } - mqtt_publish(stopic, svalue); + mqtt_publish_topic_P(0, PSTR("UPGRADE"), svalue); } } break; @@ -2348,7 +2367,7 @@ void GPIO_init() uint8_t mpin; mytmplt def_module; - if (!sysCfg.module) sysCfg.module = SONOFF_BASIC; // Sonoff Basic + if (!sysCfg.module || (sysCfg.module >= MAXMODULE)) sysCfg.module = SONOFF_BASIC; // Sonoff Basic memcpy_P(&def_module, &modules[sysCfg.module], sizeof(def_module)); strlcpy(my_module.name, def_module.name, sizeof(my_module.name)); diff --git a/sonoff/sonoff_template.h b/sonoff/sonoff_template.h index 315f26b3f..b664637c5 100644 --- a/sonoff/sonoff_template.h +++ b/sonoff/sonoff_template.h @@ -149,12 +149,10 @@ const mytmplt modules[MAXMODULE] PROGMEM = { GPIO_KEY1, // GPIO00 Button 1 0, GPIO_USER, // GPIO02 Optional sensor - 0, + GPIO_USER, // GPIO03 Serial TXD and Optional sensor GPIO_REL3, // GPIO04 Sonoff 4CH Red Led and Relay 3 (0 = Off, 1 = On) GPIO_REL2, // GPIO05 Sonoff 4CH Red Led and Relay 2 (0 = Off, 1 = On) - 0, - GPIO_USER, // GPIO07 Optional sensor - GPIO_USER, // GPIO08 Optional sensor + 0, 0, 0, GPIO_KEY2, // GPIO09 Button 2 GPIO_KEY3, // GPIO10 Button 3 0, @@ -235,7 +233,8 @@ const mytmplt modules[MAXMODULE] PROGMEM = { }, { "User Test", // Sonoff Basic User Test GPIO_KEY1, // GPIO00 Button - 0, 0, + 0, + GPIO_USER, // GPIO02 Optional sensor GPIO_USER, // GPIO03 Serial TXD and Optional sensor GPIO_USER, // GPIO04 Optional sensor 0, 0, 0, 0, 0, 0, 0, diff --git a/sonoff/user_config.h b/sonoff/user_config.h index 2edb63c08..fae221352 100644 --- a/sonoff/user_config.h +++ b/sonoff/user_config.h @@ -127,6 +127,7 @@ #define USE_HTU // Add I2C code for HTU21 sensor #define USE_WS2812 // WS2812 Led string support (+8k code, +1k mem) + #define USE_WS2812_CTYPE 1 // WS2812 Color type (0 - RGB, 1 - GRB) // #define USE_WS2812_DMA // DMA supports only GPIO03 (= Serial TXD) (+1k mem) // When USE_WS2812_DMA is enabled expect Exceptions on Pow diff --git a/sonoff/webserver.ino b/sonoff/webserver.ino index 7689ada06..204d0510d 100644 --- a/sonoff/webserver.ino +++ b/sonoff/webserver.ino @@ -164,8 +164,8 @@ const char HTTP_FORM_OTHER2[] PROGMEM = #ifdef USE_EMULATION const char HTTP_FORM_OTHER3[] PROGMEM = "

 Emulation " - "
None
" - "
Belkin WeMo
" + "
None" + "
Belkin WeMo" "
Hue Bridge
"; #endif // USE_EMULATION const char HTTP_FORM_END[] PROGMEM = @@ -288,6 +288,28 @@ const char HUE_LIGHT_STATUS_JSON[] PROGMEM = "}"; const char HUE_LIGHT_RESPONSE_JSON[] PROGMEM = "{\"success\":{\"{api}/{id}/{cmd}\":{res}}}"; +const char HUE_CONFIG_RESPONSE_JSON[] PROGMEM = + "{\"name\":\"Philips hue\"," + "\"mac\":\"{mac}\"," + "\"dhcp\":true," + "\"ipaddress\":\"{ip}\"," + "\"netmask\":\"{mask}\"," + "\"gateway\":\"{gw}\"," + "\"proxyaddress\":\"\"," + "\"proxyport\":0," + "\"UTC\":\"{dt}\"," + "\"whitelist\":{\"{id}\":{" + "\"last use date\":\"{dt}\"," + "\"create date\":\"{dt}\"," + "\"name\":\"Remote\"}}," + "\"swversion\":\"01036659\"," + "\"apiversion\":\"1.16.0\"," + "\"swupdate\":{\"updatestate\":0,\"url\":\"\",\"text\":\"\",\"notify\": false}," + "\"linkbutton\":false," + "\"portalservices\":false" + "}"; +const char HUE_NO_AUTH_JSON[] PROGMEM = + "[{\"error\":{\"type\":101,\"address\":\"/\",\"description\":\"link button not pressed\"}}]"; #endif // USE_EMULATION #define DNS_PORT 53 @@ -971,23 +993,23 @@ void handleUploadDone() page.replace("{v}", "Info"); page += F("
Upload "); if (_uploaderror) { - page += F("failed"); + page += F("failed

"); if (_uploaderror == 1) { - page += F("

No file selected"); + page += F("No file selected"); } else if (_uploaderror == 2) { - page += F("

File size is larger than available free space"); + page += F("File size is larger than available free space"); } else if (_uploaderror == 3) { - page += F("

File magic header does not start with 0xE9"); + page += F("File magic header does not start with 0xE9"); } else if (_uploaderror == 4) { - page += F("

File flash size is larger than device flash size"); + page += F("File flash size is larger than device flash size"); } else if (_uploaderror == 5) { - page += F("

File upload buffer miscompare"); + page += F("File upload buffer miscompare"); } else if (_uploaderror == 6) { - page += F("

Upload failed. Enable logging option 3 for more information"); + page += F("Upload failed. Enable logging option 3 for more information"); } else if (_uploaderror == 7) { - page += F("

Upload aborted"); + page += F("Upload aborted"); } else { - page += F("

Upload error code "); + page += F("Upload error code "); page += String(_uploaderror); } if (Update.hasError()) { @@ -1205,52 +1227,86 @@ void handleInfo() // page += F("
 Information "); page += F(""); page += F(""); - page += F(""); - page += F(""); -// page += F(""); - page += F(""); - page += F(""); - page += F(""); - page += F(""); + page += F(""); + page += F(""); + page += F(""); +// page += F(""); + page += F(""); + page += F(""); + page += F(""); + page += F(""); for (byte i = 0; i < Maxdevice; i++) { - page += F(""); + page += F(""); } page += F(""); -// page += F(""); - page += F(""); - page += F(""); +// page += F(""); + page += F(""); + page += F(""); if (static_cast(WiFi.localIP()) != 0) { - page += F(""); - page += F(""); - page += F(""); + page += F(""); + page += F(""); + page += F(""); } if (static_cast(WiFi.softAPIP()) != 0) { - page += F(""); - page += F(""); - page += F(""); + page += F(""); + page += F(""); + page += F(""); } page += F(""); if (sysCfg.mqtt_enabled) { - page += F(""); - page += F(""); - page += F(""); - page += F(""); -// page += F(""); - page += F(""); - page += F(""); + page += F(""); + page += F(""); + page += F(""); + page += F(""); +// page += F(""); + page += F(""); + page += F(""); } else { - page += F(""); + page += F(""); } + + page += F(""); + + page += F(""); + page += F(""); + page += F(""); - page += F(""); - page += F(""); - page += F(""); - page += F(""); - page += F(""); - page += F(""); - page += F(""); + page += F(""); + page += F(""); + page += F(""); + page += F(""); + page += F(""); + page += F(""); + page += F(""); page += F("
Program version"); page += Version; page += F("
Core/SDK version"); page += ESP.getCoreVersion(); page += F("/"); page += String(ESP.getSdkVersion()); page += F("
Boot version"); page += String(ESP.getBootVersion()); page += F("
Uptime"); page += String(uptime); page += F(" Hours
Flash write count"); page += String(sysCfg.saveFlag); page += F("
Boot count"); page += String(sysCfg.bootcount); page += F("
Reset reason"); page += ESP.getResetReason(); page += F("
Program version"); page += Version; page += F("
Build Date/Time"); page += __DATE__; + page += F("/"); page += __TIME__ ; page += F("
Core/SDK version"); page += ESP.getCoreVersion(); page += F("/"); page += String(ESP.getSdkVersion()); page += F("
Boot version"); page += String(ESP.getBootVersion()); page += F("
Uptime"); page += String(uptime); page += F(" Hours
Flash write count"); page += String(sysCfg.saveFlag); page += F("
Boot count"); page += String(sysCfg.bootcount); page += F("
Reset reason"); page += ESP.getResetReason(); page += F("
Friendly name "); + page += F("
Friendly name "); page += i +1; - page += F(""); page += String(sysCfg.friendlyname[i]); page += F("
"); page += String(sysCfg.friendlyname[i]); page += F("
 
SSId (RSSI)"); page += (sysCfg.sta_active)? sysCfg.sta_ssid2 : sysCfg.sta_ssid1; page += F(" ("); page += WIFI_getRSSIasQuality(WiFi.RSSI()); page += F("%)
AP"); page += String(sysCfg.sta_active +1); page += F(" SSId (RSSI)"); page += sysCfg.sta_ssid[sysCfg.sta_active]; page += F(" ("); page += WIFI_getRSSIasQuality(WiFi.RSSI()); page += F("%)
Hostname"); page += Hostname; page += F("
SSId (RSSI)"); page += (sysCfg.sta_active)? sysCfg.sta_ssid2 : sysCfg.sta_ssid1; page += F(" ("); page += WIFI_getRSSIasQuality(WiFi.RSSI()); page += F("%)
AP"); page += String(sysCfg.sta_active +1); page += F(" SSId (RSSI)"); page += sysCfg.sta_ssid[sysCfg.sta_active]; page += F(" ("); page += WIFI_getRSSIasQuality(WiFi.RSSI()); page += F("%)
Hostname"); page += Hostname; page += F("
IP address"); page += WiFi.localIP().toString(); page += F("
Gateway"); page += WiFi.gatewayIP().toString(); page += F("
MAC address"); page += WiFi.macAddress(); page += F("
IP address"); page += WiFi.localIP().toString(); page += F("
Gateway"); page += WiFi.gatewayIP().toString(); page += F("
MAC address"); page += WiFi.macAddress(); page += F("
AP IP address"); page += WiFi.softAPIP().toString(); page += F("
AP Gateway"); page += WiFi.softAPIP().toString(); page += F("
AP MAC address"); page += WiFi.softAPmacAddress(); page += F("
AP IP address"); page += WiFi.softAPIP().toString(); page += F("
AP Gateway"); page += WiFi.softAPIP().toString(); page += F("
AP MAC address"); page += WiFi.softAPmacAddress(); page += F("
 
MQTT Host"); page += sysCfg.mqtt_host; page += F("
MQTT Port"); page += String(sysCfg.mqtt_port); page += F("
MQTT Client and
 Fallback Topic
"); page += MQTTClient; page += F("
MQTT User"); page += sysCfg.mqtt_user; page += F("
MQTT Password"); page += sysCfg.mqtt_pwd; page += F("
MQTT Topic"); page += sysCfg.mqtt_topic; page += F("
MQTT Group Topic"); page += sysCfg.mqtt_grptopic; page += F("
MQTT Host"); page += sysCfg.mqtt_host; page += F("
MQTT Port"); page += String(sysCfg.mqtt_port); page += F("
MQTT Client and
 Fallback Topic
"); page += MQTTClient; page += F("
MQTT User"); page += sysCfg.mqtt_user; page += F("
MQTT Password"); page += sysCfg.mqtt_pwd; page += F("
MQTT Topic"); page += sysCfg.mqtt_topic; page += F("
MQTT Group Topic"); page += sysCfg.mqtt_grptopic; page += F("
MQTTDisabled
MQTTDisabled
Emulation"); +#ifdef USE_EMULATION + if (sysCfg.emulation == EMUL_WEMO) { + page += F("Belkin WeMo"); + } + else if (sysCfg.emulation == EMUL_HUE) { + page += F("Hue Bridge"); + } + else { + page += F("None"); + } +#else + page += F("Disabled"); +#endif // USE_EMULATION + page += F("
mDNS Discovery"); +#ifdef USE_DISCOVERY + page += F("Enabled"); + page += F("
mDNS Webserver Advertise"); +#ifdef WEBSERVER_ADVERTISE + page += F("Enabled"); +#else + page += F("Disabled"); +#endif // WEBSERVER_ADVERTISE +#else + page += F("Disabled"); +#endif // USE_DISCOVERY + page += F("
 
ESP Chip id"); page += String(ESP.getChipId()); page += F("
Flash Chip id"); page += String(ESP.getFlashChipId()); page += F("
Flash size"); page += String(ESP.getFlashChipRealSize() / 1024); page += F("kB
Program flash size"); page += String(ESP.getFlashChipSize() / 1024); page += F("kB
Program size"); page += String(ESP.getSketchSize() / 1024); page += F("kB
Free program space"); page += String(ESP.getFreeSketchSpace() / 1024); page += F("kB
Free memory"); page += String(freeMem / 1024); page += F("kB
ESP Chip id"); page += String(ESP.getChipId()); page += F("
Flash Chip id"); page += String(ESP.getFlashChipId()); page += F("
Flash size"); page += String(ESP.getFlashChipRealSize() / 1024); page += F("kB
Program flash size"); page += String(ESP.getFlashChipSize() / 1024); page += F("kB
Program size"); page += String(ESP.getSketchSize() / 1024); page += F("kB
Free program space"); page += String(ESP.getFreeSketchSpace() / 1024); page += F("kB
Free memory"); page += String(freeMem / 1024); page += F("kB
"); // page += F("
"); page += FPSTR(HTTP_BTN_MAIN); @@ -1286,8 +1342,8 @@ void handleUPnPevent() addLog_P(LOG_LEVEL_DEBUG, PSTR("HTTP: Handle WeMo basic event")); String request = webServer->arg(0); - if(request.indexOf("State>1 0) do_cmnd_power(1, 1); - if(request.indexOf("State>0 0) do_cmnd_power(1, 0); + if (request.indexOf("State>1 0) do_cmnd_power(1, 1); + if (request.indexOf("State>0 0) do_cmnd_power(1, 0); webServer->send(200, "text/plain", ""); } @@ -1304,7 +1360,6 @@ void handleUPnPsetupWemo() addLog_P(LOG_LEVEL_DEBUG, PSTR("HTTP: Handle WeMo setup")); String setup_xml = FPSTR(WEMO_SETUP_XML); -// setup_xml.replace("{x1}", String(MQTTClient)); setup_xml.replace("{x1}", String(sysCfg.friendlyname[0])); setup_xml.replace("{x2}", wemo_UUID()); setup_xml.replace("{x3}", wemo_serial()); @@ -1339,6 +1394,76 @@ void hue_todo(String *path) addLog(LOG_LEVEL_DEBUG_MORE, log); } +void hue_config_response(String *response) +{ + char buffer[21]; + + *response += FPSTR(HUE_CONFIG_RESPONSE_JSON); + response->replace("{mac}", WiFi.macAddress()); + response->replace("{ip}", WiFi.localIP().toString()); + response->replace("{mask}", WiFi.subnetMask().toString()); + response->replace("{gw}", WiFi.gatewayIP().toString()); + snprintf_P(buffer, sizeof(buffer), PSTR("%04d-%02d-%02dT%02d:%02d:%02d"), + rtcTime.Year, rtcTime.Month, rtcTime.Day, rtcTime.Hour, rtcTime.Minute, rtcTime.Second); + response->replace("{dt}", String(buffer)); +} + +void hue_global_cfg(String *path) +{ + String response; + + path->remove(0,1); // cut leading / to get + response = "{\"lights\":{\""; + for (uint8_t i = 1; i <= Maxdevice; i++) + { + response += i; + response += "\":"; + response += FPSTR(HUE_LIGHT_STATUS_JSON); + if (i < Maxdevice) response += ",\""; + response.replace("{state}", (power & (0x01 << (i-1))) ? "true" : "false"); + response.replace("{j1}", sysCfg.friendlyname[i-1]); + response.replace("{j2}", hue_deviceId(i)); + if (pin[GPIO_WS2812] < 99) { +#ifdef USE_WS2812 + ws2812_replaceHSB(&response); +#endif // USE_WS2812 + } else + { + response.replace("{h}", "0"); + response.replace("{s}", "0"); + response.replace("{b}", "0"); + } + } + response += F("},\"groups\":{},\"schedules\":{},\"config\":"); + + hue_config_response(&response); + response.replace("{id}", *path); + response += "}"; + webServer->send(200, "application/json", response); +} + +void hue_auth(String *path) +{ + String response; + char uid[7]; + + snprintf_P(uid, sizeof(uid), PSTR("%03x"), ESP.getChipId()); + response="[{\"success\":{\"username\":\""; + response+=String(uid); + response+="\"}}]"; + webServer->send(200, "application/json", response); +} + +void hue_config(String *path) +{ + String response = ""; + + path->remove(0,1); // cut leading / to get + hue_config_response(&response); + response.replace("{id}", *path); + webServer->send(200, "application/json", response); +} + void hue_lights(String *path) { String response; @@ -1347,7 +1472,7 @@ void hue_lights(String *path) uint8_t bri = 0; char id[4]; - path->remove(0,path->indexOf("/lights")); // Remove until /lights + path->remove(0,path->indexOf("/lights")); // Remove until /lights if (path->endsWith("/lights")) // Got /lights { response = "{\""; @@ -1388,7 +1513,8 @@ void hue_lights(String *path) if (webServer->args() == 1) { String json = webServer->arg(0); -// Serial.print("HUE API: POST "); Serial.println(json.c_str()); + json.replace(" ",""); // remove blanks + if (json.indexOf("\"on\":") >= 0) // Got "on" command { if (json.indexOf("false") >= 0) // false -> turn device off @@ -1408,7 +1534,7 @@ void hue_lights(String *path) } #ifdef USE_WS2812 if ((pin[GPIO_WS2812] < 99) && ((pos=json.indexOf("\"bri\":")) >= 0)) { - bri=atoi(json.substring(pos+6).c_str()); + bri = atoi(json.substring(pos+6).c_str()); ws2812_changeBrightness(bri); response += ","; response += FPSTR(HUE_LIGHT_RESPONSE_JSON); @@ -1456,22 +1582,34 @@ void handle_hue_api(String *path) */ char log[LOGSZ]; + uint8_t args = 0; path->remove(0, 4); // remove /api + snprintf_P(log, sizeof(log), PSTR("HTTP: Handle Hue API (%s)"), path->c_str()); + addLog(LOG_LEVEL_DEBUG_MORE, log); + for (args = 0; args < webServer->args(); args++) { + String json = webServer->arg(args); + snprintf_P(log, sizeof(log), PSTR("HTTP: Hue POST args (%s)"), json.c_str()); + addLog(LOG_LEVEL_DEBUG_MORE, log); + } + if (path->endsWith("/invalid/")) {} // Just ignore - else if (path->endsWith("/config")) hue_todo(path); - else if(path->indexOf("/lights") >= 0) hue_lights(path); - else if(path->endsWith("/groups")) hue_todo(path); - else if(path->endsWith("/schedules")) hue_todo(path); - else if(path->endsWith("/sensors")) hue_todo(path); - else if(path->endsWith("/scenes")) hue_todo(path); - else if(path->endsWith("/rules")) hue_todo(path); - else + else if (path->endsWith("/")) hue_auth(path); // New HUE App setup + else if (path->endsWith("/config")) hue_config(path); + else if (path->indexOf("/lights") >= 0) hue_lights(path); + else if (path->endsWith("/groups")) hue_todo(path); + else if (path->endsWith("/schedules")) hue_todo(path); + else if (path->endsWith("/sensors")) hue_todo(path); + else if (path->endsWith("/scenes")) hue_todo(path); + else if (path->endsWith("/rules")) hue_todo(path); + else hue_global_cfg(path); +/* { snprintf_P(log, sizeof(log), PSTR("HTTP: Handle Hue API (%s)"),path->c_str()); addLog(LOG_LEVEL_DEBUG_MORE, log); webServer->send(406, "application/json", "{}"); } +*/ } #endif // USE_EMULATION diff --git a/sonoff/xdrv_domoticz.ino b/sonoff/xdrv_domoticz.ino index 259313798..ce1743da0 100644 --- a/sonoff/xdrv_domoticz.ino +++ b/sonoff/xdrv_domoticz.ino @@ -239,7 +239,7 @@ boolean domoticz_command(char *type, uint16_t index, char *dataBuf, uint16_t dat void domoticz_commands(char *svalue, uint16_t ssvalue) { - snprintf_P(svalue, ssvalue, PSTR("{\"Commands\":\"DomoticzInTopic, DomoticzOutTopic, DomoticzIdx, DomoticzKeyIdx, DomoticzSwitchIdx, DomoticzSensorIdx, DomoticzUpdateTimer\"}")); + snprintf_P(svalue, ssvalue, PSTR("{\"Commands4\":\"DomoticzInTopic, DomoticzOutTopic, DomoticzIdx, DomoticzKeyIdx, DomoticzSwitchIdx, DomoticzSensorIdx, DomoticzUpdateTimer\"}")); } boolean domoticz_button(byte key, byte device, byte state, byte svalflg) diff --git a/sonoff/xdrv_wemohue.ino b/sonoff/xdrv_wemohue.ino index 38d379c48..2a4472133 100644 --- a/sonoff/xdrv_wemohue.ino +++ b/sonoff/xdrv_wemohue.ino @@ -52,14 +52,14 @@ const char WEMO_MSEARCH[] PROGMEM = String wemo_serial() { - char serial[15]; - snprintf_P(serial, sizeof(serial), PSTR("201612K%07d"), ESP.getChipId()); + char serial[16]; + snprintf_P(serial, sizeof(serial), PSTR("201612K%08X"), ESP.getChipId()); return String(serial); } String wemo_UUID() { - char uuid[26]; + char uuid[27]; snprintf_P(uuid, sizeof(uuid), PSTR("Socket-1_0-%s"), wemo_serial().c_str()); return String(uuid); } @@ -138,7 +138,6 @@ void hue_respondToMSearch() response.replace("{r3}", hue_UUID()); portUDP.write(response.c_str()); portUDP.endPacket(); - snprintf_P(message, sizeof(message), PSTR("Response1 sent")); // addLog(LOG_LEVEL_DEBUG_MORE, response.c_str()); response = FPSTR(HUE_RESPONSE); @@ -150,7 +149,6 @@ void hue_respondToMSearch() response.replace("{r3}", hue_UUID()); portUDP.write(response.c_str()); portUDP.endPacket(); - snprintf_P(message, sizeof(message), PSTR("Response2 sent")); // addLog(LOG_LEVEL_DEBUG_MORE, response.c_str()); response = FPSTR(HUE_RESPONSE); @@ -161,7 +159,8 @@ void hue_respondToMSearch() response.replace("{r3}", hue_UUID()); portUDP.write(response.c_str()); portUDP.endPacket(); - snprintf_P(message, sizeof(message), PSTR("Response3 sent")); + + snprintf_P(message, sizeof(message), PSTR("3 response packets sent")); // addLog(LOG_LEVEL_DEBUG_MORE, response.c_str()); } else { diff --git a/sonoff/xdrv_ws2812.ino b/sonoff/xdrv_ws2812.ino index d56cfb7d2..da64bde0d 100644 --- a/sonoff/xdrv_ws2812.ino +++ b/sonoff/xdrv_ws2812.ino @@ -31,9 +31,17 @@ POSSIBILITY OF SUCH DAMAGE. #include #ifdef USE_WS2812_DMA +#if (USE_WS2812_CTYPE == 1) NeoPixelBus *strip = NULL; -#else +#else // USE_WS2812_CTYPE + NeoPixelBus *strip = NULL; +#endif // USE_WS2812_CTYPE +#else // USE_WS2812_DMA +#if (USE_WS2812_CTYPE == 1) NeoPixelBus *strip = NULL; +#else // USE_WS2812_CTYPE + NeoPixelBus *strip = NULL; +#endif // USE_WS2812_CTYPE #endif // USE_WS2812_DMA #define COLOR_SATURATION 254.0f @@ -457,9 +465,17 @@ void ws2812_pixels() void ws2812_init() { #ifdef USE_WS2812_DMA +#if (USE_WS2812_CTYPE == 1) strip = new NeoPixelBus(WS2812_MAX_LEDS); // For Esp8266, the Pin is omitted and it uses GPIO3 due to DMA hardware use. -#else +#else // USE_WS2812_CTYPE + strip = new NeoPixelBus(WS2812_MAX_LEDS); // For Esp8266, the Pin is omitted and it uses GPIO3 due to DMA hardware use. +#endif // USE_WS2812_CTYPE +#else // USE_WS2812_DMA +#if (USE_WS2812_CTYPE == 1) strip = new NeoPixelBus(WS2812_MAX_LEDS, pin[GPIO_WS2812]); +#else // USE_WS2812_CTYPE + strip = new NeoPixelBus(WS2812_MAX_LEDS, pin[GPIO_WS2812]); +#endif // USE_WS2812_CTYPE #endif // USE_WS2812_DMA strip->Begin(); ws2812_pixels(); diff --git a/sonoff/xsns_bh1750.ino b/sonoff/xsns_bh1750.ino index 405e4a1f1..603fd9805 100644 --- a/sonoff/xsns_bh1750.ino +++ b/sonoff/xsns_bh1750.ino @@ -82,7 +82,7 @@ boolean bh1750_detect() * Presentation \*********************************************************************************************/ -void bh1750_mqttPresent(char* svalue, uint16_t ssvalue, uint8_t* djson, uint8_t domidx) +void bh1750_mqttPresent(char* svalue, uint16_t ssvalue, uint8_t* djson) { if (!bh1750type) return; diff --git a/sonoff/xsns_bmp.ino b/sonoff/xsns_bmp.ino index 91f00eb55..6475895b6 100644 --- a/sonoff/xsns_bmp.ino +++ b/sonoff/xsns_bmp.ino @@ -424,7 +424,7 @@ boolean bmp_detect() * Presentation \*********************************************************************************************/ -void bmp_mqttPresent(char* svalue, uint16_t ssvalue, uint8_t* djson, uint8_t domidx) +void bmp_mqttPresent(char* svalue, uint16_t ssvalue, uint8_t* djson) { if (!bmptype) return; diff --git a/sonoff/xsns_dht.ino b/sonoff/xsns_dht.ino index 4809c83ac..816819567 100644 --- a/sonoff/xsns_dht.ino +++ b/sonoff/xsns_dht.ino @@ -178,7 +178,7 @@ void dht_init() * Presentation \*********************************************************************************************/ -void dht_mqttPresent(char* svalue, uint16_t ssvalue, uint8_t* djson, uint8_t domidx) +void dht_mqttPresent(char* svalue, uint16_t ssvalue, uint8_t* djson) { char stemp1[10], stemp2[10]; float t, h; diff --git a/sonoff/xsns_dht2.ino b/sonoff/xsns_dht2.ino index 9239182a8..5b885625a 100644 --- a/sonoff/xsns_dht2.ino +++ b/sonoff/xsns_dht2.ino @@ -57,7 +57,7 @@ void dht_init() * Presentation \*********************************************************************************************/ -void dht_mqttPresent(char* svalue, uint16_t ssvalue, uint8_t* djson, uint8_t domidx) +void dht_mqttPresent(char* svalue, uint16_t ssvalue, uint8_t* djson) { char stemp1[10], stemp2[10]; float t, h; diff --git a/sonoff/xsns_ds18b20.ino b/sonoff/xsns_ds18b20.ino index eec7d5cb2..b77d89f69 100644 --- a/sonoff/xsns_ds18b20.ino +++ b/sonoff/xsns_ds18b20.ino @@ -172,7 +172,7 @@ boolean dsb_readTemp(bool S, float &t) * Presentation \*********************************************************************************************/ -void dsb_mqttPresent(char* svalue, uint16_t ssvalue, uint8_t* djson, uint8_t domidx) +void dsb_mqttPresent(char* svalue, uint16_t ssvalue, uint8_t* djson) { char stemp1[10]; float t; diff --git a/sonoff/xsns_ds18x20.ino b/sonoff/xsns_ds18x20.ino index 1205d76ea..334c3c944 100644 --- a/sonoff/xsns_ds18x20.ino +++ b/sonoff/xsns_ds18x20.ino @@ -155,7 +155,7 @@ boolean ds18x20_read(uint8_t sensor, bool S, float &t) * Presentation \*********************************************************************************************/ -void ds18x20_mqttPresent(char* svalue, uint16_t ssvalue, uint8_t* djson, uint8_t domidx) +void ds18x20_mqttPresent(char* svalue, uint16_t ssvalue, uint8_t* djson) { char stemp1[10], stemp2[10]; float t; diff --git a/sonoff/xsns_hlw8012.ino b/sonoff/xsns_hlw8012.ino index a15b62ded..097969e7a 100644 --- a/sonoff/xsns_hlw8012.ino +++ b/sonoff/xsns_hlw8012.ino @@ -279,7 +279,7 @@ void hlw_setPowerSteadyCounter(byte value) void hlw_margin_chk() { - char log[LOGSZ], stopic[TOPSZ], svalue[MESSZ]; + char log[LOGSZ], svalue[MESSZ]; float ped, pi, pc; uint16_t uped, piv, pe, pw, pu; byte flag, jsonflg; @@ -296,7 +296,6 @@ void hlw_margin_chk() // snprintf_P(log, sizeof(log), PSTR("HLW: W %d, U %d, I %d"), pw, pu, piv); // addLog(LOG_LEVEL_DEBUG, log); - snprintf_P(stopic, sizeof(stopic), PSTR("%s/%s/TELEMETRY"), PUB_PREFIX2, sysCfg.mqtt_topic); snprintf_P(svalue, sizeof(svalue), PSTR("{")); jsonflg = 0; if (hlw_margin(0, sysCfg.hlw_pmin, pw, flag, hlw_pminflg)) { @@ -325,12 +324,11 @@ void hlw_margin_chk() } if (jsonflg) { snprintf_P(svalue, sizeof(svalue), PSTR("%s}"), svalue); - mqtt_publish(stopic, svalue); + mqtt_publish_topic_P(1, PSTR("MARGINS"), svalue); } } #if FEATURE_POWER_LIMIT - snprintf_P(stopic, sizeof(stopic), PSTR("%s/%s/RESULT"), PUB_PREFIX, sysCfg.mqtt_topic); // Max Power if (sysCfg.hlw_mpl) { if (pw > sysCfg.hlw_mpl) { @@ -340,7 +338,7 @@ void hlw_margin_chk() hlw_mplh_counter--; if (!hlw_mplh_counter) { snprintf_P(svalue, sizeof(svalue), PSTR("{\"MaxPowerReached\":\"%d%s\"}"), pw, (sysCfg.value_units) ? " W" : ""); - mqtt_publish(stopic, svalue); + mqtt_publish_topic_P(0, PSTR("WARNING"), svalue); do_cmnd_power(1, 0); if (!hlw_mplr_counter) hlw_mplr_counter = MAX_POWER_RETRY +1; hlw_mplw_counter = sysCfg.hlw_mplw; @@ -359,12 +357,12 @@ void hlw_margin_chk() if (hlw_mplr_counter) { hlw_mplr_counter--; if (hlw_mplr_counter) { - snprintf_P(svalue, sizeof(stopic), PSTR("{\"PowerMonitor\":\"%s\"}"), MQTT_STATUS_ON); - mqtt_publish(stopic, svalue); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"PowerMonitor\":\"%s\"}"), MQTT_STATUS_ON); + mqtt_publish_topic_P(0, PSTR("RESULT"), svalue); do_cmnd_power(1, 1); } else { - snprintf_P(svalue, sizeof(stopic), PSTR("{\"MaxPowerReachedRetry\":\"%s\"}"), MQTT_STATUS_OFF); - mqtt_publish(stopic, svalue); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"MaxPowerReachedRetry\":\"%s\"}"), MQTT_STATUS_OFF); + mqtt_publish_topic_P(0, PSTR("WARNING"), svalue); } } } @@ -376,15 +374,15 @@ void hlw_margin_chk() uped = (uint16_t)(ped * 1000); if (!hlw_mkwh_state && (rtcTime.Hour == sysCfg.hlw_mkwhs)) { hlw_mkwh_state = 1; - snprintf_P(svalue, sizeof(stopic), PSTR("{\"EnergyMonitor\":\"%s\"}"), MQTT_STATUS_ON); - mqtt_publish(stopic, svalue); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"EnergyMonitor\":\"%s\"}"), MQTT_STATUS_ON); + mqtt_publish_topic_P(0, PSTR("RESULT"), svalue); do_cmnd_power(1, 1); } else if ((hlw_mkwh_state == 1) && (uped >= sysCfg.hlw_mkwh)) { hlw_mkwh_state = 2; dtostrf(ped, 1, 3, svalue); snprintf_P(svalue, sizeof(svalue), PSTR("{\"MaxEnergyReached\":\"%s%s\"}"), svalue, (sysCfg.value_units) ? " kWh" : ""); - mqtt_publish(stopic, svalue); + mqtt_publish_topic_P(0, PSTR("WARNING"), svalue); do_cmnd_power(1, 0); } } @@ -512,7 +510,7 @@ boolean hlw_command(char *type, uint16_t index, char *dataBuf, uint16_t data_len void hlw_commands(char *svalue, uint16_t ssvalue) { - snprintf_P(svalue, ssvalue, PSTR("{\"Commands\":\"PowerLow, PowerHigh, VoltageLow, VoltageHigh, CurrentLow, CurrentHigh, HlwPcal, HlwUcal, HlwIcal%s\"}"), + snprintf_P(svalue, ssvalue, PSTR("{\"Commands5\":\"PowerLow, PowerHigh, VoltageLow, VoltageHigh, CurrentLow, CurrentHigh, HlwPcal, HlwUcal, HlwIcal%s\"}"), (FEATURE_POWER_LIMIT)?", SafePower, SafePowerHold, SafePowerWindow, MaxPower, MaxPowerHold, MaxPowerWindow, MaxEnergy, MaxEnergyStart":""); } @@ -520,29 +518,50 @@ void hlw_commands(char *svalue, uint16_t ssvalue) * Presentation \*********************************************************************************************/ -void hlw_mqttPresent(uint8_t domidx) +void hlw_mqttStat(byte option, char* svalue, uint16_t ssvalue) { - char stopic[TOPSZ], svalue[MESSZ], stime[21], stemp0[10], stemp1[10], stemp2[10], stemp3[10]; + char stemp0[10], stemp1[10], stemp2[10], stemp3[10], speriod[20]; float ped, pi, pc; uint16_t pe, pw, pu; - snprintf_P(stime, sizeof(stime), PSTR("%04d-%02d-%02dT%02d:%02d:%02d"), - rtcTime.Year, rtcTime.Month, rtcTime.Day, rtcTime.Hour, rtcTime.Minute, rtcTime.Second); - hlw_readEnergy(1, ped, pe, pw, pu, pi, pc); + hlw_readEnergy(option, ped, pe, pw, pu, pi, pc); dtostrf((float)sysCfg.hlw_kWhyesterday / 100000000, 1, 3, stemp0); dtostrf(ped, 1, 3, stemp1); dtostrf(pc, 1, 2, stemp2); dtostrf(pi, 1, 3, stemp3); - snprintf_P(stopic, sizeof(stopic), PSTR("%s/%s/TELEMETRY"), PUB_PREFIX2, sysCfg.mqtt_topic); - snprintf_P(svalue, sizeof(svalue), PSTR("{\"Time\":\"%s\", \"Energy\":{\"Yesterday\":\"%s\", \"Today\":\"%s\", \"Period\":%d, \"Power\":%d, \"Factor\":\"%s\", \"Voltage\":%d, \"Current\":\"%s\"}}"), - stime, stemp0, stemp1, pe, pw, stemp2, pu, stemp3); - mqtt_publish(stopic, svalue); + snprintf_P(speriod, sizeof(speriod), PSTR(", \"Period\":%d"), pe); + snprintf_P(svalue, ssvalue, PSTR("%s\"Yesterday\":\"%s\", \"Today\":\"%s\"%s, \"Power\":%d, \"Factor\":\"%s\", \"Voltage\":%d, \"Current\":\"%s\"}"), + svalue, stemp0, stemp1, (option) ? speriod : "", pw, stemp2, pu, stemp3); #ifdef USE_DOMOTICZ dtostrf(ped * 1000, 1, 1, stemp1); domoticz_sensor4(pw, stemp1); #endif // USE_DOMOTICZ } +void hlw_mqttPresent() +{ +// char stopic[TOPSZ], svalue[MESSZ], stime[21]; + char svalue[MESSZ], stime[21]; + + snprintf_P(stime, sizeof(stime), PSTR("%04d-%02d-%02dT%02d:%02d:%02d"), + rtcTime.Year, rtcTime.Month, rtcTime.Day, rtcTime.Hour, rtcTime.Minute, rtcTime.Second); + snprintf_P(svalue, sizeof(svalue), PSTR("{\"Time\":\"%s\", "), stime); + hlw_mqttStat(1, svalue, sizeof(svalue)); + +// snprintf_P(stopic, sizeof(stopic), PSTR("%s/%s/ENERGY"), PUB_PREFIX2, sysCfg.mqtt_topic); +// mqtt_publish(stopic, svalue); + + mqtt_publish_topic_P(1, PSTR("ENERGY"), svalue); + +} + +void hlw_mqttStatus(char* svalue, uint16_t ssvalue) +{ + snprintf_P(svalue, ssvalue, PSTR("{\"StatusPWR\":{")); + hlw_mqttStat(0, svalue, ssvalue); + snprintf_P(svalue, ssvalue, PSTR("%s}"), svalue); +} + #ifdef USE_WEBSERVER String hlw_webPresent() { diff --git a/sonoff/xsns_htu21.ino b/sonoff/xsns_htu21.ino index ddb9cc6bc..36e26f8be 100644 --- a/sonoff/xsns_htu21.ino +++ b/sonoff/xsns_htu21.ino @@ -229,7 +229,7 @@ uint8_t htu_detect() * Presentation \*********************************************************************************************/ -void htu_mqttPresent(char* svalue, uint16_t ssvalue, uint8_t* djson, uint8_t domidx) +void htu_mqttPresent(char* svalue, uint16_t ssvalue, uint8_t* djson) { if (!htutype) return;