config.ino 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477
  1. void deleteConfig()
  2. {
  3. snprintf_P(logBuf, LOG_BUFFER_SIZE, PGMStr_conf_deleting);
  4. sendLog(logBuf);
  5. FS_format();
  6. delay(100);
  7. ESP.restart();
  8. }
  9. void loadConf_all()
  10. {
  11. snprintf_P(logBuf, LOG_BUFFER_SIZE, PGMStr_conf_loading);
  12. sendLog(logBuf);
  13. loadConf_Secrets();
  14. loadConf_DevWiFi();
  15. loadConf_Web();
  16. loadConf_Mqtt();
  17. #ifdef FIRMWARE_VARIANT_THERMOSTAT
  18. loadConf_Therm();
  19. #endif
  20. #ifdef FIRMWARE_VARIANT_HEATCONTROL
  21. loadConf_Heatc();
  22. #endif
  23. loadConf_Add();
  24. #ifdef ENABLE_FEATURE_NTP_TIME
  25. loadConf_Time();
  26. #endif
  27. loadConf_Log();
  28. loadConf_Sens();
  29. snprintf_P(logBuf, LOG_BUFFER_SIZE, PGMStr_conf_loading_done);
  30. sendLog(logBuf);
  31. }
  32. bool conf_getDebugMode()
  33. {
  34. uint8_t _data;
  35. EEPROM.begin(EEPROM_SIZE);
  36. _data = EEPROM.read(EEPROM_ADDR_DEBUGMODE);
  37. EEPROM.end();
  38. if(_data == 1) return true;
  39. else return false;
  40. }
  41. void conf_restoreDebugMode()
  42. {
  43. if(conf_getDebugMode()) debug = true;
  44. else debug = false;
  45. }
  46. void conf_setDebugMode()
  47. {
  48. EEPROM.begin(EEPROM_SIZE);
  49. EEPROM.write(EEPROM_ADDR_DEBUGMODE, 1);
  50. EEPROM.commit();
  51. EEPROM.end();
  52. debug = true;
  53. }
  54. void conf_clearDebugMode()
  55. {
  56. EEPROM.begin(EEPROM_SIZE);
  57. EEPROM.write(EEPROM_ADDR_DEBUGMODE, 0);
  58. EEPROM.commit();
  59. EEPROM.end();
  60. debug = false;
  61. }
  62. void saveConfig_all() {
  63. saveConfig_all(false);
  64. }
  65. void saveConfig_all(bool _force)
  66. {
  67. if(confCheckUnsaved() || _force) {
  68. snprintf_P(logBuf, LOG_BUFFER_SIZE, PGMStr_conf_saving);
  69. sendLog(logBuf);
  70. saveConf_Secrets(_force);
  71. yield();
  72. saveConf_DevWiFi(_force);
  73. yield();
  74. saveConf_Web(_force);
  75. yield();
  76. saveConf_Mqtt(_force);
  77. yield();
  78. #ifdef FIRMWARE_VARIANT_THERMOSTAT
  79. saveConf_Therm(_force);
  80. yield();
  81. #endif
  82. #ifdef FIRMWARE_VARIANT_HEATCONTROL
  83. saveConf_Heatc(_force);
  84. yield();
  85. #endif
  86. saveConf_Add(_force);
  87. yield();
  88. #ifdef ENABLE_FEATURE_NTP_TIME
  89. saveConf_Time(_force);
  90. yield();
  91. #endif
  92. saveConf_Log(_force);
  93. yield();
  94. saveConf_Sens(_force);
  95. yield();
  96. snprintf_P(logBuf, LOG_BUFFER_SIZE, PGMStr_conf_saveToFS_done);
  97. sendLog(logBuf);
  98. }
  99. else {
  100. snprintf_P(logBuf, LOG_BUFFER_SIZE, PGMStr_conf_save_nothingChanged);
  101. sendLog(logBuf);
  102. }
  103. }
  104. void loadConf_defaults()
  105. {
  106. // set initial deviceName
  107. createDeviceName();
  108. // confDevWiFi
  109. // strlcpy(deviceName, DEVICE_NAME, sizeof(deviceName)); // now done via createDeviceName()
  110. strlcpy(confDevWiFi.hostName, confDevWiFi.deviceName, sizeof(confDevWiFi.hostName)); // copy deviceName to hostName as initial value
  111. strlcpy(confSecrets.WiFiAPModePassword, DEFAULT_WIFI_APMODE_PASSWORD, sizeof(confSecrets.WiFiAPModePassword));
  112. confDevWiFi.WiFiAPModeTimeout = DEFAULT_WIFI_APMODE_TIMEOUT;
  113. confDevWiFi.WiFiRetryInterval = DEFAULT_WIFI_RETRY_INTERVAL;
  114. confDevWiFi.WiFiConnCheckInterval = DEFAULT_WIFI_CONNCHECK_INTERVAL;
  115. confDevWiFi.WiFiRebootOnNoConnect = DEFAULT_WIFI_REBOOT_ONNOCONNECT;
  116. confDevWiFi_wasChanged = false;
  117. // confWeb
  118. strlcpy(confSecrets.http_token, HTTP_SET_TOKEN, sizeof(confSecrets.http_token));
  119. strlcpy(confSecrets.http_user, DEFAULT_HTTP_USER, sizeof(confSecrets.http_user));
  120. strlcpy(confSecrets.http_pass, DEFAULT_HTTP_PASS, sizeof(confSecrets.http_pass));
  121. confWeb.http_user_auth = DEFAULT_HTTP_USER_AUTH;
  122. confWeb_wasChanged = false;
  123. // confMqtt
  124. confMqtt.mqtt_enable = MQTT_ENABLE;
  125. strlcpy(confMqtt.mqtt_server, MQTT_SERVER, sizeof(confMqtt.mqtt_server));
  126. confMqtt.mqtt_port = MQTT_PORT;
  127. strlcpy(confSecrets.mqtt_user, MQTT_USER, sizeof(confSecrets.mqtt_user));
  128. strlcpy(confSecrets.mqtt_pass, MQTT_PASS, sizeof(confSecrets.mqtt_pass));
  129. strlcpy(confMqtt.mqtt_topic_in, MQTT_TOPIC_IN, sizeof(confMqtt.mqtt_topic_in));
  130. strlcpy(confMqtt.mqtt_topic_out, MQTT_TOPIC_OUT, sizeof(confMqtt.mqtt_topic_out));
  131. strlcpy(confMqtt.mqtt_willTopic, MQTT_WILLTOPIC, sizeof(confMqtt.mqtt_willTopic));
  132. confMqtt.mqtt_willQos = MQTT_WILLQOS;
  133. confMqtt.mqtt_willRetain = MQTT_WILLRETAIN;
  134. strlcpy(confMqtt.mqtt_willMsg, MQTT_WILLMSG, sizeof(confMqtt.mqtt_willMsg));
  135. strlcpy(confMqtt.mqtt_connMsg, MQTT_CONNMSG, sizeof(confMqtt.mqtt_connMsg));
  136. confMqtt.mqtt_outRetain = MQTT_OUT_RETAIN;
  137. confMqtt.mqtt_outRetain_sensors = MQTT_OUT_RETAIN_SENSORS;
  138. confMqtt.mqtt_enable_heartbeat = MQTT_ENABLE_HEARTBEAT;
  139. confMqtt.mqtt_heartbeat_maxage_reconnect = MQTT_HEARTBEAT_MAXAGE;
  140. confMqtt.mqtt_heartbeat_maxage_reboot = MQTT_HEARTBEAT_MAXAGE_REBOOT;
  141. confMqtt_wasChanged = false;
  142. // confAdd
  143. strlcpy(confAdd.mqtt_topic_pir, MQTT_TOPIC_PIR, sizeof(confAdd.mqtt_topic_pir));
  144. strlcpy(confAdd.mqtt_payload_pir_on, MQTT_TOPIC_PIR_ON, sizeof(confAdd.mqtt_payload_pir_on));
  145. strlcpy(confAdd.mqtt_payload_pir_off, MQTT_TOPIC_PIR_OFF, sizeof(confAdd.mqtt_payload_pir_off));
  146. strlcpy(confAdd.outTemp_topic_in, OUTTEMP_TOPIC_IN, sizeof(confAdd.outTemp_topic_in));
  147. strlcpy(confAdd.outHum_topic_in, OUTHUM_TOPIC_IN, sizeof(confAdd.outHum_topic_in));
  148. confAdd_wasChanged = false;
  149. // confTime
  150. #ifdef ENABLE_FEATURE_NTP_TIME
  151. confTime.ntpEnable = DEFAULT_NTP_ENABLED;
  152. strlcpy(confTime.timeZoneStr, DEFAULT_TIMEZONE, sizeof(confTime.timeZoneStr));
  153. strlcpy(confTime.ntpServer1, DEFAULT_NTP_SERVER, sizeof(confTime.ntpServer1));
  154. confTime.ntpSyncInterval = DEFAULT_NTP_SYNC_INTERVAL;
  155. confTime_wasChanged = false;
  156. #endif
  157. // confLog
  158. confLog.logLevelSerial = DEFAULT_LOGLEVEL_SERIAL;
  159. confLog.logLevelWeb = DEFAULT_LOGLEVEL_WEB;
  160. confLog.logLevelMqtt = DEFAULT_LOGLEVEL_MQTT;
  161. confLog.logLevelSyslog = DEFAULT_LOGLEVEL_SYSLOG;
  162. confLog_wasChanged = false;
  163. // confSens
  164. confSens.measureInterval = DEFAULT_MEASURE_INTERVAL;
  165. // confDisplay
  166. confDisplay.displayInterval = DEFAULT_DISPLAY_INTERVAL;
  167. confDisplay.displayTimeout = DEFAULT_DISPLAY_TIMEOUT;
  168. confDisplay.PIRenablesDisplay = DEFAULT_PIR_ENABLES_DISPLAY;
  169. #ifdef FIRMWARE_VARIANT_THERMOSTAT
  170. // confBas
  171. confTherm.setTempMin = DEFAULT_SETTEMP_MIN;
  172. confTherm.setTempMax = DEFAULT_SETTEMP_MAX;
  173. confTherm.autoSaveSetTemp = AUTOSAVE_SETTEMP;
  174. confTherm.autoSaveHeatingMode = AUTOSAVE_SETMODE;
  175. confTherm.saveToMqttRetained = SAVE_TO_MQTT_RETAINED;
  176. confTherm.PIRenablesDisplay_preset0only = DEFAULT_PIR_ENABLES_DISPLAY_PRESET0_ONLY;
  177. confTherm.togglingTempHumAIDisplay = DEFAULT_TOGGLING_I_O_TEMPHUM;
  178. confTherm.hysteresis = DEFAULT_HYSTERESIS;
  179. confTherm.heatingMinOffTime = DEFAULT_HEATING_MIN_OFFTIME;
  180. confTherm.setTempDecreaseVal = SETTEMP_DECREASE_VALUE;
  181. strlcpy(confTherm.offMessage, OFF_MESSAGE, sizeof(confTherm.offMessage));
  182. strlcpy(confTherm.iTempLabel, INSIDE_TEMP_LABEL, sizeof(confTherm.iTempLabel));
  183. strlcpy(confTherm.oTempLabel, OUTSIDE_TEMP_LABEL, sizeof(confTherm.oTempLabel));
  184. strlcpy(confTherm.modeName0, MODE_NAME_0, sizeof(confTherm.modeName0));
  185. strlcpy(confTherm.modeName1, MODE_NAME_1, sizeof(confTherm.modeName1));
  186. strlcpy(confTherm.psetName0, PRESET_NAME_0, sizeof(confTherm.psetName0));
  187. strlcpy(confTherm.psetName1, PRESET_NAME_1, sizeof(confTherm.psetName1));
  188. strlcpy(confTherm.psetName2, PRESET_NAME_2, sizeof(confTherm.psetName2));
  189. confTherm.pauseTout = 1800;
  190. confTherm_wasChanged = false;
  191. #endif
  192. }
  193. void loadConf_restoreDefaultWhenMissing()
  194. {
  195. if (strlen(confDevWiFi.deviceName) < 4)
  196. createDeviceName();
  197. if (strlen(confDevWiFi.hostName) < 4)
  198. strlcpy(confDevWiFi.hostName, confDevWiFi.deviceName, sizeof(confDevWiFi.hostName));
  199. #ifdef FIRMWARE_VARIANT_THERMOSTAT
  200. if (confTherm.modeName0[0] == '\0')
  201. strlcpy(confTherm.modeName0, MODE_NAME_0, sizeof(confTherm.modeName0));
  202. if (confTherm.modeName1[0] == '\0')
  203. strlcpy(confTherm.modeName1, MODE_NAME_1, sizeof(confTherm.modeName1));
  204. if (confTherm.psetName0[0] == '\0')
  205. strlcpy(confTherm.psetName0, PRESET_NAME_0, sizeof(confTherm.psetName0));
  206. if (confTherm.psetName1[0] == '\0')
  207. strlcpy(confTherm.psetName1, PRESET_NAME_1, sizeof(confTherm.psetName1));
  208. if (confTherm.psetName2[0] == '\0')
  209. strlcpy(confTherm.psetName2, PRESET_NAME_2, sizeof(confTherm.psetName2));
  210. if (confTherm.iTempLabel[0] == '\0')
  211. strlcpy(confTherm.iTempLabel, INSIDE_TEMP_LABEL, sizeof(confTherm.iTempLabel));
  212. if (confTherm.oTempLabel[0] == '\0')
  213. strlcpy(confTherm.oTempLabel, OUTSIDE_TEMP_LABEL, sizeof(confTherm.oTempLabel));
  214. #endif
  215. //confTherm.tempCorrVal = TEMPSENSOR_CORRECTION_VALUE;
  216. //confTherm.humCorrVal = HUMSENSOR_CORRECTION_VALUE;
  217. if (confDevWiFi.WiFiConnCheckInterval == 0)
  218. confDevWiFi.WiFiConnCheckInterval = DEFAULT_WIFI_CONNCHECK_INTERVAL;
  219. //NTP
  220. #ifdef ENABLE_FEATURE_NTP_TIME
  221. if (confTime.ntpEnable && strlen(confTime.ntpServer1) == 0)
  222. strlcpy(confTime.ntpServer1, DEFAULT_NTP_SERVER, sizeof(confTime.ntpServer1));
  223. if (confTime.ntpEnable && strlen(confTime.timeZoneStr) == 0)
  224. strlcpy(confTime.timeZoneStr, DEFAULT_TIMEZONE, sizeof(confTime.timeZoneStr));
  225. #endif
  226. }
  227. void conf_clearSecrets() {
  228. #ifdef STORE_SECRETS_IN_EEPROM
  229. clearSecrets_EEPROM();
  230. #else
  231. confClearCredentials();
  232. confClearWiFiCredentials();
  233. #endif
  234. }
  235. void confClearCredentials()
  236. {
  237. strcpy(confSecrets.http_token, "");
  238. strcpy(confSecrets.http_pass, "");
  239. strcpy(confSecrets.http_pass1, "");
  240. strcpy(confSecrets.http_pass2, "");
  241. strcpy(confSecrets.mqtt_pass, "");
  242. //saveConf_Web();
  243. //saveConf_Mqtt();
  244. saveConf_Secrets();
  245. snprintf_P(logBuf, LOG_BUFFER_SIZE, PGMStr_conf_clearedCreds);
  246. sendLog(logBuf);
  247. }
  248. void confClearWiFiCredentials()
  249. {
  250. strcpy(confSecrets.WiFiPW1, "");
  251. strcpy(confSecrets.WiFiPW2, "");
  252. strcpy(confSecrets.WiFiAPModePassword, "");
  253. //saveConf_DevWiFi();
  254. saveConf_Secrets();
  255. snprintf_P(logBuf, LOG_BUFFER_SIZE, PGMStr_conf_clearedWifiCreds);
  256. sendLog(logBuf);
  257. }
  258. #ifdef ENABLE_FEATURE_SECRETS_ENCRYPTION
  259. bool confCheckEncrypted()
  260. {
  261. #ifdef STORE_SECRETS_IN_EEPROM
  262. uint8_t _data;
  263. EEPROM.begin(EEPROM_SIZE);
  264. _data = EEPROM.read(EEPROM_ADDR_SECRETS_ENCRYPTED);
  265. EEPROM.end();
  266. if(_data == 1) confEncryptionEnabled = true;
  267. else confEncryptionEnabled = false;
  268. #else
  269. if (LittleFS.exists("/isEncrypted"))
  270. {
  271. confEncryptionEnabled = true;
  272. }
  273. else
  274. {
  275. confEncryptionEnabled = false;
  276. }
  277. #endif
  278. if(confEncryptionEnabled) {
  279. snprintf_P(logBuf, LOG_BUFFER_SIZE, PGMStr_conf_secretsEncrypted);
  280. sendLog(logBuf);
  281. return true;
  282. }
  283. else {
  284. if(debug > 0) {
  285. snprintf_P(logBuf, LOG_BUFFER_SIZE, PGMStr_conf_secretsNotEncrypted);
  286. sendLog(logBuf);
  287. }
  288. return false;
  289. }
  290. }
  291. void confEncrypt(){
  292. confEncrypt(false);
  293. }
  294. void confEncrypt(bool _force)
  295. {
  296. if (!confCheckEncrypted() || _force)
  297. {
  298. snprintf_P(logBuf, LOG_BUFFER_SIZE, PGMStr_conf_encryptingSecrets);
  299. sendLog(logBuf);
  300. confEncryptionEnabled = true;
  301. saveConf_Secrets(true);
  302. #ifdef STORE_SECRETS_IN_EEPROM
  303. EEPROM.begin(EEPROM_SIZE);
  304. EEPROM.write(EEPROM_ADDR_SECRETS_ENCRYPTED, 1);
  305. EEPROM.commit();
  306. EEPROM.end();
  307. #else
  308. File configFile = LittleFS.open("/isEncrypted", "w");
  309. configFile.close();
  310. #endif
  311. snprintf_P(logBuf, LOG_BUFFER_SIZE, PGMStr_conf_encryptingSecretsDone);
  312. sendLog(logBuf);
  313. }
  314. else
  315. {
  316. snprintf_P(logBuf, LOG_BUFFER_SIZE, PGMStr_conf_alreadyEncrypted);
  317. sendLog(logBuf);
  318. }
  319. }
  320. void confEncryptOff()
  321. {
  322. if (confCheckEncrypted())
  323. {
  324. snprintf_P(logBuf, LOG_BUFFER_SIZE, PGMStr_conf_encryptionOff);
  325. sendLog(logBuf);
  326. confEncryptionEnabled = false;
  327. //confClearCredentials();
  328. //confClearWiFiCredentials();
  329. conf_clearSecrets();
  330. #ifdef STORE_SECRETS_IN_EEPROM
  331. EEPROM.begin(EEPROM_SIZE);
  332. EEPROM.write(EEPROM_ADDR_SECRETS_ENCRYPTED, 0);
  333. EEPROM.commit();
  334. EEPROM.end();
  335. #else
  336. LittleFS.remove("/isEncrypted");
  337. #endif
  338. snprintf_P(logBuf, LOG_BUFFER_SIZE, PGMStr_conf_encryptionOffDone);
  339. sendLog(logBuf);
  340. }
  341. else
  342. {
  343. snprintf_P(logBuf, LOG_BUFFER_SIZE, PGMStr_conf_secretsNotEncrypted);
  344. sendLog(logBuf);
  345. }
  346. }
  347. #endif
  348. bool confCheckUnsaved()
  349. {
  350. bool confChanged = false;
  351. if (confSecrets_wasChanged) confChanged = true;
  352. if (confDevWiFi_wasChanged) confChanged = true;
  353. if (confWeb_wasChanged) confChanged = true;
  354. if (confMqtt_wasChanged) confChanged = true;
  355. if (confAdd_wasChanged) confChanged = true;
  356. if (confTime_wasChanged) confChanged = true;
  357. if (confLog_wasChanged) confChanged = true;
  358. if (confSens_wasChanged) confChanged = true;
  359. #ifdef FIRMWARE_VARIANT_THERMOSTAT
  360. if (confTherm_wasChanged) confChanged = true;
  361. #endif
  362. return confChanged;
  363. }
  364. void conf_confChangedLogNote(bool force = false)
  365. {
  366. if (confCheckUnsaved() && (force || (!lastConfigChangeNoteAlreadyDone && (millis() - lastConfigChange) > 5000)))
  367. {
  368. snprintf_P(logBuf, LOG_BUFFER_SIZE, PGMStr_conf_pendingConfChanges);
  369. sendLog(logBuf);
  370. confMqttConnResetRequiredLogNote();
  371. confRestartRequiredLogNote();
  372. lastConfigChangeNoteAlreadyDone = true;
  373. }
  374. if(force) {
  375. confMqttConnResetRequiredLogNote();
  376. confRestartRequiredLogNote();
  377. }
  378. }
  379. void confRestartRequiredLogNote()
  380. {
  381. if (configChangedRestartRequired)
  382. snprintf_P(logBuf, LOG_BUFFER_SIZE, PGMStr_conf_restartRequired);
  383. sendLog(logBuf);
  384. }
  385. void confMqttConnResetRequiredLogNote()
  386. {
  387. if (configChangedMqttConnResetRequired)
  388. snprintf_P(logBuf, LOG_BUFFER_SIZE, PGMStr_conf_mqttReconnectRequired);
  389. sendLog(logBuf);
  390. }