From 231f342497626fede2466164941db55d724df010 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sun, 13 Jul 2025 15:37:33 +0200 Subject: [PATCH] ESP32 reduce Domoticz memory and filesystem footprint. Redesign GUI --- tasmota/language/af_AF.h | 2 + tasmota/language/bg_BG.h | 2 + tasmota/language/ca_AD.h | 2 + tasmota/language/cs_CZ.h | 2 + tasmota/language/de_DE.h | 2 + tasmota/language/el_GR.h | 2 + tasmota/language/en_GB.h | 2 + tasmota/language/es_ES.h | 2 + tasmota/language/fr_FR.h | 2 + tasmota/language/fy_NL.h | 2 + tasmota/language/he_HE.h | 2 + tasmota/language/hu_HU.h | 2 + tasmota/language/it_IT.h | 2 + tasmota/language/ko_KO.h | 2 + tasmota/language/lt_LT.h | 2 + tasmota/language/nl_NL.h | 2 + tasmota/language/pl_PL.h | 2 + tasmota/language/pt_BR.h | 2 + tasmota/language/pt_PT.h | 2 + tasmota/language/ro_RO.h | 2 + tasmota/language/ru_RU.h | 2 + tasmota/language/sk_SK.h | 2 + tasmota/language/sv_SE.h | 2 + tasmota/language/tr_TR.h | 2 + tasmota/language/uk_UA.h | 2 + tasmota/language/vi_VN.h | 2 + tasmota/language/zh_CN.h | 2 + tasmota/language/zh_TW.h | 2 + .../xdrv_07_esp32_domoticz.ino | 192 +++++++++++------- 29 files changed, 176 insertions(+), 72 deletions(-) diff --git a/tasmota/language/af_AF.h b/tasmota/language/af_AF.h index bb1d22d8d..a08d31a4b 100644 --- a/tasmota/language/af_AF.h +++ b/tasmota/language/af_AF.h @@ -453,6 +453,8 @@ #define D_DOMOTICZ_IDX "Idx" #define D_DOMOTICZ_KEY_IDX "Key idx" #define D_DOMOTICZ_SWITCH_IDX "Switch idx" +#define D_DOMOTICZ_KEY "Key" +#define D_DOMOTICZ_SWITCH "Switch" #define D_DOMOTICZ_SENSOR_IDX "Sensor idx" #define D_DOMOTICZ_TEMP "Temp" #define D_DOMOTICZ_TEMP_HUM "Temp,Hum" diff --git a/tasmota/language/bg_BG.h b/tasmota/language/bg_BG.h index 8c62d2273..25237c1c3 100644 --- a/tasmota/language/bg_BG.h +++ b/tasmota/language/bg_BG.h @@ -453,6 +453,8 @@ #define D_DOMOTICZ_IDX "Idx" #define D_DOMOTICZ_KEY_IDX "Key idx" #define D_DOMOTICZ_SWITCH_IDX "Switch idx" +#define D_DOMOTICZ_KEY "Key" +#define D_DOMOTICZ_SWITCH "Switch" #define D_DOMOTICZ_SENSOR_IDX "Sensor idx" #define D_DOMOTICZ_TEMP "Темп" #define D_DOMOTICZ_TEMP_HUM "Темп,Влаж" diff --git a/tasmota/language/ca_AD.h b/tasmota/language/ca_AD.h index 0d318eda4..72ce82387 100644 --- a/tasmota/language/ca_AD.h +++ b/tasmota/language/ca_AD.h @@ -453,6 +453,8 @@ #define D_DOMOTICZ_IDX "Idx" #define D_DOMOTICZ_KEY_IDX "Key idx" #define D_DOMOTICZ_SWITCH_IDX "Switch idx" +#define D_DOMOTICZ_KEY "Key" +#define D_DOMOTICZ_SWITCH "Switch" #define D_DOMOTICZ_SENSOR_IDX "Sensor idx" #define D_DOMOTICZ_TEMP "Temp" #define D_DOMOTICZ_TEMP_HUM "Temp,Hum" diff --git a/tasmota/language/cs_CZ.h b/tasmota/language/cs_CZ.h index bf36d123d..9f5931a4d 100644 --- a/tasmota/language/cs_CZ.h +++ b/tasmota/language/cs_CZ.h @@ -453,6 +453,8 @@ #define D_DOMOTICZ_IDX "Idx" #define D_DOMOTICZ_KEY_IDX "Key idx" #define D_DOMOTICZ_SWITCH_IDX "Spinac idx" +#define D_DOMOTICZ_KEY "Key" +#define D_DOMOTICZ_SWITCH "Switch" #define D_DOMOTICZ_SENSOR_IDX "Sensor idx" #define D_DOMOTICZ_TEMP "Temp" #define D_DOMOTICZ_TEMP_HUM "Temp,Vlhk" diff --git a/tasmota/language/de_DE.h b/tasmota/language/de_DE.h index ec0bc5a77..a3263f79a 100644 --- a/tasmota/language/de_DE.h +++ b/tasmota/language/de_DE.h @@ -453,6 +453,8 @@ #define D_DOMOTICZ_IDX "Idx" #define D_DOMOTICZ_KEY_IDX "Key Idx" #define D_DOMOTICZ_SWITCH_IDX "Switch Idx" +#define D_DOMOTICZ_KEY "Key" +#define D_DOMOTICZ_SWITCH "Switch" #define D_DOMOTICZ_SENSOR_IDX "Sensor Idx" #define D_DOMOTICZ_TEMP "Temp" #define D_DOMOTICZ_TEMP_HUM "Temp,Hum" diff --git a/tasmota/language/el_GR.h b/tasmota/language/el_GR.h index e2d2a39b8..ddda91d25 100644 --- a/tasmota/language/el_GR.h +++ b/tasmota/language/el_GR.h @@ -453,6 +453,8 @@ #define D_DOMOTICZ_IDX "Idx" #define D_DOMOTICZ_KEY_IDX "Key idx" #define D_DOMOTICZ_SWITCH_IDX "Switch idx" +#define D_DOMOTICZ_KEY "Key" +#define D_DOMOTICZ_SWITCH "Switch" #define D_DOMOTICZ_SENSOR_IDX "Sensor idx" #define D_DOMOTICZ_TEMP "Temp" #define D_DOMOTICZ_TEMP_HUM "Temp,Hum" diff --git a/tasmota/language/en_GB.h b/tasmota/language/en_GB.h index d25a4a0be..459c82910 100644 --- a/tasmota/language/en_GB.h +++ b/tasmota/language/en_GB.h @@ -453,6 +453,8 @@ #define D_DOMOTICZ_IDX "Idx" #define D_DOMOTICZ_KEY_IDX "Key idx" #define D_DOMOTICZ_SWITCH_IDX "Switch idx" +#define D_DOMOTICZ_KEY "Key" +#define D_DOMOTICZ_SWITCH "Switch" #define D_DOMOTICZ_SENSOR_IDX "Sensor idx" #define D_DOMOTICZ_TEMP "Temp" #define D_DOMOTICZ_TEMP_HUM "Temp,Hum" diff --git a/tasmota/language/es_ES.h b/tasmota/language/es_ES.h index 1ca645658..5c687ab39 100644 --- a/tasmota/language/es_ES.h +++ b/tasmota/language/es_ES.h @@ -453,6 +453,8 @@ #define D_DOMOTICZ_IDX "Idx" #define D_DOMOTICZ_KEY_IDX "Key idx" #define D_DOMOTICZ_SWITCH_IDX "Switch idx" +#define D_DOMOTICZ_KEY "Key" +#define D_DOMOTICZ_SWITCH "Switch" #define D_DOMOTICZ_SENSOR_IDX "Sensor idx" #define D_DOMOTICZ_TEMP "Temp" #define D_DOMOTICZ_TEMP_HUM "Temp,Hum" diff --git a/tasmota/language/fr_FR.h b/tasmota/language/fr_FR.h index 60903fe25..2e5a90735 100644 --- a/tasmota/language/fr_FR.h +++ b/tasmota/language/fr_FR.h @@ -453,6 +453,8 @@ #define D_DOMOTICZ_IDX "Idx" #define D_DOMOTICZ_KEY_IDX "Key idx" #define D_DOMOTICZ_SWITCH_IDX "Switch idx" +#define D_DOMOTICZ_KEY "Key" +#define D_DOMOTICZ_SWITCH "Switch" #define D_DOMOTICZ_SENSOR_IDX "Sensor idx" #define D_DOMOTICZ_TEMP "Temp" #define D_DOMOTICZ_TEMP_HUM "Temp,Hum" diff --git a/tasmota/language/fy_NL.h b/tasmota/language/fy_NL.h index a5191befc..f32ee7b0f 100644 --- a/tasmota/language/fy_NL.h +++ b/tasmota/language/fy_NL.h @@ -453,6 +453,8 @@ #define D_DOMOTICZ_IDX "Idx" #define D_DOMOTICZ_KEY_IDX "Toets idx" #define D_DOMOTICZ_SWITCH_IDX "Omskeakelje idx" +#define D_DOMOTICZ_KEY "Toets" +#define D_DOMOTICZ_SWITCH "Omskeakelje" #define D_DOMOTICZ_SENSOR_IDX "Sensor idx" #define D_DOMOTICZ_TEMP "Temp" #define D_DOMOTICZ_TEMP_HUM "Temp,Hum" diff --git a/tasmota/language/he_HE.h b/tasmota/language/he_HE.h index 620585068..89e296c10 100644 --- a/tasmota/language/he_HE.h +++ b/tasmota/language/he_HE.h @@ -453,6 +453,8 @@ #define D_DOMOTICZ_IDX "Idx" #define D_DOMOTICZ_KEY_IDX "Key idx" #define D_DOMOTICZ_SWITCH_IDX "Switch idx" +#define D_DOMOTICZ_KEY "Key" +#define D_DOMOTICZ_SWITCH "Switch" #define D_DOMOTICZ_SENSOR_IDX "Sensor idx" #define D_DOMOTICZ_TEMP "טמפרטורה" #define D_DOMOTICZ_TEMP_HUM "טמפרטורה,לחות" diff --git a/tasmota/language/hu_HU.h b/tasmota/language/hu_HU.h index 1115853cc..ebf326332 100644 --- a/tasmota/language/hu_HU.h +++ b/tasmota/language/hu_HU.h @@ -453,6 +453,8 @@ #define D_DOMOTICZ_IDX "Idx" #define D_DOMOTICZ_KEY_IDX "Key idx" #define D_DOMOTICZ_SWITCH_IDX "Kapcsoló idx" +#define D_DOMOTICZ_KEY "Key" +#define D_DOMOTICZ_SWITCH "Switch" #define D_DOMOTICZ_SENSOR_IDX "Szenzor idx" #define D_DOMOTICZ_TEMP "Hőmérséklet" #define D_DOMOTICZ_TEMP_HUM "Hőmérséklet, páratartalom" diff --git a/tasmota/language/it_IT.h b/tasmota/language/it_IT.h index d23c9e895..f35d21a21 100644 --- a/tasmota/language/it_IT.h +++ b/tasmota/language/it_IT.h @@ -453,6 +453,8 @@ #define D_DOMOTICZ_IDX "Idx" #define D_DOMOTICZ_KEY_IDX "Idx - chiave" #define D_DOMOTICZ_SWITCH_IDX "Idx - switch" +#define D_DOMOTICZ_KEY "Chiave" +#define D_DOMOTICZ_SWITCH "Switch" #define D_DOMOTICZ_SENSOR_IDX "Idx - sensore" #define D_DOMOTICZ_TEMP "Temp" #define D_DOMOTICZ_TEMP_HUM "Temp,Umd" diff --git a/tasmota/language/ko_KO.h b/tasmota/language/ko_KO.h index 2f5db90cb..a60c13112 100644 --- a/tasmota/language/ko_KO.h +++ b/tasmota/language/ko_KO.h @@ -453,6 +453,8 @@ #define D_DOMOTICZ_IDX "Idx" #define D_DOMOTICZ_KEY_IDX "Key idx" #define D_DOMOTICZ_SWITCH_IDX "스위치 idx" +#define D_DOMOTICZ_KEY "Key" +#define D_DOMOTICZ_SWITCH "Switch" #define D_DOMOTICZ_SENSOR_IDX "센서 idx" #define D_DOMOTICZ_TEMP "온도" #define D_DOMOTICZ_TEMP_HUM "온도,습도" diff --git a/tasmota/language/lt_LT.h b/tasmota/language/lt_LT.h index bb578be17..8a5bdcf41 100644 --- a/tasmota/language/lt_LT.h +++ b/tasmota/language/lt_LT.h @@ -453,6 +453,8 @@ #define D_DOMOTICZ_IDX "Idx" #define D_DOMOTICZ_KEY_IDX "Rakto idx" #define D_DOMOTICZ_SWITCH_IDX "Jungiklio idx" +#define D_DOMOTICZ_KEY "Key" +#define D_DOMOTICZ_SWITCH "Switch" #define D_DOMOTICZ_SENSOR_IDX "Jutiklio idx" #define D_DOMOTICZ_TEMP "Temperatūra" #define D_DOMOTICZ_TEMP_HUM "Temperatūra, Drėgmė" diff --git a/tasmota/language/nl_NL.h b/tasmota/language/nl_NL.h index a4fdfc5da..e61da7f65 100644 --- a/tasmota/language/nl_NL.h +++ b/tasmota/language/nl_NL.h @@ -453,6 +453,8 @@ #define D_DOMOTICZ_IDX "Idx" #define D_DOMOTICZ_KEY_IDX "Toets idx" #define D_DOMOTICZ_SWITCH_IDX "Schakelaar idx" +#define D_DOMOTICZ_KEY "Key" +#define D_DOMOTICZ_SWITCH "Switch" #define D_DOMOTICZ_SENSOR_IDX "Sensor idx" #define D_DOMOTICZ_TEMP "Temp" #define D_DOMOTICZ_TEMP_HUM "Temp,Hum" diff --git a/tasmota/language/pl_PL.h b/tasmota/language/pl_PL.h index d86aa2e4a..9132be03e 100644 --- a/tasmota/language/pl_PL.h +++ b/tasmota/language/pl_PL.h @@ -453,6 +453,8 @@ #define D_DOMOTICZ_IDX "Idx" #define D_DOMOTICZ_KEY_IDX "Klucz Idx" #define D_DOMOTICZ_SWITCH_IDX "Przełącznik Idx" +#define D_DOMOTICZ_KEY "Klucz" +#define D_DOMOTICZ_SWITCH "Przełącznik" #define D_DOMOTICZ_SENSOR_IDX "Sensor Idx" #define D_DOMOTICZ_TEMP "Temperatura" #define D_DOMOTICZ_TEMP_HUM "Temperatura, Wilgotność" diff --git a/tasmota/language/pt_BR.h b/tasmota/language/pt_BR.h index 2db2b5695..fab34b471 100644 --- a/tasmota/language/pt_BR.h +++ b/tasmota/language/pt_BR.h @@ -453,6 +453,8 @@ #define D_DOMOTICZ_IDX "Idx" #define D_DOMOTICZ_KEY_IDX "Chave idx" #define D_DOMOTICZ_SWITCH_IDX "Interruptor idx" +#define D_DOMOTICZ_KEY "Chave" +#define D_DOMOTICZ_SWITCH "Interruptor" #define D_DOMOTICZ_SENSOR_IDX "Sensor idx" #define D_DOMOTICZ_TEMP "Temp" #define D_DOMOTICZ_TEMP_HUM "Temp,Umi" diff --git a/tasmota/language/pt_PT.h b/tasmota/language/pt_PT.h index 59ef7da01..87dfc1cb2 100644 --- a/tasmota/language/pt_PT.h +++ b/tasmota/language/pt_PT.h @@ -453,6 +453,8 @@ #define D_DOMOTICZ_IDX "Idx" #define D_DOMOTICZ_KEY_IDX "Chave idx" #define D_DOMOTICZ_SWITCH_IDX "Interruptor idx" +#define D_DOMOTICZ_KEY "Chave" +#define D_DOMOTICZ_SWITCH "Interruptor" #define D_DOMOTICZ_SENSOR_IDX "Sensor idx" #define D_DOMOTICZ_TEMP "Temp" #define D_DOMOTICZ_TEMP_HUM "Temp,Hum" diff --git a/tasmota/language/ro_RO.h b/tasmota/language/ro_RO.h index 0f946c546..249928bb5 100644 --- a/tasmota/language/ro_RO.h +++ b/tasmota/language/ro_RO.h @@ -453,6 +453,8 @@ #define D_DOMOTICZ_IDX "Idx" #define D_DOMOTICZ_KEY_IDX "Key idx" #define D_DOMOTICZ_SWITCH_IDX "Întrerupator idx" +#define D_DOMOTICZ_KEY "Key" +#define D_DOMOTICZ_SWITCH "Switch" #define D_DOMOTICZ_SENSOR_IDX "Senzor idx" #define D_DOMOTICZ_TEMP "Temp" #define D_DOMOTICZ_TEMP_HUM "Temp,U!mid" diff --git a/tasmota/language/ru_RU.h b/tasmota/language/ru_RU.h index da42fe800..524f811f4 100644 --- a/tasmota/language/ru_RU.h +++ b/tasmota/language/ru_RU.h @@ -454,6 +454,8 @@ #define D_DOMOTICZ_IDX "Idx" #define D_DOMOTICZ_KEY_IDX "Key idx" #define D_DOMOTICZ_SWITCH_IDX "Switch idx" +#define D_DOMOTICZ_KEY "Key" +#define D_DOMOTICZ_SWITCH "Switch" #define D_DOMOTICZ_SENSOR_IDX "Sensor idx" #define D_DOMOTICZ_TEMP "Temp" #define D_DOMOTICZ_TEMP_HUM "Temp,Hum" diff --git a/tasmota/language/sk_SK.h b/tasmota/language/sk_SK.h index a215a0326..6bfc51cea 100644 --- a/tasmota/language/sk_SK.h +++ b/tasmota/language/sk_SK.h @@ -453,6 +453,8 @@ #define D_DOMOTICZ_IDX "Idx" #define D_DOMOTICZ_KEY_IDX "Key idx" #define D_DOMOTICZ_SWITCH_IDX "Spinac idx" +#define D_DOMOTICZ_KEY "Key" +#define D_DOMOTICZ_SWITCH "Switch" #define D_DOMOTICZ_SENSOR_IDX "Sensor idx" #define D_DOMOTICZ_TEMP "Temp" #define D_DOMOTICZ_TEMP_HUM "Temp,Vlhk" diff --git a/tasmota/language/sv_SE.h b/tasmota/language/sv_SE.h index 31874de29..7da9abe3e 100644 --- a/tasmota/language/sv_SE.h +++ b/tasmota/language/sv_SE.h @@ -453,6 +453,8 @@ #define D_DOMOTICZ_IDX "Idx" #define D_DOMOTICZ_KEY_IDX "Nyckel idx" #define D_DOMOTICZ_SWITCH_IDX "Switch idx" +#define D_DOMOTICZ_KEY "Nyckel" +#define D_DOMOTICZ_SWITCH "Switch" #define D_DOMOTICZ_SENSOR_IDX "Sensor idx" #define D_DOMOTICZ_TEMP "Temp" #define D_DOMOTICZ_TEMP_HUM "Temp,Fuk" diff --git a/tasmota/language/tr_TR.h b/tasmota/language/tr_TR.h index 4c00320cc..3e0de6dcd 100644 --- a/tasmota/language/tr_TR.h +++ b/tasmota/language/tr_TR.h @@ -453,6 +453,8 @@ #define D_DOMOTICZ_IDX "Idx" #define D_DOMOTICZ_KEY_IDX "Key idx" #define D_DOMOTICZ_SWITCH_IDX "Switch idx" +#define D_DOMOTICZ_KEY "Key" +#define D_DOMOTICZ_SWITCH "Switch" #define D_DOMOTICZ_SENSOR_IDX "Sensor idx" #define D_DOMOTICZ_TEMP "Temp" #define D_DOMOTICZ_TEMP_HUM "Temp,Hum" diff --git a/tasmota/language/uk_UA.h b/tasmota/language/uk_UA.h index e72a0d319..523fa2155 100644 --- a/tasmota/language/uk_UA.h +++ b/tasmota/language/uk_UA.h @@ -453,6 +453,8 @@ #define D_DOMOTICZ_IDX "Idx" #define D_DOMOTICZ_KEY_IDX "Ключ idx" #define D_DOMOTICZ_SWITCH_IDX "Перемикач idx" +#define D_DOMOTICZ_KEY "Ключ" +#define D_DOMOTICZ_SWITCH "Перемикач" #define D_DOMOTICZ_SENSOR_IDX "Давач idx" #define D_DOMOTICZ_TEMP "Температура" #define D_DOMOTICZ_TEMP_HUM "Темп,Волог" diff --git a/tasmota/language/vi_VN.h b/tasmota/language/vi_VN.h index 420c773d5..af82f2212 100644 --- a/tasmota/language/vi_VN.h +++ b/tasmota/language/vi_VN.h @@ -453,6 +453,8 @@ #define D_DOMOTICZ_IDX "Idx" #define D_DOMOTICZ_KEY_IDX "Key idx" #define D_DOMOTICZ_SWITCH_IDX "Switch idx" +#define D_DOMOTICZ_KEY "Key" +#define D_DOMOTICZ_SWITCH "Switch" #define D_DOMOTICZ_SENSOR_IDX "Sensor idx" #define D_DOMOTICZ_TEMP "Temp" #define D_DOMOTICZ_TEMP_HUM "Temp,Hum" diff --git a/tasmota/language/zh_CN.h b/tasmota/language/zh_CN.h index 93d454a54..5009a7d16 100644 --- a/tasmota/language/zh_CN.h +++ b/tasmota/language/zh_CN.h @@ -453,6 +453,8 @@ #define D_DOMOTICZ_IDX "Idx" #define D_DOMOTICZ_KEY_IDX "Key idx" #define D_DOMOTICZ_SWITCH_IDX "开关 idx" +#define D_DOMOTICZ_KEY "Key" +#define D_DOMOTICZ_SWITCH "Switch" #define D_DOMOTICZ_SENSOR_IDX "传感器 idx" #define D_DOMOTICZ_TEMP "温度" #define D_DOMOTICZ_TEMP_HUM "温度,湿度" diff --git a/tasmota/language/zh_TW.h b/tasmota/language/zh_TW.h index 3523085b5..ae2469a5c 100644 --- a/tasmota/language/zh_TW.h +++ b/tasmota/language/zh_TW.h @@ -453,6 +453,8 @@ #define D_DOMOTICZ_IDX "Idx" #define D_DOMOTICZ_KEY_IDX "Key idx" #define D_DOMOTICZ_SWITCH_IDX "開關 idx" +#define D_DOMOTICZ_KEY "Key" +#define D_DOMOTICZ_SWITCH "Switch" #define D_DOMOTICZ_SENSOR_IDX "感應器 idx" #define D_DOMOTICZ_TEMP "溫度" #define D_DOMOTICZ_TEMP_HUM "溫度、濕度" diff --git a/tasmota/tasmota_xdrv_driver/xdrv_07_esp32_domoticz.ino b/tasmota/tasmota_xdrv_driver/xdrv_07_esp32_domoticz.ino index d89fe6d56..00a9c6ec4 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_07_esp32_domoticz.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_07_esp32_domoticz.ino @@ -69,15 +69,17 @@ char domoticz_in_topic[] = DOMOTICZ_IN_TOPIC; typedef struct DzSettings_t { uint32_t crc32; // To detect file changes uint32_t update_timer; - uint32_t relay_idx[MAX_RELAYS_SET]; - uint32_t key_idx[MAX_RELAYS_SET]; // = MAX_KEYS_SET - uint32_t switch_idx[MAX_RELAYS_SET]; // = MAX_SWITCHES_SET + uint32_t* relay_idx; + uint32_t* key_idx; + uint32_t* switch_idx; uint32_t sensor_idx[DZ_MAX_SENSORS]; } DzSettings_t; typedef struct Domoticz_t { DzSettings_t Settings; // Persistent settings int update_timer; + uint8_t keys; + uint8_t switches; bool subscribe; bool update_flag; #ifdef USE_SHUTTER @@ -107,19 +109,19 @@ bool DomoticzLoadData(void) { Domoticz->Settings.update_timer = root.getUInt(PSTR("Update"), Domoticz->Settings.update_timer); JsonParserArray arr = root[PSTR("Relay")]; if (arr) { - for (uint32_t i = 0; i < MAX_RELAYS_SET; i++) { + for (uint32_t i = 0; i < TasmotaGlobal.devices_present; i++) { if (arr[i]) { Domoticz->Settings.relay_idx[i] = arr[i].getUInt(); } } } arr = root[PSTR("Key")]; if (arr) { - for (uint32_t i = 0; i < MAX_RELAYS_SET; i++) { + for (uint32_t i = 0; i < Domoticz->keys; i++) { if (arr[i]) { Domoticz->Settings.key_idx[i] = arr[i].getUInt(); } } } arr = root[PSTR("Switch")]; if (arr) { - for (uint32_t i = 0; i < MAX_RELAYS_SET; i++) { + for (uint32_t i = 0; i < Domoticz->switches; i++) { if (arr[i]) { Domoticz->Settings.switch_idx[i] = arr[i].getUInt(); } } } @@ -139,18 +141,25 @@ bool DomoticzSaveData(void) { Domoticz->Settings.crc32, Domoticz->Settings.update_timer); ResponseAppend_P(PSTR(",\"Relay\":")); - for (uint32_t i = 0; i < MAX_RELAYS_SET; i++) { + for (uint32_t i = 0; i < TasmotaGlobal.devices_present; i++) { ResponseAppend_P(PSTR("%c%d"), (0==i)?'[':',', Domoticz->Settings.relay_idx[i]); } - ResponseAppend_P(PSTR("],\"Key\":")); - for (uint32_t i = 0; i < MAX_RELAYS_SET; i++) { - ResponseAppend_P(PSTR("%c%d"), (0==i)?'[':',', Domoticz->Settings.key_idx[i]); + ResponseAppend_P(PSTR("]")); + if (Domoticz->keys) { + ResponseAppend_P(PSTR(",\"Key\":")); + for (uint32_t i = 0; i < Domoticz->keys; i++) { + ResponseAppend_P(PSTR("%c%d"), (0==i)?'[':',', Domoticz->Settings.key_idx[i]); + } + ResponseAppend_P(PSTR("]")); } - ResponseAppend_P(PSTR("],\"Switch\":")); - for (uint32_t i = 0; i < MAX_RELAYS_SET; i++) { - ResponseAppend_P(PSTR("%c%d"), (0==i)?'[':',', Domoticz->Settings.switch_idx[i]); + if (Domoticz->switches) { + ResponseAppend_P(PSTR(",\"Switch\":")); + for (uint32_t i = 0; i < Domoticz->switches; i++) { + ResponseAppend_P(PSTR("%c%d"), (0==i)?'[':',', Domoticz->Settings.switch_idx[i]); + } + ResponseAppend_P(PSTR("]")); } - ResponseAppend_P(PSTR("],\"Sensor\":")); + ResponseAppend_P(PSTR(",\"Sensor\":")); for (uint32_t i = 0; i < DZ_MAX_SENSORS; i++) { ResponseAppend_P(PSTR("%c%d"), (0==i)?'[':',', Domoticz->Settings.sensor_idx[i]); } @@ -173,22 +182,26 @@ void DomoticzDeleteData(void) { void DomoticzSettingsLoad(bool erase) { // Called from FUNC_PRE_INIT (erase = 0) once at restart // Called from FUNC_RESET_SETTINGS (erase = 1) after command reset 4, 5, or 6 - memset(&Domoticz->Settings, 0x00, sizeof(DzSettings_t)); +// memset(&Domoticz->Settings, 0x00, sizeof(DzSettings_t)); #ifndef CONFIG_IDF_TARGET_ESP32P4 // Init any other parameter in struct DzSettings Domoticz->Settings.update_timer = Settings->domoticz_update_timer; for (uint32_t i = 0; i < MAX_DOMOTICZ_IDX; i++) { - Domoticz->Settings.relay_idx[i] = Settings->domoticz_relay_idx[i]; - Domoticz->Settings.key_idx[i] = Settings->domoticz_key_idx[i]; - Domoticz->Settings.switch_idx[i] = Settings->domoticz_switch_idx[i]; + if (i < TasmotaGlobal.devices_present) { + Domoticz->Settings.relay_idx[i] = Settings->domoticz_relay_idx[i]; + } + if (i < Domoticz->keys) { + Domoticz->Settings.key_idx[i] = Settings->domoticz_key_idx[i]; + } + if (i < Domoticz->switches) { + Domoticz->Settings.switch_idx[i] = Settings->domoticz_switch_idx[i]; + } } - uint32_t max_sns_idx = MAX_DOMOTICZ_SNS_IDX; - if (max_sns_idx > DZ_MAX_SENSORS) { - max_sns_idx = DZ_MAX_SENSORS; - } - for (uint32_t i = 0; i < max_sns_idx; i++) { - Domoticz->Settings.sensor_idx[i] = Settings->domoticz_sensor_idx[i]; + for (uint32_t i = 0; i < MAX_DOMOTICZ_SNS_IDX; i++) { + if (i < DZ_MAX_SENSORS) { + Domoticz->Settings.sensor_idx[i] = Settings->domoticz_sensor_idx[i]; + } } // *** End Init default values *** #endif // CONFIG_IDF_TARGET_ESP32P4 @@ -214,6 +227,13 @@ void DomoticzSettingsSave(void) { // Called from FUNC_SAVE_SETTINGS every SaveData second and at restart #ifdef USE_UFILESYS uint32_t crc32 = GetCfgCrc32((uint8_t*)&Domoticz->Settings +4, sizeof(DzSettings_t) -4); // Skip crc32 + crc32 += GetCfgCrc32((uint8_t*)Domoticz->Settings.relay_idx, TasmotaGlobal.devices_present * sizeof(uint32_t)); + if (Domoticz->keys) { + crc32 += GetCfgCrc32((uint8_t*)Domoticz->Settings.key_idx, Domoticz->keys * sizeof(uint32_t)); + } + if (Domoticz->switches) { + crc32 += GetCfgCrc32((uint8_t*)Domoticz->Settings.switch_idx, Domoticz->switches * sizeof(uint32_t)); + } if (crc32 != Domoticz->Settings.crc32) { Domoticz->Settings.crc32 = crc32; if (DomoticzSaveData()) { @@ -257,12 +277,12 @@ int DomoticzRssiQuality(void) { } uint32_t DomoticzRelayIdx(uint32_t relay) { - if (relay >= MAX_RELAYS_SET) { return 0; } + if (relay >= TasmotaGlobal.devices_present) { return 0; } return Domoticz->Settings.relay_idx[relay]; } void DomoticzSetRelayIdx(uint32_t relay, uint32_t idx) { - if (relay >= MAX_RELAYS_SET) { return; } + if (relay >= TasmotaGlobal.devices_present) { return; } Domoticz->Settings.relay_idx[relay] = idx; } @@ -271,7 +291,7 @@ void DomoticzSetRelayIdx(uint32_t relay, uint32_t idx) { void MqttPublishDomoticzPowerState(uint8_t device) { if (Settings->flag.mqtt_enabled) { // SetOption3 - Enable MQTT if (device < 1) { device = 1; } - if ((device > TasmotaGlobal.devices_present) || (device > MAX_RELAYS_SET)) { return; } + if (device > TasmotaGlobal.devices_present) { return; } if (DomoticzRelayIdx(device -1)) { #ifdef USE_SHUTTER if (Domoticz->is_shutter) { @@ -313,16 +333,15 @@ void DomoticzMqttUpdate(void) { break; } #endif // USE_SHUTTER - MqttPublishDomoticzPowerState(i); + MqttPublishDomoticzPowerState(i); } } } } void DomoticzMqttSubscribe(void) { - uint8_t maxdev = (TasmotaGlobal.devices_present > MAX_RELAYS_SET) ? MAX_RELAYS_SET : TasmotaGlobal.devices_present; bool any_relay = false; - for (uint32_t i = 0; i < maxdev; i++) { + for (uint32_t i = 0; i < TasmotaGlobal.devices_present; i++) { if (DomoticzRelayIdx(i)) { any_relay = true; break; @@ -343,8 +362,7 @@ void DomoticzMqttSubscribe(void) { int DomoticzIdx2Relay(uint32_t idx) { if (idx > 0) { - uint32_t maxdev = (TasmotaGlobal.devices_present > MAX_RELAYS_SET) ? MAX_RELAYS_SET : TasmotaGlobal.devices_present; - for (uint32_t i = 0; i < maxdev; i++) { + for (uint32_t i = 0; i < TasmotaGlobal.devices_present; i++) { if (idx == DomoticzRelayIdx(i)) { return i; } @@ -484,16 +502,22 @@ void DomoticzSendSwitch(uint32_t type, uint32_t index, uint32_t state) { MqttPublish(domoticz_in_topic); } -bool DomoticzSendKey(uint8_t key, uint8_t device, uint8_t state, uint8_t svalflg) { - bool result = false; - - if (device <= MAX_RELAYS_SET) { - if ((Domoticz->Settings.key_idx[device -1] || Domoticz->Settings.switch_idx[device -1]) && (svalflg)) { - DomoticzSendSwitch(0, (key) ? Domoticz->Settings.switch_idx[device -1] : Domoticz->Settings.key_idx[device -1], state); - result = true; +bool DomoticzSendKey(uint32_t key, uint32_t device, uint32_t state, uint32_t svalflg) { + // If ButtonTopic or SwitchTopic is set perform DomoticzSendSwitch + if (svalflg) { + if (key) { // Switch + if ((device <= Domoticz->switches) && Domoticz->Settings.switch_idx[device -1]) { + DomoticzSendSwitch(0, Domoticz->Settings.switch_idx[device -1], state); + return true; + } + } else { // Button + if ((device <= Domoticz->keys) && Domoticz->Settings.key_idx[device -1]) { + DomoticzSendSwitch(0, Domoticz->Settings.key_idx[device -1], state); + return true; + } } } - return result; + return false; } /*********************************************************************************************\ @@ -613,10 +637,27 @@ void DomoticzSensorP1SmartMeter(char *usage1, char *usage2, char *return1, char /*********************************************************************************************/ void DomoticzInit(void) { - if (Settings->flag.mqtt_enabled) { // SetOption3 - Enable MQTT + if (Settings->flag.mqtt_enabled && TasmotaGlobal.devices_present) { // SetOption3 - Enable MQTT Domoticz = (Domoticz_t*)calloc(1, sizeof(Domoticz_t)); // Need calloc to reset registers to 0/false if (nullptr == Domoticz) { return; } + Domoticz->Settings.relay_idx = (uint32_t*)calloc(TasmotaGlobal.devices_present, sizeof(uint32_t)); // Need calloc to reset registers to 0/false + for (uint32_t i = 0; i < TasmotaGlobal.devices_present; i++) { + if (ButtonUsed(i)) { Domoticz->keys++; } + if (SwitchUsed(i)) { Domoticz->switches++; } + } + if (Domoticz->keys) { + Domoticz->Settings.key_idx = (uint32_t*)calloc(Domoticz->keys, sizeof(uint32_t)); // Need calloc to reset registers to 0/false + if (nullptr == Domoticz->Settings.key_idx) { return; } + } + if (Domoticz->switches) { + Domoticz->Settings.switch_idx = (uint32_t*)calloc(Domoticz->switches, sizeof(uint32_t)); // Need calloc to reset registers to 0/false + if (nullptr == Domoticz->Settings.switch_idx) { return; } + } + + AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_DOMOTICZ "Support %d Device(s), %d Button(s) and %d Switch(es)"), + TasmotaGlobal.devices_present, Domoticz->keys, Domoticz->switches); + DomoticzSettingsLoad(0); Domoticz->update_flag = true; } @@ -630,10 +671,10 @@ void CmndDomoticzIdx(void) { // DzIdx0 0 - Reset all disabling subscription too // DzIdx1 403 - Relate relay1 (=Power1) to Domoticz Idx 403 persistent // DzIdx5 403 - Relate relay5 (=Power5) to Domoticz Idx 403 non-persistent (need a rule at boot to become persistent) - if ((XdrvMailbox.index >= 0) && (XdrvMailbox.index <= MAX_RELAYS_SET)) { + if ((XdrvMailbox.index >= 0) && (XdrvMailbox.index <= TasmotaGlobal.devices_present)) { if (XdrvMailbox.payload >= 0) { if (0 == XdrvMailbox.index) { - for (uint32_t i = 0; i < MAX_RELAYS_SET; i++) { + for (uint32_t i = 0; i < TasmotaGlobal.devices_present; i++) { DomoticzSetRelayIdx(i, 0); } } else { @@ -646,7 +687,7 @@ void CmndDomoticzIdx(void) { } void CmndDomoticzKeyIdx(void) { - if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= MAX_RELAYS_SET)) { + if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= Domoticz->keys)) { if (XdrvMailbox.payload >= 0) { Domoticz->Settings.key_idx[XdrvMailbox.index -1] = XdrvMailbox.payload; } @@ -655,7 +696,7 @@ void CmndDomoticzKeyIdx(void) { } void CmndDomoticzSwitchIdx(void) { - if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= MAX_RELAYS_SET)) { + if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= Domoticz->switches)) { if (XdrvMailbox.payload >= 0) { Domoticz->Settings.switch_idx[XdrvMailbox.index -1] = XdrvMailbox.payload; } @@ -726,16 +767,16 @@ const char HTTP_BTN_MENU_DOMOTICZ[] PROGMEM = const char HTTP_FORM_DOMOTICZ[] PROGMEM = "