From 5666cd5198715586bae8b7dfd3c2229c7c9c0dc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xose=20P=C3=A9rez?= Date: Thu, 1 Sep 2016 00:34:03 +0200 Subject: [PATCH] Using gulp to build file system files --- .gitignore | 1 + README.md | 52 +++++-- code/data/checkboxes-min.css.gz | Bin 563 -> 0 bytes code/data/checkboxes-min.js.gz | Bin 2094 -> 0 bytes code/data/favicon.ico | Bin 1150 -> 0 bytes code/data/grids-responsive-min.css.gz | Bin 1366 -> 0 bytes code/data/images/off.png | Bin 2577 -> 0 bytes code/data/images/on.png | Bin 2496 -> 0 bytes code/data/images/slider.png | Bin 1228 -> 0 bytes code/data/images/slider_center.png | Bin 260 -> 0 bytes code/data/images/slider_left.png | Bin 324 -> 0 bytes code/data/images/slider_right.png | Bin 321 -> 0 bytes code/data/index.html.gz | Bin 3795 -> 0 bytes code/data/jquery-1.12.3.min.js.gz | Bin 33692 -> 0 bytes code/data/pure-min.css.gz | Bin 3888 -> 0 bytes code/data/side-menu-min.css.gz | Bin 782 -> 0 bytes code/gulpfile.js | 43 ++++++ code/html/checkboxes-min.css | 1 - code/html/checkboxes-min.js | 1 - code/html/custom.css | 59 ++++++++ code/html/custom.js | 108 +++++++++++++++ code/{data => html}/fsversion | 0 code/html/index.html | 192 ++------------------------ code/html/side-menu-min.css | 1 - code/package.json | 25 ++++ code/src/defaults.h | 2 +- 26 files changed, 291 insertions(+), 194 deletions(-) delete mode 100644 code/data/checkboxes-min.css.gz delete mode 100644 code/data/checkboxes-min.js.gz delete mode 100644 code/data/favicon.ico delete mode 100644 code/data/grids-responsive-min.css.gz delete mode 100644 code/data/images/off.png delete mode 100644 code/data/images/on.png delete mode 100644 code/data/images/slider.png delete mode 100644 code/data/images/slider_center.png delete mode 100644 code/data/images/slider_left.png delete mode 100644 code/data/images/slider_right.png delete mode 100644 code/data/index.html.gz delete mode 100644 code/data/jquery-1.12.3.min.js.gz delete mode 100644 code/data/pure-min.css.gz delete mode 100644 code/data/side-menu-min.css.gz create mode 100644 code/gulpfile.js delete mode 100644 code/html/checkboxes-min.css delete mode 100644 code/html/checkboxes-min.js create mode 100644 code/html/custom.css create mode 100644 code/html/custom.js rename code/{data => html}/fsversion (100%) delete mode 100644 code/html/side-menu-min.css create mode 100644 code/package.json diff --git a/.gitignore b/.gitignore index d600de31..439d23ef 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ firmware* .pioenvs .sconsign.dblite +node_modules diff --git a/README.md b/README.md index 9dfdd44c..1f9234cd 100644 --- a/README.md +++ b/README.md @@ -30,21 +30,31 @@ You can read about this board and firmware in [my blog][2]. * Support for **DHT22** sensors * Command line configuration -# Flashing a Sonoff +## Installing -*This section only applies to the Sonoff, but pretty much every other ESP8266-based hardware will be similar.* +### Build the web config site -The unpopulated header in the Sonoff has all the required pins. My board has a 5 pins header in-line with the button. They are (from the button outwards): +Normally when you flash an ESP8266 you only flash the firmware, like for any other microcontroller. But the ESP8266 has plenty of room and normally it is split into different partitions. One such partition is used to store web files like a normal webserver. In the "Flash your board" section below you'll know how to flash this special partition, but first we will have to build it. -* 3V3 -* RX -* TX -* GND -* GPIO14 +The build process read the HTML files, looks for the stylesheet and script files linked there, grabs them, merges them, minifies them and compresses them. Thus, a single HTML with N linked scripts and M linked CSS files is transformed in just 3 files (index.html.gz, style.css.gz and script.js.gz). This way the ESP8266 webserver can serve them really fast. Mind the ESP8266 is just a microcontroller, the webserver has a very limited capacity to hold concurrent requests, so few and lighter files are a must. -Last one is not necessary. Mind it's a **3V3 device**, if connected to 5V you will probably fry it. Button is connected to GPIO0 on the ESP8266 chip, so to enter flash mode you have to hold the button pressed while powering on the board, then you can realease it again. +To build these files we are using **[Gulp][11]**, a build system built in [node.js][13]. So you will need node (and [npm][14], its package manager) first. [Read the documentation][12] on how to install them. + +Once you have node and npm installed, go to the 'code' folder and install all the dependencies with: + +``` +npm install +``` + +It will take a minute or two. Then you are ready to build the webserver files with: + +``` +gulp +``` -## Firmware +It will create a populate a 'data' folder with all the required files. + +### Build the firmware The project is ready to be build using [PlatformIO][3]. Please refer to their web page for instructions on how to install the builder. @@ -75,7 +85,23 @@ Once you have all the code, you can check if it's working by: > platformio run -e node-debug ``` -If it compiles you are ready to flash, wire your board like in the flashing section above and: +If it compiles you are ready to flash the firmware. + +### Flash your board + +*This section only applies to the Sonoff, but pretty much every other ESP8266-based hardware will be similar.* + +The unpopulated header in the Sonoff has all the required pins. My board has a 5 pins header in-line with the button. They are (from the button outwards): + +* 3V3 +* RX +* TX +* GND +* GPIO14 + +Last one is not necessary. Mind it's a **3V3 device**, if connected to 5V you will probably fry it. Button is connected to GPIO0 on the ESP8266 chip, so to enter flash mode you have to hold the button pressed while powering on the board, then you can realease it again. + +Wire your board and flash the firmware (with ```upload```) and the file system (with ```uploadfs```): ```bash > platformio run --target upload -e node-debug @@ -127,3 +153,7 @@ After flashing the firmware via serial do a hard reset of the device (unplug & p [8]: https://www.itead.cc/sonoff-rf.html [9]: https://www.itead.cc/slampher-wifi-wireless-light-holder.html [10]: https://www.itead.cc/smart-socket-eu.html +[11]: http://gulpjs.com/ +[12]: https://docs.npmjs.com/getting-started/installing-node +[13]: https://nodejs.org/en/ +[14]: https://www.npmjs.com/ diff --git a/code/data/checkboxes-min.css.gz b/code/data/checkboxes-min.css.gz deleted file mode 100644 index 5ffa7577c9635515a7361754fa0d6a20f35bb479..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 563 zcmV-30?hp%iwFp`XTw(j17m1qV{2k>cx7`fZE0>UV{>x=jZ;x;+b|IRE2d+RfSq{> zS&PITM)uH$v5x(LAzLT=h$0C|j+2`F_sMcolGYBz*ql$N`@XyHZh?Pltzc6_x!q{x z87i<{)FC+Jz3tH11%ftv?WHP z@?fdngB4P@q(;s`ofc!b2`bb0?lmzhoR*CT>a`*3kW_;3WR(X?pbTjVlcr{~C&Nng z$M1oZ9!!!?AV^k#OfSzKnc@;Uj?PGSB!$%F_Esh1>~7+9ZH*o>7q|gYy0y$u5kfMD z&p^KRATmT}FR0NG&)dOqpXbBBU^|pYa`y;w4<1XF{DubZ(jOL?OkcgJ3u0vsEDG8p z_cdXS*VHi1QB~Qwn;+67y;WBeFanN*(ucYf&}^rlv-jR@?RWB>{|fLYI#x*F-Ketb z3uzbYQ$)YK{i}C8sjk#ANcBkwK?_!HE2|sDNn_;UMXQBT)jUx;vtWRE>fsQC zs2LB9$df!-nnPl%f(>JyF22o&vCH4~Z<0k4gjU@-I$nO54j1Cg`l0BbDdIv5%xyms zf#(M*SgzOU`R(h7flOi*cDBz#<2TIiB(>{OhVZ_Ykp+5b(lBrNL={dV2m7y&eXGM& zzgD9de|!Ayyd`=5`2{VS*Ca!N+Z1BhL`O%UH_$Kt6!uM|GG2{Pr~i||>QQe6001>Q B6tMsR diff --git a/code/data/checkboxes-min.js.gz b/code/data/checkboxes-min.js.gz deleted file mode 100644 index 250e37e2ff529467713e85d844f93cb6fb3c8707..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2094 zcmV+}2+{W+iwFp`XTw(j17m1qV{2k>cx7`fZE0>UYI6X!8EtRdHu|qPLf}y|qu9L- z2Pk2TL$ci+(5$N~A2g-G=+p%6#76A2MiFibU~T zpzvi+ixI;dD=f%j8Oe+%>`IhbM#y>eSmaNV72`2dM9@87QW^6@+}J&qYsx$wD|B8 zEhph+#6GbE7`(n-q9^wFk*gC3`HmGdMDsZMdd~_8qQm(x_EvHhj(R{W;v!|A-mOrO zyfP|2}llfR^NJ+98cJi&W(iJT@una@Yh?6DubHos& zN)=gwC8k$u!)3%Wwk79?hgd?^uuqDK6oCaSO4*8*nUX+swaN=5MqG?!NQqpCCDz37 zKXKSZDOD7ipZeN0lSn}~P|MUx2n>)UjsD@FcXtMck51HAVrCd@7 zaaIw?^Y|z{pN!hjjrX6iklh(l-7o@)G(R^*OvzRL0n%N zV$dd{yB%ci`yBadwMsky3GpP}OjpcK+b)3O5`dv625`uw#A*!`Kny(00)}ArkjF>`Hg}lM{7bMMv4Fa3ElMWZhMh z(ssPId!uk(WmODY7@*TN`}OseM>)8KLk5_E2enPbnn9_Q&^hE{x~vdEp`G{e8Z764c!w zuJ{V|sYqNU!`fGpAT>Ew?V`tq@Uoh%I&&U)%JB3?!oDL3q>#Lsna`QdSow7a@hH67 zyjUFk#_mR5cukO|yp#ujWK`H&lWC?)#upC5E{3)&zCg1J8FrLA^m_L@k@h+Fi(ES% zpB<%J*sMU>t)S3)js&>=i~Q_N@FIs*pq^s^7B?jNHmvg$gv5iGXG4&%CGX8^-9>S$ zb@e;2u7Q4`otCdgwcl?IFS~EmKT#um(3G&*Ez_E&6PALlV5!>-ElPuQ4S;knXjd-1 z*BUyLF@lz9hAMK`-|8sDXEW$z9fE>wp*n|Y7#Z}#+>d=c^@@iIzJ;B+E+BTOomLjq zB#vKB4RTddtf!><>FWY(=)EEv6xv5)%8p%hDz3wz6EXM7aTGLtt8M~kyomiVZDF9$ zKePOiX1Y)6ohN%n3WHMRRx=Lug|VR%J#;_sdZ_R@O7q102x0quG{bnSCz1~MNa;zT zzXHro;Fh}z6V|W*7M6ok6?HB4WVx*XNbv58A33~Jn2Z&7se4L*2aIgS=;y5bavM)r z*u6&ix2&Ehw=Wz+>qld~v+nqph<2LP8Q73C1BH`5z+{H~y>>i4@4f_F{~hKXzaW3J zH%^<~q!#x1jp>3rfj3viwhJ6>1Xaa%N7vx|^b!BeFzt%6U9Lyi^mB9fh*!@(_6K@y z?~TB%_ny@d2KVt)9*=uQUU*`Q{NuagSvxz&<9n($5q*@XXX;<5@TRgAAn!N2)blKb zBy)!E*|c%AT>;H<((j3%cm00&zuWAn2z!*#5XPkYbVXil_mAI9r`Wxi$HBWF0_?vm zz}ffT2iScGiqEFF^U9--yhMou{^KSW%)GYPs0Y}8Ht~=eUIBJr6Fi)^6~JQD?;|}Z zt5txVyS|4}8PUMoi+c}N1+}>Ci$D*m0S4Ghq4-h8 zi+E7aT3fr&#ZJRMKwJ-yC+CraTD4XF?!i8E5r)l8+{Nj1eSNuxt2N%>92YplDNb;S zcjk$cli4+C22_+Wu~wV8(65LYYR>UAj2BC|cvn|{l-iGkaLCSZo;2^DbqfjSY20RI z`#M@y2CR4np0|w|%zz-4s{FWD+V;E{Y|l#YCcA)8oJ02&>}dp>G&YvFyX&F$tmEv#KNwVhgkZX> zkQX!myr*US;+NR$sGe#eCyJ@Y7_OumVX%xm_;C%@;8O+Up`55556_lPoB6Fn13TcH Y^o5psID}OM&13r2??2N@qyriN0DTD;(EtDd diff --git a/code/data/favicon.ico b/code/data/favicon.ico deleted file mode 100644 index ee8bae72b153c5fc106f6ce59ab7f8299eb396b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1150 zcmZQzU<5(|0R|wcz>vYhz#zuJz@P!dKp~(AL>x#lFaYI*xFHzKA0>zif&c&iGazGR zP1mknE8VbuW9^C+E34P6SzEJq&AQq(Yu42R=|&)K0^$~+eEZ$IccXx2FoDcL2A3~g zZkRr8#>wQQ)F1YCPX7%JOn}(3w*RZ7sQO=CPU*j_jKY5>C)a=b_U`Zg`SYh7HaCFG1DONF%wNBL zQ{26KPoI;c>pzfQkQpGe?Cl)?|kKt2Fup6Iav diff --git a/code/data/grids-responsive-min.css.gz b/code/data/grids-responsive-min.css.gz deleted file mode 100644 index a189cb953977192991af632069f61fd08faf8a4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1366 zcmV-c1*!TUiwFp`XTw(j17~t+WOFTYWpi+EZgXjNWi4%KZZ2bUa{$ej%W~s35JmU- z3U6FBnF>{EkRU*5Gryu(EJqbRT(X>*#N~gF_>#JBqs+$6vpXWdxr7_t=f|Pl?lupv zPv^EhK5UNLhi`}7vG}>$UjAB@e&O50@9&G3w{u&(6|aYa{@{S*c z-0S6Hft5rrk&0SAt>x1w-yG#)fkEQ+^POBRIRF!GxE@#~KhwdXNUnfAa19)QBX9#u zOZ)*75=JD+bv&I9oBjId>Ac0?{%Oyb-P2}YZ1%h7;m*U(Wx9z!GxOuyrKA;xfhig|YsIJ4~`uhz_A09tGsXTYz92e#F-)-|1m#&1( z5sPfxOK#zBJFigH4eYG39H*W2qUM=9)}j5l+AZ%3n?(cvi@(3tEfc0tWVIxnxW1YUlt2FK|OL^oSV@T*L4ci^qnO_0V+}%#Cx}RE^IyLAmOIA=M z|2iG3@8bpN<*|3HkKL)pFmCtvpp_0vtl&J9x=+-)>Y}XdJXE_+lzVwQ!1|ucrw%Zx zwl!_!_oCMK0!JIG!5S_`ow^vT6a!RzNK`z|N>+>Eo-^o@Csua>YCa@tzPcSx>dCj&EBS3Q^&BXR;r8UsMatn=2c7gdb4UJMq7?*P5sZR zT8UX{Q?03uT2*Tptn;d+XKI#e>9J~7t<*@(Qmtt!SXFDre?UAkRjaPJYVDudyE{O1 z5=)LwBJYq_EG2T)>i2rNSYRd5OXTyRe_G3@QNB6K#R7vw@n`N=OAf$<8-yP8pXuOG zBv-&5xCRcu5x4=Csx>5rA21?eM#7MUDG6f|<|GVCnABlXr_K_SI!yY7RBNmSn`$L0 z&#qdjlDDarzDhZ&HQecW)f%hXs#>~{*i>u099GrR-7H77bYHQm*3kOqRV&eavQ%rj z>Q>cCG<%zBO&!CkTB$CYqgunTm{%>`>&>c_7;QPKHT6HMY9(f+O|_;rYE`Xau+FQN zo~c=?rN^pSwNfKBOSPt{U{$Rd{{ivHRIRw=s`YEn-rWJBlUQI43 ztJYZ6R@Kst#HL!~<*=%j?q)fvrTdCiwT9L=uUd)blcieIRkx~EqS@P2Yw8$Q)k<~I z9Mu|z#k^|iUT;>d#AwS=t*QT6RVy(oZK^f3QLAbVgLPiD^i0iCEj?Dvs+Ah4S*kTn Y1*>Y!_z#GOR;}Ou2SC(ppRXkV0OJ3-1^@s6 diff --git a/code/data/images/off.png b/code/data/images/off.png deleted file mode 100644 index f414051ecc72db50e3267adb99ad288d22a293ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2577 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 diff --git a/code/data/images/on.png b/code/data/images/on.png deleted file mode 100644 index 94425e5841c89fb0b226d987b1a6d9199c372b3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2496 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 KMNUMnLSTYI@WUwp diff --git a/code/data/images/slider.png b/code/data/images/slider.png deleted file mode 100644 index 80e05ff2dde736f92872019c10e6e69e4caf7179..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1228 zcmV;-1T*`IP)+dQ(pVRYZe}Df92L}hw z(vL4YJ3DJzTU)feyi6o{Uit#+o8Z<<`XKbQep=Y;XN#NZ_fBsC{ki)?*Vor{c6RnH zb-tLVuXnq-6*2FZ%c6hiwcmG+9`Xw@hzw%7KDl>oB?6pVrE7-lDj`mNA$% zHa2K!X=&}` zQCo-(yXJ>%{)!*6?*U42UHdJeVXIAF(dqE(>fpTXl3gV_xwxjuEp09X5H17gps850 z;7J~8A%L!BRVIz(%?n`2VVL^dat1`@>I9ycw}MoIiQw!n-5IFID?(lo%JM5i8hoYPxPIQBFYBvs;dhdEUE$lHbtC}_``U&!bOl_1075lx|^f8 zQ2|%C=XSPzQQ8cQE>iatrI#il%N5ZBxI^csTaKB$T`O|fdx552$D|E7n>`fK?Ue9) zgM4s0w^jmF+Xqe$JgyN3h*^bVAUdmw1`CnJx#Q_6cguuwG$6RUl`6oS0xkXY-!S23 zfS?>|R63XDwVh&yfYLeA`UGYgM!TgK}I_0jsq-)@+}m5XY3{u!9NL@Fc~zIaXgt$F&3VG<_M*89xjmPh*A{IBh68 zC9t3NIjc1(|w#y1z zd%VchBEiPFH^{x4uQ@m7}Ahe9Ql! qH~!5>yzzh48~^LQy}hgd0t^6MQ^T06mz3!M0000i zsd#E)vfFS1BxGB=t^*+idJkfZ#1b$8KILp>BJa=w*2e?R>ZFMr>$0Q)(&OAKtjW_Y z7&ietEH)YwgPhX%g*-G9LB+&@qsN5Yd7g*sloBy>vw@sHXlja-Qu+#5mTzAH>$*|n z$S~AehuXgH)*(iI$Dy&P3-3J7LA$QYwvnOteUGo2rm55Z0t^6tOGp^$Su~UY0000< KMNUMnLSTa9gK3li diff --git a/code/data/images/slider_left.png b/code/data/images/slider_left.png deleted file mode 100644 index 51576ce351944e96229b04bfa03f8f03e907e9ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 324 zcmV-K0lWT*P)$+ma!JqEi%8`jz}$IH&>I5C#~pELZ9uqT21yUVFdi6z z&R`?^zg{I1Q|2Gz=NToC-jt`3*w$$wy(z^UGHz=CkE1&^mMKGpL-c=+J}C!hjHZPJ z8+EZ@!}t+^z~1!UeL9;Zfa--y(=_CqGoQdXR8@7W>zcamtuh^;EX(k7=kRl10R{jI W5i+_owTc4(0000b$oD9c+P3`xaMbu}n#PfH zPUd;WFbpRpcYHZtP!t8Ks(M#q&jP{idP7;3n&ZO~kq0owK=E55*4Hu*jd5&$_PNuK)u8EfzVU TqbKrS00000NkvXXu0mjf#?yy8 diff --git a/code/data/index.html.gz b/code/data/index.html.gz deleted file mode 100644 index 0a8965141067fe375a3a1f93f5c002221ec1891c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3795 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 Q9{kJy4~iHj7paicPL`)K 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 y^rQbKlKb8`TVRbg+VFbw^EzaqNoq)loN zw6~R#FZWjhF>Ta9PzY-`)c<}-AdtbXJ55^K#D2D)pPgK?_r8!qs%&#O9PUxmDZsos zVFhg?>z2PkU(p-Ba;DE&634&D8Tjd}Guml+-w66HJH6dhPOsXmmXgszi^GU zq6S2BS!YxT6i2%j0c`;rFM=!i@tsBcje&f8|LD?Z-#2nJQ6Q)`C6k6S#_JOnQ0gr9 zh7m37EppZN?k;(Wn;RL~vEP@r0VlJ=Jt}0aq1J|5b>ejvBTJ_bYkuyaA~Wx4Y@-ae zIG0+>DszDiF5s~tN%RWUJvswrpeA54c6Yzu6Ad?wso$`JUlulQ-o-6D@{eXa2-b0&EN6>b)pZ!f_&XvG*lT@S2)IP4K?VPYp5{eZ=3-epD{ M7wDT4x?BhV0Iu3~O8@`> diff --git a/code/gulpfile.js b/code/gulpfile.js new file mode 100644 index 00000000..f127089d --- /dev/null +++ b/code/gulpfile.js @@ -0,0 +1,43 @@ +var gulp = require('gulp'); +var plumber = require('gulp-plumber'); +var htmlmin = require('gulp-htmlmin'); +var cleancss = require('gulp-clean-css'); +var uglify = require('gulp-uglify'); +var gzip = require('gulp-gzip'); +var del = require('del'); +var useref = require('gulp-useref'); +var gulpif = require('gulp-if'); + +/* Clean destination folder */ +gulp.task('clean', function() { + return del(['data/*']); +}); + +/* Copy static files */ +gulp.task('files', function() { + return gulp.src([ + 'html/**/*.{jpg,jpeg,png,ico,gif}', + 'html/fsversion' + ]) + .pipe(gulp.dest('data/')); +}); + +/* Process HTML, CSS, JS */ +gulp.task('html', function() { + return gulp.src('html/*.html') + .pipe(useref()) + .pipe(plumber()) + .pipe(gulpif('*.css', cleancss())) + .pipe(gulpif('*.js', uglify())) + .pipe(gulpif('*.html', htmlmin({ + collapseWhitespace: true, + removeComments: true, + minifyCSS: true, + minifyJS: true + }))) + .pipe(gzip()) + .pipe(gulp.dest('data')); +}); + +/* Default Task */ +gulp.task('default', ['clean', 'files', 'html']); diff --git a/code/html/checkboxes-min.css b/code/html/checkboxes-min.css deleted file mode 100644 index 311f2e2f..00000000 --- a/code/html/checkboxes-min.css +++ /dev/null @@ -1 +0,0 @@ -.iPhoneCheckContainer{-webkit-transform:translate3d(0,0,0);position:relative;height:27px;cursor:pointer;overflow:hidden}.iPhoneCheckContainer input{position:absolute;top:5px;left:30px;filter:alpha(Opacity=0);opacity:0}.iPhoneCheckContainer label,.iPhoneCheckHandle{display:block;height:27px;cursor:pointer;position:absolute;top:0}.iPhoneCheckContainer label{white-space:nowrap;font-size:17px;line-height:17px;font-weight:700;font-family:"Helvetica Neue",Arial,Helvetica,sans-serif;width:auto;padding-top:5px;overflow:hidden}.iPhoneCheckContainer,.iPhoneCheckContainer label{user-select:none;-moz-user-select:none;-khtml-user-select:none}.iPhoneCheckDisabled{filter:alpha(Opacity=50);opacity:.5}label.iPhoneCheckLabelOn{color:#fff;background:url(images/on.png) no-repeat;text-shadow:0 0 2px rgba(0,0,0,.6);left:0;padding-top:5px}label.iPhoneCheckLabelOn span{padding-left:8px}label.iPhoneCheckLabelOff{color:#8b8b8b;background:url(images/off.png) right 0 no-repeat;text-shadow:0 0 2px rgba(255,255,255,.6);text-align:right;right:0}label.iPhoneCheckLabelOff span{padding-right:8px}.iPhoneCheckHandle{left:0;width:0;background:url(images/slider_left.png) no-repeat;padding-left:3px}.iPhoneCheckHandleRight{height:100%;width:100%;padding-right:3px;background:url(images/slider_right.png) right 0 no-repeat}.iPhoneCheckHandleCenter{height:100%;width:100%;background:url(images/slider_center.png)} \ No newline at end of file diff --git a/code/html/checkboxes-min.js b/code/html/checkboxes-min.js deleted file mode 100644 index 013487c3..00000000 --- a/code/html/checkboxes-min.js +++ /dev/null @@ -1 +0,0 @@ -(function(){var e,i,t,n=[].slice;null==$.browser&&(t=navigator.userAgent||"",jQuery.uaMatch=function(e){var i;return e=e.toLowerCase(),i=/(chrome)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+)/.exec(e)||/(opera)(?:.*version)?[ \/]([\w.]+)/.exec(e)||/(msie) ([\w.]+)/.exec(e)||e.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+))?/.exec(e)||[],{browser:i[1]||"",version:i[2]||"0"}},i=jQuery.uaMatch(t),jQuery.browser={},i.browser&&(jQuery.browser[i.browser]=!0,jQuery.browser.version=i.version),jQuery.browser.webkit&&(jQuery.browser.safari=!0)),e=function(){function e(i,t){var n,s,a;this.elem=$(i),s=$.extend({},e.defaults,t);for(n in s)a=s[n],this[n]=a;this.elem.data(this.dataName,this),this.wrapCheckboxWithDivs(),this.attachEvents(),this.disableTextSelection(),this.calculateDimensions()}return e.prototype.calculateDimensions=function(){return this.resizeHandle&&this.optionallyResize("handle"),this.resizeContainer&&this.optionallyResize("container"),this.initialPosition()},e.prototype.isDisabled=function(){return this.elem.is(":disabled")},e.prototype.wrapCheckboxWithDivs=function(){return this.elem.wrap("
"),this.container=this.elem.parent(),this.offLabel=$("").appendTo(this.container),this.offSpan=this.offLabel.children("span"),this.onLabel=$("").appendTo(this.container),this.onSpan=this.onLabel.children("span"),this.handle=$("
\n
\n
\n
\n
").appendTo(this.container)},e.prototype.disableTextSelection=function(){return $.browser.msie?$([this.handle,this.offLabel,this.onLabel,this.container]).attr("unselectable","on"):void 0},e.prototype._getDimension=function(e,i){return null!=$.fn.actual?e.actual(i):e[i]()},e.prototype.optionallyResize=function(e){var i,t,n,s,a;return a=this.onLabel.find("span"),s=this._getDimension(a,"width"),s+=parseInt(a.css("padding-left"),10),n=this.offLabel.find("span"),t=this._getDimension(n,"width"),t+=parseInt(n.css("padding-right"),10),"container"===e?(i=s>t?s:t,i+=this._getDimension(this.handle,"width")+this.handleMargin,this.container.css({width:i})):(i=s>t?s:t,this.handle.css({width:i}))},e.prototype.onMouseDown=function(i){var t;return i.preventDefault(),this.isDisabled()?void 0:(t=i.pageX||i.originalEvent.changedTouches[0].pageX,e.currentlyClicking=this.handle,e.dragStartPosition=t,e.handleLeftOffset=parseInt(this.handle.css("left"),10)||0)},e.prototype.onDragMove=function(i,t){var n,s;if(e.currentlyClicking===this.handle)return s=(t+e.handleLeftOffset-e.dragStartPosition)/this.rightSide,0>s&&(s=0),s>1&&(s=1),n=s*this.rightSide,this.handle.css({left:n}),this.onLabel.css({width:n+this.handleRadius}),this.offSpan.css({marginRight:-n}),this.onSpan.css({marginLeft:-(1-s)*this.rightSide})},e.prototype.onDragEnd=function(i,t){var n;if(e.currentlyClicking===this.handle&&!this.isDisabled())return e.dragging?(n=(t-e.dragStartPosition)/this.rightSide,this.elem.prop("checked",n>=.5).change()):this.elem.prop("checked",!this.elem.prop("checked")).change(),e.currentlyClicking=null,e.dragging=null,"function"==typeof this.onChange&&this.onChange(this.elem,this.elem.prop("checked")),this.didChange()},e.prototype.refresh=function(){return this.didChange()},e.prototype.didChange=function(){var e;return this.isDisabled()?(this.container.addClass(this.disabledClass),!1):(this.container.removeClass(this.disabledClass),e=this.elem.prop("checked")?this.rightSide:0,this.handle.animate({left:e},this.duration),this.onLabel.animate({width:e+this.handleRadius},this.duration),this.offSpan.animate({marginRight:-e},this.duration),this.onSpan.animate({marginLeft:e-this.rightSide},this.duration))},e.prototype.attachEvents=function(){var e,i,t;return t=this,e=function(e){return t.onGlobalMove.apply(t,arguments)},i=function(n){return t.onGlobalUp.apply(t,arguments),$(document).unbind("mousemove touchmove",e),$(document).unbind("mouseup touchend",i)},this.elem.change(function(){return t.refresh()}),this.container.bind("mousedown touchstart",function(n){return t.onMouseDown.apply(t,arguments),$(document).bind("mousemove touchmove",e),$(document).bind("mouseup touchend",i)})},e.prototype.initialPosition=function(){var e,i;return e=this._getDimension(this.container,"width"),this.offLabel.css({width:e-this.containerRadius}),i=this.containerRadius+1,$.browser.msie&&$.browser.version<7&&(i-=3),this.rightSide=e-this._getDimension(this.handle,"width")-i,this.elem.is(":checked")?(this.handle.css({left:this.rightSide}),this.onLabel.css({width:this.rightSide+this.handleRadius}),this.offSpan.css({marginRight:-this.rightSide})):(this.onLabel.css({width:0}),this.onSpan.css({marginLeft:-this.rightSide})),this.isDisabled()?this.container.addClass(this.disabledClass):void 0},e.prototype.onGlobalMove=function(i){var t;if(!this.isDisabled()&&e.currentlyClicking)return i.preventDefault(),t=i.pageX||i.originalEvent.changedTouches[0].pageX,!e.dragging&&Math.abs(e.dragStartPosition-t)>this.dragThreshold&&(e.dragging=!0),this.onDragMove(i,t)},e.prototype.onGlobalUp=function(i){var t;if(e.currentlyClicking)return i.preventDefault(),t=i.pageX||i.originalEvent.changedTouches[0].pageX,this.onDragEnd(i,t),!1},e.defaults={duration:200,checkedLabel:"ON",uncheckedLabel:"OFF",resizeHandle:!0,resizeContainer:!0,disabledClass:"iPhoneCheckDisabled",containerClass:"iPhoneCheckContainer",labelOnClass:"iPhoneCheckLabelOn",labelOffClass:"iPhoneCheckLabelOff",handleClass:"iPhoneCheckHandle",handleCenterClass:"iPhoneCheckHandleCenter",handleRightClass:"iPhoneCheckHandleRight",dragThreshold:5,handleMargin:15,handleRadius:4,containerRadius:5,dataName:"iphoneStyle",onChange:function(){}},e}(),$.iphoneStyle=this.iOSCheckbox=e,$.fn.iphoneStyle=function(){var i,t,s,a,h,o,r,l,d,c,u,p;for(i=1<=arguments.length?n.call(arguments,0):[],s=null!=(d=null!=(c=i[0])?c.dataName:void 0)?d:e.defaults.dataName,u=this.filter(":checkbox"),r=0,l=u.length;l>r;r++)t=u[r],a=$(t).data(s),null!=a?(h=i[0],o=2<=i.length?n.call(i,1):[],null!=(p=a[h])&&p.apply(a,o)):new e(t,i[0]);return this},$.fn.iOSCheckbox=function(e){var i;return null==e&&(e={}),i=$.extend({},e,{resizeHandle:!1,disabledClass:"iOSCheckDisabled",containerClass:"iOSCheckContainer",labelOnClass:"iOSCheckLabelOn",labelOffClass:"iOSCheckLabelOff",handleClass:"iOSCheckHandle",handleCenterClass:"iOSCheckHandleCenter",handleRightClass:"iOSCheckHandleRight",dataName:"iOSCheckbox"}),this.iphoneStyle(i)}}).call(this); \ No newline at end of file diff --git a/code/html/custom.css b/code/html/custom.css new file mode 100644 index 00000000..b4536cb6 --- /dev/null +++ b/code/html/custom.css @@ -0,0 +1,59 @@ +#menu .pure-menu-heading { + font-size: 100%; + padding: .5em .5em; +} +.header h2 { + font-size: 1em; +} +.panel { + display: none; +} +.content { + margin: 0px; +} +.page { + margin-top: 40px; +} +.center { + text-align: center; +} +.pure-button { + color: white; + padding: 8px 16px; + border-radius: 4px; + text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2); +} +.button-update { + width: 100px; + margin: 50px auto; + background: #1f8dd6; +} +.pure-g { + margin-bottom: 20px; +} +legend { + font-weight: bold; +} +.l-box { + padding-right: 1px; +} +#topics .pure-g { + padding-bottom: 5px; + margin-bottom: 5px; + border-bottom: 1px dashed #e5e5e5; +} +.pure-form input[type=text][disabled] { + color: #777777; +} +div.hint { + font-size: 80%; + color: #ccc; + margin-top: -5px; +} +.iPhoneCheckContainer { + letter-spacing: 0em; + height: 36px; +} +.iPhoneCheckHandle { + top: 8px; +} diff --git a/code/html/custom.js b/code/html/custom.js new file mode 100644 index 00000000..7abcd05f --- /dev/null +++ b/code/html/custom.js @@ -0,0 +1,108 @@ +var update_timer = null; +var relaySlider; + +function doUpdate() { + var self = $(this); + self.addClass("loading"); + $.ajax({ + 'method': 'POST', + 'url': '/post', + 'dataType': 'json', + 'data': $("#formSave").serializeArray() + }).done(function(data) { + self.removeClass("loading"); + }).fail(function() { + self.removeClass("loading"); + }); +} + +function showPanel() { + $(".panel").hide(); + $("#" + $(this).attr("data")).show(); + if ($("#layout").hasClass('active')) toggleMenu(); +}; + +function toggleMenu() { + $("#layout").toggleClass('active'); + $("#menu").toggleClass('active'); + $("#menuLink").toggleClass('active'); +} + +function parseResponse(data) { + + // pre-process + if ("network" in data) data.network = data.network.toUpperCase(); + if ("mqttStatus" in data) data.mqttStatus = data.mqttStatus ? "CONNECTED" : "NOT CONNECTED"; + + // relay + if ("relayStatus" in data) { + $("input[name='relayStatus']") + .prop("checked", data.relayStatus) + .iphoneStyle("refresh"); + } + + // title + if ("app" in data) { + document.title = data.app; + $(".pure-menu-heading").html(data.app); + } + + // automatic assign + Object.keys(data).forEach(function(key) { + var id = "input[name=" + key + "]"; + if ($(id).length) $(id).val(data[key]); + }); + + // WIFI + var groups = $("#panel-wifi .pure-g"); + for (var i in data.wifi) { + var wifi = data.wifi[i]; + Object.keys(wifi).forEach(function(key) { + var id = "input[name=" + key + "]"; + if ($(id, groups[i]).length) $(id, groups[i]).val(wifi[key]); + }); + }; + + if ("updateInterval" in data) { + if (update_timer) clearInterval(update_timer); + if (data.updateInterval > 0) { + update_timer = setInterval(update, data.updateInterval); + } + } + +} + +function update() { + $.ajax({ + 'method': 'GET', + 'url': '/status', + 'dataType': 'json' + }).done(parseResponse); +} + +function init() { + $.ajax({ + 'method': 'GET', + 'url': '/get', + 'dataType': 'json' + }).done(parseResponse); +} + +$(function() { + $("#menuLink").on('click', toggleMenu); + $(".button-update").on('click', doUpdate); + $(".pure-menu-link").on('click', showPanel); + relaySlider = $('#relayStatus').iphoneStyle({ + checkedLabel: 'ON', + uncheckedLabel: 'OFF', + onChange: function(elem, value) { + $.ajax({ + 'method': 'GET', + 'url': value ? '/relay/on' : '/relay/off', + 'dataType': 'json' + }); + setTimeout(update, 200); + } + }); + init(); +}); diff --git a/code/data/fsversion b/code/html/fsversion similarity index 100% rename from code/data/fsversion rename to code/html/fsversion diff --git a/code/html/index.html b/code/html/index.html index ac0d8ca4..e337c69b 100644 --- a/code/html/index.html +++ b/code/html/index.html @@ -6,187 +6,15 @@ + + - + - - - - - - - + + + + @@ -492,4 +320,10 @@ + + + + + + diff --git a/code/html/side-menu-min.css b/code/html/side-menu-min.css deleted file mode 100644 index be77eab8..00000000 --- a/code/html/side-menu-min.css +++ /dev/null @@ -1 +0,0 @@ -body{color:#777}.pure-img-responsive{max-width:100%;height:auto}#layout,#menu,.menu-link{-webkit-transition:all 0.2s ease-out;-moz-transition:all 0.2s ease-out;-ms-transition:all 0.2s ease-out;-o-transition:all 0.2s ease-out;transition:all 0.2s ease-out}#layout{position:relative;padding-left:0}#layout.active #menu{left:150px;width:150px}#layout.active .menu-link{left:150px}.content{margin:0 auto;padding:0 2em;max-width:800px;margin-bottom:50px;line-height:1.6em}.header{margin:0;color:#333;text-align:center;padding:2.5em 2em 0;border-bottom:1px solid #eee}.header h1{margin:0.2em 0;font-size:3em;font-weight:300}.header h2{font-weight:300;color:#ccc;padding:0;margin-top:0}.content-subhead{margin:50px 0 20px 0;font-weight:300;color:#888}#menu{margin-left:-150px;width:150px;position:fixed;top:0;left:0;bottom:0;z-index:1000;background:#191818;overflow-y:auto;-webkit-overflow-scrolling:touch}#menu a{color:#999;border:none;padding:0.6em 0 0.6em 0.6em}#menu .pure-menu,#menu .pure-menu ul{border:none;background:transparent}#menu .pure-menu ul,#menu .pure-menu .menu-item-divided{border-top:1px solid #333}#menu .pure-menu li a:hover,#menu .pure-menu li a:focus{background:#333}#menu .pure-menu-selected,#menu .pure-menu-heading{background:#1f8dd6}#menu .pure-menu-selected a{color:#fff}#menu .pure-menu-heading{font-size:110%;color:#fff;margin:0}.menu-link{position:fixed;display:block;top:0;left:0;background:#000;background:rgba(0,0,0,0.7);font-size:10px;z-index:10;width:2em;height:auto;padding:2.1em 1.6em}.menu-link:hover,.menu-link:focus{background:#000}.menu-link span{position:relative;display:block}.menu-link span,.menu-link span:before,.menu-link span:after{background-color:#fff;width:100%;height:0.2em}.menu-link span:before,.menu-link span:after{position:absolute;margin-top:-0.6em;content:" "}.menu-link span:after{margin-top:0.6em}@media (min-width: 48em){.header,.content{padding-left:2em;padding-right:2em}#layout{padding-left:150px;left:0}#menu{left:150px}.menu-link{position:fixed;left:150px;display:none}#layout.active .menu-link{left:150px}}@media (max-width: 48em){#layout.active{position:relative;left:150px}} diff --git a/code/package.json b/code/package.json new file mode 100644 index 00000000..0ff1e23e --- /dev/null +++ b/code/package.json @@ -0,0 +1,25 @@ +{ + "name": "esp8266-filesystem-builder", + "version": "0.1.0", + "description": "Gulp based build system for ESP8266 file system files", + "main": "gulpfile.js", + "repository": { + "type": "git", + "url": "" + }, + "author": "Xose PĂ©rez ", + "license": "MIT", + "homepage": "", + "devDependencies": { + "del": "^2.2.1", + "gulp": "^3.9.1", + "gulp-clean-css": "^2.0.10", + "gulp-gzip": "^1.4.0", + "gulp-htmlmin": "^2.0.0", + "gulp-if": "^2.0.1", + "gulp-plumber": "^1.1.0", + "gulp-uglify": "^1.5.3", + "gulp-useref": "^3.1.2" + }, + "dependencies": {} +} diff --git a/code/src/defaults.h b/code/src/defaults.h index c32e1d9d..a46fa537 100644 --- a/code/src/defaults.h +++ b/code/src/defaults.h @@ -41,7 +41,7 @@ #ifdef NODEMCUV2 #define MANUFACTURER "NODEMCU" #define DEVICE "LOLIN" - #define LED_PIN 16 + #define LED_PIN 4 #endif #define AP_PASS "fibonacci"