settings.h 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428
  1. /*
  2. settings.h - setting variables 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 _SETTINGS_H_
  16. #define _SETTINGS_H_
  17. #define PARAM8_SIZE 18 // Number of param bytes (SetOption)
  18. typedef union { // Restricted by MISRA-C Rule 18.4 but so useful...
  19. uint32_t data; // Allow bit manipulation using SetOption
  20. struct { // SetOption0 .. SetOption31
  21. uint32_t save_state : 1; // bit 0
  22. uint32_t button_restrict : 1; // bit 1
  23. uint32_t value_units : 1; // bit 2
  24. uint32_t mqtt_enabled : 1; // bit 3
  25. uint32_t mqtt_response : 1; // bit 4
  26. uint32_t mqtt_power_retain : 1; // CMND_POWERRETAIN
  27. uint32_t mqtt_button_retain : 1; // CMND_BUTTONRETAIN
  28. uint32_t mqtt_switch_retain : 1; // CMND_SWITCHRETAIN
  29. uint32_t temperature_conversion : 1; // bit 8
  30. uint32_t mqtt_sensor_retain : 1; // CMND_SENSORRETAIN
  31. uint32_t mqtt_offline : 1; // bit 10
  32. uint32_t button_swap : 1; // bit 11 (v5.1.6)
  33. uint32_t stop_flash_rotate : 1; // bit 12 (v5.2.0)
  34. uint32_t button_single : 1; // bit 13 (v5.4.0)
  35. uint32_t interlock : 1; // bit 14 (v5.6.0)
  36. uint32_t pwm_control : 1; // bit 15 (v5.8.1)
  37. uint32_t ws_clock_reverse : 1; // bit 16 (v5.8.1)
  38. uint32_t decimal_text : 1; // bit 17 (v5.8.1)
  39. uint32_t light_signal : 1; // bit 18 (v5.10.0c)
  40. uint32_t hass_discovery : 1; // bit 19 (v5.11.1a)
  41. uint32_t not_power_linked : 1; // bit 20 (v5.11.1f)
  42. uint32_t no_power_on_check : 1; // bit 21 (v5.11.1i)
  43. uint32_t mqtt_serial : 1; // bit 22 (v5.12.0f)
  44. uint32_t mqtt_serial_raw : 1; // bit 23 (v6.1.1c) // Was rules_enabled until 5.14.0b
  45. uint32_t pressure_conversion : 1; // bit 24 (v6.3.0.2) // Was rules_once until 5.14.0b
  46. uint32_t knx_enabled : 1; // bit 25 (v5.12.0l) KNX
  47. uint32_t device_index_enable : 1; // bit 26 (v5.13.1a)
  48. uint32_t knx_enable_enhancement : 1; // bit 27 (v5.14.0a) KNX
  49. uint32_t rf_receive_decimal : 1; // bit 28 (v6.0.0a)
  50. uint32_t ir_receive_decimal : 1; // bit 29 (v6.0.0a)
  51. uint32_t hass_light : 1; // bit 30 (v6.0.0b)
  52. uint32_t global_state : 1; // bit 31 (v6.1.0)
  53. };
  54. } SysBitfield;
  55. typedef union { // Restricted by MISRA-C Rule 18.4 but so useful...
  56. uint32_t data; // Allow bit manipulation using SetOption
  57. struct { // SetOption50 .. SetOption81
  58. uint32_t timers_enable : 1; // bit 0 (v6.1.1b)
  59. uint32_t user_esp8285_enable : 1; // bit 1 (v6.1.1.14)
  60. uint32_t time_append_timezone : 1; // bit 2 (v6.2.1.2)
  61. uint32_t gui_hostname_ip : 1; // bit 3 (v6.2.1.20)
  62. uint32_t tuya_apply_o20 : 1; // bit 4 (v6.3.0.4)
  63. uint32_t spare5 : 1;
  64. uint32_t use_wifi_scan : 1; // bit 6 (v6.3.0.10)
  65. uint32_t use_wifi_rescan : 1; // bit 7 (v6.3.0.10)
  66. uint32_t receive_raw : 1; // bit 8 (v6.3.0.11)
  67. uint32_t hass_tele_on_power : 1; // bit 9 (v6.3.0.13)
  68. uint32_t sleep_normal : 1; // bit 10 (v6.3.0.15) - SetOption60 - Enable normal sleep instead of dynamic sleep
  69. uint32_t button_switch_force_local : 1;// bit 11
  70. uint32_t spare12 : 1;
  71. uint32_t spare13 : 1;
  72. uint32_t spare14 : 1;
  73. uint32_t spare15 : 1;
  74. uint32_t spare16 : 1;
  75. uint32_t spare17 : 1;
  76. uint32_t spare18 : 1;
  77. uint32_t spare19 : 1;
  78. uint32_t spare20 : 1;
  79. uint32_t spare21 : 1;
  80. uint32_t spare22 : 1;
  81. uint32_t spare23 : 1;
  82. uint32_t spare24 : 1;
  83. uint32_t spare25 : 1;
  84. uint32_t spare26 : 1;
  85. uint32_t spare27 : 1;
  86. uint32_t spare28 : 1;
  87. uint32_t spare29 : 1;
  88. uint32_t spare30 : 1;
  89. uint32_t spare31 : 1;
  90. };
  91. } SysBitfield3;
  92. typedef union {
  93. uint32_t data; // Allow bit manipulation
  94. struct {
  95. uint32_t spare00 : 1;
  96. uint32_t spare01 : 1;
  97. uint32_t spare02 : 1;
  98. uint32_t spare03 : 1;
  99. uint32_t spare04 : 1;
  100. uint32_t spare05 : 1;
  101. uint32_t calc_resolution : 3;
  102. uint32_t weight_resolution : 2;
  103. uint32_t frequency_resolution : 2;
  104. uint32_t axis_resolution : 2;
  105. uint32_t current_resolution : 2;
  106. uint32_t voltage_resolution : 2;
  107. uint32_t wattage_resolution : 2;
  108. uint32_t emulation : 2;
  109. uint32_t energy_resolution : 3;
  110. uint32_t pressure_resolution : 2;
  111. uint32_t humidity_resolution : 2;
  112. uint32_t temperature_resolution : 2;
  113. };
  114. } SysBitfield2;
  115. typedef union {
  116. uint16_t data;
  117. struct {
  118. uint16_t hemis : 1; // bit 0 = 0=Northern, 1=Southern Hemisphere (=Opposite DST/STD)
  119. uint16_t week : 3; // bits 1 - 3 = 0=Last week of the month, 1=First, 2=Second, 3=Third, 4=Fourth
  120. uint16_t month : 4; // bits 4 - 7 = 1=Jan, 2=Feb, ... 12=Dec
  121. uint16_t dow : 3; // bits 8 - 10 = day of week, 1=Sun, 2=Mon, ... 7=Sat
  122. uint16_t hour : 5; // bits 11 - 15 = 0-23
  123. };
  124. } TimeRule;
  125. typedef union {
  126. uint32_t data;
  127. struct {
  128. uint32_t time : 11; // bits 0 - 10 = minutes in a day
  129. uint32_t window : 4; // bits 11 - 14 = minutes random window
  130. uint32_t repeat : 1; // bit 15
  131. uint32_t days : 7; // bits 16 - 22 = week day mask
  132. uint32_t device : 4; // bits 23 - 26 = 16 devices
  133. uint32_t power : 2; // bits 27 - 28 = 4 power states - Off, On, Toggle, Blink or Rule
  134. uint32_t mode : 2; // bits 29 - 30 = timer modes - 0 = Scheduler, 1 = Sunrise, 2 = Sunset
  135. uint32_t arm : 1; // bit 31
  136. };
  137. } Timer;
  138. typedef union {
  139. uint16_t data;
  140. struct {
  141. uint16_t pinmode : 3; // Pin mode (1 through 6)
  142. uint16_t pullup : 1; // Enable internal weak pull-up resistor
  143. uint16_t saved_state : 1; // Save output state, if used.
  144. uint16_t int_report_mode : 2; // Interrupt reporting mode 0 = immediate telemetry & event, 1 = immediate event only, 2 = immediate telemetry only
  145. uint16_t int_report_defer : 4; // Number of interrupts to ignore until reporting (default 0, max 15)
  146. uint16_t int_count_en : 1; // Enable interrupt counter for this pin
  147. uint16_t int_retain_flag : 1; // Report if interrupt occured for pin in next teleperiod
  148. uint16_t spare13 : 1;
  149. uint16_t spare14 : 1;
  150. uint16_t spare15 : 1;
  151. };
  152. } Mcp230xxCfg;
  153. /*
  154. struct SYSCFG {
  155. unsigned long cfg_holder; // 000 Pre v6 header
  156. unsigned long save_flag; // 004
  157. unsigned long version; // 008
  158. unsigned long bootcount; // 00C
  159. */
  160. struct SYSCFG {
  161. uint16_t cfg_holder; // 000 v6 header
  162. uint16_t cfg_size; // 002
  163. unsigned long save_flag; // 004
  164. unsigned long version; // 008
  165. uint16_t bootcount; // 00C
  166. uint16_t cfg_crc; // 00E
  167. SysBitfield flag; // 010
  168. int16_t save_data; // 014
  169. int8_t timezone; // 016
  170. char ota_url[101]; // 017
  171. char mqtt_prefix[3][11]; // 07C
  172. uint8_t baudrate; // 09D
  173. byte seriallog_level; // 09E
  174. uint8_t sta_config; // 09F
  175. byte sta_active; // 0A0
  176. char sta_ssid[2][33]; // 0A1 - Keep together with sta_pwd as being copied as one chunck with reset 4/5
  177. char sta_pwd[2][65]; // 0E3 - Keep together with sta_ssid as being copied as one chunck with reset 4/5
  178. char hostname[33]; // 165
  179. char syslog_host[33]; // 186
  180. uint8_t rule_stop; // 1A7
  181. uint16_t syslog_port; // 1A8
  182. byte syslog_level; // 1AA
  183. uint8_t webserver; // 1AB
  184. byte weblog_level; // 1AC
  185. uint8_t mqtt_fingerprint[2][20]; // 1AD
  186. byte free_1D5[20]; // 1D5 Free since 5.12.0e
  187. char mqtt_host[33]; // 1E9
  188. uint16_t mqtt_port; // 20A
  189. char mqtt_client[33]; // 20C
  190. char mqtt_user[33]; // 22D
  191. char mqtt_pwd[33]; // 24E
  192. char mqtt_topic[33]; // 26F
  193. char button_topic[33]; // 290
  194. char mqtt_grptopic[33]; // 2B1
  195. uint8_t display_model; // 2D2
  196. uint8_t display_mode; // 2D3
  197. uint8_t display_refresh; // 2D4
  198. uint8_t display_rows; // 2D5
  199. uint8_t display_cols[2]; // 2D6
  200. uint8_t display_address[8]; // 2D8
  201. uint8_t display_dimmer; // 2E0
  202. uint8_t display_size; // 2E1
  203. TimeRule tflag[2]; // 2E2
  204. uint16_t pwm_frequency; // 2E6
  205. power_t power; // 2E8
  206. uint16_t pwm_value[MAX_PWMS]; // 2EC
  207. int16_t altitude; // 2F6
  208. uint16_t tele_period; // 2F8
  209. uint8_t display_rotate; // 2FA
  210. uint8_t ledstate; // 2FB
  211. uint8_t param[PARAM8_SIZE]; // 2FC SetOption32 .. SetOption49
  212. int16_t toffset[2]; // 30E
  213. uint8_t display_font; // 312
  214. char state_text[4][11]; // 313
  215. uint8_t energy_power_delta; // 33F
  216. uint16_t domoticz_update_timer; // 340
  217. uint16_t pwm_range; // 342
  218. unsigned long domoticz_relay_idx[MAX_DOMOTICZ_IDX]; // 344
  219. unsigned long domoticz_key_idx[MAX_DOMOTICZ_IDX]; // 354
  220. unsigned long energy_power_calibration; // 364
  221. unsigned long energy_voltage_calibration; // 368
  222. unsigned long energy_current_calibration; // 36C
  223. unsigned long energy_kWhtoday; // 370
  224. unsigned long energy_kWhyesterday; // 374
  225. uint16_t energy_kWhdoy; // 378
  226. uint16_t energy_min_power; // 37A
  227. uint16_t energy_max_power; // 37C
  228. uint16_t energy_min_voltage; // 37E
  229. uint16_t energy_max_voltage; // 380
  230. uint16_t energy_min_current; // 382
  231. uint16_t energy_max_current; // 384
  232. uint16_t energy_max_power_limit; // 386 MaxPowerLimit
  233. uint16_t energy_max_power_limit_hold; // 388 MaxPowerLimitHold
  234. uint16_t energy_max_power_limit_window; // 38A MaxPowerLimitWindow
  235. uint16_t energy_max_power_safe_limit; // 38C MaxSafePowerLimit
  236. uint16_t energy_max_power_safe_limit_hold; // 38E MaxSafePowerLimitHold
  237. uint16_t energy_max_power_safe_limit_window; // 390 MaxSafePowerLimitWindow
  238. uint16_t energy_max_energy; // 392 MaxEnergy
  239. uint16_t energy_max_energy_start; // 394 MaxEnergyStart
  240. uint16_t mqtt_retry; // 396
  241. uint8_t poweronstate; // 398
  242. uint8_t last_module; // 399
  243. uint16_t blinktime; // 39A
  244. uint16_t blinkcount; // 39C
  245. uint16_t light_rotation; // 39E
  246. SysBitfield3 flag3; // 3A0
  247. uint8_t switchmode[MAX_SWITCHES]; // 3A4 (6.0.0b - moved from 0x4CA)
  248. char friendlyname[MAX_FRIENDLYNAMES][33]; // 3AC
  249. char switch_topic[33]; // 430
  250. char serial_delimiter; // 451
  251. uint8_t sbaudrate; // 452
  252. uint8_t sleep; // 453
  253. uint16_t domoticz_switch_idx[MAX_DOMOTICZ_IDX]; // 454
  254. uint16_t domoticz_sensor_idx[MAX_DOMOTICZ_SNS_IDX]; // 45C
  255. uint8_t module; // 474
  256. uint8_t ws_color[4][3]; // 475
  257. uint8_t ws_width[3]; // 481
  258. myio my_gp; // 484
  259. uint16_t light_pixels; // 496
  260. uint8_t light_color[5]; // 498
  261. uint8_t light_correction; // 49D
  262. uint8_t light_dimmer; // 49E
  263. uint8_t rule_enabled; // 49F
  264. uint8_t rule_once; // 4A0
  265. uint8_t light_fade; // 4A1
  266. uint8_t light_speed; // 4A2
  267. uint8_t light_scheme; // 4A3
  268. uint8_t light_width; // 4A4
  269. byte knx_GA_registered; // 4A5 Number of Group Address to read
  270. uint16_t light_wakeup; // 4A6
  271. byte knx_CB_registered; // 4A8 Number of Group Address to write
  272. char web_password[33]; // 4A9
  273. uint8_t ex_switchmode[4]; // 4CA Free since 6.0.0a
  274. char ntp_server[3][33]; // 4CE
  275. byte ina219_mode; // 531
  276. uint16_t pulse_timer[MAX_PULSETIMERS]; // 532
  277. uint16_t button_debounce; // 542
  278. uint32_t ip_address[4]; // 544
  279. unsigned long energy_kWhtotal; // 554
  280. char mqtt_fulltopic[100]; // 558
  281. SysBitfield2 flag2; // 5BC
  282. unsigned long pulse_counter[MAX_COUNTERS]; // 5C0
  283. uint16_t pulse_counter_type; // 5D0
  284. uint16_t pulse_counter_debounce; // 5D2
  285. uint8_t rf_code[17][9]; // 5D4
  286. uint8_t timezone_minutes; // 66D
  287. uint16_t switch_debounce; // 66E
  288. Timer timer[MAX_TIMERS]; // 670
  289. int latitude; // 6B0
  290. int longitude; // 6B4
  291. uint16_t knx_physsical_addr; // 6B8 (address_t is a uint16_t)
  292. uint16_t knx_GA_addr[MAX_KNX_GA]; // 6BA (address_t is a uint16_t) x KNX_max_GA
  293. uint16_t knx_CB_addr[MAX_KNX_CB]; // 6CE (address_t is a uint16_t) x KNX_max_CB
  294. byte knx_GA_param[MAX_KNX_GA]; // 6E2 Type of Input (relay changed, button pressed, sensor read <-teleperiod)
  295. byte knx_CB_param[MAX_KNX_CB]; // 6EC Type of Output (set relay, toggle relay, reply sensor value)
  296. Mcp230xxCfg mcp230xx_config[16]; // 6F6
  297. uint8_t mcp230xx_int_prio; // 716
  298. byte free_717[1]; // 717
  299. uint16_t mcp230xx_int_timer; // 718
  300. uint8_t rgbwwTable[5]; // 71A
  301. byte free_71F[117]; // 71F
  302. uint32_t drivers[3]; // 794
  303. uint32_t monitors; // 7A0
  304. uint32_t sensors[3]; // 7A4
  305. uint32_t displays; // 7B0
  306. uint32_t energy_kWhtotal_time; // 7B4
  307. unsigned long weight_item; // 7B8 Weight of one item in gram * 10
  308. byte free_7BC[2]; // 7BC
  309. uint16_t weight_max; // 7BE Total max weight in kilogram
  310. unsigned long weight_reference; // 7C0 Reference weight in gram
  311. unsigned long weight_calibration; // 7C4
  312. unsigned long energy_frequency_calibration; // 7C8
  313. uint16_t web_refresh; // 7CC
  314. char mems[MAX_RULE_MEMS][10]; // 7CE
  315. char rules[MAX_RULE_SETS][MAX_RULE_SIZE]; // 800 uses 512 bytes in v5.12.0m, 3 x 512 bytes in v5.14.0b
  316. // E00 - FFF free locations
  317. } Settings;
  318. struct RTCRBT {
  319. uint16_t valid; // 280 (RTC memory offset 100 - sizeof(RTCRBT))
  320. uint8_t fast_reboot_count; // 282
  321. uint8_t free_003[1]; // 283
  322. } RtcReboot;
  323. struct RTCMEM {
  324. uint16_t valid; // 290 (RTC memory offset 100)
  325. byte oswatch_blocked_loop; // 292
  326. uint8_t ota_loader; // 293
  327. unsigned long energy_kWhtoday; // 294
  328. unsigned long energy_kWhtotal; // 298
  329. unsigned long pulse_counter[MAX_COUNTERS]; // 29C
  330. power_t power; // 2AC
  331. uint8_t free_020[60]; // 2B0
  332. // 2EC - 2FF free locations
  333. } RtcSettings;
  334. struct TIME_T {
  335. uint8_t second;
  336. uint8_t minute;
  337. uint8_t hour;
  338. uint8_t day_of_week; // sunday is day 1
  339. uint8_t day_of_month;
  340. uint8_t month;
  341. char name_of_month[4];
  342. uint16_t day_of_year;
  343. uint16_t year;
  344. unsigned long days;
  345. unsigned long valid;
  346. } RtcTime;
  347. struct XDRVMAILBOX {
  348. uint16_t valid;
  349. uint16_t index;
  350. uint16_t data_len;
  351. uint16_t payload16;
  352. int16_t payload;
  353. uint8_t grpflg;
  354. uint8_t notused;
  355. char *topic;
  356. char *data;
  357. } XdrvMailbox;
  358. #define MAX_RULES_FLAG 7 // Number of bits used in RulesBitfield (tricky I know...)
  359. typedef union { // Restricted by MISRA-C Rule 18.4 but so useful...
  360. uint16_t data; // Allow bit manipulation
  361. struct {
  362. uint16_t system_boot : 1;
  363. uint16_t time_init : 1;
  364. uint16_t time_set : 1;
  365. uint16_t mqtt_connected : 1;
  366. uint16_t mqtt_disconnected : 1;
  367. uint16_t wifi_connected : 1;
  368. uint16_t wifi_disconnected : 1;
  369. uint16_t spare07 : 1;
  370. uint16_t spare08 : 1;
  371. uint16_t spare09 : 1;
  372. uint16_t spare10 : 1;
  373. uint16_t spare11 : 1;
  374. uint16_t spare12 : 1;
  375. uint16_t spare13 : 1;
  376. uint16_t spare14 : 1;
  377. uint16_t spare15 : 1;
  378. };
  379. } RulesBitfield;
  380. typedef union {
  381. uint8_t data;
  382. struct {
  383. uint8_t wifi_down : 1;
  384. uint8_t mqtt_down : 1;
  385. uint8_t spare02 : 1;
  386. uint8_t spare03 : 1;
  387. uint8_t spare04 : 1;
  388. uint8_t spare05 : 1;
  389. uint8_t spare06 : 1;
  390. uint8_t spare07 : 1;
  391. };
  392. } StateBitfield;
  393. // See issue https://github.com/esp8266/Arduino/issues/2913
  394. #ifdef USE_ADC_VCC
  395. ADC_MODE(ADC_VCC); // Set ADC input for Power Supply Voltage usage
  396. #endif
  397. #endif // _SETTINGS_H_