httpServer.ino 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609
  1. //extern ESP8266WebServer httpServer;
  2. static const char httpRoot[] PROGMEM =
  3. R"(<html><body>
  4. <h1><span id='devname'></span></h1>
  5. <h3>WiFi Thermostat</h3>
  6. <form id='minusBtnFrm'>
  7. <input type='hidden' name='minusBtn' value='1'>
  8. </form>
  9. <form id='plusBtnFrm'>
  10. <input type='hidden' name='plusBtn' value='1'>
  11. </form>
  12. <form id='modeBtnFrm'>
  13. <input type='hidden' name='modeBtn' value='1'>
  14. </form>
  15. <form id='onoffBtnFrm'>
  16. <input type='hidden' name='onoffBtn' value='1'>
  17. </form>
  18. <span style="font-size:xx-large" id='setTemp'></span> &#8451;<br>
  19. <span id='mode'></span><br>
  20. <input type='button' onclick='return sendMinusBtn()' value='-'/>
  21. <input type='button' onclick='return sendPlusBtn()' value='+'/>
  22. <input type='button' onclick='return sendModeBtn()' value='MODE'/>
  23. <br>
  24. <br>
  25. <input id='btn_onoff' type='button' onclick='return sendOnOffBtn()' value=''/><br>
  26. <br>
  27. Current: <span id='temp'></span> &#8451;&nbsp;&nbsp;&nbsp;<span id='hum'></span> %<br>
  28. Heating <span id='heating'></span><br>
  29. <br>
  30. WiFi connected to <i><span id='ssid'></span></i>.<br>
  31. <h6>Last update
  32. <span id='ut'></span> seconds ago.
  33. <span id='status'></span>
  34. </h6>
  35. <br>
  36. <a href='/wifi.htm'>WiFi settings</a><br>
  37. <a href='/conf'>Base configuration</a><br>
  38. <a href='/conf2'>Extended configuration</a><br>
  39. <a href='/update'>Firmware update</a><br>
  40. <a href='/restart'>Restart</a>
  41. <script>
  42. function g(i) { return document.getElementById(i) };
  43. var xhttp, updateTime, reqTime, reqFin;
  44. var textA = 'OFF';
  45. var textE = 'ON';
  46. function sendMinusBtn() {
  47. var form = document.getElementById('minusBtnFrm');
  48. return transmit(form);
  49. }
  50. function sendPlusBtn() {
  51. var form = document.getElementById('plusBtnFrm');
  52. return transmit(form);
  53. }
  54. function sendModeBtn() {
  55. var form = document.getElementById('modeBtnFrm');
  56. return transmit(form);
  57. }
  58. function sendOnOffBtn() {
  59. var form = document.getElementById('onoffBtnFrm');
  60. return transmit(form);
  61. }
  62. function transmit(f) {
  63. if (!xhttp) {
  64. g('status').innerHTML = 'loading...';
  65. reqTime = 0;
  66. reqFin = false;
  67. xhttp = new XMLHttpRequest();
  68. xhttp.timeout = 2000;
  69. xhttp.open('POST', 'api');
  70. xhttp.send(f ? (new FormData(f)) : '');
  71. xhttp.onreadystatechange = function () {
  72. if (xhttp.readyState === XMLHttpRequest.DONE && xhttp.status === 200) {
  73. var data = JSON.parse(xhttp.responseText);
  74. if(data.devname != undefined) g('devname').innerHTML = data.devname;
  75. g('temp').innerHTML = data.temp.toFixed(1);
  76. g('hum').innerHTML = data.hum;
  77. g('setTemp').innerHTML = data.setTemp.toFixed(1);
  78. g('ssid').innerHTML = data.ssid;
  79. if(data.mode == '0') {
  80. g('btn_onoff').value = textA;
  81. g('mode').innerHTML = 'Heating OFF';
  82. }
  83. else if(data.mode == '1') {
  84. g('btn_onoff').value = textE;
  85. g('mode').innerHTML = 'Normal';
  86. }
  87. else if(data.mode == '2') {
  88. g('btn_onoff').value = textE;
  89. g('mode').innerHTML = 'Reduction';
  90. }
  91. if(data.heating == '1') g('heating').innerHTML = 'active';
  92. else if(data.heating == '0') g('heating').innerHTML = 'not active';
  93. xhttp = null;
  94. g('status').innerHTML = '';
  95. updateTime = 0;
  96. reqFin = true;
  97. }
  98. else {
  99. if(!reqFin && reqTime > 10) {
  100. xhttp = null;
  101. reqFin = true;
  102. }
  103. }
  104. }
  105. }
  106. return false;
  107. }
  108. transmit();
  109. setInterval(function () { g('ut').innerHTML = ++updateTime; ++reqTime; }, 1000);
  110. setInterval(transmit, 5000);
  111. </script>
  112. </body></html>)";
  113. static const char httpConfPage[] PROGMEM =
  114. R"(<html><head><body>
  115. <h3>Base configuration</h3>
  116. <a href='/'>Home</a><br><br>
  117. <input type='button' value='reload' onclick='return transmit()'/><br><br>
  118. <form id='form1' onsubmit='return transmit(this)'>
  119. Device Name: <input type='text' name='devName' id='devName'/><br><br>
  120. HTTP User *: <input type='text' name='httpUser' id='httpUser'/><br>
  121. HTTP Password *: <input type='text' name='httpPass' id='httpPass'/><br><br>
  122. MQTT Server *: <input type='text' name='mqttHost' id='mqttHost'/><br>
  123. MQTT Port *: <input type='number' name='mqttPort' id='mqttPort'/><br>
  124. MQTT User *: <input type='text' name='mqttUser' id='mqttUser'/><br>
  125. MQTT Password *: <input type='text' name='mqttPass' id='mqttPass'/><br><br>
  126. In Topic *: <input type='text' name='inTop' id='inTop'/><br>
  127. Out Topic: <input type='text' name='outTop' id='outTop'/><br>
  128. Out Retain *: <input type='checkbox' name='outRet' id='outRet'/><br><br>
  129. LastWill Topic *: <input type='text' name='willTop' id='willTop'/><br>
  130. LastWill Qos *: <select name='willQos' id='willQos'><option>0</option><option>1</option><option>2</option></select><br>
  131. LastWill Retain *: <input type='checkbox' name='willRet' id='willRet'/><br>
  132. LastWill Message *: <input type='text' name='willMsg' id='willMsg'/><br><br>
  133. Domoticz Out Topic *: <input type='text' name='domOutTop' id='domOutTop'/><br>
  134. <br>
  135. <input type='submit' value='Save'/>
  136. </form>
  137. <form id='restartForm' onsubmit='return res()'>
  138. <input type='hidden' name='restart' value='1'>
  139. <input type='submit' value='Restart'/>
  140. </form>
  141. <script>
  142. function g(i) { return document.getElementById(i) };
  143. var xhttp, reqTime, reqFin, rxhttp;
  144. function res() {
  145. rxhttp = new XMLHttpRequest();
  146. rxhttp.timeout = 1000;
  147. rxhttp.open('POST', 'restart');
  148. rxhttp.send('');
  149. rxhttp = null;
  150. return false;
  151. }
  152. function setCheckbox(ele, dat) {
  153. if(dat == 1) {
  154. ele.checked = true;
  155. ele.style.visibility = 'visible';
  156. }
  157. else {
  158. ele.checked = false;
  159. ele.style.visibility = 'visible';
  160. }
  161. }
  162. function updateCheckboxValue(ele) {
  163. if (ele.checked) ele.value ='1';
  164. else {
  165. ele.value = '0';
  166. ele.checked = true;
  167. ele.style.visibility = 'hidden';
  168. }
  169. }
  170. function transmit(f) {
  171. if (!xhttp) {
  172. reqTime = 0;
  173. reqFin = false;
  174. updateCheckboxValue(g('outRet'));
  175. updateCheckboxValue(g('willRet'));
  176. xhttp = new XMLHttpRequest();
  177. xhttp.timeout = 2000;
  178. xhttp.open('POST', 'confdata');
  179. xhttp.send(f ? (new FormData(f)) : '');
  180. xhttp.onreadystatechange = function () {
  181. if (xhttp.readyState === XMLHttpRequest.DONE && xhttp.status === 200) {
  182. var data = JSON.parse(xhttp.responseText);
  183. g('httpUser').value = data.httpUser;
  184. g('httpPass').value = data.httpPass;
  185. g('devName').value = data.devName
  186. g('mqttHost').value = data.mqttHost;
  187. g('mqttPort').value = data.mqttPort;
  188. g('mqttUser').value = data.mqttUser;
  189. g('mqttPass').value = data.mqttPass;
  190. g('inTop').value = data.inTop;
  191. g('outTop').value = data.outTop;
  192. g('willTop').value = data.willTop;
  193. g('willQos').value = data.willQos;
  194. setCheckbox(g('outRet'), data.outRet);
  195. setCheckbox(g('willRet'), data.willRet);
  196. g('willMsg').value = data.willMsg;
  197. g('domOutTop').value = data.domOutTop;
  198. xhttp = null;
  199. reqFin = true;
  200. }
  201. else {
  202. if(!reqFin && reqTime > 10) {
  203. xhttp = null;
  204. reqFin = true;
  205. }
  206. }
  207. }
  208. }
  209. return false;
  210. }
  211. transmit();
  212. setInterval(function () { ++reqTime; }, 1000);
  213. </script>
  214. </body></html>)";
  215. static const char httpConf2Page[] PROGMEM =
  216. R"(<html><head><body>
  217. <h3>Extended configuration</h3>
  218. <a href='/'>Home</a><br><br>
  219. <input type='button' value='reload' onclick='return transmit()'/><br>
  220. <form id='form1' onsubmit='return transmit(this)'>
  221. <h4>Domoticz</h4>
  222. Idx setTemp: <input type='number' name='domIdxTherm' id='domIdxTherm'/><br>
  223. Idx mode: <input type='number' name='domIdxMode' id='domIdxMode'/><br>
  224. Idx TempHum Sensor: <input type='number' name='domIdxTempHum' id='domIdxTempHum'/><br>
  225. Idx Heating: <input type='number' name='domIdxHeating' id='domIdxHeating'/><br>
  226. Idx PIR: <input type='number' name='domIdxPIR' id='domIdxPIR'/><br>
  227. <h4>Outside Temp/Hum via MQTT</h4>
  228. Temp In-Topic: <input type='text' name='outTempTop' id='outTempTop'/><br>
  229. Hum In-Topic: <input type='text' name='outHumTop' id='outHumTop'/><br>
  230. <h4>Auto-Save</h4>
  231. setTemp: <input type='checkbox' name='autoSaveTemp' id='autoSaveTemp'/><br>
  232. Mode: <input type='checkbox' name='autoSaveMode' id='autoSaveMode'/><br>
  233. <h4>Thermostat / Heating</h4>
  234. Min. Off-Time: <input type='number' name='minOffTime' id='minOffTime'/><br>
  235. Min. Temp: <input type='text' name='tempMin' id='tempMin'/><br>
  236. Max. Temp: <input type='text' name='tempMax' id='tempMax'/><br>
  237. Reduction Mode Temp: <input type='text' name='tempLow' id='tempLow'/><br>
  238. Hysteresis: <input type='text' name='hyst' id='hyst'/><br>
  239. Temp Correction.: <input type='text' name='tempCorr' id='tempCorr'/><br>
  240. Hum Correction: <input type='number' name='humCorr' id='humCorr'/><br>
  241. <h4>Intervals / Timeouts</h4>
  242. Measure Interval: <input type='number' name='measInt' id='measInt'/><br>
  243. Display Interval: <input type='number' name='dispInt' id='dispInt'/><br>
  244. Display Timeout: <input type='number' name='dispTout' id='dispTout'/><br>
  245. <h4>Misc</h4>
  246. PIR enables Display: <input type='checkbox' name='PIRenDisp' id='PIRenDisp'/>
  247. <br><br>
  248. <input type='submit' value='Save'/>
  249. </form>
  250. <form id='rebootForm' onsubmit='return res()'>
  251. <input type='submit' value='Restart'/>
  252. </form>
  253. <script>
  254. function g(i) { return document.getElementById(i) };
  255. var xhttp, reqTime, reqFin, rxhttp;
  256. function res() {
  257. rxhttp = new XMLHttpRequest();
  258. rxhttp.timeout = 1000;
  259. rxhttp.open('POST', 'restart');
  260. rxhttp.send('');
  261. rxhttp = null;
  262. return false;
  263. }
  264. function setCheckbox(ele, dat) {
  265. if(dat == 1) {
  266. ele.checked = true;
  267. ele.style.visibility = 'visible';
  268. }
  269. else {
  270. ele.checked = false;
  271. ele.style.visibility = 'visible';
  272. }
  273. }
  274. function updateCheckboxValue(ele) {
  275. if (ele.checked) ele.value ='1';
  276. else {
  277. ele.value = '0';
  278. ele.checked = true;
  279. ele.style.visibility = 'hidden';
  280. }
  281. }
  282. function transmit(f) {
  283. if (!xhttp) {
  284. updateCheckboxValue(g('autoSaveTemp'));
  285. updateCheckboxValue(g('autoSaveMode'));
  286. updateCheckboxValue(g('PIRenDisp'));
  287. xhttp = new XMLHttpRequest();
  288. xhttp.timeout = 2000;
  289. xhttp.open('POST', 'confdata2');
  290. xhttp.send(f ? (new FormData(f)) : '');
  291. xhttp.onreadystatechange = function () {
  292. if (xhttp.readyState === XMLHttpRequest.DONE && xhttp.status === 200) {
  293. var data = JSON.parse(xhttp.responseText);
  294. setCheckbox(g('autoSaveTemp'), data.autoSaveTemp);
  295. setCheckbox(g('autoSaveMode'), data.autoSaveMode);
  296. setCheckbox(g('PIRenDisp'), data.PIRenDisp);
  297. g('domIdxTherm').value = data.domIdxTherm;
  298. g('domIdxMode').value = data.domIdxMode;
  299. g('domIdxTempHum').value = data.domIdxTempHum;
  300. g('domIdxHeating').value = data.domIdxHeating;
  301. g('domIdxPIR').value = data.domIdxPIR;
  302. g('outTempTop').value = data.outTempTop;
  303. g('outHumTop').value = data.outHumTop;
  304. g('minOffTime').value = data.minOffTime;
  305. g('tempMin').value = data.tempMin;
  306. g('tempMax').value = data.tempMax;
  307. g('tempLow').value = data.tempLow;
  308. g('hyst').value = data.hyst;
  309. g('tempCorr').value = data.tempCorr;
  310. g('humCorr').value = data.humCorr;
  311. g('measInt').value = data.measInt;
  312. g('dispInt').value = data.dispInt;
  313. g('dispTout').value = data.dispTout;
  314. xhttp = null;
  315. reqFin = false;
  316. }
  317. else {
  318. if(!reqFin && reqTime > 10) {
  319. xhttp = null;
  320. reqFin = true;
  321. }
  322. }
  323. }
  324. }
  325. return false;
  326. }
  327. transmit();
  328. setInterval(function () { ++reqTime; }, 1000);
  329. </script>
  330. </body></html>)";
  331. void httpServerHandleRoot() {
  332. httpServer.send_P(200, "text/html", httpRoot);
  333. }
  334. void httpServerHandleConfPage() {
  335. httpServer.send_P(200, "text/html", httpConfPage);
  336. }
  337. void httpServerHandleConf2Page() {
  338. httpServer.send_P(200, "text/html", httpConf2Page);
  339. }
  340. //void httpServerHandleNotFound() {
  341. // String message = "File Not Found\n\n";
  342. // message += "URI: ";
  343. // message += httpServer.uri();
  344. // message += "\nMethod: ";
  345. // message += (httpServer.method() == HTTP_GET) ? "GET" : "POST";
  346. // message += "\nArguments: ";
  347. // message += httpServer.args();
  348. // message += "\n";
  349. // for (uint8_t i = 0; i < httpServer.args(); i++) {
  350. // message += " " + httpServer.argName(i) + ": " + httpServer.arg(i) + "\n";
  351. // }
  352. // httpServer.send(404, "text / plain", message);
  353. //}
  354. void httpServerHandleNotFound() {
  355. // if (strlen(http_user) > 0 && strlen(http_pass) > 0) {
  356. // if (!httpServer.authenticate(http_user, http_pass))
  357. // return httpServer.requestAuthentication();
  358. httpServer.send(404, "text/plain", "");
  359. //}
  360. }
  361. void httpServerInit() {
  362. httpServer.on("/delconf", []() {
  363. Serial.println("httpServer.on /delconf");
  364. if (httpServer.hasArg("token")) {
  365. char buf[20];
  366. httpServer.arg("token").toCharArray(buf, 20);
  367. if (strcmp(buf, CLEARCONF_TOKEN) == 0) {
  368. // httpServer.send(200, "text / plain", "Token OK - deleting config");
  369. deleteConfig();
  370. }
  371. } //if
  372. // else {
  373. // httpServer.send(200, "text / plain", "not allowed");
  374. // }
  375. });
  376. httpServer.on("/api", []() {
  377. DEBUG_PRINT("httpServer.on /api");
  378. if (httpServer.hasArg("plusBtn")) {
  379. setTempStepUp();
  380. DEBUG_PRINT(P("web plusBtn"));
  381. } //if
  382. if (httpServer.hasArg("minusBtn")) {
  383. setTempStepDown();
  384. DEBUG_PRINT(P("web minusBtn"));
  385. } //if
  386. if (httpServer.hasArg("modeBtn")) {
  387. toggleHeatingMode();
  388. DEBUG_PRINT(P("web modeBtn"));
  389. } //if
  390. if (httpServer.hasArg("onoffBtn")) {
  391. toggleThermostatOnOff();
  392. DEBUG_PRINT(P("web onoffBtn"));
  393. } //if
  394. //build json object of program data
  395. StaticJsonBuffer<200> jsonBuffer;
  396. JsonObject &json = jsonBuffer.createObject();
  397. json["devname"] = deviceName;
  398. json["ssid"] = WiFi.SSID();
  399. json["setTemp"] = setTemp;
  400. json["temp"] = currTemp;
  401. json["hum"] = int(currHum);
  402. json["mode"] = heatingMode;
  403. json["heating"] = turnHeatingOn;
  404. char jsonchar[200];
  405. json.printTo(jsonchar); //print to char array, takes more memory but sends in one piece
  406. httpServer.send(200, "application/json", jsonchar);
  407. }); //httpServer.on /api
  408. httpServer.on("/restart", []() {
  409. Serial.println("web triggered restart");
  410. ESP.restart();
  411. });
  412. httpServer.on("/confdata", []() {
  413. boolean sendData = false;
  414. if (strlen(http_user) > 0 && strlen(http_pass) > 0) {
  415. if (!httpServer.authenticate(http_user, http_pass)) return httpServer.requestAuthentication();
  416. sendData = true;
  417. }
  418. else sendData = true;
  419. if (sendData) {
  420. Serial.println("httpServer.on /confdata");
  421. for (int i = 0; i < httpServer.args(); i++) {
  422. char bufName[20];
  423. char bufValue[101];
  424. httpServer.argName(i).toCharArray(bufName, 20);
  425. httpServer.arg(i).toCharArray(bufValue, 101);
  426. if (strlen(bufName) > 0) {
  427. Serial.print("web update ");
  428. Serial.print(bufName);
  429. Serial.print(" = ");
  430. Serial.println(bufValue);
  431. setConfig(bufName, bufValue);
  432. }
  433. saveConfigToFlash = true; // will be saved in next loop()
  434. Serial.println("web triggered saveConfigToFlash");
  435. }
  436. yield();
  437. //build json object of program data
  438. StaticJsonBuffer<1000> jsonBuffer;
  439. JsonObject &json = jsonBuffer.createObject();
  440. json["devName"] = deviceName;
  441. json["httpUser"] = http_user;
  442. json["httpPass"] = http_pass;
  443. json["mqttHost"] = mqtt_server;
  444. json["mqttPort"] = mqtt_port;
  445. json["mqttUser"] = mqtt_user;
  446. json["mqttPass"] = mqtt_pass;
  447. json["inTop"] = mqtt_topic_in;
  448. json["outTop"] = mqtt_topic_out;
  449. json["outRet"] = mqtt_outRetain;
  450. json["willTop"] = mqtt_willTopic;
  451. json["willQos"] = mqtt_willQos;
  452. json["willRet"] = mqtt_willRetain;
  453. json["willMsg"] = mqtt_willMsg;
  454. json["domOutTop"] = domoticz_out_topic;
  455. yield();
  456. char jsonchar[1000];
  457. json.printTo(jsonchar); //print to char array, takes more memory but sends in one piece
  458. httpServer.send(200, "application/json", jsonchar);
  459. }
  460. }); //httpServer.on /confdata
  461. httpServer.on("/confdata2", []() {
  462. boolean sendData = false;
  463. if (strlen(http_user) > 0 && strlen(http_pass) > 0) {
  464. if (!httpServer.authenticate(http_user, http_pass)) return httpServer.requestAuthentication();
  465. sendData = true;
  466. }
  467. else sendData = true;
  468. if (sendData) {
  469. Serial.println("httpServer.on /confdata2");
  470. for (int i = 0; i < httpServer.args(); i++) {
  471. char bufName[20];
  472. char bufValue[101];
  473. httpServer.argName(i).toCharArray(bufName, 20);
  474. httpServer.arg(i).toCharArray(bufValue, 101);
  475. if (strlen(bufName) > 0) {
  476. Serial.print("web update ");
  477. Serial.print(bufName);
  478. Serial.print(" = ");
  479. Serial.println(bufValue);
  480. setConfig(bufName, bufValue);
  481. }
  482. saveConfig2ToFlash = true;
  483. Serial.println("web triggered saveConfig2ToFlash");
  484. }
  485. yield();
  486. //build json object of program data
  487. StaticJsonBuffer<1000> jsonBuffer;
  488. JsonObject &json = jsonBuffer.createObject();
  489. json["domIdxTherm"] = domoticzIdx_Thermostat;
  490. json["domIdxMode"] = domoticzIdx_ThermostatMode;
  491. json["domIdxTempHum"] = domoticzIdx_TempHumSensor;
  492. json["domIdxHeating"] = domoticzIdx_Heating;
  493. json["domIdxPIR"] = domoticzIdx_PIR;
  494. json["outTempTop"] = outTemp_topic_in;
  495. json["outHumTop"] = outHum_topic_in;
  496. json["autoSaveTemp"] = autoSaveSetTemp;
  497. json["autoSaveMode"] = autoSaveHeatingMode;
  498. json["minOffTime"] = heatingMinOffTime;
  499. json["tempMin"] = setTempMin;
  500. json["tempMax"] = setTempMax;
  501. json["tempLow"] = setTempLow;
  502. json["hyst"] = hysteresis;
  503. json["tempCorr"] = tempCorrVal;
  504. json["humCorr"] = humCorrVal;
  505. json["measInt"] = measureInterval;
  506. json["dispInt"] = displayInterval;
  507. json["dispTout"] = displayTimeout;
  508. json["PIRenDisp"] = PIR_enablesDisplay;
  509. yield();
  510. char jsonchar[1000];
  511. json.printTo(jsonchar); //print to char array, takes more memory but sends in one piece
  512. httpServer.send(200, "application/json", jsonchar);
  513. }
  514. }); //httpServer.on /confdata2
  515. //get heap status, analog input value and all GPIO statuses in one json call
  516. httpServer.on("/info", HTTP_GET, []() {
  517. boolean sendData = false;
  518. if (strlen(http_user) > 0 && strlen(http_pass) > 0) {
  519. if (!httpServer.authenticate(http_user, http_pass)) return httpServer.requestAuthentication();
  520. sendData = true;
  521. }
  522. else sendData = true;
  523. if (sendData) {
  524. String json = " {";
  525. json += "\"wifissid\":\"" + WiFi.SSID() + "\"";
  526. json += "\"heap\":" + String(ESP.getFreeHeap());
  527. json += "}";
  528. httpServer.send(200, "text/json", json);
  529. json = String();
  530. }
  531. }); //httpServer.on /info
  532. httpServer.on("/", []() {
  533. httpServerHandleRoot();
  534. });
  535. httpServer.on("/conf", []() {
  536. httpServerHandleConfPage();
  537. });
  538. httpServer.on("/conf2", []() {
  539. httpServerHandleConf2Page();
  540. });
  541. httpServer.onNotFound([]() {
  542. httpServerHandleNotFound();
  543. }); //httpServer.onNotFound
  544. // HTTP Updater at /update
  545. httpUpdater.setup(&httpServer);
  546. httpServer.begin();
  547. }