settings.ino 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873
  1. /*
  2. settings.ino - user settings for Sonoff-Tasmota
  3. Copyright (C) 2018 Theo Arends
  4. This program is free software: you can redistribute it and/or modify
  5. it under the terms of the GNU General Public License as published by
  6. the Free Software Foundation, either version 3 of the License, or
  7. (at your option) any later version.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. GNU General Public License for more details.
  12. You should have received a copy of the GNU General Public License
  13. along with this program. If not, see <http://www.gnu.org/licenses/>.
  14. */
  15. #ifndef DOMOTICZ_UPDATE_TIMER
  16. #define DOMOTICZ_UPDATE_TIMER 0 // [DomoticzUpdateTimer] Send relay status (0 = disable, 1 - 3600 seconds) (Optional)
  17. #endif
  18. #ifndef EMULATION
  19. #define EMULATION EMUL_NONE // [Emulation] Select Belkin WeMo (single relay/light) or Hue Bridge emulation (multi relay/light) (EMUL_NONE, EMUL_WEMO or EMUL_HUE)
  20. #endif
  21. #ifndef MTX_ADDRESS1 // Add Display Support for up to eigth Matrices
  22. #define MTX_ADDRESS1 0
  23. #endif
  24. #ifndef MTX_ADDRESS2
  25. #define MTX_ADDRESS2 0
  26. #endif
  27. #ifndef MTX_ADDRESS3
  28. #define MTX_ADDRESS3 0
  29. #endif
  30. #ifndef MTX_ADDRESS4
  31. #define MTX_ADDRESS4 0
  32. #endif
  33. #ifndef MTX_ADDRESS5
  34. #define MTX_ADDRESS5 0
  35. #endif
  36. #ifndef MTX_ADDRESS6
  37. #define MTX_ADDRESS6 0
  38. #endif
  39. #ifndef MTX_ADDRESS7
  40. #define MTX_ADDRESS7 0
  41. #endif
  42. #ifndef MTX_ADDRESS8
  43. #define MTX_ADDRESS8 0
  44. #endif
  45. #ifndef HOME_ASSISTANT_DISCOVERY_ENABLE
  46. #define HOME_ASSISTANT_DISCOVERY_ENABLE 0
  47. #endif
  48. #ifndef LATITUDE
  49. #define LATITUDE 48.858360 // [Latitude] Your location to be used with sunrise and sunset
  50. #endif
  51. #ifndef LONGITUDE
  52. #define LONGITUDE 2.294442 // [Longitude] Your location to be used with sunrise and sunset
  53. #endif
  54. /*********************************************************************************************\
  55. * RTC memory
  56. \*********************************************************************************************/
  57. #define RTC_MEM_VALID 0xA55A
  58. uint32_t rtc_settings_crc = 0;
  59. uint32_t GetRtcSettingsCrc(void)
  60. {
  61. uint32_t crc = 0;
  62. uint8_t *bytes = (uint8_t*)&RtcSettings;
  63. for (uint16_t i = 0; i < sizeof(RTCMEM); i++) {
  64. crc += bytes[i]*(i+1);
  65. }
  66. return crc;
  67. }
  68. void RtcSettingsSave(void)
  69. {
  70. if (GetRtcSettingsCrc() != rtc_settings_crc) {
  71. RtcSettings.valid = RTC_MEM_VALID;
  72. ESP.rtcUserMemoryWrite(100, (uint32_t*)&RtcSettings, sizeof(RTCMEM));
  73. rtc_settings_crc = GetRtcSettingsCrc();
  74. }
  75. }
  76. void RtcSettingsLoad(void)
  77. {
  78. ESP.rtcUserMemoryRead(100, (uint32_t*)&RtcSettings, sizeof(RTCMEM)); // 0x290
  79. if (RtcSettings.valid != RTC_MEM_VALID) {
  80. memset(&RtcSettings, 0, sizeof(RTCMEM));
  81. RtcSettings.valid = RTC_MEM_VALID;
  82. RtcSettings.energy_kWhtoday = Settings.energy_kWhtoday;
  83. RtcSettings.energy_kWhtotal = Settings.energy_kWhtotal;
  84. for (byte i = 0; i < MAX_COUNTERS; i++) {
  85. RtcSettings.pulse_counter[i] = Settings.pulse_counter[i];
  86. }
  87. RtcSettings.power = Settings.power;
  88. RtcSettingsSave();
  89. }
  90. rtc_settings_crc = GetRtcSettingsCrc();
  91. }
  92. boolean RtcSettingsValid(void)
  93. {
  94. return (RTC_MEM_VALID == RtcSettings.valid);
  95. }
  96. /********************************************************************************************/
  97. uint32_t rtc_reboot_crc = 0;
  98. uint32_t GetRtcRebootCrc(void)
  99. {
  100. uint32_t crc = 0;
  101. uint8_t *bytes = (uint8_t*)&RtcReboot;
  102. for (uint16_t i = 0; i < sizeof(RTCRBT); i++) {
  103. crc += bytes[i]*(i+1);
  104. }
  105. return crc;
  106. }
  107. void RtcRebootSave(void)
  108. {
  109. if (GetRtcRebootCrc() != rtc_reboot_crc) {
  110. RtcReboot.valid = RTC_MEM_VALID;
  111. ESP.rtcUserMemoryWrite(100 - sizeof(RTCRBT), (uint32_t*)&RtcReboot, sizeof(RTCRBT));
  112. rtc_reboot_crc = GetRtcRebootCrc();
  113. }
  114. }
  115. void RtcRebootLoad(void)
  116. {
  117. ESP.rtcUserMemoryRead(100 - sizeof(RTCRBT), (uint32_t*)&RtcReboot, sizeof(RTCRBT)); // 0x280
  118. if (RtcReboot.valid != RTC_MEM_VALID) {
  119. memset(&RtcReboot, 0, sizeof(RTCRBT));
  120. RtcReboot.valid = RTC_MEM_VALID;
  121. // RtcReboot.fast_reboot_count = 0; // Explicit by memset
  122. RtcRebootSave();
  123. }
  124. rtc_reboot_crc = GetRtcRebootCrc();
  125. }
  126. boolean RtcRebootValid(void)
  127. {
  128. return (RTC_MEM_VALID == RtcReboot.valid);
  129. }
  130. /*********************************************************************************************\
  131. * Config - Flash
  132. \*********************************************************************************************/
  133. extern "C" {
  134. #include "spi_flash.h"
  135. }
  136. #include "eboot_command.h"
  137. extern "C" uint32_t _SPIFFS_end;
  138. // From libraries/EEPROM/EEPROM.cpp EEPROMClass
  139. #define SPIFFS_END ((uint32_t)&_SPIFFS_end - 0x40200000) / SPI_FLASH_SEC_SIZE
  140. // Version 4.2 config = eeprom area
  141. #define SETTINGS_LOCATION SPIFFS_END // No need for SPIFFS as it uses EEPROM area
  142. // Version 5.2 allow for more flash space
  143. #define CFG_ROTATES 8 // Number of flash sectors used (handles uploads)
  144. uint16_t settings_crc = 0;
  145. uint32_t settings_location = SETTINGS_LOCATION;
  146. uint8_t *settings_buffer = NULL;
  147. /********************************************************************************************/
  148. /*
  149. * Based on cores/esp8266/Updater.cpp
  150. */
  151. void SetFlashModeDout(void)
  152. {
  153. uint8_t *_buffer;
  154. uint32_t address;
  155. eboot_command ebcmd;
  156. eboot_command_read(&ebcmd);
  157. address = ebcmd.args[0];
  158. _buffer = new uint8_t[FLASH_SECTOR_SIZE];
  159. if (ESP.flashRead(address, (uint32_t*)_buffer, FLASH_SECTOR_SIZE)) {
  160. if (_buffer[2] != 3) { // DOUT
  161. _buffer[2] = 3;
  162. if (ESP.flashEraseSector(address / FLASH_SECTOR_SIZE)) ESP.flashWrite(address, (uint32_t*)_buffer, FLASH_SECTOR_SIZE);
  163. }
  164. }
  165. delete[] _buffer;
  166. }
  167. void SettingsBufferFree(void)
  168. {
  169. if (settings_buffer != NULL) {
  170. free(settings_buffer);
  171. settings_buffer = NULL;
  172. }
  173. }
  174. bool SettingsBufferAlloc(void)
  175. {
  176. SettingsBufferFree();
  177. if (!(settings_buffer = (uint8_t *)malloc(sizeof(Settings)))) {
  178. AddLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_APPLICATION D_UPLOAD_ERR_2)); // Not enough (memory) space
  179. return false;
  180. }
  181. return true;
  182. }
  183. uint16_t GetSettingsCrc(void)
  184. {
  185. uint16_t crc = 0;
  186. uint8_t *bytes = (uint8_t*)&Settings;
  187. for (uint16_t i = 0; i < sizeof(SYSCFG); i++) {
  188. if ((i < 14) || (i > 15)) { crc += bytes[i]*(i+1); } // Skip crc
  189. }
  190. return crc;
  191. }
  192. void SettingsSaveAll(void)
  193. {
  194. if (Settings.flag.save_state) {
  195. Settings.power = power;
  196. } else {
  197. Settings.power = 0;
  198. }
  199. XsnsCall(FUNC_SAVE_BEFORE_RESTART);
  200. SettingsSave(0);
  201. }
  202. /*********************************************************************************************\
  203. * Config Save - Save parameters to Flash ONLY if any parameter has changed
  204. \*********************************************************************************************/
  205. uint32_t GetSettingsAddress(void)
  206. {
  207. return settings_location * SPI_FLASH_SEC_SIZE;
  208. }
  209. void SettingsSave(byte rotate)
  210. {
  211. /* Save configuration in eeprom or one of 7 slots below
  212. *
  213. * rotate 0 = Save in next flash slot
  214. * rotate 1 = Save only in eeprom flash slot until SetOption12 0 or restart
  215. * rotate 2 = Save in eeprom flash slot, erase next flash slots and continue depending on stop_flash_rotate
  216. * stop_flash_rotate 0 = Allow flash slot rotation (SetOption12 0)
  217. * stop_flash_rotate 1 = Allow only eeprom flash slot use (SetOption12 1)
  218. */
  219. #ifndef BE_MINIMAL
  220. if ((GetSettingsCrc() != settings_crc) || rotate) {
  221. if (1 == rotate) { // Use eeprom flash slot only and disable flash rotate from now on (upgrade)
  222. stop_flash_rotate = 1;
  223. }
  224. if (2 == rotate) { // Use eeprom flash slot and erase next flash slots if stop_flash_rotate is off (default)
  225. settings_location = SETTINGS_LOCATION +1;
  226. }
  227. if (stop_flash_rotate) {
  228. settings_location = SETTINGS_LOCATION;
  229. } else {
  230. settings_location--;
  231. if (settings_location <= (SETTINGS_LOCATION - CFG_ROTATES)) {
  232. settings_location = SETTINGS_LOCATION;
  233. }
  234. }
  235. Settings.save_flag++;
  236. Settings.cfg_size = sizeof(SYSCFG);
  237. Settings.cfg_crc = GetSettingsCrc();
  238. ESP.flashEraseSector(settings_location);
  239. ESP.flashWrite(settings_location * SPI_FLASH_SEC_SIZE, (uint32*)&Settings, sizeof(SYSCFG));
  240. if (!stop_flash_rotate && rotate) {
  241. for (byte i = 1; i < CFG_ROTATES; i++) {
  242. ESP.flashEraseSector(settings_location -i); // Delete previous configurations by resetting to 0xFF
  243. delay(1);
  244. }
  245. }
  246. snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_CONFIG D_SAVED_TO_FLASH_AT " %X, " D_COUNT " %d, " D_BYTES " %d"),
  247. settings_location, Settings.save_flag, sizeof(SYSCFG));
  248. AddLog(LOG_LEVEL_DEBUG);
  249. settings_crc = Settings.cfg_crc;
  250. }
  251. #endif // BE_MINIMAL
  252. RtcSettingsSave();
  253. }
  254. void SettingsLoad(void)
  255. {
  256. /* Load configuration from eeprom or one of 7 slots below if first load does not stop_flash_rotate
  257. */
  258. struct SYSCFGH {
  259. uint16_t cfg_holder; // 000
  260. uint16_t cfg_size; // 002
  261. unsigned long save_flag; // 004
  262. } _SettingsH;
  263. bool bad_crc = false;
  264. settings_location = SETTINGS_LOCATION +1;
  265. for (byte i = 0; i < CFG_ROTATES; i++) {
  266. settings_location--;
  267. ESP.flashRead(settings_location * SPI_FLASH_SEC_SIZE, (uint32*)&Settings, sizeof(SYSCFG));
  268. ESP.flashRead((settings_location -1) * SPI_FLASH_SEC_SIZE, (uint32*)&_SettingsH, sizeof(SYSCFGH));
  269. if (Settings.version > 0x06000000) { bad_crc = (Settings.cfg_crc != GetSettingsCrc()); }
  270. if (Settings.flag.stop_flash_rotate || bad_crc || (Settings.cfg_holder != _SettingsH.cfg_holder) || (Settings.save_flag > _SettingsH.save_flag)) {
  271. break;
  272. }
  273. delay(1);
  274. }
  275. snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_CONFIG D_LOADED_FROM_FLASH_AT " %X, " D_COUNT " %d"), settings_location, Settings.save_flag);
  276. AddLog(LOG_LEVEL_DEBUG);
  277. #ifndef BE_MINIMAL
  278. if (bad_crc || (Settings.cfg_holder != (uint16_t)CFG_HOLDER)) { SettingsDefault(); }
  279. settings_crc = GetSettingsCrc();
  280. #endif // BE_MINIMAL
  281. RtcSettingsLoad();
  282. }
  283. void SettingsErase(uint8_t type)
  284. {
  285. /*
  286. 0 = Erase from program end until end of physical flash
  287. 1 = Erase SDK parameter area at end of linker memory model (0x0FDxxx - 0x0FFFFF) solving possible wifi errors
  288. */
  289. #ifndef BE_MINIMAL
  290. bool result;
  291. uint32_t _sectorStart = (ESP.getSketchSize() / SPI_FLASH_SEC_SIZE) + 1;
  292. uint32_t _sectorEnd = ESP.getFlashChipRealSize() / SPI_FLASH_SEC_SIZE;
  293. if (1 == type) {
  294. _sectorStart = SETTINGS_LOCATION +2; // SDK parameter area above EEPROM area (0x0FDxxx - 0x0FFFFF)
  295. _sectorEnd = SETTINGS_LOCATION +5;
  296. }
  297. boolean _serialoutput = (LOG_LEVEL_DEBUG_MORE <= seriallog_level);
  298. snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_APPLICATION D_ERASE " %d " D_UNIT_SECTORS), _sectorEnd - _sectorStart);
  299. AddLog(LOG_LEVEL_DEBUG);
  300. for (uint32_t _sector = _sectorStart; _sector < _sectorEnd; _sector++) {
  301. result = ESP.flashEraseSector(_sector);
  302. if (_serialoutput) {
  303. Serial.print(F(D_LOG_APPLICATION D_ERASED_SECTOR " "));
  304. Serial.print(_sector);
  305. if (result) {
  306. Serial.println(F(" " D_OK));
  307. } else {
  308. Serial.println(F(" " D_ERROR));
  309. }
  310. delay(10);
  311. }
  312. OsWatchLoop();
  313. }
  314. #endif // BE_MINIMAL
  315. }
  316. // Copied from 2.4.0 as 2.3.0 is incomplete
  317. bool SettingsEraseConfig(void) {
  318. const size_t cfgSize = 0x4000;
  319. size_t cfgAddr = ESP.getFlashChipSize() - cfgSize;
  320. for (size_t offset = 0; offset < cfgSize; offset += SPI_FLASH_SEC_SIZE) {
  321. if (!ESP.flashEraseSector((cfgAddr + offset) / SPI_FLASH_SEC_SIZE)) {
  322. return false;
  323. }
  324. }
  325. return true;
  326. }
  327. void SettingsSdkErase(void)
  328. {
  329. WiFi.disconnect(true); // Delete SDK wifi config
  330. SettingsErase(1);
  331. SettingsEraseConfig();
  332. delay(1000);
  333. }
  334. /********************************************************************************************/
  335. void SettingsDefault(void)
  336. {
  337. AddLog_P(LOG_LEVEL_NONE, PSTR(D_LOG_CONFIG D_USE_DEFAULTS));
  338. SettingsDefaultSet1();
  339. SettingsDefaultSet2();
  340. SettingsSave(2);
  341. }
  342. void SettingsDefaultSet1(void)
  343. {
  344. memset(&Settings, 0x00, sizeof(SYSCFG));
  345. Settings.cfg_holder = (uint16_t)CFG_HOLDER;
  346. Settings.cfg_size = sizeof(SYSCFG);
  347. // Settings.save_flag = 0;
  348. Settings.version = VERSION;
  349. // Settings.bootcount = 0;
  350. // Settings.cfg_crc = 0;
  351. }
  352. void SettingsDefaultSet2(void)
  353. {
  354. memset((char*)&Settings +16, 0x00, sizeof(SYSCFG) -16);
  355. // Settings.flag.value_units = 0;
  356. // Settings.flag.stop_flash_rotate = 0;
  357. Settings.save_data = SAVE_DATA;
  358. Settings.sleep = APP_SLEEP;
  359. if (Settings.sleep < 50) {
  360. Settings.sleep = 50; // Default to 50 for sleep, for now
  361. }
  362. // Module
  363. // Settings.flag.interlock = 0;
  364. Settings.module = MODULE;
  365. // for (byte i = 0; i < MAX_GPIO_PIN; i++) { Settings.my_gp.io[i] = 0; }
  366. strlcpy(Settings.friendlyname[0], FRIENDLY_NAME, sizeof(Settings.friendlyname[0]));
  367. strlcpy(Settings.friendlyname[1], FRIENDLY_NAME"2", sizeof(Settings.friendlyname[1]));
  368. strlcpy(Settings.friendlyname[2], FRIENDLY_NAME"3", sizeof(Settings.friendlyname[2]));
  369. strlcpy(Settings.friendlyname[3], FRIENDLY_NAME"4", sizeof(Settings.friendlyname[3]));
  370. strlcpy(Settings.ota_url, OTA_URL, sizeof(Settings.ota_url));
  371. // Power
  372. Settings.flag.save_state = SAVE_STATE;
  373. Settings.power = APP_POWER;
  374. Settings.poweronstate = APP_POWERON_STATE;
  375. Settings.blinktime = APP_BLINKTIME;
  376. Settings.blinkcount = APP_BLINKCOUNT;
  377. Settings.ledstate = APP_LEDSTATE;
  378. Settings.pulse_timer[0] = APP_PULSETIME;
  379. // for (byte i = 1; i < MAX_PULSETIMERS; i++) { Settings.pulse_timer[i] = 0; }
  380. // Serial
  381. Settings.baudrate = APP_BAUDRATE / 1200;
  382. Settings.sbaudrate = SOFT_BAUDRATE / 1200;
  383. Settings.serial_delimiter = 0xff;
  384. Settings.seriallog_level = SERIAL_LOG_LEVEL;
  385. // Wifi
  386. ParseIp(&Settings.ip_address[0], WIFI_IP_ADDRESS);
  387. ParseIp(&Settings.ip_address[1], WIFI_GATEWAY);
  388. ParseIp(&Settings.ip_address[2], WIFI_SUBNETMASK);
  389. ParseIp(&Settings.ip_address[3], WIFI_DNS);
  390. Settings.sta_config = WIFI_CONFIG_TOOL;
  391. // Settings.sta_active = 0;
  392. strlcpy(Settings.sta_ssid[0], STA_SSID1, sizeof(Settings.sta_ssid[0]));
  393. strlcpy(Settings.sta_pwd[0], STA_PASS1, sizeof(Settings.sta_pwd[0]));
  394. strlcpy(Settings.sta_ssid[1], STA_SSID2, sizeof(Settings.sta_ssid[1]));
  395. strlcpy(Settings.sta_pwd[1], STA_PASS2, sizeof(Settings.sta_pwd[1]));
  396. strlcpy(Settings.hostname, WIFI_HOSTNAME, sizeof(Settings.hostname));
  397. // Syslog
  398. strlcpy(Settings.syslog_host, SYS_LOG_HOST, sizeof(Settings.syslog_host));
  399. Settings.syslog_port = SYS_LOG_PORT;
  400. Settings.syslog_level = SYS_LOG_LEVEL;
  401. // Webserver
  402. Settings.flag2.emulation = EMULATION;
  403. Settings.webserver = WEB_SERVER;
  404. Settings.weblog_level = WEB_LOG_LEVEL;
  405. strlcpy(Settings.web_password, WEB_PASSWORD, sizeof(Settings.web_password));
  406. // Button
  407. // Settings.flag.button_restrict = 0;
  408. // Settings.flag.button_swap = 0;
  409. // Settings.flag.button_single = 0;
  410. Settings.param[P_HOLD_TIME] = KEY_HOLD_TIME; // Default 4 seconds hold time
  411. // Switch
  412. for (byte i = 0; i < MAX_SWITCHES; i++) { Settings.switchmode[i] = SWITCH_MODE; }
  413. // MQTT
  414. Settings.flag.mqtt_enabled = MQTT_USE;
  415. // Settings.flag.mqtt_response = 0;
  416. Settings.flag.mqtt_power_retain = MQTT_POWER_RETAIN;
  417. Settings.flag.mqtt_button_retain = MQTT_BUTTON_RETAIN;
  418. Settings.flag.mqtt_switch_retain = MQTT_SWITCH_RETAIN;
  419. Settings.flag3.button_switch_force_local = MQTT_BUTTON_SWITCH_FORCE_LOCAL;
  420. // Settings.flag.mqtt_sensor_retain = 0;
  421. // Settings.flag.mqtt_offline = 0;
  422. // Settings.flag.mqtt_serial = 0;
  423. // Settings.flag.device_index_enable = 0;
  424. strlcpy(Settings.mqtt_host, MQTT_HOST, sizeof(Settings.mqtt_host));
  425. Settings.mqtt_port = MQTT_PORT;
  426. strlcpy(Settings.mqtt_client, MQTT_CLIENT_ID, sizeof(Settings.mqtt_client));
  427. strlcpy(Settings.mqtt_user, MQTT_USER, sizeof(Settings.mqtt_user));
  428. strlcpy(Settings.mqtt_pwd, MQTT_PASS, sizeof(Settings.mqtt_pwd));
  429. strlcpy(Settings.mqtt_topic, MQTT_TOPIC, sizeof(Settings.mqtt_topic));
  430. strlcpy(Settings.button_topic, MQTT_BUTTON_TOPIC, sizeof(Settings.button_topic));
  431. strlcpy(Settings.switch_topic, MQTT_SWITCH_TOPIC, sizeof(Settings.switch_topic));
  432. strlcpy(Settings.mqtt_grptopic, MQTT_GRPTOPIC, sizeof(Settings.mqtt_grptopic));
  433. strlcpy(Settings.mqtt_fulltopic, MQTT_FULLTOPIC, sizeof(Settings.mqtt_fulltopic));
  434. Settings.mqtt_retry = MQTT_RETRY_SECS;
  435. strlcpy(Settings.mqtt_prefix[0], SUB_PREFIX, sizeof(Settings.mqtt_prefix[0]));
  436. strlcpy(Settings.mqtt_prefix[1], PUB_PREFIX, sizeof(Settings.mqtt_prefix[1]));
  437. strlcpy(Settings.mqtt_prefix[2], PUB_PREFIX2, sizeof(Settings.mqtt_prefix[2]));
  438. strlcpy(Settings.state_text[0], MQTT_STATUS_OFF, sizeof(Settings.state_text[0]));
  439. strlcpy(Settings.state_text[1], MQTT_STATUS_ON, sizeof(Settings.state_text[1]));
  440. strlcpy(Settings.state_text[2], MQTT_CMND_TOGGLE, sizeof(Settings.state_text[2]));
  441. strlcpy(Settings.state_text[3], MQTT_CMND_HOLD, sizeof(Settings.state_text[3]));
  442. char fingerprint[60];
  443. strlcpy(fingerprint, MQTT_FINGERPRINT1, sizeof(fingerprint));
  444. char *p = fingerprint;
  445. for (byte i = 0; i < 20; i++) {
  446. Settings.mqtt_fingerprint[0][i] = strtol(p, &p, 16);
  447. }
  448. strlcpy(fingerprint, MQTT_FINGERPRINT2, sizeof(fingerprint));
  449. p = fingerprint;
  450. for (byte i = 0; i < 20; i++) {
  451. Settings.mqtt_fingerprint[1][i] = strtol(p, &p, 16);
  452. }
  453. Settings.tele_period = TELE_PERIOD;
  454. // Energy
  455. Settings.flag2.current_resolution = 3;
  456. // Settings.flag2.voltage_resolution = 0;
  457. // Settings.flag2.wattage_resolution = 0;
  458. Settings.flag2.energy_resolution = ENERGY_RESOLUTION;
  459. Settings.param[P_MAX_POWER_RETRY] = MAX_POWER_RETRY;
  460. Settings.energy_power_delta = DEFAULT_POWER_DELTA;
  461. Settings.energy_power_calibration = HLW_PREF_PULSE;
  462. Settings.energy_voltage_calibration = HLW_UREF_PULSE;
  463. Settings.energy_current_calibration = HLW_IREF_PULSE;
  464. // Settings.energy_kWhtoday = 0;
  465. // Settings.energy_kWhyesterday = 0;
  466. // Settings.energy_kWhdoy = 0;
  467. // Settings.energy_min_power = 0;
  468. // Settings.energy_max_power = 0;
  469. // Settings.energy_min_voltage = 0;
  470. // Settings.energy_max_voltage = 0;
  471. // Settings.energy_min_current = 0;
  472. // Settings.energy_max_current = 0;
  473. // Settings.energy_max_power_limit = 0; // MaxPowerLimit
  474. Settings.energy_max_power_limit_hold = MAX_POWER_HOLD;
  475. Settings.energy_max_power_limit_window = MAX_POWER_WINDOW;
  476. // Settings.energy_max_power_safe_limit = 0; // MaxSafePowerLimit
  477. Settings.energy_max_power_safe_limit_hold = SAFE_POWER_HOLD;
  478. Settings.energy_max_power_safe_limit_window = SAFE_POWER_WINDOW;
  479. // Settings.energy_max_energy = 0; // MaxEnergy
  480. // Settings.energy_max_energy_start = 0; // MaxEnergyStart
  481. // Settings.energy_kWhtotal = 0;
  482. RtcSettings.energy_kWhtotal = 0;
  483. // RF Bridge
  484. // for (byte i = 0; i < 17; i++) { Settings.rf_code[i][0] = 0; }
  485. memcpy_P(Settings.rf_code[0], kDefaultRfCode, 9);
  486. // Domoticz
  487. Settings.domoticz_update_timer = DOMOTICZ_UPDATE_TIMER;
  488. // for (byte i = 0; i < MAX_DOMOTICZ_IDX; i++) {
  489. // Settings.domoticz_relay_idx[i] = 0;
  490. // Settings.domoticz_key_idx[i] = 0;
  491. // Settings.domoticz_switch_idx[i] = 0;
  492. // }
  493. // for (byte i = 0; i < MAX_DOMOTICZ_SNS_IDX; i++) {
  494. // Settings.domoticz_sensor_idx[i] = 0;
  495. // }
  496. // Sensor
  497. Settings.flag.temperature_conversion = TEMP_CONVERSION;
  498. Settings.flag.pressure_conversion = PRESSURE_CONVERSION;
  499. Settings.flag2.pressure_resolution = PRESSURE_RESOLUTION;
  500. Settings.flag2.humidity_resolution = HUMIDITY_RESOLUTION;
  501. Settings.flag2.temperature_resolution = TEMP_RESOLUTION;
  502. // Settings.altitude = 0;
  503. // Rules
  504. // Settings.rule_enabled = 0;
  505. // Settings.rule_once = 0;
  506. // for (byte i = 1; i < MAX_RULE_SETS; i++) { Settings.rules[i][0] = '\0'; }
  507. Settings.flag2.calc_resolution = CALC_RESOLUTION;
  508. // Home Assistant
  509. Settings.flag.hass_discovery = HOME_ASSISTANT_DISCOVERY_ENABLE;
  510. // Knx
  511. // Settings.flag.knx_enabled = 0;
  512. // Settings.flag.knx_enable_enhancement = 0;
  513. // Light
  514. Settings.flag.pwm_control = 1;
  515. //Settings.flag.ws_clock_reverse = 0;
  516. //Settings.flag.light_signal = 0;
  517. //Settings.flag.not_power_linked = 0;
  518. //Settings.flag.decimal_text = 0;
  519. Settings.pwm_frequency = PWM_FREQ;
  520. Settings.pwm_range = PWM_RANGE;
  521. for (byte i = 0; i < MAX_PWMS; i++) {
  522. Settings.light_color[i] = 255;
  523. // Settings.pwm_value[i] = 0;
  524. }
  525. // Settings.light_correction = 0;
  526. Settings.light_dimmer = 10;
  527. // Settings.light_fade = 0;
  528. Settings.light_speed = 1;
  529. // Settings.light_scheme = 0;
  530. Settings.light_width = 1;
  531. // Settings.light_wakeup = 0;
  532. Settings.light_pixels = WS2812_LEDS;
  533. // Settings.light_rotation = 0;
  534. SettingsDefaultSet_5_8_1(); // Clock color
  535. // Display
  536. SettingsDefaultSet_5_10_1(); // Display settings
  537. // Time
  538. if (((APP_TIMEZONE > -14) && (APP_TIMEZONE < 15)) || (99 == APP_TIMEZONE)) {
  539. Settings.timezone = APP_TIMEZONE;
  540. Settings.timezone_minutes = 0;
  541. } else {
  542. Settings.timezone = APP_TIMEZONE / 60;
  543. Settings.timezone_minutes = abs(APP_TIMEZONE % 60);
  544. }
  545. strlcpy(Settings.ntp_server[0], NTP_SERVER1, sizeof(Settings.ntp_server[0]));
  546. strlcpy(Settings.ntp_server[1], NTP_SERVER2, sizeof(Settings.ntp_server[1]));
  547. strlcpy(Settings.ntp_server[2], NTP_SERVER3, sizeof(Settings.ntp_server[2]));
  548. for (byte j = 0; j < 3; j++) {
  549. for (byte i = 0; i < strlen(Settings.ntp_server[j]); i++) {
  550. if (Settings.ntp_server[j][i] == ',') {
  551. Settings.ntp_server[j][i] = '.';
  552. }
  553. }
  554. }
  555. Settings.latitude = (int)((double)LATITUDE * 1000000);
  556. Settings.longitude = (int)((double)LONGITUDE * 1000000);
  557. SettingsDefaultSet_5_13_1c(); // Time STD/DST settings
  558. Settings.button_debounce = KEY_DEBOUNCE_TIME;
  559. Settings.switch_debounce = SWITCH_DEBOUNCE_TIME;
  560. for (byte j = 0; j < 5; j++) {
  561. Settings.rgbwwTable[j] = 255;
  562. }
  563. memset(&Settings.drivers, 0xFF, 32); // Enable all possible monitors, displays, drivers and sensors
  564. }
  565. /********************************************************************************************/
  566. void SettingsDefaultSet_5_8_1(void)
  567. {
  568. // Settings.flag.ws_clock_reverse = 0;
  569. Settings.ws_width[WS_SECOND] = 1;
  570. Settings.ws_color[WS_SECOND][WS_RED] = 255;
  571. Settings.ws_color[WS_SECOND][WS_GREEN] = 0;
  572. Settings.ws_color[WS_SECOND][WS_BLUE] = 255;
  573. Settings.ws_width[WS_MINUTE] = 3;
  574. Settings.ws_color[WS_MINUTE][WS_RED] = 0;
  575. Settings.ws_color[WS_MINUTE][WS_GREEN] = 255;
  576. Settings.ws_color[WS_MINUTE][WS_BLUE] = 0;
  577. Settings.ws_width[WS_HOUR] = 5;
  578. Settings.ws_color[WS_HOUR][WS_RED] = 255;
  579. Settings.ws_color[WS_HOUR][WS_GREEN] = 0;
  580. Settings.ws_color[WS_HOUR][WS_BLUE] = 0;
  581. }
  582. void SettingsDefaultSet_5_10_1(void)
  583. {
  584. Settings.display_model = 0;
  585. Settings.display_mode = 1;
  586. Settings.display_refresh = 2;
  587. Settings.display_rows = 2;
  588. Settings.display_cols[0] = 16;
  589. Settings.display_cols[1] = 8;
  590. Settings.display_dimmer = 1;
  591. Settings.display_size = 1;
  592. Settings.display_font = 1;
  593. Settings.display_rotate = 0;
  594. Settings.display_address[0] = MTX_ADDRESS1;
  595. Settings.display_address[1] = MTX_ADDRESS2;
  596. Settings.display_address[2] = MTX_ADDRESS3;
  597. Settings.display_address[3] = MTX_ADDRESS4;
  598. Settings.display_address[4] = MTX_ADDRESS5;
  599. Settings.display_address[5] = MTX_ADDRESS6;
  600. Settings.display_address[6] = MTX_ADDRESS7;
  601. Settings.display_address[7] = MTX_ADDRESS8;
  602. }
  603. void SettingsResetStd(void)
  604. {
  605. Settings.tflag[0].hemis = TIME_STD_HEMISPHERE;
  606. Settings.tflag[0].week = TIME_STD_WEEK;
  607. Settings.tflag[0].dow = TIME_STD_DAY;
  608. Settings.tflag[0].month = TIME_STD_MONTH;
  609. Settings.tflag[0].hour = TIME_STD_HOUR;
  610. Settings.toffset[0] = TIME_STD_OFFSET;
  611. }
  612. void SettingsResetDst(void)
  613. {
  614. Settings.tflag[1].hemis = TIME_DST_HEMISPHERE;
  615. Settings.tflag[1].week = TIME_DST_WEEK;
  616. Settings.tflag[1].dow = TIME_DST_DAY;
  617. Settings.tflag[1].month = TIME_DST_MONTH;
  618. Settings.tflag[1].hour = TIME_DST_HOUR;
  619. Settings.toffset[1] = TIME_DST_OFFSET;
  620. }
  621. void SettingsDefaultSet_5_13_1c(void)
  622. {
  623. SettingsResetStd();
  624. SettingsResetDst();
  625. }
  626. /********************************************************************************************/
  627. void SettingsDelta(void)
  628. {
  629. if (Settings.version != VERSION) { // Fix version dependent changes
  630. if (Settings.version < 0x05050000) {
  631. for (byte i = 0; i < 17; i++) { Settings.rf_code[i][0] = 0; }
  632. memcpy_P(Settings.rf_code[0], kDefaultRfCode, 9);
  633. }
  634. if (Settings.version < 0x05080000) {
  635. Settings.light_pixels = WS2812_LEDS;
  636. Settings.light_width = 1;
  637. Settings.light_color[0] = 255;
  638. Settings.light_color[1] = 0;
  639. Settings.light_color[2] = 0;
  640. Settings.light_dimmer = 10;
  641. Settings.light_correction = 0;
  642. Settings.light_fade = 0;
  643. Settings.light_speed = 1;
  644. Settings.light_scheme = 0;
  645. Settings.light_width = 1;
  646. Settings.light_wakeup = 0;
  647. }
  648. if (Settings.version < 0x0508000A) {
  649. Settings.power = 0;
  650. Settings.altitude = 0;
  651. }
  652. if (Settings.version < 0x0508000B) {
  653. for (byte i = 0; i < MAX_GPIO_PIN; i++) { // Move GPIO_LEDs
  654. if ((Settings.my_gp.io[i] >= 25) && (Settings.my_gp.io[i] <= 32)) { // Was GPIO_LED1
  655. Settings.my_gp.io[i] += 23; // Move GPIO_LED1
  656. }
  657. }
  658. for (byte i = 0; i < MAX_PWMS; i++) { // Move pwm_value and reset additional pulse_timerrs
  659. Settings.pwm_value[i] = Settings.pulse_timer[4 +i];
  660. Settings.pulse_timer[4 +i] = 0;
  661. }
  662. }
  663. if (Settings.version < 0x0508000D) {
  664. Settings.pwm_frequency = PWM_FREQ;
  665. Settings.pwm_range = PWM_RANGE;
  666. }
  667. if (Settings.version < 0x0508000E) {
  668. SettingsDefaultSet_5_8_1();
  669. }
  670. if (Settings.version < 0x05090102) {
  671. Settings.flag2.data = Settings.flag.data;
  672. Settings.flag2.data &= 0xFFE80000;
  673. Settings.flag2.voltage_resolution = Settings.flag.not_power_linked;
  674. Settings.flag2.current_resolution = 3;
  675. Settings.ina219_mode = 0;
  676. }
  677. if (Settings.version < 0x050A0009) {
  678. SettingsDefaultSet_5_10_1();
  679. }
  680. if (Settings.version < 0x050B0107) {
  681. Settings.flag.not_power_linked = 0;
  682. }
  683. if (Settings.version < 0x050C0005) {
  684. Settings.light_rotation = 0;
  685. Settings.energy_power_delta = DEFAULT_POWER_DELTA;
  686. char fingerprint[60];
  687. memcpy(fingerprint, Settings.mqtt_fingerprint, sizeof(fingerprint));
  688. char *p = fingerprint;
  689. for (byte i = 0; i < 20; i++) {
  690. Settings.mqtt_fingerprint[0][i] = strtol(p, &p, 16);
  691. Settings.mqtt_fingerprint[1][i] = Settings.mqtt_fingerprint[0][i];
  692. }
  693. }
  694. if (Settings.version < 0x050C0007) {
  695. Settings.baudrate = APP_BAUDRATE / 1200;
  696. }
  697. if (Settings.version < 0x050C0008) {
  698. Settings.sbaudrate = SOFT_BAUDRATE / 1200;
  699. Settings.serial_delimiter = 0xff;
  700. }
  701. if (Settings.version < 0x050C000A) {
  702. Settings.latitude = (int)((double)LATITUDE * 1000000);
  703. Settings.longitude = (int)((double)LONGITUDE * 1000000);
  704. }
  705. if (Settings.version < 0x050C000B) {
  706. Settings.rules[0][0] = '\0';
  707. }
  708. if (Settings.version < 0x050C000D) {
  709. memmove(Settings.rules, Settings.rules -256, sizeof(Settings.rules)); // move rules up by 256 bytes
  710. memset(&Settings.timer, 0x00, sizeof(Timer) * MAX_TIMERS); // Reset timers as layout has changed from v5.12.0i
  711. Settings.knx_GA_registered = 0;
  712. Settings.knx_CB_registered = 0;
  713. memset(&Settings.knx_physsical_addr, 0x00, 0x800 - 0x6b8); // Reset until 0x800 for future use
  714. }
  715. if (Settings.version < 0x050C000F) {
  716. Settings.energy_kWhtoday /= 1000;
  717. Settings.energy_kWhyesterday /= 1000;
  718. RtcSettings.energy_kWhtoday /= 1000;
  719. }
  720. if (Settings.version < 0x050D0103) {
  721. SettingsDefaultSet_5_13_1c();
  722. }
  723. if (Settings.version < 0x050E0002) {
  724. for (byte i = 1; i < MAX_RULE_SETS; i++) { Settings.rules[i][0] = '\0'; }
  725. Settings.rule_enabled = Settings.flag.mqtt_serial_raw; // Was rules_enabled until 5.14.0b
  726. Settings.rule_once = Settings.flag.pressure_conversion; // Was rules_once until 5.14.0b
  727. }
  728. if (Settings.version < 0x06000000) {
  729. Settings.cfg_size = sizeof(SYSCFG);
  730. Settings.cfg_crc = GetSettingsCrc();
  731. }
  732. if (Settings.version < 0x06000002) {
  733. for (byte i = 0; i < MAX_SWITCHES; i++) {
  734. if (i < 4) {
  735. Settings.switchmode[i] = Settings.ex_switchmode[i];
  736. } else {
  737. Settings.switchmode[i] = SWITCH_MODE;
  738. }
  739. }
  740. for (byte i = 0; i < MAX_GPIO_PIN; i++) {
  741. if (Settings.my_gp.io[i] >= GPIO_SWT5) { // Move up from GPIO_SWT5 to GPIO_KEY1
  742. Settings.my_gp.io[i] += 4;
  743. }
  744. }
  745. }
  746. if (Settings.version < 0x06000003) {
  747. Settings.flag.mqtt_serial_raw = 0; // Was rules_enabled until 5.14.0b
  748. Settings.flag.pressure_conversion = 0; // Was rules_once until 5.14.0b
  749. Settings.flag3.data = 0;
  750. }
  751. if (Settings.version < 0x06010103) {
  752. Settings.flag3.timers_enable = 1;
  753. }
  754. if (Settings.version < 0x0601010C) {
  755. Settings.button_debounce = KEY_DEBOUNCE_TIME;
  756. Settings.switch_debounce = SWITCH_DEBOUNCE_TIME;
  757. }
  758. if (Settings.version < 0x0602010A) {
  759. for (byte j = 0; j < 5; j++) {
  760. Settings.rgbwwTable[j] = 255;
  761. }
  762. }
  763. if (Settings.version < 0x06030002) {
  764. Settings.timezone_minutes = 0;
  765. }
  766. if (Settings.version < 0x06030004) {
  767. memset(&Settings.drivers, 0xFF, 32); // Enable all possible monitors, displays, drivers and sensors
  768. }
  769. if (Settings.version < 0x0603000E) {
  770. Settings.flag2.calc_resolution = CALC_RESOLUTION;
  771. }
  772. if (Settings.version < 0x0603000F) {
  773. if (Settings.sleep < 50) {
  774. Settings.sleep = 50; // Default to 50 for sleep, for now
  775. }
  776. }
  777. Settings.version = VERSION;
  778. SettingsSave(1);
  779. }
  780. }