config_set.ino 50 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101
  1. // sets the corresponding config variable for 'param' to new value
  2. // does not trigger saving to flash
  3. // does not distinguish between config sets as they are only split on flash and
  4. // in web interface called from commands:
  5. // serial command: set [param] [value]
  6. // MQTT cmd topic, payload "set [param] [value]"
  7. // -> must be committed by command 'save' after all desired values are set
  8. // called from web interface setConf functions, which also saves the changed
  9. // conf set to flash immediately
  10. void setConfig(char *param, char *value)
  11. {
  12. //snprintf(logBuf, LOG_BUFFER_SIZE, "setConfig: '%s' set to '%s'", param, value);
  13. snprintf_P(logBuf, LOG_BUFFER_SIZE, PGMStr_setConf, param, value);
  14. sendLog(logBuf, LOGLEVEL_DEBUG);
  15. //char param_l[15];
  16. strlwr(param);
  17. // confDevWiFi
  18. if (strcmp(param, "devname") == 0)
  19. {
  20. if (strcmp(value, confDevWiFi.deviceName) != 0)
  21. {
  22. if (strcmp(value, "0") == 0)
  23. {
  24. strlcpy(confDevWiFi.deviceName, "", sizeof(confDevWiFi.deviceName));
  25. configChangedRestartRequired = true;
  26. confDevWiFi_wasChanged = true;
  27. }
  28. else
  29. {
  30. if (strlen(value) >= 4)
  31. {
  32. strlcpy(confDevWiFi.deviceName, value, sizeof(confDevWiFi.deviceName));
  33. configChangedRestartRequired = true;
  34. confDevWiFi_wasChanged = true;
  35. }
  36. }
  37. }
  38. }
  39. else if (strcmp(param, "hostname") == 0)
  40. {
  41. if (strcmp(value, confDevWiFi.hostName) != 0)
  42. {
  43. if (strcmp(value, "0") == 0)
  44. {
  45. strlcpy(confDevWiFi.hostName, "", sizeof(confDevWiFi.hostName));
  46. configChangedRestartRequired = true;
  47. confDevWiFi_wasChanged = true;
  48. }
  49. else
  50. {
  51. if (strlen(value) >= 4)
  52. {
  53. strlcpy(confDevWiFi.hostName, value, sizeof(confDevWiFi.hostName));
  54. configChangedRestartRequired = true;
  55. confDevWiFi_wasChanged = true;
  56. }
  57. }
  58. }
  59. }
  60. else if (strcmp(param, "ssid1") == 0)
  61. {
  62. if (strcmp(value, confDevWiFi.WiFiSSID1) != 0)
  63. {
  64. if (strcmp(value, "0") == 0)
  65. {
  66. strlcpy(confDevWiFi.WiFiSSID1, "", sizeof(confDevWiFi.WiFiSSID1));
  67. configChangedRestartRequired = true;
  68. confDevWiFi_wasChanged = true;
  69. }
  70. else
  71. {
  72. strlcpy(confDevWiFi.WiFiSSID1, value, sizeof(confDevWiFi.WiFiSSID1));
  73. configChangedRestartRequired = true;
  74. confDevWiFi_wasChanged = true;
  75. }
  76. }
  77. }
  78. else if (strcmp(param, "wpw1") == 0)
  79. {
  80. if (strcmp(value, confSecrets.WiFiPW1) != 0)
  81. {
  82. if (strcmp(value, "0") == 0)
  83. {
  84. strlcpy(confSecrets.WiFiPW1, "", sizeof(confSecrets.WiFiPW1));
  85. configChangedRestartRequired = true;
  86. confSecrets_wasChanged = true;
  87. }
  88. else
  89. {
  90. if (!strcmp(value, "****") == 0)
  91. {
  92. strlcpy(confSecrets.WiFiPW1, value, sizeof(confSecrets.WiFiPW1));
  93. configChangedRestartRequired = true;
  94. confSecrets_wasChanged = true;
  95. }
  96. }
  97. }
  98. }
  99. else if (strcmp(param, "ssid2") == 0)
  100. {
  101. if (strcmp(value, confDevWiFi.WiFiSSID2) != 0)
  102. {
  103. if (strcmp(value, "0") == 0)
  104. {
  105. strlcpy(confDevWiFi.WiFiSSID2, "", sizeof(confDevWiFi.WiFiSSID2));
  106. configChangedRestartRequired = true;
  107. confDevWiFi_wasChanged = true;
  108. }
  109. else
  110. {
  111. strlcpy(confDevWiFi.WiFiSSID2, value, sizeof(confDevWiFi.WiFiSSID2));
  112. configChangedRestartRequired = true;
  113. confDevWiFi_wasChanged = true;
  114. }
  115. }
  116. }
  117. else if (strcmp(param, "wpw2") == 0)
  118. {
  119. if (strcmp(value, confSecrets.WiFiPW2) != 0)
  120. {
  121. if (strcmp(value, "0") == 0)
  122. {
  123. strlcpy(confSecrets.WiFiPW2, "", sizeof(confSecrets.WiFiPW2));
  124. configChangedRestartRequired = true;
  125. confSecrets_wasChanged = true;
  126. }
  127. else
  128. {
  129. if (!strcmp(value, "****") == 0)
  130. {
  131. strlcpy(confSecrets.WiFiPW2, value, sizeof(confSecrets.WiFiPW2));
  132. configChangedRestartRequired = true;
  133. confSecrets_wasChanged = true;
  134. }
  135. }
  136. }
  137. }
  138. else if (strcmp(param, "wpwap") == 0)
  139. {
  140. if (strcmp(value, confSecrets.WiFiAPModePassword) != 0)
  141. {
  142. if (strcmp(value, "0") == 0)
  143. {
  144. strlcpy(confSecrets.WiFiAPModePassword, "", sizeof(confSecrets.WiFiAPModePassword));
  145. confSecrets_wasChanged = true;
  146. }
  147. else
  148. {
  149. if (!strcmp(value, "****") == 0)
  150. {
  151. strlcpy(confSecrets.WiFiAPModePassword, value, sizeof(confSecrets.WiFiAPModePassword));
  152. confSecrets_wasChanged = true;
  153. }
  154. }
  155. }
  156. }
  157. else if (strcmp(param, "waptout") == 0)
  158. {
  159. int tmpval = atoi(value);
  160. if (tmpval != confDevWiFi.WiFiAPModeTimeout)
  161. {
  162. if (tmpval >= 0 && tmpval <= 120)
  163. {
  164. confDevWiFi.WiFiAPModeTimeout = tmpval;
  165. confDevWiFi_wasChanged = true;
  166. }
  167. else {
  168. sprintf_P(logBuf, PGMStr_conf_invalidValue, param);
  169. sendLog(logBuf, LOGLEVEL_ERROR);
  170. }
  171. }
  172. }
  173. else if (strcmp(param, "wconncheck") == 0)
  174. {
  175. int tmpval = atoi(value);
  176. if (tmpval != confDevWiFi.WiFiConnCheckInterval)
  177. {
  178. if (tmpval == 0)
  179. {
  180. confDevWiFi.WiFiConnCheckInterval = 0;
  181. confDevWiFi_wasChanged = true;
  182. }
  183. else
  184. {
  185. if (tmpval >= 10 && tmpval <= 3600)
  186. {
  187. confDevWiFi.WiFiConnCheckInterval = tmpval;
  188. confDevWiFi_wasChanged = true;
  189. }
  190. else {
  191. sprintf_P(logBuf, PGMStr_conf_invalidValue, param);
  192. sendLog(logBuf, LOGLEVEL_ERROR);
  193. }
  194. }
  195. }
  196. }
  197. else if (strcmp(param, "wretry") == 0)
  198. {
  199. int tmpval = atoi(value);
  200. if (tmpval != confDevWiFi.WiFiRetryInterval)
  201. {
  202. if (tmpval >= 0 && tmpval <= 120)
  203. {
  204. confDevWiFi.WiFiRetryInterval = tmpval;
  205. confDevWiFi_wasChanged = true;
  206. }
  207. else {
  208. sprintf_P(logBuf, PGMStr_conf_invalidValue, param);
  209. sendLog(logBuf, LOGLEVEL_ERROR);
  210. }
  211. }
  212. }
  213. else if (strcmp(param, "wreboot") == 0)
  214. {
  215. int tmpval = atoi(value);
  216. if (tmpval != confDevWiFi.WiFiRebootOnNoConnect)
  217. {
  218. if (tmpval >= 0 && tmpval <= 2880)
  219. {
  220. confDevWiFi.WiFiRebootOnNoConnect = tmpval;
  221. confDevWiFi_wasChanged = true;
  222. }
  223. else {
  224. sprintf_P(logBuf, PGMStr_conf_invalidValue, param);
  225. sendLog(logBuf, LOGLEVEL_ERROR);
  226. }
  227. }
  228. }
  229. else if (strcmp(param, "ardota") == 0)
  230. {
  231. bool tmpval = false;
  232. if (atoi(value) == 1) tmpval = true;
  233. if(tmpval != confDevWiFi.enableArduinoOTA) {
  234. confDevWiFi.enableArduinoOTA = tmpval;
  235. configChangedRestartRequired = true;
  236. confDevWiFi_wasChanged = true;
  237. }
  238. }
  239. // confWeb
  240. else if (strcmp(param, "apitoken") == 0)
  241. {
  242. if (strcmp(value, confSecrets.http_token) != 0)
  243. {
  244. if (strcmp(value, "0") == 0)
  245. {
  246. strlcpy(confSecrets.http_token, "", sizeof(confSecrets.http_token));
  247. confSecrets_wasChanged = true;
  248. }
  249. else
  250. {
  251. if (!strcmp(value, "****") == 0)
  252. {
  253. strlcpy(confSecrets.http_token, value, sizeof(confSecrets.http_token));
  254. confSecrets_wasChanged = true;
  255. }
  256. }
  257. }
  258. }
  259. else if (strcmp(param, "httpua") == 0)
  260. {
  261. if (strcmp(value, confSecrets.http_user) != 0)
  262. {
  263. if (strcmp(value, "0") == 0)
  264. {
  265. strlcpy(confSecrets.http_user, "", sizeof(confSecrets.http_user));
  266. confSecrets_wasChanged = true;
  267. }
  268. else
  269. {
  270. strlcpy(confSecrets.http_user, value, sizeof(confSecrets.http_user));
  271. confSecrets_wasChanged = true;
  272. }
  273. }
  274. }
  275. else if (strcmp(param, "httppa") == 0)
  276. {
  277. if (strcmp(value, confSecrets.http_pass) != 0)
  278. {
  279. if (strcmp(value, "0") == 0)
  280. {
  281. strlcpy(confSecrets.http_pass, "", sizeof(confSecrets.http_pass));
  282. confSecrets_wasChanged = true;
  283. }
  284. else
  285. {
  286. if (!strcmp(value, "****") == 0)
  287. {
  288. strlcpy(confSecrets.http_pass, value, sizeof(confSecrets.http_pass));
  289. confSecrets_wasChanged = true;
  290. }
  291. }
  292. }
  293. }
  294. else if (strcmp(param, "httpauth") == 0)
  295. {
  296. bool tmpval;
  297. if (atoi(value) == 1)
  298. tmpval = true;
  299. else
  300. tmpval = false;
  301. if (confWeb.http_user_auth != tmpval)
  302. {
  303. confWeb.http_user_auth = tmpval;
  304. confWeb_wasChanged = true;
  305. }
  306. }
  307. else if (strcmp(param, "httpu1") == 0)
  308. {
  309. if (strcmp(value, confSecrets.http_user1) != 0)
  310. {
  311. if (strcmp(value, "0") == 0)
  312. {
  313. strlcpy(confSecrets.http_user1, "", sizeof(confSecrets.http_user1));
  314. confSecrets_wasChanged = true;
  315. }
  316. else
  317. {
  318. strlcpy(confSecrets.http_user1, value, sizeof(confSecrets.http_user1));
  319. confSecrets_wasChanged = true;
  320. }
  321. }
  322. }
  323. else if (strcmp(param, "httpp1") == 0)
  324. {
  325. if (strcmp(value, confSecrets.http_pass1) != 0)
  326. {
  327. if (strcmp(value, "0") == 0)
  328. {
  329. strlcpy(confSecrets.http_pass1, "", sizeof(confSecrets.http_pass1));
  330. confSecrets_wasChanged = true;
  331. }
  332. else
  333. {
  334. if (!strcmp(value, "****") == 0)
  335. {
  336. strlcpy(confSecrets.http_pass1, value, sizeof(confSecrets.http_pass1));
  337. confSecrets_wasChanged = true;
  338. }
  339. }
  340. }
  341. }
  342. else if (strcmp(param, "httpu2") == 0)
  343. {
  344. if (strcmp(value, confSecrets.http_user2) != 0)
  345. {
  346. if (strcmp(value, "0") == 0)
  347. {
  348. strlcpy(confSecrets.http_user2, "", sizeof(confSecrets.http_user2));
  349. confSecrets_wasChanged = true;
  350. }
  351. else
  352. {
  353. strlcpy(confSecrets.http_user2, value, sizeof(confSecrets.http_user2));
  354. confSecrets_wasChanged = true;
  355. }
  356. }
  357. }
  358. else if (strcmp(param, "httpp2") == 0)
  359. {
  360. if (strcmp(value, confSecrets.http_pass2) != 0)
  361. {
  362. if (strcmp(value, "0") == 0)
  363. {
  364. strlcpy(confSecrets.http_pass2, "", sizeof(confSecrets.http_pass2));
  365. confSecrets_wasChanged = true;
  366. }
  367. else
  368. {
  369. if (!strcmp(value, "****") == 0)
  370. {
  371. strlcpy(confSecrets.http_pass2, value, sizeof(confSecrets.http_pass2));
  372. confSecrets_wasChanged = true;
  373. }
  374. }
  375. }
  376. }
  377. else if (strcmp(param, "wconsole") == 0)
  378. {
  379. bool tmpval;
  380. if (atoi(value) == 1)
  381. tmpval = true;
  382. else
  383. tmpval = false;
  384. if (confWeb.wConsole != tmpval)
  385. {
  386. confWeb.wConsole = tmpval;
  387. configChangedRestartRequired = true;
  388. confWeb_wasChanged = true;
  389. }
  390. }
  391. else if (strcmp(param, "wsconsole") == 0)
  392. {
  393. bool tmpval;
  394. if (atoi(value) == 1)
  395. tmpval = true;
  396. else
  397. tmpval = false;
  398. if (confWeb.wsConsole != tmpval)
  399. {
  400. confWeb.wsConsole = tmpval;
  401. configChangedRestartRequired = true;
  402. confWeb_wasChanged = true;
  403. }
  404. }
  405. #ifdef ENABLE_FEATURE_HTTP_UPDATER
  406. else if (strcmp(param, "enableota") == 0)
  407. {
  408. bool tmpval;
  409. if (atoi(value) == 1) tmpval = true;
  410. else tmpval = false;
  411. if (confWeb.enableOTA != tmpval) {
  412. confWeb.enableOTA = tmpval;
  413. confWeb_wasChanged = true;
  414. }
  415. }
  416. #endif
  417. #ifdef ENABLE_FEATURE_FILESYSTEM_BROWSER
  418. else if (strcmp(param, "fsbrowser") == 0)
  419. {
  420. bool tmpval;
  421. if (atoi(value) == 1) tmpval = true;
  422. else tmpval = false;
  423. if (confWeb.FSbrowser != tmpval) {
  424. confWeb.FSbrowser = tmpval;
  425. confWeb_wasChanged = true;
  426. }
  427. }
  428. #endif
  429. // confMqtt
  430. else if (strcmp(param, "mqttenable") == 0)
  431. {
  432. bool tmpval;
  433. if (atoi(value) == 1)
  434. tmpval = true;
  435. else
  436. tmpval = false;
  437. if (confMqtt.mqtt_enable != tmpval)
  438. {
  439. confMqtt.mqtt_enable = tmpval;
  440. configChangedMqttConnResetRequired = true;
  441. confMqtt_wasChanged = true;
  442. }
  443. }
  444. else if (strcmp(param, "mqtthost") == 0)
  445. {
  446. if (strcmp(value, confMqtt.mqtt_server) != 0)
  447. {
  448. if (strcmp(value, "0") == 0)
  449. {
  450. strlcpy(confMqtt.mqtt_server, "", sizeof(confMqtt.mqtt_server));
  451. configChangedMqttConnResetRequired = true;
  452. confMqtt_wasChanged = true;
  453. }
  454. else
  455. {
  456. strlcpy(confMqtt.mqtt_server, value, sizeof(confMqtt.mqtt_server));
  457. configChangedMqttConnResetRequired = true;
  458. confMqtt_wasChanged = true;
  459. }
  460. }
  461. }
  462. else if (strcmp(param, "mqttport") == 0)
  463. {
  464. if (atoi(value) != confMqtt.mqtt_port)
  465. {
  466. confMqtt.mqtt_port = atoi(value);
  467. configChangedMqttConnResetRequired = true;
  468. confMqtt_wasChanged = true;
  469. }
  470. }
  471. else if (strcmp(param, "mqttuser") == 0)
  472. {
  473. if (strcmp(value, confSecrets.mqtt_user) != 0)
  474. {
  475. if (strcmp(value, "0") == 0)
  476. {
  477. strlcpy(confSecrets.mqtt_user, "", sizeof(confSecrets.mqtt_user));
  478. configChangedMqttConnResetRequired = true;
  479. confSecrets_wasChanged = true;
  480. }
  481. else
  482. {
  483. strlcpy(confSecrets.mqtt_user, value, sizeof(confSecrets.mqtt_user));
  484. configChangedMqttConnResetRequired = true;
  485. confSecrets_wasChanged = true;
  486. }
  487. }
  488. }
  489. else if (strcmp(param, "mqttpass") == 0)
  490. {
  491. if (strcmp(value, confSecrets.mqtt_pass) != 0)
  492. {
  493. if (strcmp(value, "0") == 0)
  494. {
  495. strlcpy(confSecrets.mqtt_pass, "", sizeof(confSecrets.mqtt_pass));
  496. configChangedMqttConnResetRequired = true;
  497. confSecrets_wasChanged = true;
  498. }
  499. else
  500. {
  501. if (!strcmp(value, "****") == 0)
  502. {
  503. strlcpy(confSecrets.mqtt_pass, value, sizeof(confSecrets.mqtt_pass));
  504. configChangedMqttConnResetRequired = true;
  505. confSecrets_wasChanged = true;
  506. }
  507. }
  508. }
  509. }
  510. else if (strcmp(param, "intop") == 0)
  511. {
  512. if (strcmp(value, confMqtt.mqtt_topic_in) != 0)
  513. {
  514. if (strcmp(value, "0") == 0)
  515. {
  516. strlcpy(confMqtt.mqtt_topic_in, "", sizeof(confMqtt.mqtt_topic_in));
  517. configChangedMqttConnResetRequired = true;
  518. confMqtt_wasChanged = true;
  519. }
  520. else
  521. {
  522. strlcpy(confMqtt.mqtt_topic_in, value, sizeof(confMqtt.mqtt_topic_in));
  523. configChangedMqttConnResetRequired = true;
  524. confMqtt_wasChanged = true;
  525. }
  526. }
  527. }
  528. else if (strcmp(param, "outtop") == 0)
  529. {
  530. if (strcmp(value, confMqtt.mqtt_topic_out) != 0)
  531. {
  532. if (strcmp(value, "0") == 0)
  533. {
  534. strlcpy(confMqtt.mqtt_topic_out, "", sizeof(confMqtt.mqtt_topic_out));
  535. confMqtt_wasChanged = true;
  536. }
  537. else
  538. {
  539. strlcpy(confMqtt.mqtt_topic_out, value, sizeof(confMqtt.mqtt_topic_out));
  540. confMqtt_wasChanged = true;
  541. }
  542. }
  543. }
  544. else if (strcmp(param, "outret") == 0)
  545. {
  546. bool tmpval;
  547. if (atoi(value) == 1)
  548. tmpval = true;
  549. else
  550. tmpval = false;
  551. if (confMqtt.mqtt_outRetain != tmpval)
  552. {
  553. confMqtt.mqtt_outRetain = tmpval;
  554. confMqtt_wasChanged = true;
  555. if (tmpval == false)
  556. {
  557. publishDeleteRetainedOutMessages();
  558. }
  559. }
  560. }
  561. else if (strcmp(param, "outretsens") == 0)
  562. {
  563. bool tmpval;
  564. if (atoi(value) == 1)
  565. tmpval = true;
  566. else
  567. tmpval = false;
  568. if (confMqtt.mqtt_outRetain_sensors != tmpval)
  569. {
  570. confMqtt.mqtt_outRetain_sensors = tmpval;
  571. confMqtt_wasChanged = true;
  572. if (tmpval == false)
  573. {
  574. publishDeleteRetainedOutMessages_sensors();
  575. }
  576. }
  577. }
  578. else if (strcmp(param, "outpubint") == 0)
  579. {
  580. if (atoi(value) != confMqtt.mqtt_outPubInterval)
  581. {
  582. confMqtt.mqtt_outPubInterval = atoi(value);
  583. confMqtt_wasChanged = true;
  584. }
  585. }
  586. else if (strcmp(param, "outpubintsens") == 0)
  587. {
  588. if (atoi(value) != confMqtt.mqtt_outPubInterval_sensors)
  589. {
  590. confMqtt.mqtt_outPubInterval_sensors = atoi(value);
  591. confMqtt_wasChanged = true;
  592. }
  593. }
  594. else if (strcmp(param, "willtop") == 0)
  595. {
  596. if (strcmp(value, confMqtt.mqtt_willTopic) != 0)
  597. {
  598. if (strcmp(value, "0") == 0)
  599. {
  600. strlcpy(confMqtt.mqtt_willTopic, "", sizeof(confMqtt.mqtt_willTopic));
  601. configChangedMqttConnResetRequired = true;
  602. confMqtt_wasChanged = true;
  603. }
  604. else
  605. {
  606. strlcpy(confMqtt.mqtt_willTopic, value, sizeof(confMqtt.mqtt_willTopic));
  607. configChangedMqttConnResetRequired = true;
  608. confMqtt_wasChanged = true;
  609. }
  610. }
  611. }
  612. else if (strcmp(param, "willqos") == 0)
  613. {
  614. int tmpval = atoi(value);
  615. if (tmpval != confMqtt.mqtt_willQos)
  616. {
  617. if (tmpval >= 0 && tmpval <= 2)
  618. {
  619. confMqtt.mqtt_willQos = tmpval;
  620. configChangedMqttConnResetRequired = true;
  621. confMqtt_wasChanged = true;
  622. }
  623. }
  624. }
  625. else if (strcmp(param, "willret") == 0)
  626. {
  627. bool tmpval;
  628. if (atoi(value) == 1)
  629. tmpval = true;
  630. else
  631. tmpval = false;
  632. if (confMqtt.mqtt_willRetain != tmpval)
  633. {
  634. confMqtt.mqtt_willRetain = tmpval;
  635. configChangedMqttConnResetRequired = true;
  636. confMqtt_wasChanged = true;
  637. }
  638. }
  639. else if (strcmp(param, "willmsg") == 0)
  640. {
  641. if (strcmp(value, confMqtt.mqtt_willMsg) != 0)
  642. {
  643. if (strcmp(value, "0") == 0)
  644. {
  645. strlcpy(confMqtt.mqtt_willMsg, "", sizeof(confMqtt.mqtt_willMsg));
  646. configChangedMqttConnResetRequired = true;
  647. confMqtt_wasChanged = true;
  648. }
  649. else
  650. {
  651. strlcpy(confMqtt.mqtt_willMsg, value, sizeof(confMqtt.mqtt_willMsg));
  652. configChangedMqttConnResetRequired = true;
  653. confMqtt_wasChanged = true;
  654. }
  655. }
  656. }
  657. else if (strcmp(param, "connmsg") == 0)
  658. {
  659. if (strcmp(value, confMqtt.mqtt_connMsg) != 0)
  660. {
  661. if (strcmp(value, "0") == 0)
  662. {
  663. strlcpy(confMqtt.mqtt_connMsg, "", sizeof(confMqtt.mqtt_connMsg));
  664. configChangedMqttConnResetRequired = true;
  665. confMqtt_wasChanged = true;
  666. }
  667. else
  668. {
  669. strlcpy(confMqtt.mqtt_connMsg, value, sizeof(confMqtt.mqtt_connMsg));
  670. configChangedMqttConnResetRequired = true;
  671. confMqtt_wasChanged = true;
  672. }
  673. }
  674. }
  675. else if (strcmp(param, "hbenable") == 0)
  676. {
  677. bool tmpval;
  678. if (atoi(value) == 1)
  679. tmpval = true;
  680. else
  681. tmpval = false;
  682. if (confMqtt.mqtt_enable_heartbeat != tmpval)
  683. {
  684. confMqtt.mqtt_enable_heartbeat = tmpval;
  685. confMqtt_wasChanged = true;
  686. }
  687. }
  688. else if (strcmp(param, "hbreconn") == 0)
  689. {
  690. unsigned int _tmpval = atoi(value);
  691. if (_tmpval != confMqtt.mqtt_heartbeat_maxage_reconnect)
  692. {
  693. if (_tmpval == 0)
  694. {
  695. confMqtt.mqtt_heartbeat_maxage_reconnect = 0;
  696. confMqtt_wasChanged = true;
  697. }
  698. else if (_tmpval >= 1 && _tmpval <= 60)
  699. {
  700. confMqtt.mqtt_heartbeat_maxage_reconnect = _tmpval;
  701. confMqtt_wasChanged = true;
  702. }
  703. else {
  704. sprintf_P(logBuf, PGMStr_conf_invalidValue, param);
  705. sendLog(logBuf, LOGLEVEL_ERROR);
  706. }
  707. }
  708. }
  709. else if (strcmp(param, "hbreboot") == 0)
  710. {
  711. unsigned int _tmpval = atoi(value);
  712. if (_tmpval != confMqtt.mqtt_heartbeat_maxage_reboot)
  713. {
  714. if (_tmpval == 0)
  715. {
  716. confMqtt.mqtt_heartbeat_maxage_reboot = 0;
  717. confMqtt_wasChanged = true;
  718. }
  719. else if (_tmpval >= 5 && _tmpval <= 3600)
  720. {
  721. confMqtt.mqtt_heartbeat_maxage_reboot = _tmpval;
  722. confMqtt_wasChanged = true;
  723. }
  724. else {
  725. sprintf_P(logBuf, PGMStr_conf_invalidValue, param);
  726. sendLog(logBuf, LOGLEVEL_ERROR);
  727. }
  728. }
  729. }
  730. else if (strcmp(param, "reconsilent") == 0)
  731. {
  732. bool tmpval;
  733. if (atoi(value) == 1)
  734. tmpval = true;
  735. else
  736. tmpval = false;
  737. if (confMqtt.mqtt_reconnect_silent != tmpval)
  738. {
  739. confMqtt.mqtt_reconnect_silent = tmpval;
  740. confMqtt_wasChanged = true;
  741. }
  742. }
  743. // confAdd
  744. else if (strcmp(param, "outtemptop") == 0)
  745. {
  746. if (strcmp(value, confAdd.outTemp_topic_in) != 0)
  747. {
  748. if (strcmp(value, "0") == 0)
  749. {
  750. strlcpy(confAdd.outTemp_topic_in, "", sizeof(confAdd.outTemp_topic_in));
  751. configChangedMqttConnResetRequired = true;
  752. confAdd_wasChanged = true;
  753. }
  754. else
  755. {
  756. strlcpy(confAdd.outTemp_topic_in, value, sizeof(confAdd.outTemp_topic_in));
  757. configChangedMqttConnResetRequired = true;
  758. confAdd_wasChanged = true;
  759. }
  760. }
  761. }
  762. else if (strcmp(param, "outhumtop") == 0)
  763. {
  764. if (strcmp(value, confAdd.outHum_topic_in) != 0)
  765. {
  766. if (strcmp(value, "0") == 0)
  767. {
  768. strlcpy(confAdd.outHum_topic_in, "", sizeof(confAdd.outHum_topic_in));
  769. configChangedMqttConnResetRequired = true;
  770. confAdd_wasChanged = true;
  771. }
  772. else
  773. {
  774. strlcpy(confAdd.outHum_topic_in, value, sizeof(confAdd.outHum_topic_in));
  775. configChangedMqttConnResetRequired = true;
  776. confAdd_wasChanged = true;
  777. }
  778. }
  779. }
  780. else if (strcmp(param, "pirtop") == 0)
  781. {
  782. if (strcmp(value, confAdd.mqtt_topic_pir) != 0)
  783. {
  784. if (strcmp(value, "0") == 0)
  785. {
  786. strlcpy(confAdd.mqtt_topic_pir, "", sizeof(confAdd.mqtt_topic_pir));
  787. confAdd_wasChanged = true;
  788. }
  789. else
  790. {
  791. strlcpy(confAdd.mqtt_topic_pir, value, sizeof(confAdd.mqtt_topic_pir));
  792. confAdd_wasChanged = true;
  793. }
  794. }
  795. }
  796. else if (strcmp(param, "pironpld") == 0)
  797. {
  798. if (strcmp(value, confAdd.mqtt_payload_pir_on) != 0)
  799. {
  800. if (strcmp(value, "0") == 0)
  801. {
  802. strlcpy(confAdd.mqtt_payload_pir_on, "", sizeof(confAdd.mqtt_payload_pir_on));
  803. confAdd_wasChanged = true;
  804. }
  805. else
  806. {
  807. strlcpy(confAdd.mqtt_payload_pir_on, value, sizeof(confAdd.mqtt_payload_pir_on));
  808. confAdd_wasChanged = true;
  809. }
  810. }
  811. }
  812. else if (strcmp(param, "piroffpld") == 0)
  813. {
  814. if (strcmp(value, confAdd.mqtt_payload_pir_off) != 0)
  815. {
  816. if (strcmp(value, "0") == 0)
  817. {
  818. strlcpy(confAdd.mqtt_payload_pir_off, "", sizeof(confAdd.mqtt_payload_pir_off));
  819. confAdd_wasChanged = true;
  820. }
  821. else
  822. {
  823. strlcpy(confAdd.mqtt_payload_pir_off, value, sizeof(confAdd.mqtt_payload_pir_off));
  824. confAdd_wasChanged = true;
  825. }
  826. }
  827. }
  828. #ifdef ENABLE_FEATURE_NTP_TIME
  829. // confTime
  830. else if (strcmp(param, "tzstr") == 0)
  831. {
  832. if (strcmp(value, confTime.timeZoneStr) != 0)
  833. {
  834. if (strcmp(value, "0") == 0)
  835. {
  836. strlcpy(confTime.timeZoneStr, "", sizeof(confTime.timeZoneStr));
  837. configChangedRestartRequired = true;
  838. confTime_wasChanged = true;
  839. }
  840. else
  841. {
  842. strlcpy(confTime.timeZoneStr, value, sizeof(confTime.timeZoneStr));
  843. configChangedRestartRequired = true;
  844. confTime_wasChanged = true;
  845. }
  846. }
  847. }
  848. else if (strcmp(param, "ntpenable") == 0)
  849. {
  850. bool tmpval;
  851. if (atoi(value) == 1)
  852. tmpval = true;
  853. else
  854. tmpval = false;
  855. if (confTime.ntpEnable != tmpval)
  856. {
  857. confTime.ntpEnable = tmpval;
  858. configChangedRestartRequired = true;
  859. confTime_wasChanged = true;
  860. }
  861. }
  862. else if (strcmp(param, "ntpserver1") == 0)
  863. {
  864. if (strcmp(value, confTime.ntpServer1) != 0)
  865. {
  866. if (strcmp(value, "0") == 0)
  867. {
  868. strlcpy(confTime.ntpServer1, "", sizeof(confTime.ntpServer1));
  869. configChangedRestartRequired = true;
  870. confTime_wasChanged = true;
  871. }
  872. else
  873. {
  874. strlcpy(confTime.ntpServer1, value, sizeof(confTime.ntpServer1));
  875. configChangedRestartRequired = true;
  876. confTime_wasChanged = true;
  877. }
  878. }
  879. }
  880. else if (strcmp(param, "ntpserver2") == 0)
  881. {
  882. if (strcmp(value, confTime.ntpServer2) != 0)
  883. {
  884. if (strcmp(value, "0") == 0)
  885. {
  886. strlcpy(confTime.ntpServer2, "", sizeof(confTime.ntpServer2));
  887. configChangedRestartRequired = true;
  888. confTime_wasChanged = true;
  889. }
  890. else
  891. {
  892. strlcpy(confTime.ntpServer2, value, sizeof(confTime.ntpServer2));
  893. configChangedRestartRequired = true;
  894. confTime_wasChanged = true;
  895. }
  896. }
  897. }
  898. else if (strcmp(param, "ntpsyncint") == 0)
  899. {
  900. unsigned int valueInt = atoi(value) * 60;
  901. if (confTime.ntpSyncInterval != valueInt)
  902. {
  903. confTime.ntpSyncInterval = valueInt;
  904. configChangedRestartRequired = true;
  905. confTime_wasChanged = true;
  906. }
  907. }
  908. #endif // NTP
  909. // confLog
  910. else if (strcmp(param, "loglevser") == 0)
  911. {
  912. int valueInt = atoi(value);
  913. if (confLog.logLevelSerial != valueInt)
  914. {
  915. if (valueInt >= 0 && valueInt <= 5)
  916. {
  917. confLog.logLevelSerial = valueInt;
  918. confLog_wasChanged = true;
  919. }
  920. else {
  921. sprintf_P(logBuf, PGMStr_conf_invalidValue, param);
  922. sendLog(logBuf, LOGLEVEL_ERROR);
  923. }
  924. }
  925. }
  926. else if (strcmp(param, "loglevweb") == 0)
  927. {
  928. int valueInt = atoi(value);
  929. if (confLog.logLevelWeb != valueInt)
  930. {
  931. if (valueInt >= 0 && valueInt <= 5)
  932. {
  933. confLog.logLevelWeb = valueInt;
  934. confLog_wasChanged = true;
  935. }
  936. else {
  937. sprintf_P(logBuf, PGMStr_conf_invalidValue, param);
  938. sendLog(logBuf, LOGLEVEL_ERROR);
  939. }
  940. }
  941. }
  942. else if (strcmp(param, "loglevmqtt") == 0)
  943. {
  944. int valueInt = atoi(value);
  945. if (confLog.logLevelMqtt != valueInt)
  946. {
  947. if (valueInt >= 0 && valueInt <= 5)
  948. {
  949. confLog.logLevelMqtt = valueInt;
  950. confLog_wasChanged = true;
  951. }
  952. else {
  953. sprintf_P(logBuf, PGMStr_conf_invalidValue, param);
  954. sendLog(logBuf, LOGLEVEL_ERROR);
  955. }
  956. }
  957. }
  958. else if (strcmp(param, "logwebrequests") == 0)
  959. {
  960. bool tmpval;
  961. if (atoi(value) == 1)
  962. tmpval = true;
  963. else
  964. tmpval = false;
  965. if (confLog.logWebRequests != tmpval)
  966. {
  967. confLog.logWebRequests = tmpval;
  968. confLog_wasChanged = true;
  969. }
  970. }
  971. // DISPLAY
  972. else if (strcmp(param, "dispint") == 0)
  973. {
  974. int valueInt = atoi(value);
  975. if (valueInt != confDisplay.displayInterval)
  976. {
  977. if (valueInt >= 1 && valueInt <= 60)
  978. {
  979. confDisplay.displayInterval = valueInt;
  980. confDisplay_wasChanged = true;
  981. }
  982. else {
  983. sprintf_P(logBuf, PGMStr_conf_invalidValue, param);
  984. sendLog(logBuf, LOGLEVEL_ERROR);
  985. }
  986. }
  987. }
  988. else if (strcmp(param, "disptout") == 0)
  989. {
  990. int valueInt = atoi(value);
  991. if (valueInt != confDisplay.displayTimeout)
  992. {
  993. if (valueInt >= 2 && valueInt <= 3600)
  994. {
  995. confDisplay.displayTimeout = valueInt;
  996. confDisplay_wasChanged = true;
  997. }
  998. else {
  999. sprintf_P(logBuf, PGMStr_conf_invalidValue, param);
  1000. sendLog(logBuf, LOGLEVEL_ERROR);
  1001. }
  1002. }
  1003. }
  1004. else if (strcmp(param, "pirendisp") == 0)
  1005. {
  1006. bool tmpval;
  1007. if (atoi(value) == 1)
  1008. tmpval = true;
  1009. else
  1010. tmpval = false;
  1011. if (tmpval != confDisplay.PIRenablesDisplay)
  1012. {
  1013. confDisplay.PIRenablesDisplay = tmpval;
  1014. confDisplay_wasChanged = true;
  1015. }
  1016. }
  1017. // /DISPLAY
  1018. // SENSORS
  1019. else if (strcmp(param, "measint") == 0)
  1020. {
  1021. int valueInt = atoi(value);
  1022. if (valueInt != confSens.measureInterval)
  1023. {
  1024. if (valueInt >= 5 && valueInt <= 60)
  1025. {
  1026. confSens.measureInterval = valueInt;
  1027. confSens_wasChanged = true;
  1028. }
  1029. else {
  1030. sprintf_P(logBuf, PGMStr_conf_invalidValue, param);
  1031. sendLog(logBuf, LOGLEVEL_ERROR);
  1032. }
  1033. }
  1034. }
  1035. #ifdef ENABLE_SENSOR_DHT22
  1036. else if (strcmp(param, "dht_enable") == 0)
  1037. {
  1038. bool tmpval;
  1039. if (atoi(value) == 1)
  1040. tmpval = true;
  1041. else
  1042. tmpval = false;
  1043. if (tmpval != confSens.DHT_enable)
  1044. {
  1045. confSens.DHT_enable = tmpval;
  1046. confSens_wasChanged = true;
  1047. }
  1048. }
  1049. else if (strcmp(param, "dht_tempcorr") == 0)
  1050. {
  1051. float valueFloat = atof(value);
  1052. if (valueFloat != confSens.DHT_tempCorrVal)
  1053. {
  1054. if (valueFloat >= -5.0 && valueFloat <= 5.0)
  1055. {
  1056. confSens.DHT_tempCorrVal = valueFloat;
  1057. confSens_wasChanged = true;
  1058. }
  1059. }
  1060. }
  1061. else if (strcmp(param, "dht_humcorr") == 0)
  1062. {
  1063. int valueInt = atoi(value);
  1064. if (valueInt != confSens.DHT_humCorrVal)
  1065. {
  1066. if (valueInt >= -40 && valueInt <= 40)
  1067. {
  1068. confSens.DHT_humCorrVal = valueInt;
  1069. confSens_wasChanged = true;
  1070. }
  1071. }
  1072. }
  1073. #endif //ENABLE_SENSOR_DHT22
  1074. #ifdef ENABLE_SENSORS_ONEWIRE
  1075. // assign sensors - console commands
  1076. else if (strcmp(param, "sens_feed") == 0)
  1077. {
  1078. int val = atoi(value);
  1079. if (val >= 0 && val <= ONEWIRE_SENSORS_COUNT)
  1080. {
  1081. oneWireSensor_assign(val, ONEWIRE_SENSOR_INDEX_FEED);
  1082. confSens_wasChanged = true;
  1083. }
  1084. else {
  1085. sprintf_P(logBuf, PGMStr_conf_invalidValue, param);
  1086. sendLog(logBuf, LOGLEVEL_ERROR);
  1087. }
  1088. }
  1089. else if (strcmp(param, "sens_return") == 0)
  1090. {
  1091. int val = atoi(value);
  1092. if (val >= 0 && val <= ONEWIRE_SENSORS_COUNT)
  1093. {
  1094. oneWireSensor_assign(val, ONEWIRE_SENSOR_INDEX_RETURN);
  1095. confSens_wasChanged = true;
  1096. }
  1097. else {
  1098. sprintf_P(logBuf, PGMStr_conf_invalidValue, param);
  1099. sendLog(logBuf, LOGLEVEL_ERROR);
  1100. }
  1101. }
  1102. else if (strcmp(param, "sens_out") == 0)
  1103. {
  1104. int val = atoi(value);
  1105. if (val >= 0 && val <= ONEWIRE_SENSORS_COUNT)
  1106. {
  1107. oneWireSensor_assign(val, ONEWIRE_SENSOR_INDEX_OUT);
  1108. confSens_wasChanged = true;
  1109. }
  1110. else {
  1111. sprintf_P(logBuf, PGMStr_conf_invalidValue, param);
  1112. sendLog(logBuf, LOGLEVEL_ERROR);
  1113. }
  1114. }
  1115. // assign sensors - from web interface
  1116. else if (strcmp(param, "assignsens_0") == 0)
  1117. { // value is index of confSens.oneWireDevAddress/oneWireSensor_assignedDevToIndex
  1118. int val = atoi(value);
  1119. if (val >= 0 && val <= ONEWIRE_SENSORS_COUNT)
  1120. {
  1121. oneWireSensor_assign(0, val);
  1122. confSens_wasChanged = true;
  1123. }
  1124. else {
  1125. sprintf_P(logBuf, PGMStr_conf_invalidValue, param);
  1126. sendLog(logBuf, LOGLEVEL_ERROR);
  1127. }
  1128. }
  1129. // assign sensors - from web interface
  1130. else if (strcmp(param, "assignsens_1") == 0)
  1131. { // value is index of confSens.oneWireDevAddress/oneWireSensor_assignedDevToIndex
  1132. int val = atoi(value);
  1133. if (val >= 0 && val <= ONEWIRE_SENSORS_COUNT)
  1134. {
  1135. oneWireSensor_assign(1, val);
  1136. confSens_wasChanged = true;
  1137. }
  1138. else {
  1139. sprintf_P(logBuf, PGMStr_conf_invalidValue, param);
  1140. sendLog(logBuf, LOGLEVEL_ERROR);
  1141. }
  1142. }
  1143. // assign sensors - from web interface
  1144. else if (strcmp(param, "assignsens_2") == 0)
  1145. { // value is index of confSens.oneWireDevAddress/oneWireSensor_assignedDevToIndex
  1146. int val = atoi(value);
  1147. if (val >= 0 && val <= ONEWIRE_SENSORS_COUNT)
  1148. {
  1149. oneWireSensor_assign(2, val);
  1150. confSens_wasChanged = true;
  1151. }
  1152. else {
  1153. sprintf_P(logBuf, PGMStr_conf_invalidValue, param);
  1154. sendLog(logBuf, LOGLEVEL_ERROR);
  1155. }
  1156. }
  1157. #endif // ENABLE_SENSORS_ONEWIRE
  1158. // /SENSORS - confSens
  1159. // THERMOSTAT - confTherm
  1160. #ifdef FIRMWARE_VARIANT_THERMOSTAT
  1161. else if (strcmp(param, "autosavetemp") == 0)
  1162. {
  1163. bool tmpval;
  1164. if (atoi(value) == 1)
  1165. tmpval = true;
  1166. else
  1167. tmpval = false;
  1168. if (confTherm.autoSaveSetTemp != tmpval)
  1169. {
  1170. confTherm.autoSaveSetTemp = tmpval;
  1171. confTherm_wasChanged = true;
  1172. }
  1173. }
  1174. else if (strcmp(param, "autosavemode") == 0)
  1175. {
  1176. bool tmpval;
  1177. if (atoi(value) == 1)
  1178. tmpval = true;
  1179. else
  1180. tmpval = false;
  1181. if (confTherm.autoSaveHeatingMode != tmpval)
  1182. {
  1183. confTherm.autoSaveHeatingMode = tmpval;
  1184. confTherm_wasChanged = true;
  1185. }
  1186. }
  1187. else if (strcmp(param, "savetomqttret") == 0)
  1188. {
  1189. bool tmpval;
  1190. if (atoi(value) == 1)
  1191. tmpval = true;
  1192. else
  1193. tmpval = false;
  1194. if (confTherm.saveToMqttRetained != tmpval)
  1195. {
  1196. confTherm.saveToMqttRetained = tmpval;
  1197. confTherm_wasChanged = true;
  1198. if (tmpval == false)
  1199. {
  1200. publishDeleteRetainedSavedStates();
  1201. }
  1202. }
  1203. }
  1204. else if (strcmp(param, "tempmin") == 0)
  1205. {
  1206. float valueFloat = round(atof(value) * 2.0) / 2.0;
  1207. if (valueFloat != confTherm.setTempMin)
  1208. {
  1209. if (valueFloat >= 10 && valueFloat <= 16)
  1210. {
  1211. confTherm.setTempMin = valueFloat;
  1212. confTherm_wasChanged = true;
  1213. }
  1214. else {
  1215. sprintf_P(logBuf, PGMStr_conf_invalidValue, param);
  1216. sendLog(logBuf, LOGLEVEL_ERROR);
  1217. }
  1218. }
  1219. }
  1220. else if (strcmp(param, "tempmax") == 0)
  1221. {
  1222. float valueFloat = round(atof(value) * 2.0) / 2.0;
  1223. if (valueFloat != confTherm.setTempMax)
  1224. {
  1225. if (valueFloat >= 18 && valueFloat <= 30)
  1226. {
  1227. confTherm.setTempMax = valueFloat;
  1228. confTherm_wasChanged = true;
  1229. }
  1230. else {
  1231. sprintf_P(logBuf, PGMStr_conf_invalidValue, param);
  1232. sendLog(logBuf, LOGLEVEL_ERROR);
  1233. }
  1234. }
  1235. }
  1236. else if (strcmp(param, "pirendispps0") == 0)
  1237. {
  1238. bool tmpval;
  1239. if (atoi(value) == 1)
  1240. tmpval = true;
  1241. else
  1242. tmpval = false;
  1243. if (tmpval != confTherm.PIRenablesDisplay_preset0only)
  1244. {
  1245. confTherm.PIRenablesDisplay_preset0only = tmpval;
  1246. confTherm_wasChanged = true;
  1247. }
  1248. }
  1249. else if (strcmp(param, "togthdisp") == 0)
  1250. {
  1251. bool tmpval;
  1252. if (atoi(value) == 1)
  1253. tmpval = true;
  1254. else
  1255. tmpval = false;
  1256. if (tmpval != confTherm.togglingTempHumAIDisplay)
  1257. {
  1258. confTherm.togglingTempHumAIDisplay = tmpval;
  1259. confTherm_wasChanged = true;
  1260. }
  1261. }
  1262. // confThermAdv
  1263. else if (strcmp(param, "minofftime") == 0)
  1264. {
  1265. int valueInt = atoi(value);
  1266. if (valueInt != confTherm.heatingMinOffTime)
  1267. {
  1268. confTherm.heatingMinOffTime = valueInt;
  1269. confTherm_wasChanged = true;
  1270. }
  1271. }
  1272. else if (strcmp(param, "tempdec") == 0)
  1273. {
  1274. float valueFloat = atof(value);
  1275. if (valueFloat != confTherm.setTempDecreaseVal)
  1276. {
  1277. if (valueFloat >= 0.0 && valueFloat <= 1.5)
  1278. {
  1279. confTherm.setTempDecreaseVal = valueFloat;
  1280. confTherm_wasChanged = true;
  1281. }
  1282. else {
  1283. sprintf_P(logBuf, PGMStr_conf_invalidValue, param);
  1284. sendLog(logBuf, LOGLEVEL_ERROR);
  1285. }
  1286. }
  1287. }
  1288. else if (strcmp(param, "hyst") == 0)
  1289. {
  1290. float valueFloat = atof(value);
  1291. if (valueFloat != confTherm.hysteresis)
  1292. {
  1293. if (valueFloat >= 0.1 && valueFloat <= 4.0)
  1294. {
  1295. confTherm.hysteresis = valueFloat;
  1296. confTherm_wasChanged = true;
  1297. }
  1298. else {
  1299. sprintf_P(logBuf, PGMStr_conf_invalidValue, param);
  1300. sendLog(logBuf, LOGLEVEL_ERROR);
  1301. }
  1302. }
  1303. }
  1304. else if (strcmp(param, "offmsg") == 0)
  1305. {
  1306. if (strcmp(value, confTherm.offMessage) != 0)
  1307. {
  1308. if (strcmp(value, "0") == 0)
  1309. {
  1310. strlcpy(confTherm.offMessage, "", sizeof(confTherm.offMessage));
  1311. confTherm_wasChanged = true;
  1312. }
  1313. else
  1314. {
  1315. strlcpy(confTherm.offMessage, value, sizeof(confTherm.offMessage));
  1316. confTherm_wasChanged = true;
  1317. }
  1318. }
  1319. }
  1320. else if (strcmp(param, "modename0") == 0)
  1321. {
  1322. if (strcmp(value, confTherm.modeName0) != 0)
  1323. {
  1324. if (strcmp(value, "0") == 0)
  1325. {
  1326. strlcpy(confTherm.modeName0, "", sizeof(confTherm.modeName0));
  1327. confTherm_wasChanged = true;
  1328. }
  1329. else
  1330. {
  1331. strlcpy(confTherm.modeName0, value, sizeof(confTherm.modeName0));
  1332. confTherm_wasChanged = true;
  1333. }
  1334. }
  1335. }
  1336. else if (strcmp(param, "modename1") == 0)
  1337. {
  1338. if (strcmp(value, confTherm.modeName1) != 0)
  1339. {
  1340. if (strcmp(value, "0") == 0)
  1341. {
  1342. strlcpy(confTherm.modeName1, "", sizeof(confTherm.modeName1));
  1343. confTherm_wasChanged = true;
  1344. }
  1345. else
  1346. {
  1347. strlcpy(confTherm.modeName1, value, sizeof(confTherm.modeName1));
  1348. confTherm_wasChanged = true;
  1349. }
  1350. }
  1351. }
  1352. else if (strcmp(param, "psetname0") == 0)
  1353. {
  1354. if (strcmp(value, confTherm.psetName0) != 0)
  1355. {
  1356. if (strcmp(value, "0") == 0)
  1357. {
  1358. strlcpy(confTherm.psetName0, "", sizeof(confTherm.psetName0));
  1359. confTherm_wasChanged = true;
  1360. }
  1361. else
  1362. {
  1363. strlcpy(confTherm.psetName0, value, sizeof(confTherm.psetName0));
  1364. confTherm_wasChanged = true;
  1365. }
  1366. }
  1367. }
  1368. else if (strcmp(param, "psetname1") == 0)
  1369. {
  1370. if (strcmp(value, confTherm.psetName1) != 0)
  1371. {
  1372. if (strcmp(value, "0") == 0)
  1373. {
  1374. strlcpy(confTherm.psetName1, "", sizeof(confTherm.psetName1));
  1375. confTherm_wasChanged = true;
  1376. }
  1377. else
  1378. {
  1379. strlcpy(confTherm.psetName1, value, sizeof(confTherm.psetName1));
  1380. confTherm_wasChanged = true;
  1381. }
  1382. }
  1383. }
  1384. else if (strcmp(param, "psetname2") == 0)
  1385. {
  1386. if (strcmp(value, confTherm.psetName2) != 0)
  1387. {
  1388. if (strcmp(value, "0") == 0)
  1389. {
  1390. strlcpy(confTherm.psetName2, "", sizeof(confTherm.psetName2));
  1391. confTherm_wasChanged = true;
  1392. }
  1393. else
  1394. {
  1395. strlcpy(confTherm.psetName2, value, sizeof(confTherm.psetName2));
  1396. confTherm_wasChanged = true;
  1397. }
  1398. }
  1399. }
  1400. else if (strcmp(param, "itemplab") == 0)
  1401. {
  1402. if (strcmp(value, confTherm.iTempLabel) != 0)
  1403. {
  1404. if (strcmp(value, "0") == 0)
  1405. {
  1406. strlcpy(confTherm.iTempLabel, "I", sizeof(confTherm.iTempLabel));
  1407. confTherm_wasChanged = true;
  1408. }
  1409. else
  1410. {
  1411. strlcpy(confTherm.iTempLabel, value, sizeof(confTherm.iTempLabel));
  1412. confTherm_wasChanged = true;
  1413. }
  1414. }
  1415. }
  1416. else if (strcmp(param, "otemplab") == 0)
  1417. {
  1418. if (strcmp(value, confTherm.oTempLabel) != 0)
  1419. {
  1420. if (strcmp(value, "0") == 0)
  1421. {
  1422. strlcpy(confTherm.oTempLabel, "O", sizeof(confTherm.oTempLabel));
  1423. confTherm_wasChanged = true;
  1424. }
  1425. else
  1426. {
  1427. strlcpy(confTherm.oTempLabel, value, sizeof(confTherm.oTempLabel));
  1428. confTherm_wasChanged = true;
  1429. }
  1430. }
  1431. }
  1432. else if (strcmp(param, "pausetout") == 0)
  1433. {
  1434. int valueInt = atoi(value);
  1435. if (valueInt != confTherm.pauseTout)
  1436. {
  1437. if (valueInt >= 0 && valueInt <= 3600)
  1438. {
  1439. confTherm.pauseTout = valueInt;
  1440. confTherm_wasChanged = true;
  1441. }
  1442. else {
  1443. sprintf_P(logBuf, PGMStr_conf_invalidValue, param);
  1444. sendLog(logBuf, LOGLEVEL_ERROR);
  1445. }
  1446. }
  1447. }
  1448. // Thermostat values
  1449. else if (strcmp(param, "temp") == 0)
  1450. {
  1451. float valueFloat = round(atof(value) * 2.0) / 2.0;
  1452. thermostat_setTempTo(valueFloat);
  1453. }
  1454. else if (strcmp(param, "templow") == 0)
  1455. {
  1456. float valueFloat = round(atof(value) * 2.0) / 2.0;
  1457. thermostat_setTempLowTo(valueFloat);
  1458. }
  1459. else if (strcmp(param, "templow2") == 0)
  1460. {
  1461. float valueFloat = round(atof(value) * 2.0) / 2.0;
  1462. thermostat_setTempLow2To(valueFloat);
  1463. }
  1464. else if (strcmp(param, "mode") == 0)
  1465. {
  1466. int val = atoi(value);
  1467. if (val >= 0 && val <= 1)
  1468. {
  1469. thermostat_setHeatingmodeTo(val);
  1470. }
  1471. else {
  1472. sprintf_P(logBuf, PGMStr_conf_invalidValue, param);
  1473. sendLog(logBuf, LOGLEVEL_ERROR);
  1474. }
  1475. }
  1476. else if (strcmp(param, "preset") == 0)
  1477. {
  1478. int val = atoi(value);
  1479. if (val >= 0 && val <= 2)
  1480. {
  1481. thermostat_setPresetTo(val);
  1482. }
  1483. else {
  1484. sprintf_P(logBuf, PGMStr_conf_invalidValue, param);
  1485. sendLog(logBuf, LOGLEVEL_ERROR);
  1486. }
  1487. }
  1488. #endif // FIRMWARE_VARIANT_THERMOSTAT
  1489. // /THERMOSTAT
  1490. // HEAT CONTROL - confHeatc
  1491. #ifdef FIRMWARE_VARIANT_HEATCONTROL
  1492. else if (strcmp(param, "heatcm20") == 0)
  1493. {
  1494. int val = atoi(value);
  1495. if (val >= 0 && val <= 90)
  1496. {
  1497. confHeatc.heatCurve[0] = val;
  1498. confHeatc_wasChanged = true;
  1499. }
  1500. else {
  1501. sprintf_P(logBuf, PGMStr_conf_invalidValue, param);
  1502. sendLog(logBuf, LOGLEVEL_ERROR);
  1503. }
  1504. }
  1505. else if (strcmp(param, "heatcm15") == 0)
  1506. {
  1507. int val = atoi(value);
  1508. if (val >= 0 && val <= 90)
  1509. {
  1510. confHeatc.heatCurve[1] = val;
  1511. confHeatc_wasChanged = true;
  1512. }
  1513. else {
  1514. sprintf_P(logBuf, PGMStr_conf_invalidValue, param);
  1515. sendLog(logBuf, LOGLEVEL_ERROR);
  1516. }
  1517. }
  1518. else if (strcmp(param, "heatcm10") == 0)
  1519. {
  1520. int val = atoi(value);
  1521. if (val >= 0 && val <= 90)
  1522. {
  1523. confHeatc.heatCurve[2] = val;
  1524. confHeatc_wasChanged = true;
  1525. }
  1526. else {
  1527. sprintf_P(logBuf, PGMStr_conf_invalidValue, param);
  1528. sendLog(logBuf, LOGLEVEL_ERROR);
  1529. }
  1530. }
  1531. else if (strcmp(param, "heatcm5") == 0)
  1532. {
  1533. int val = atoi(value);
  1534. if (val >= 0 && val <= 90)
  1535. {
  1536. confHeatc.heatCurve[3] = val;
  1537. confHeatc_wasChanged = true;
  1538. }
  1539. else {
  1540. sprintf_P(logBuf, PGMStr_conf_invalidValue, param);
  1541. sendLog(logBuf, LOGLEVEL_ERROR);
  1542. }
  1543. }
  1544. else if (strcmp(param, "heatc0") == 0)
  1545. {
  1546. int val = atoi(value);
  1547. if (val >= 0 && val <= 90)
  1548. {
  1549. confHeatc.heatCurve[4] = val;
  1550. confHeatc_wasChanged = true;
  1551. }
  1552. else {
  1553. sprintf_P(logBuf, PGMStr_conf_invalidValue, param);
  1554. sendLog(logBuf, LOGLEVEL_ERROR);
  1555. }
  1556. }
  1557. else if (strcmp(param, "heatc5") == 0)
  1558. {
  1559. int val = atoi(value);
  1560. if (val >= 0 && val <= 90)
  1561. {
  1562. confHeatc.heatCurve[5] = val;
  1563. confHeatc_wasChanged = true;
  1564. }
  1565. else {
  1566. sprintf_P(logBuf, PGMStr_conf_invalidValue, param);
  1567. sendLog(logBuf, LOGLEVEL_ERROR);
  1568. }
  1569. }
  1570. else if (strcmp(param, "heatc10") == 0)
  1571. {
  1572. int val = atoi(value);
  1573. if (val >= 0 && val <= 90)
  1574. {
  1575. confHeatc.heatCurve[6] = val;
  1576. confHeatc_wasChanged = true;
  1577. }
  1578. else {
  1579. sprintf_P(logBuf, PGMStr_conf_invalidValue, param);
  1580. sendLog(logBuf, LOGLEVEL_ERROR);
  1581. }
  1582. }
  1583. else if (strcmp(param, "heatc15") == 0)
  1584. {
  1585. int val = atoi(value);
  1586. if (val >= 0 && val <= 90)
  1587. {
  1588. confHeatc.heatCurve[7] = val;
  1589. confHeatc_wasChanged = true;
  1590. }
  1591. else {
  1592. sprintf_P(logBuf, PGMStr_conf_invalidValue, param);
  1593. sendLog(logBuf, LOGLEVEL_ERROR);
  1594. }
  1595. }
  1596. else if (strcmp(param, "heatc20") == 0)
  1597. {
  1598. int val = atoi(value);
  1599. if (val >= 0 && val <= 90)
  1600. {
  1601. confHeatc.heatCurve[8] = val;
  1602. confHeatc_wasChanged = true;
  1603. }
  1604. else {
  1605. sprintf_P(logBuf, PGMStr_conf_invalidValue, param);
  1606. sendLog(logBuf, LOGLEVEL_ERROR);
  1607. }
  1608. }
  1609. else if (strcmp(param, "heatlm20") == 0)
  1610. {
  1611. int val = atoi(value);
  1612. if (val >= 0 && val <= 90)
  1613. {
  1614. confHeatc.heatLocktime[0] = val;
  1615. confHeatc_wasChanged = true;
  1616. }
  1617. else {
  1618. sprintf_P(logBuf, PGMStr_conf_invalidValue, param);
  1619. sendLog(logBuf, LOGLEVEL_ERROR);
  1620. }
  1621. }
  1622. else if (strcmp(param, "heatlm15") == 0)
  1623. {
  1624. int val = atoi(value);
  1625. if (val >= 0 && val <= 90)
  1626. {
  1627. confHeatc.heatLocktime[1] = val;
  1628. confHeatc_wasChanged = true;
  1629. }
  1630. else {
  1631. sprintf_P(logBuf, PGMStr_conf_invalidValue, param);
  1632. sendLog(logBuf, LOGLEVEL_ERROR);
  1633. }
  1634. }
  1635. else if (strcmp(param, "heatlm10") == 0)
  1636. {
  1637. int val = atoi(value);
  1638. if (val >= 0 && val <= 90)
  1639. {
  1640. confHeatc.heatLocktime[2] = val;
  1641. confHeatc_wasChanged = true;
  1642. }
  1643. else {
  1644. sprintf_P(logBuf, PGMStr_conf_invalidValue, param);
  1645. sendLog(logBuf, LOGLEVEL_ERROR);
  1646. }
  1647. }
  1648. else if (strcmp(param, "heatlm5") == 0)
  1649. {
  1650. int val = atoi(value);
  1651. if (val >= 0 && val <= 90)
  1652. {
  1653. confHeatc.heatLocktime[3] = val;
  1654. confHeatc_wasChanged = true;
  1655. }
  1656. else {
  1657. sprintf_P(logBuf, PGMStr_conf_invalidValue, param);
  1658. sendLog(logBuf, LOGLEVEL_ERROR);
  1659. }
  1660. }
  1661. else if (strcmp(param, "heatl0") == 0)
  1662. {
  1663. int val = atoi(value);
  1664. if (val >= 0 && val <= 90)
  1665. {
  1666. confHeatc.heatLocktime[4] = val;
  1667. confHeatc_wasChanged = true;
  1668. }
  1669. else {
  1670. sprintf_P(logBuf, PGMStr_conf_invalidValue, param);
  1671. sendLog(logBuf, LOGLEVEL_ERROR);
  1672. }
  1673. }
  1674. else if (strcmp(param, "heatl5") == 0)
  1675. {
  1676. int val = atoi(value);
  1677. if (val >= 0 && val <= 90)
  1678. {
  1679. confHeatc.heatLocktime[5] = val;
  1680. confHeatc_wasChanged = true;
  1681. }
  1682. else {
  1683. sprintf_P(logBuf, PGMStr_conf_invalidValue, param);
  1684. sendLog(logBuf, LOGLEVEL_ERROR);
  1685. }
  1686. }
  1687. else if (strcmp(param, "heatl10") == 0)
  1688. {
  1689. int val = atoi(value);
  1690. if (val >= 0 && val <= 90)
  1691. {
  1692. confHeatc.heatLocktime[6] = val;
  1693. confHeatc_wasChanged = true;
  1694. }
  1695. else {
  1696. sprintf_P(logBuf, PGMStr_conf_invalidValue, param);
  1697. sendLog(logBuf, LOGLEVEL_ERROR);
  1698. }
  1699. }
  1700. else if (strcmp(param, "heatl15") == 0)
  1701. {
  1702. int val = atoi(value);
  1703. if (val >= 0 && val <= 90)
  1704. {
  1705. confHeatc.heatLocktime[7] = val;
  1706. confHeatc_wasChanged = true;
  1707. }
  1708. else {
  1709. sprintf_P(logBuf, PGMStr_conf_invalidValue, param);
  1710. sendLog(logBuf, LOGLEVEL_ERROR);
  1711. }
  1712. }
  1713. else if (strcmp(param, "heatl20") == 0)
  1714. {
  1715. int val = atoi(value);
  1716. if (val >= 0 && val <= 90)
  1717. {
  1718. confHeatc.heatLocktime[8] = val;
  1719. confHeatc_wasChanged = true;
  1720. }
  1721. else {
  1722. sprintf_P(logBuf, PGMStr_conf_invalidValue, param);
  1723. sendLog(logBuf, LOGLEVEL_ERROR);
  1724. }
  1725. }
  1726. else if (strcmp(param, "heatusehc") == 0)
  1727. {
  1728. int val = atoi(value);
  1729. if (val >= 0 && val <= 1)
  1730. {
  1731. if (val == 1) confHeatc.useHeatCurve = true;
  1732. else confHeatc.useHeatCurve = false;
  1733. confHeatc_wasChanged = true;
  1734. }
  1735. else {
  1736. sprintf_P(logBuf, PGMStr_conf_invalidValue, param);
  1737. sendLog(logBuf, LOGLEVEL_ERROR);
  1738. }
  1739. }
  1740. else if (strcmp(param, "heatforcehc") == 0)
  1741. {
  1742. int val = atoi(value);
  1743. if (val >= 0 && val <= 1)
  1744. {
  1745. if (val == 1) confHeatc.forceHeatCurve = true;
  1746. else confHeatc.forceHeatCurve = false;
  1747. confHeatc_wasChanged = true;
  1748. }
  1749. else {
  1750. sprintf_P(logBuf, PGMStr_conf_invalidValue, param);
  1751. sendLog(logBuf, LOGLEVEL_ERROR);
  1752. }
  1753. }
  1754. else if (strcmp(param, "heatcvhy1") == 0)
  1755. {
  1756. int val = atoi(value);
  1757. if (val >= 0 && val <= 10)
  1758. {
  1759. confHeatc.hystereseOn = val;
  1760. confHeatc_wasChanged = true;
  1761. }
  1762. else {
  1763. sprintf_P(logBuf, PGMStr_conf_invalidValue, param);
  1764. sendLog(logBuf, LOGLEVEL_ERROR);
  1765. }
  1766. }
  1767. else if (strcmp(param, "heatcvhy0") == 0)
  1768. {
  1769. int val = atoi(value);
  1770. if (val >= 0 && val <= 16)
  1771. {
  1772. confHeatc.hystereseOff = val;
  1773. confHeatc_wasChanged = true;
  1774. }
  1775. else {
  1776. sprintf_P(logBuf, PGMStr_conf_invalidValue, param);
  1777. sendLog(logBuf, LOGLEVEL_ERROR);
  1778. }
  1779. }
  1780. else if (strcmp(param, "pumpnl") == 0)
  1781. {
  1782. int val = atoi(value);
  1783. if (val >= 0 && val <= 90)
  1784. {
  1785. confHeatc.pumpBacklash = val;
  1786. confHeatc_wasChanged = true;
  1787. }
  1788. else {
  1789. sprintf_P(logBuf, PGMStr_conf_invalidValue, param);
  1790. sendLog(logBuf, LOGLEVEL_ERROR);
  1791. }
  1792. }
  1793. else if (strcmp(param, "heattempfeedlimit") == 0)
  1794. {
  1795. int val = atoi(value);
  1796. if (val >= 50 && val <= 90)
  1797. {
  1798. confHeatc.tempFeedLimit = val;
  1799. confHeatc_wasChanged = true;
  1800. }
  1801. else {
  1802. sprintf_P(logBuf, PGMStr_conf_invalidValue, param);
  1803. sendLog(logBuf, LOGLEVEL_ERROR);
  1804. }
  1805. }
  1806. else if (strcmp(param, "heatouttdis") == 0)
  1807. {
  1808. int val = atoi(value);
  1809. if (val >= 16 && val <= 26)
  1810. {
  1811. confHeatc.disableAboveTOut = val;
  1812. confHeatc_wasChanged = true;
  1813. }
  1814. else {
  1815. sprintf_P(logBuf, PGMStr_conf_invalidValue, param);
  1816. sendLog(logBuf, LOGLEVEL_ERROR);
  1817. }
  1818. }
  1819. else if (strcmp(param, "heatforcehcalsoon") == 0)
  1820. {
  1821. int val = atoi(value);
  1822. if (val >= 0 && val <= 1)
  1823. {
  1824. if (val == 1) confHeatc.forceHeatCurveAlsoForSwitchOn = true;
  1825. else confHeatc.forceHeatCurveAlsoForSwitchOn = false;
  1826. confHeatc_wasChanged = true;
  1827. }
  1828. else {
  1829. sprintf_P(logBuf, PGMStr_conf_invalidValue, param);
  1830. sendLog(logBuf, LOGLEVEL_ERROR);
  1831. }
  1832. }
  1833. else if (strcmp(param, "pumpforceint") == 0)
  1834. {
  1835. int val = atoi(value);
  1836. if (val >= 0 && val <= 255)
  1837. {
  1838. confHeatc.pump_forceRunInterval = val;
  1839. confHeatc_wasChanged = true;
  1840. }
  1841. else {
  1842. sprintf_P(logBuf, PGMStr_conf_invalidValue, param);
  1843. sendLog(logBuf, LOGLEVEL_ERROR);
  1844. }
  1845. }
  1846. else if (strcmp(param, "pumpforcetime") == 0)
  1847. {
  1848. int val = atoi(value);
  1849. if (val >= 1 && val <= 15)
  1850. {
  1851. confHeatc.pumpTime_forceRun = val;
  1852. confHeatc_wasChanged = true;
  1853. }
  1854. else {
  1855. sprintf_P(logBuf, PGMStr_conf_invalidValue, param);
  1856. sendLog(logBuf, LOGLEVEL_ERROR);
  1857. }
  1858. }
  1859. else if (strcmp(param, "pumpforcebegin") == 0)
  1860. {
  1861. int val = atoi(value);
  1862. if (val >= 0 && val <= 23)
  1863. {
  1864. confHeatc.pump_forceRunTimeBegin = val;
  1865. confHeatc_wasChanged = true;
  1866. }
  1867. else {
  1868. sprintf_P(logBuf, PGMStr_conf_invalidValue, param);
  1869. sendLog(logBuf, LOGLEVEL_ERROR);
  1870. }
  1871. }
  1872. else if (strcmp(param, "pumpforceend") == 0)
  1873. {
  1874. int val = atoi(value);
  1875. if (val >= 0 && val <= 24)
  1876. {
  1877. confHeatc.pump_forceRunTimeEnd = val;
  1878. confHeatc_wasChanged = true;
  1879. }
  1880. else {
  1881. sprintf_P(logBuf, PGMStr_conf_invalidValue, param);
  1882. sendLog(logBuf, LOGLEVEL_ERROR);
  1883. }
  1884. }
  1885. #endif //FIRMWARE_VARIANT_HEATCONTROL
  1886. else {
  1887. snprintf_P(logBuf, LOG_BUFFER_SIZE, PGMStr_conf_setConf_unknownParamName, param);
  1888. sendLog(logBuf);
  1889. }
  1890. //getConfig(param);
  1891. if (confCheckUnsaved())
  1892. {
  1893. lastConfigChange = millis();
  1894. lastConfigChangeNoteAlreadyDone = false;
  1895. }
  1896. } // setConfig()