httpServer.ino 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669
  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 1';
  90. }
  91. else if(data.mode == '3') {
  92. g('btn_onoff').value = textE;
  93. g('mode').innerHTML = 'Reduction 2';
  94. }
  95. if(data.heating == '1') g('heating').innerHTML = 'active';
  96. else if(data.heating == '0') g('heating').innerHTML = 'not active';
  97. xhttp = null;
  98. g('status').innerHTML = '';
  99. updateTime = 0;
  100. reqFin = true;
  101. }
  102. else {
  103. if(!reqFin && reqTime > 10) {
  104. xhttp = null;
  105. reqFin = true;
  106. }
  107. }
  108. }
  109. }
  110. return false;
  111. }
  112. transmit();
  113. setInterval(function () { g('ut').innerHTML = ++updateTime; ++reqTime; }, 1000);
  114. setInterval(transmit, 5000);
  115. </script>
  116. </body></html>)";
  117. static const char httpConfPage[] PROGMEM =
  118. R"(<html><head><body>
  119. <h3>Base configuration</h3>
  120. <a href='/'>Home</a><br><br>
  121. <input type='button' value='reload' onclick='return transmit()'/><br><br>
  122. <form id='form1' onsubmit='return transmit(this)'>
  123. Device Name: <input type='text' name='devName' id='devName'/><br><br>
  124. HTTP User *: <input type='text' name='httpUser' id='httpUser'/><br>
  125. HTTP Password *: <input type='text' name='httpPass' id='httpPass'/><br><br>
  126. HTTP set token: <input type='text' name='httpToken' id='httpToken'/><br>
  127. MQTT Server *: <input type='text' name='mqttHost' id='mqttHost'/><br>
  128. MQTT Port *: <input type='number' name='mqttPort' id='mqttPort'/><br>
  129. MQTT User *: <input type='text' name='mqttUser' id='mqttUser'/><br>
  130. MQTT Password *: <input type='text' name='mqttPass' id='mqttPass'/><br><br>
  131. In Topic *: <input type='text' name='inTop' id='inTop'/><br>
  132. Out Topic: <input type='text' name='outTop' id='outTop'/><br>
  133. Out Retain *: <input type='checkbox' name='outRet' id='outRet'/><br><br>
  134. LastWill Topic *: <input type='text' name='willTop' id='willTop'/><br>
  135. LastWill Qos *: <select name='willQos' id='willQos'><option>0</option><option>1</option><option>2</option></select><br>
  136. LastWill Retain *: <input type='checkbox' name='willRet' id='willRet'/><br>
  137. LastWill Message *: <input type='text' name='willMsg' id='willMsg'/><br><br>
  138. Domoticz Out Topic *: <input type='text' name='domOutTop' id='domOutTop'/><br>
  139. <br>
  140. <input type='submit' value='Save'/>
  141. </form>
  142. <form id='restartForm' onsubmit='return res()'>
  143. <input type='hidden' name='restart' value='1'>
  144. <input type='submit' value='Restart'/>
  145. </form>
  146. <script>
  147. function g(i) { return document.getElementById(i) };
  148. var xhttp, reqTime, reqFin, rxhttp;
  149. function res() {
  150. rxhttp = new XMLHttpRequest();
  151. rxhttp.timeout = 1000;
  152. rxhttp.open('POST', 'restart');
  153. rxhttp.send('');
  154. rxhttp = null;
  155. return false;
  156. }
  157. function setCheckbox(ele, dat) {
  158. if(dat == 1) {
  159. ele.checked = true;
  160. ele.style.visibility = 'visible';
  161. }
  162. else {
  163. ele.checked = false;
  164. ele.style.visibility = 'visible';
  165. }
  166. }
  167. function updateCheckboxValue(ele) {
  168. if (ele.checked) ele.value ='1';
  169. else {
  170. ele.value = '0';
  171. ele.checked = true;
  172. ele.style.visibility = 'hidden';
  173. }
  174. }
  175. function transmit(f) {
  176. if (!xhttp) {
  177. reqTime = 0;
  178. reqFin = false;
  179. updateCheckboxValue(g('outRet'));
  180. updateCheckboxValue(g('willRet'));
  181. xhttp = new XMLHttpRequest();
  182. xhttp.timeout = 2000;
  183. xhttp.open('POST', 'confdata');
  184. xhttp.send(f ? (new FormData(f)) : '');
  185. xhttp.onreadystatechange = function () {
  186. if (xhttp.readyState === XMLHttpRequest.DONE && xhttp.status === 200) {
  187. var data = JSON.parse(xhttp.responseText);
  188. g('httpUser').value = data.httpUser;
  189. g('httpPass').value = data.httpPass;
  190. g('httpToken').value = data.httpToken;
  191. g('devName').value = data.devName
  192. g('mqttHost').value = data.mqttHost;
  193. g('mqttPort').value = data.mqttPort;
  194. g('mqttUser').value = data.mqttUser;
  195. g('mqttPass').value = data.mqttPass;
  196. g('inTop').value = data.inTop;
  197. g('outTop').value = data.outTop;
  198. g('willTop').value = data.willTop;
  199. g('willQos').value = data.willQos;
  200. setCheckbox(g('outRet'), data.outRet);
  201. setCheckbox(g('willRet'), data.willRet);
  202. g('willMsg').value = data.willMsg;
  203. g('domOutTop').value = data.domOutTop;
  204. xhttp = null;
  205. reqFin = true;
  206. }
  207. else {
  208. if(!reqFin && reqTime > 10) {
  209. xhttp = null;
  210. reqFin = true;
  211. }
  212. }
  213. }
  214. }
  215. return false;
  216. }
  217. transmit();
  218. setInterval(function () { ++reqTime; }, 1000);
  219. </script>
  220. </body></html>)";
  221. static const char httpConf2Page[] PROGMEM =
  222. R"(<html><head><body>
  223. <h3>Extended configuration</h3>
  224. <a href='/'>Home</a><br><br>
  225. <input type='button' value='reload' onclick='return transmit()'/><br>
  226. <form id='form1' onsubmit='return transmit(this)'>
  227. <h4>Domoticz</h4>
  228. Idx setTemp: <input type='number' name='domIdxTherm' id='domIdxTherm'/><br>
  229. Idx mode: <input type='number' name='domIdxMode' id='domIdxMode'/><br>
  230. Idx TempHum Sensor: <input type='number' name='domIdxTempHum' id='domIdxTempHum'/><br>
  231. Idx Heating: <input type='number' name='domIdxHeating' id='domIdxHeating'/><br>
  232. Idx PIR: <input type='number' name='domIdxPIR' id='domIdxPIR'/><br>
  233. <h4>Outside Temp/Hum via MQTT</h4>
  234. Temp In-Topic: <input type='text' name='outTempTop' id='outTempTop'/><br>
  235. Hum In-Topic: <input type='text' name='outHumTop' id='outHumTop'/><br>
  236. <h4>Auto-Save</h4>
  237. setTemp: <input type='checkbox' name='autoSaveTemp' id='autoSaveTemp'/><br>
  238. Mode: <input type='checkbox' name='autoSaveMode' id='autoSaveMode'/><br>
  239. <h4>Thermostat / Heating</h4>
  240. Min. Off-Time: <input type='number' name='minOffTime' id='minOffTime'/><br>
  241. Min. Temp: <input type='text' name='tempMin' id='tempMin'/><br>
  242. Max. Temp: <input type='text' name='tempMax' id='tempMax'/><br>
  243. Reduction Mode Temp: <input type='text' name='tempLow' id='tempLow'/><br>
  244. Reduction Mode 2 Temp: <input type='text' name='tempLow2' id='tempLow2'/><br>
  245. set temp decrease value: <input type='text' name='tempDec' id='tempDec'/><br>
  246. Hysteresis: <input type='text' name='hyst' id='hyst'/><br>
  247. Temp Correction.: <input type='text' name='tempCorr' id='tempCorr'/><br>
  248. Hum Correction: <input type='number' name='humCorr' id='humCorr'/><br>
  249. <h4>Intervals / Timeouts</h4>
  250. Measure Interval: <input type='number' name='measInt' id='measInt'/><br>
  251. Display Interval: <input type='number' name='dispInt' id='dispInt'/><br>
  252. Display Timeout: <input type='number' name='dispTout' id='dispTout'/><br>
  253. <h4>Misc</h4>
  254. PIR enables Display: <input type='checkbox' name='PIRenDisp' id='PIRenDisp'/>
  255. <br><br>
  256. <input type='submit' value='Save'/>
  257. </form>
  258. <form id='rebootForm' onsubmit='return res()'>
  259. <input type='submit' value='Restart'/>
  260. </form>
  261. <script>
  262. function g(i) { return document.getElementById(i) };
  263. var xhttp, reqTime, reqFin, rxhttp;
  264. function res() {
  265. rxhttp = new XMLHttpRequest();
  266. rxhttp.timeout = 1000;
  267. rxhttp.open('POST', 'restart');
  268. rxhttp.send('');
  269. rxhttp = null;
  270. return false;
  271. }
  272. function setCheckbox(ele, dat) {
  273. if(dat == 1) {
  274. ele.checked = true;
  275. ele.style.visibility = 'visible';
  276. }
  277. else {
  278. ele.checked = false;
  279. ele.style.visibility = 'visible';
  280. }
  281. }
  282. function updateCheckboxValue(ele) {
  283. if (ele.checked) ele.value ='1';
  284. else {
  285. ele.value = '0';
  286. ele.checked = true;
  287. ele.style.visibility = 'hidden';
  288. }
  289. }
  290. function transmit(f) {
  291. if (!xhttp) {
  292. updateCheckboxValue(g('autoSaveTemp'));
  293. updateCheckboxValue(g('autoSaveMode'));
  294. updateCheckboxValue(g('PIRenDisp'));
  295. xhttp = new XMLHttpRequest();
  296. xhttp.timeout = 2000;
  297. xhttp.open('POST', 'confdata2');
  298. xhttp.send(f ? (new FormData(f)) : '');
  299. xhttp.onreadystatechange = function () {
  300. if (xhttp.readyState === XMLHttpRequest.DONE && xhttp.status === 200) {
  301. var data = JSON.parse(xhttp.responseText);
  302. setCheckbox(g('autoSaveTemp'), data.autoSaveTemp);
  303. setCheckbox(g('autoSaveMode'), data.autoSaveMode);
  304. setCheckbox(g('PIRenDisp'), data.PIRenDisp);
  305. g('domIdxTherm').value = data.domIdxTherm;
  306. g('domIdxMode').value = data.domIdxMode;
  307. g('domIdxTempHum').value = data.domIdxTempHum;
  308. g('domIdxHeating').value = data.domIdxHeating;
  309. g('domIdxPIR').value = data.domIdxPIR;
  310. g('outTempTop').value = data.outTempTop;
  311. g('outHumTop').value = data.outHumTop;
  312. g('minOffTime').value = data.minOffTime;
  313. g('tempMin').value = data.tempMin;
  314. g('tempMax').value = data.tempMax;
  315. g('tempLow').value = data.tempLow;
  316. g('tempLow2').value = data.tempLow2;
  317. g('tempDec').value = data.tempDec;
  318. g('hyst').value = data.hyst;
  319. g('tempCorr').value = data.tempCorr;
  320. g('humCorr').value = data.humCorr;
  321. g('measInt').value = data.measInt;
  322. g('dispInt').value = data.dispInt;
  323. g('dispTout').value = data.dispTout;
  324. xhttp = null;
  325. reqFin = false;
  326. }
  327. else {
  328. if(!reqFin && reqTime > 10) {
  329. xhttp = null;
  330. reqFin = true;
  331. }
  332. }
  333. }
  334. }
  335. return false;
  336. }
  337. transmit();
  338. setInterval(function () { ++reqTime; }, 1000);
  339. </script>
  340. </body></html>)";
  341. void httpServerHandleRoot() {
  342. httpServer.send_P(200, "text/html", httpRoot);
  343. }
  344. void httpServerHandleConfPage() {
  345. httpServer.send_P(200, "text/html", httpConfPage);
  346. }
  347. void httpServerHandleConf2Page() {
  348. httpServer.send_P(200, "text/html", httpConf2Page);
  349. }
  350. //void httpServerHandleNotFound() {
  351. // String message = "File Not Found\n\n";
  352. // message += "URI: ";
  353. // message += httpServer.uri();
  354. // message += "\nMethod: ";
  355. // message += (httpServer.method() == HTTP_GET) ? "GET" : "POST";
  356. // message += "\nArguments: ";
  357. // message += httpServer.args();
  358. // message += "\n";
  359. // for (uint8_t i = 0; i < httpServer.args(); i++) {
  360. // message += " " + httpServer.argName(i) + ": " + httpServer.arg(i) + "\n";
  361. // }
  362. // httpServer.send(404, "text / plain", message);
  363. //}
  364. void httpServerHandleNotFound() {
  365. // if (strlen(http_user) > 0 && strlen(http_pass) > 0) {
  366. // if (!httpServer.authenticate(http_user, http_pass))
  367. // return httpServer.requestAuthentication();
  368. httpServer.send(404, "text/plain", "");
  369. //}
  370. }
  371. void httpServerInit() {
  372. httpServer.on("/delconf", []() {
  373. Serial.println("httpServer.on /delconf");
  374. if (httpServer.hasArg("token")) {
  375. char buf[20];
  376. httpServer.arg("token").toCharArray(buf, 20);
  377. if (strcmp(buf, CLEARCONF_TOKEN) == 0) {
  378. // httpServer.send(200, "text / plain", "Token OK - deleting config");
  379. deleteConfig();
  380. }
  381. } //if
  382. // else {
  383. // httpServer.send(200, "text / plain", "not allowed");
  384. // }
  385. });
  386. httpServer.on("/api", []() {
  387. DEBUG_PRINT("httpServer.on /api");
  388. if (httpServer.hasArg("plusBtn")) {
  389. setTempStepUp();
  390. DEBUG_PRINT(P("web plusBtn"));
  391. } //if
  392. if (httpServer.hasArg("minusBtn")) {
  393. setTempStepDown();
  394. DEBUG_PRINT(P("web minusBtn"));
  395. } //if
  396. if (httpServer.hasArg("modeBtn")) {
  397. toggleHeatingMode();
  398. DEBUG_PRINT(P("web modeBtn"));
  399. } //if
  400. if (httpServer.hasArg("onoffBtn")) {
  401. toggleThermostatOnOff();
  402. DEBUG_PRINT(P("web onoffBtn"));
  403. } //if
  404. //build json object of program data
  405. StaticJsonBuffer<200> jsonBuffer;
  406. JsonObject &json = jsonBuffer.createObject();
  407. json["devname"] = deviceName;
  408. json["ssid"] = WiFi.SSID();
  409. json["setTemp"] = setTemp;
  410. json["temp"] = currTemp;
  411. json["hum"] = int(currHum);
  412. json["mode"] = heatingMode;
  413. json["heating"] = turnHeatingOn;
  414. char jsonchar[200];
  415. json.printTo(jsonchar); //print to char array, takes more memory but sends in one piece
  416. httpServer.send(200, "application/json", jsonchar);
  417. }); //httpServer.on /api
  418. httpServer.on("/restart", []() {
  419. Serial.println("web triggered restart");
  420. ESP.restart();
  421. });
  422. httpServer.on("/mqttReconnect", []() {
  423. Serial.println("web triggered mqttReconnect");
  424. mqttReconnect();
  425. httpServer.sendHeader("Location", String("/"), true);
  426. httpServer.send (302, "text/plain", "OK");
  427. });
  428. httpServer.on("/setPoint", []() {
  429. if (httpServer.hasArg("token")) {
  430. char buf[20];
  431. httpServer.arg("token").toCharArray(buf, 20);
  432. if (strcmp(buf, http_token) == 0) {
  433. Serial.println("web triggered setPoint");
  434. if (httpServer.hasArg("value")) {
  435. char bufVal[20];
  436. httpServer.arg("value").toCharArray(bufVal, 20);
  437. float valueFloat = round(atof(bufVal) * 2.0) / 2.0;
  438. setTempTo(valueFloat);
  439. httpServer.send (200, "text/plain", "OK");
  440. }
  441. }
  442. } //if
  443. else {
  444. httpServer.send (403, "text/plain", "FORBIDDEN");
  445. }
  446. });
  447. httpServer.on("/setMode", []() {
  448. if (httpServer.hasArg("token")) {
  449. char buf[20];
  450. httpServer.arg("token").toCharArray(buf, 20);
  451. if (strcmp(buf, http_token) == 0) {
  452. Serial.println("web triggered setMode");
  453. if (httpServer.hasArg("value")) {
  454. char bufVal[20];
  455. httpServer.arg("value").toCharArray(bufVal, 20);
  456. int valueInt = atoi(bufVal);
  457. if(valueInt >= 0 && valueInt <= 3) setHeatingmodeTo(valueInt);
  458. httpServer.send (200, "text/plain", "OK");
  459. }
  460. }
  461. } //if
  462. else {
  463. httpServer.send (403, "text/plain", "FORBIDDEN");
  464. }
  465. });
  466. httpServer.on("/confdata", []() {
  467. boolean sendData = false;
  468. if (strlen(http_user) > 0 && strlen(http_pass) > 0) {
  469. if (!httpServer.authenticate(http_user, http_pass)) return httpServer.requestAuthentication();
  470. sendData = true;
  471. }
  472. else sendData = true;
  473. if (sendData) {
  474. Serial.println("httpServer.on /confdata");
  475. for (int i = 0; i < httpServer.args(); i++) {
  476. char bufName[20];
  477. char bufValue[101];
  478. httpServer.argName(i).toCharArray(bufName, 20);
  479. httpServer.arg(i).toCharArray(bufValue, 101);
  480. if (strlen(bufName) > 0) {
  481. Serial.print("web update ");
  482. Serial.print(bufName);
  483. Serial.print(" = ");
  484. Serial.println(bufValue);
  485. setConfig(bufName, bufValue);
  486. }
  487. saveConfigToFlash = true; // will be saved in next loop()
  488. Serial.println("web triggered saveConfigToFlash");
  489. }
  490. yield();
  491. //build json object of program data
  492. StaticJsonBuffer<1000> jsonBuffer;
  493. JsonObject &json = jsonBuffer.createObject();
  494. json["devName"] = deviceName;
  495. json["httpUser"] = http_user;
  496. json["httpPass"] = http_pass;
  497. json["httpToken"] = http_token;
  498. json["mqttHost"] = mqtt_server;
  499. json["mqttPort"] = mqtt_port;
  500. json["mqttUser"] = mqtt_user;
  501. json["mqttPass"] = mqtt_pass;
  502. json["inTop"] = mqtt_topic_in;
  503. json["outTop"] = mqtt_topic_out;
  504. json["outRet"] = mqtt_outRetain;
  505. json["willTop"] = mqtt_willTopic;
  506. json["willQos"] = mqtt_willQos;
  507. json["willRet"] = mqtt_willRetain;
  508. json["willMsg"] = mqtt_willMsg;
  509. json["domOutTop"] = domoticz_out_topic;
  510. yield();
  511. char jsonchar[1000];
  512. json.printTo(jsonchar); //print to char array, takes more memory but sends in one piece
  513. httpServer.send(200, "application/json", jsonchar);
  514. }
  515. }); //httpServer.on /confdata
  516. httpServer.on("/confdata2", []() {
  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. Serial.println("httpServer.on /confdata2");
  525. for (int i = 0; i < httpServer.args(); i++) {
  526. char bufName[20];
  527. char bufValue[101];
  528. httpServer.argName(i).toCharArray(bufName, 20);
  529. httpServer.arg(i).toCharArray(bufValue, 101);
  530. if (strlen(bufName) > 0) {
  531. Serial.print("web update ");
  532. Serial.print(bufName);
  533. Serial.print(" = ");
  534. Serial.println(bufValue);
  535. setConfig(bufName, bufValue);
  536. }
  537. saveConfig2ToFlash = true;
  538. Serial.println("web triggered saveConfig2ToFlash");
  539. }
  540. yield();
  541. //build json object of program data
  542. StaticJsonBuffer<1000> jsonBuffer;
  543. JsonObject &json = jsonBuffer.createObject();
  544. json["domIdxTherm"] = domoticzIdx_Thermostat;
  545. json["domIdxMode"] = domoticzIdx_ThermostatMode;
  546. json["domIdxTempHum"] = domoticzIdx_TempHumSensor;
  547. json["domIdxHeating"] = domoticzIdx_Heating;
  548. json["domIdxPIR"] = domoticzIdx_PIR;
  549. json["outTempTop"] = outTemp_topic_in;
  550. json["outHumTop"] = outHum_topic_in;
  551. json["autoSaveTemp"] = autoSaveSetTemp;
  552. json["autoSaveMode"] = autoSaveHeatingMode;
  553. json["minOffTime"] = heatingMinOffTime;
  554. json["tempMin"] = setTempMin;
  555. json["tempMax"] = setTempMax;
  556. json["tempLow"] = setTempLow;
  557. json["tempLow2"] = setTempLow2;
  558. json["tempDec"] = setTempDecreaseVal;
  559. json["hyst"] = hysteresis;
  560. json["tempCorr"] = tempCorrVal;
  561. json["humCorr"] = humCorrVal;
  562. json["measInt"] = measureInterval;
  563. json["dispInt"] = displayInterval;
  564. json["dispTout"] = displayTimeout;
  565. json["PIRenDisp"] = PIR_enablesDisplay;
  566. yield();
  567. char jsonchar[1000];
  568. json.printTo(jsonchar); //print to char array, takes more memory but sends in one piece
  569. httpServer.send(200, "application/json", jsonchar);
  570. }
  571. }); //httpServer.on /confdata2
  572. //get heap status, analog input value and all GPIO statuses in one json call
  573. httpServer.on("/info", HTTP_GET, []() {
  574. boolean sendData = false;
  575. if (strlen(http_user) > 0 && strlen(http_pass) > 0) {
  576. if (!httpServer.authenticate(http_user, http_pass)) return httpServer.requestAuthentication();
  577. sendData = true;
  578. }
  579. else sendData = true;
  580. if (sendData) {
  581. String json = " {";
  582. json += "\"wifissid\":\"" + WiFi.SSID() + "\"";
  583. json += "\"heap\":" + String(ESP.getFreeHeap());
  584. json += "}";
  585. httpServer.send(200, "text/json", json);
  586. json = String();
  587. }
  588. }); //httpServer.on /info
  589. httpServer.on("/", []() {
  590. httpServerHandleRoot();
  591. });
  592. httpServer.on("/conf", []() {
  593. httpServerHandleConfPage();
  594. });
  595. httpServer.on("/conf2", []() {
  596. httpServerHandleConf2Page();
  597. });
  598. httpServer.onNotFound([]() {
  599. httpServerHandleNotFound();
  600. }); //httpServer.onNotFound
  601. // HTTP Updater at /update
  602. httpUpdater.setup(&httpServer);
  603. httpServer.begin();
  604. }