diff --git a/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino b/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino index c713d0697..9a86617d7 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino @@ -304,23 +304,21 @@ const char HTTP_FORM_LOGIN[] PROGMEM = "" ""; +const char HTTP_FIELDSET_LEGEND[] PROGMEM = + "
 %s "; + const char HTTP_FORM_TEMPLATE[] PROGMEM = - "
 " D_TEMPLATE_PARAMETERS " " "
"; const char HTTP_FORM_TEMPLATE_FLAG[] PROGMEM = - "

" // Keep close so do not use
- "
 " D_TEMPLATE_FLAGS " 

" // "
" "

"; const char HTTP_FORM_MODULE[] PROGMEM = - "
 " D_MODULE_PARAMETERS " " "" "

" D_MODULE_TYPE " (%s)

" "
"; const char HTTP_FORM_WIFI_PART1[] PROGMEM = - "
 " D_WIFI_PARAMETERS " " "" "

" D_AP1_SSID "%s

" // Need \" instead of ' to be able to use ' in text (#8489) "


 " D_LOGGING_PARAMETERS " " - ""; + ""; const char HTTP_FORM_LOG2[] PROGMEM = "

" D_SYSLOG_HOST " (" SYS_LOG_HOST ")

" "

" D_SYSLOG_PORT " (" STR(SYS_LOG_PORT) ")

" "

" D_TELEMETRY_PERIOD " (" STR(TELE_PERIOD) ")

"; -const char HTTP_FORM_OTHER[] PROGMEM = - "
 " D_OTHER_PARAMETERS " " +const char HTTP_FORM_OTHER1[] PROGMEM = "" - "

" - "
 " D_TEMPLATE " " + "

"; + +const char HTTP_FORM_OTHER2[] PROGMEM = "

" // We need ' apostrophe here as the template contains " quotation mark "

" "
" @@ -365,17 +362,15 @@ const char HTTP_FORM_END[] PROGMEM = "" "
"; -const char HTTP_FORM_RST[] PROGMEM = - "
" - "
 " D_RESTORE_CONFIGURATION " "; +const char HTTP_DIV_BLOCK[] PROGMEM = + "
"; + const char HTTP_FORM_UPG[] PROGMEM = - "
" - "
 " D_UPGRADE_BY_WEBSERVER " " "
" "
" D_OTA_URL "

" "
" - "


" - "
 " D_UPGRADE_BY_FILE_UPLOAD " "; + "


"; + const char HTTP_FORM_RST_UPG[] PROGMEM = // ESP8266 or ESP32 dual partition "
" "

" @@ -970,7 +965,10 @@ void WSContentStart_P(const char* title, bool auth) { WSContentBegin(200, CT_HTML); if (title != nullptr) { - WSContentSend_P(HTTP_HEADER1, PSTR(D_HTML_LANGUAGE), SettingsTextEscaped(SET_DEVICENAME).c_str(), title); + WSContentSend_P(HTTP_HEADER1, + PSTR(D_HTML_LANGUAGE), + SettingsTextEscaped(SET_DEVICENAME).c_str(), + title); } } @@ -1152,19 +1150,29 @@ void WSContentSeparator(uint32_t state) { /*-------------------------------------------------------------------------------------------*/ void WSContentSend_Temp(const char *types, float f_temperature) { - WSContentSend_PD(HTTP_SNS_F_TEMP, types, Settings->flag2.temperature_resolution, &f_temperature, TempUnit()); + WSContentSend_PD(HTTP_SNS_F_TEMP, + types, + Settings->flag2.temperature_resolution, + &f_temperature, + TempUnit()); } /*-------------------------------------------------------------------------------------------*/ void WSContentSend_Voltage(const char *types, float f_voltage) { - WSContentSend_PD(HTTP_SNS_F_VOLTAGE, types, Settings->flag2.voltage_resolution, &f_voltage); + WSContentSend_PD(HTTP_SNS_F_VOLTAGE, + types, + Settings->flag2.voltage_resolution, + &f_voltage); } /*-------------------------------------------------------------------------------------------*/ void WSContentSend_Current(const char *types, float f_current) { - WSContentSend_PD(HTTP_SNS_F_CURRENT, types, Settings->flag2.current_resolution, &f_current); + WSContentSend_PD(HTTP_SNS_F_CURRENT, + types, + Settings->flag2.current_resolution, + &f_current); } /*-------------------------------------------------------------------------------------------*/ @@ -1261,11 +1269,14 @@ void WebRestart(uint32_t type) { WSContentSendStyle(); if (type) { if (!(3 == type)) { - WSContentSend_P(PSTR("
%s

"), (type==2) ? PSTR(D_TRYING_TO_CONNECT) : PSTR(D_CONFIGURATION_SAVED) ); + WSContentSend_P(PSTR("
%s

"), + (type==2) ? PSTR(D_TRYING_TO_CONNECT) : PSTR(D_CONFIGURATION_SAVED) ); } else { #if (AFTER_INITIAL_WIFI_CONFIG_GO_TO_NEW_IP) WSContentTextCenterStart(WebColor(COL_TEXT_SUCCESS)); - WSContentSend_P(PSTR(D_SUCCESSFUL_WIFI_CONNECTION "

" D_REDIRECTING_TO_NEW_IP "

%_I
"),(uint32_t)WiFi.localIP(),(uint32_t)WiFi.localIP()); + WSContentSend_P(PSTR(D_SUCCESSFUL_WIFI_CONNECTION "

" D_REDIRECTING_TO_NEW_IP "

%_I
"), + (uint32_t)WiFi.localIP(), + (uint32_t)WiFi.localIP()); #else WSContentTextCenterStart(WebColor(COL_TEXT_SUCCESS)); WSContentSend_P(PSTR(D_SUCCESSFUL_WIFI_CONNECTION "

" D_NOW_YOU_CAN_CLOSE_THIS_WINDOW "

")); @@ -1409,10 +1420,16 @@ void HandleRoot(void) { if (WifiIsInManagerMode()) { #ifndef FIRMWARE_MINIMAL - if (strlen(SettingsText(SET_WEBPWD)) && !(Webserver->hasArg(F("USER1"))) && !(Webserver->hasArg(F("PASS1"))) && HTTP_MANAGER_RESET_ONLY != Web.state) { + if (strlen(SettingsText(SET_WEBPWD)) && + !(Webserver->hasArg(F("USER1"))) && + !(Webserver->hasArg(F("PASS1"))) && + HTTP_MANAGER_RESET_ONLY != Web.state) { HandleWifiLogin(); } else { - if (!strlen(SettingsText(SET_WEBPWD)) || (((Webserver->arg(F("USER1")) == WEB_USERNAME ) && (Webserver->arg(F("PASS1")) == SettingsText(SET_WEBPWD) )) || HTTP_MANAGER_RESET_ONLY == Web.state)) { + if (!strlen(SettingsText(SET_WEBPWD)) || + (((Webserver->arg(F("USER1")) == WEB_USERNAME ) && + (Webserver->arg(F("PASS1")) == SettingsText(SET_WEBPWD) )) || + HTTP_MANAGER_RESET_ONLY == Web.state)) { HandleWifiConfiguration(); } else { // wrong user and pass @@ -1977,7 +1994,8 @@ bool HandleRootStatusRefresh(void) { #ifdef USE_WEB_STATUS_LINE // create a first DIV for the upper left status bar, positioned left-justified // we use the same string literal for both lines to reduce Flash - WSContentSend_P(PSTR("
"), PSTR("left"), PSTR("left")); + WSContentSend_P(PSTR("
"), + PSTR("left"), PSTR("left")); #ifdef USE_WEB_STATUS_LINE_WIFI if (Settings->flag4.network_wifi) { int32_t rssi = WiFi.RSSI(); @@ -1997,7 +2015,8 @@ bool HandleRootStatusRefresh(void) { WSContentSend_P(PSTR("
")); // create a second DIV for the upper right status bar, positioned right-justified - WSContentSend_P(PSTR("
"), PSTR("right"), PSTR("right")); + WSContentSend_P(PSTR("
"), + PSTR("right"), PSTR("right")); XsnsXdrvCall(FUNC_WEB_STATUS_RIGHT); WSContentSend_P(PSTR("
")); #endif // USE_WEB_STATUS_LINE @@ -2005,7 +2024,8 @@ bool HandleRootStatusRefresh(void) { WSContentSend_P(PSTR("{t}")); //
WSContentSeparator(3); // Reset seperator to ignore previous outputs if (Settings->web_time_end) { - WSContentSend_P(PSTR("{s}" D_TIME_OF_DAY "{m}%s{e}"), GetDateAndTime(DT_LOCAL).substring(Settings->web_time_start, Settings->web_time_end).c_str()); + WSContentSend_P(PSTR("{s}" D_TIME_OF_DAY "{m}%s{e}"), + GetDateAndTime(DT_LOCAL).substring(Settings->web_time_start, Settings->web_time_end).c_str()); WSContentSeparator(0); // Print separator } XsnsXdrvCall(FUNC_WEB_SENSOR); @@ -2020,10 +2040,18 @@ bool HandleRootStatusRefresh(void) { WSContentSend_P(PSTR("{t}")); #ifdef USE_SONOFF_IFAN if (IsModuleIfan()) { - WSContentSend_P(HTTP_DEVICE_STATE, 36, (bitRead(TasmotaGlobal.power, 0)) ? PSTR("bold") : PSTR("normal"), 54, GetStateText(bitRead(TasmotaGlobal.power, 0))); + WSContentSend_P(HTTP_DEVICE_STATE, + 36, + (bitRead(TasmotaGlobal.power, 0)) ? PSTR("bold") : PSTR("normal"), + 54, + GetStateText(bitRead(TasmotaGlobal.power, 0))); uint32_t fanspeed = GetFanspeed(); snprintf_P(svalue, sizeof(svalue), PSTR("%d"), fanspeed); - WSContentSend_P(HTTP_DEVICE_STATE, 64, (fanspeed) ? PSTR("bold") : PSTR("normal"), 54, (fanspeed) ? svalue : GetStateText(0)); + WSContentSend_P(HTTP_DEVICE_STATE, + 64, + (fanspeed) ? PSTR("bold") : PSTR("normal"), + 54, + (fanspeed) ? svalue : GetStateText(0)); } else { #endif // USE_SONOFF_IFAN uint32_t cols = Web.buttons_non_light_non_shutter; @@ -2033,7 +2061,11 @@ bool HandleRootStatusRefresh(void) { if (bitRead(Web.light_shutter_button_mask, button_idx -1)) { continue; } // Skip non-sequential shutter button bool power_state = bitRead(TasmotaGlobal.power, button_idx -1); snprintf_P(svalue, sizeof(svalue), PSTR("%d"), power_state); - WSContentSend_P(HTTP_DEVICE_STATE, 100 / cols, (power_state) ? PSTR("bold") : PSTR("normal"), fontsize, (cols < 5) ? GetStateText(power_state) : svalue); + WSContentSend_P(HTTP_DEVICE_STATE, + 100 / cols, + (power_state) ? PSTR("bold") : PSTR("normal"), + fontsize, + (cols < 5) ? GetStateText(power_state) : svalue); button_ptr++; if (button_ptr >= Web.buttons_non_light_non_shutter) { break; } } @@ -2115,11 +2147,15 @@ void WSContentSendNiceLists(uint32_t option) { char stemp[30]; // Template number and Sensor name for (uint32_t i = 0; i < nitems(kGpioNiceList); i++) { // GPIO: }2'0'>None (0)}3}2'17'>Button1 (17)}3... if (option && (1 == i)) { - WSContentSend_P(HTTP_MODULE_TEMPLATE_REPLACE_NO_INDEX, AGPIO(GPIO_USER), PSTR(D_SENSOR_USER)); // }2'255'>User}3 + WSContentSend_P(HTTP_MODULE_TEMPLATE_REPLACE_NO_INDEX, + AGPIO(GPIO_USER), + PSTR(D_SENSOR_USER)); // }2'255'>User}3 } uint32_t ridx = pgm_read_word(&kGpioNiceList[i]) & 0xFFE0; uint32_t midx = BGPIO(ridx); - WSContentSend_P(HTTP_MODULE_TEMPLATE_REPLACE_NO_INDEX, ridx, GetTextIndexed(stemp, sizeof(stemp), midx, kSensorNames)); + WSContentSend_P(HTTP_MODULE_TEMPLATE_REPLACE_NO_INDEX, + ridx, + GetTextIndexed(stemp, sizeof(stemp), midx, kSensorNames)); } WSContentSend_P(PSTR("\";")); @@ -2158,11 +2194,15 @@ void WSContentSendAdcNiceList(uint32_t option) { WSContentSend_P(PSTR("os=\"")); for (uint32_t i = 0; i < nitems(kAdcNiceList); i++) { // GPIO: }2'0'>None}3}2'17'>Analog}3... if (option && (1 == i)) { - WSContentSend_P(HTTP_MODULE_TEMPLATE_REPLACE_NO_INDEX, AGPIO(GPIO_USER), PSTR(D_SENSOR_USER)); // }2'15'>User}3 + WSContentSend_P(HTTP_MODULE_TEMPLATE_REPLACE_NO_INDEX, + AGPIO(GPIO_USER), + PSTR(D_SENSOR_USER)); // }2'15'>User}3 } uint32_t ridx = pgm_read_word(kAdcNiceList + i) & 0xFFE0; uint32_t midx = BGPIO(ridx); - WSContentSend_P(HTTP_MODULE_TEMPLATE_REPLACE_NO_INDEX, ridx, GetTextIndexed(stemp, sizeof(stemp), midx, kSensorNames)); + WSContentSend_P(HTTP_MODULE_TEMPLATE_REPLACE_NO_INDEX, + ridx, + GetTextIndexed(stemp, sizeof(stemp), midx, kSensorNames)); } } #endif // USE_ADC @@ -2234,6 +2274,7 @@ void HandleTemplateConfiguration(void) { WSContentSend_P(HTTP_SCRIPT_TEMPLATE5); WSContentSendStyle(); + WSContentSend_P(HTTP_FIELDSET_LEGEND, PSTR(D_TEMPLATE_PARAMETERS)); WSContentSend_P(HTTP_FORM_TEMPLATE); WSContentSend_P(HTTP_TABLE100); // "
" WSContentSend_P(PSTR("" @@ -2261,6 +2302,8 @@ void HandleTemplateConfiguration(void) { gpio_flag flag = ModuleFlag(); if (flag.data) { + WSContentSend_P(PSTR("

")); // Keep close so do not use
+ WSContentSend_P(HTTP_FIELDSET_LEGEND, PSTR(D_TEMPLATE_FLAGS)); WSContentSend_P(HTTP_FORM_TEMPLATE_FLAG); } @@ -2405,6 +2448,7 @@ void HandleModuleConfiguration(void) { WSContentSend_P(PSTR("}wl(sl);")); WSContentSendStyle(); + WSContentSend_P(HTTP_FIELDSET_LEGEND, PSTR(D_MODULE_PARAMETERS)); WSContentSend_P(HTTP_FORM_MODULE, AnyModuleName(MODULE).c_str()); for (uint32_t i = 0; i < nitems(template_gp.io); i++) { if (ValidGPIO(i, template_gp.io[i])) { @@ -2511,8 +2555,12 @@ void HandleWifiConfiguration(void) { WSContentStart_P(PSTR(D_CONFIGURE_WIFI), !WifiIsInManagerMode()); WSContentSend_P(HTTP_SCRIPT_WIFI); - if (WifiIsInManagerMode()) { WSContentSend_P(HTTP_SCRIPT_HIDE); } - if (WIFI_TESTING == Wifi.wifiTest) { WSContentSend_P(HTTP_SCRIPT_RELOAD_TIME, HTTP_RESTART_RECONNECT_TIME); } + if (WifiIsInManagerMode()) { + WSContentSend_P(HTTP_SCRIPT_HIDE); + } + if (WIFI_TESTING == Wifi.wifiTest) { + WSContentSend_P(HTTP_SCRIPT_RELOAD_TIME, HTTP_RESTART_RECONNECT_TIME); + } #ifdef USE_ENHANCED_GUI_WIFI_SCAN WSContentSendStyle_P("%s", HTTP_HEAD_STYLE_SSI); #else @@ -2580,7 +2628,8 @@ void HandleWifiConfiguration(void) { if (!ssid_copy.length()) { ssid_copy = F("no_name"); } // Print SSID if (!limitScannedNetworks) { - WSContentSend_P(PSTR("
%s
"), HtmlEscape(ssid_copy).c_str()); + WSContentSend_P(PSTR("
%s
"), + HtmlEscape(ssid_copy).c_str()); } skipduplicated = false; String nextSSID = ""; @@ -2607,7 +2656,9 @@ void HandleWifiConfiguration(void) { #endif } else { // Print item - WSContentSend_P(PSTR("%s(%d)
"), WiFi.BSSIDstr(indices[j]).c_str(), WiFi.channel(indices[j])); + WSContentSend_P(PSTR("%s(%d)
"), + WiFi.BSSIDstr(indices[j]).c_str(), + WiFi.channel(indices[j])); #ifdef USE_HIGHLIGHT_CONNECTED_AP HighlightAP = WiFi.BSSIDstr(indices[j]) == WiFi.BSSIDstr(); #endif @@ -2615,9 +2666,14 @@ void HandleWifiConfiguration(void) { // Print signal strength indicator for (uint8_t k = 0; k < 4; k++) { #ifdef USE_HIGHLIGHT_CONNECTED_AP - WSContentSend_P(PSTR(""), k, (k >= num_bars) ? PSTR(" o30") : PSTR(""), HighlightAP ? PSTR(" style='background-color:var(--c_btn);'") : PSTR("")); + WSContentSend_P(PSTR(""), + k, + (k >= num_bars) ? PSTR(" o30") : PSTR(""), + HighlightAP ? PSTR(" style='background-color:var(--c_btn);'") : PSTR("")); #else - WSContentSend_P(PSTR(""), k, (k >= num_bars) ? PSTR(" o30") : PSTR("")); + WSContentSend_P(PSTR(""), + k, + (k >= num_bars) ? PSTR(" o30") : PSTR("")); #endif } WSContentSend_P(PSTR("
")); @@ -2670,16 +2726,27 @@ void HandleWifiConfiguration(void) { } } - WSContentSend_P(PSTR("
"), (limitScannedNetworks) ? PSTR(D_SHOW_MORE_WIFI_NETWORKS) : PSTR(D_SCAN_FOR_WIFI_NETWORKS)); - WSContentSend_P(HTTP_FORM_WIFI_PART1, (WifiIsInManagerMode()) ? "" : PSTR(" (" STA_SSID1 ")"), SettingsTextEscaped(SET_STASSID1).c_str()); + WSContentSend_P(PSTR("
"), + (limitScannedNetworks) ? PSTR(D_SHOW_MORE_WIFI_NETWORKS) : PSTR(D_SCAN_FOR_WIFI_NETWORKS)); + WSContentSend_P(HTTP_FIELDSET_LEGEND, PSTR(D_WIFI_PARAMETERS)); + WSContentSend_P(HTTP_FORM_WIFI_PART1, + (WifiIsInManagerMode()) ? "" : PSTR(" (" STA_SSID1 ")"), + SettingsTextEscaped(SET_STASSID1).c_str()); if (WifiIsInManagerMode()) { // As WIFI_HOSTNAME may contain %s-%04d it cannot be part of HTTP_FORM_WIFI where it will exception WSContentSend_P(PSTR(">

")); } else { #ifdef USE_CORS - WSContentSend_P(HTTP_FORM_WIFI_PART2, SettingsTextEscaped(SET_STASSID2).c_str(), WIFI_HOSTNAME, WIFI_HOSTNAME, SettingsTextEscaped(SET_HOSTNAME).c_str(), SettingsTextEscaped(SET_CORS).c_str()); + WSContentSend_P(HTTP_FORM_WIFI_PART2, + SettingsTextEscaped(SET_STASSID2).c_str(), + WIFI_HOSTNAME, WIFI_HOSTNAME, + SettingsTextEscaped(SET_HOSTNAME).c_str(), + SettingsTextEscaped(SET_CORS).c_str()); #else - WSContentSend_P(HTTP_FORM_WIFI_PART2, SettingsTextEscaped(SET_STASSID2).c_str(), WIFI_HOSTNAME, WIFI_HOSTNAME, SettingsTextEscaped(SET_HOSTNAME).c_str()); + WSContentSend_P(HTTP_FORM_WIFI_PART2, + SettingsTextEscaped(SET_STASSID2).c_str(), + WIFI_HOSTNAME, WIFI_HOSTNAME, + SettingsTextEscaped(SET_HOSTNAME).c_str()); #endif // USE_CORS } @@ -2692,13 +2759,16 @@ void HandleWifiConfiguration(void) { WSContentSend_P(PSTR("

")); if (WIFI_TESTING == Wifi.wifiTest) { - WSContentSend_P(PSTR(D_TRYING_TO_CONNECT "
%s

"), SettingsTextEscaped(SET_STASSID1).c_str()); + WSContentSend_P(PSTR(D_TRYING_TO_CONNECT "
%s
"), + SettingsTextEscaped(SET_STASSID1).c_str()); } else if (WIFI_TEST_FINISHED_BAD == Wifi.wifiTest) { - WSContentSend_P(PSTR(D_CONNECT_FAILED_TO " %s
" D_CHECK_CREDENTIALS ""), SettingsTextEscaped(SET_STASSID1).c_str()); + WSContentSend_P(PSTR(D_CONNECT_FAILED_TO " %s
" D_CHECK_CREDENTIALS ""), + SettingsTextEscaped(SET_STASSID1).c_str()); } // More Options Button WSContentSend_P(PSTR("

"), - (WIFI_TEST_FINISHED_BAD == Wifi.wifiTest) ? "none" : Web.initial_config ? "block" : "none", Web.initial_config ? "block" : "none" + (WIFI_TEST_FINISHED_BAD == Wifi.wifiTest) ? "none" : Web.initial_config ? "block" : "none", + Web.initial_config ? "block" : "none" ); WSContentSpaceButton(BUTTON_RESTORE, !Web.initial_config); WSContentButton(BUTTON_RESET_CONFIGURATION, !Web.initial_config); @@ -2742,6 +2812,7 @@ void HandleLoggingConfiguration(void) { WSContentStart_P(PSTR(D_CONFIGURE_LOGGING)); WSContentSendStyle(); + WSContentSend_P(HTTP_FIELDSET_LEGEND, PSTR(D_LOGGING_PARAMETERS)); WSContentSend_P(HTTP_FORM_LOG1); char stemp1[45]; char stemp2[32]; @@ -2760,7 +2831,10 @@ void HandleLoggingConfiguration(void) { } WSContentSend_P(PSTR("

")); } - WSContentSend_P(HTTP_FORM_LOG2, SettingsTextEscaped(SET_SYSLOG_HOST).c_str(), Settings->syslog_port, Settings->tele_period); + WSContentSend_P(HTTP_FORM_LOG2, + SettingsTextEscaped(SET_SYSLOG_HOST).c_str(), + Settings->syslog_port, + Settings->tele_period); WSContentSend_P(HTTP_FORM_END); WSContentSpaceButton(BUTTON_CONFIGURATION); WSContentStop(); @@ -2799,10 +2873,17 @@ void HandleOtherConfiguration(void) { WSContentSendStyle(); TemplateJson(); - WSContentSend_P(HTTP_FORM_OTHER, HtmlEscape(ResponseData()).c_str(), (USER_MODULE == Settings->module) ? PSTR(" checked disabled") : "", + + WSContentSend_P(HTTP_FIELDSET_LEGEND, PSTR(D_OTHER_PARAMETERS)); + WSContentSend_P(HTTP_FORM_OTHER1); + WSContentSend_P(HTTP_FIELDSET_LEGEND, PSTR(D_TEMPLATE)); + WSContentSend_P(HTTP_FORM_OTHER2, + HtmlEscape(ResponseData()).c_str(), + (USER_MODULE == Settings->module) ? PSTR(" checked disabled") : "", (Settings->flag5.disable_referer_chk) ? PSTR(" checked") : "", // SetOption128 - Enable HTTP API (Settings->flag.mqtt_enabled) ? PSTR(" checked") : "", // SetOption3 - Enable MQTT - SettingsTextEscaped(SET_FRIENDLYNAME1).c_str(), SettingsTextEscaped(SET_DEVICENAME).c_str()); + SettingsTextEscaped(SET_FRIENDLYNAME1).c_str(), + SettingsTextEscaped(SET_DEVICENAME).c_str()); char stemp[32]; uint32_t maxfn = (TasmotaGlobal.devices_present > MAX_FRIENDLYNAMES) ? MAX_FRIENDLYNAMES : (!TasmotaGlobal.devices_present) ? 1 : TasmotaGlobal.devices_present; @@ -2821,7 +2902,9 @@ void HandleOtherConfiguration(void) { #ifdef USE_EMULATION #if defined(USE_EMULATION_WEMO) || defined(USE_EMULATION_HUE) - WSContentSend_P(PSTR("

 " D_EMULATION " 

")); // Keep close to Friendlynames so do not use
+ WSContentSend_P(PSTR("

")); // Keep close to Friendlynames so do not use
+ WSContentSend_P(HTTP_FIELDSET_LEGEND, PSTR(D_EMULATION)); + WSContentSend_P(PSTR("

")); // Keep close to Friendlynames so do not use
for (uint32_t i = 0; i < EMUL_MAX; i++) { #ifndef USE_EMULATION_WEMO if (i == EMUL_WEMO) { i++; } @@ -2935,7 +3018,8 @@ void HandleRestoreConfiguration(void) { WSContentStart_P(PSTR(D_RESTORE_CONFIGURATION)); WSContentSendStyle(); - WSContentSend_P(HTTP_FORM_RST); + WSContentSend_P(HTTP_DIV_BLOCK); + WSContentSend_P(HTTP_FIELDSET_LEGEND, PSTR(D_RESTORE_CONFIGURATION)); WSContentSend_P(HTTP_FORM_RST_UPG, PSTR(D_START_RESTORE)); if (WifiIsInManagerMode()) { WSContentSpaceButton(BUTTON_MAIN); @@ -2952,7 +3036,8 @@ void HandleRestoreConfiguration(void) { \*********************************************************************************************/ void WSContentSeparatorI(uint32_t size) { - WSContentSend_P(PSTR("

" D_TEMPLATE_NAME "

"), (1 == size)?" size=1":""); + WSContentSend_P(PSTR("

"), + (1 == size)?" size=1":""); // WSContentSend_P(PSTR("

"), size); // WSContentSend_P(PSTR("

"), size); // WSContentSend_P(PSTR("
"), size); @@ -2988,12 +3073,17 @@ void HandleInformation(void) { WSContentSend_P(HTTP_SCRIPT_INFO_BEGIN); WSContentSend_P(HTTP_MENU_HEAD, D_INFORMATION); WSContentSend_P(PSTR("
")); - WSContentSend_P(PSTR(D_PROGRAM_VERSION "}2%s %s %s"), TasmotaGlobal.version, TasmotaGlobal.image_name, GetCodeCores().c_str()); + WSContentSend_P(PSTR(D_PROGRAM_VERSION "}2%s %s %s"), + TasmotaGlobal.version, + TasmotaGlobal.image_name, + GetCodeCores().c_str()); WSContentSend_P(PSTR("}1" D_BUILD_DATE_AND_TIME "}2%s"), GetBuildDateAndTime().c_str()); WSContentSend_P(PSTR("}1" D_CORE_AND_SDK_VERSION "}2" ARDUINO_CORE_RELEASE "/%s"), ESP.getSdkVersion()); WSContentSend_P(PSTR("}1" D_UPTIME "}2%s"), GetUptime().c_str()); #ifdef ESP8266 - WSContentSend_P(PSTR("}1" D_FLASH_WRITE_COUNT "}2%d " D_AT " 0x%X"), Settings->save_flag, GetSettingsAddress()); + WSContentSend_P(PSTR("}1" D_FLASH_WRITE_COUNT "}2%d " D_AT " 0x%X"), + Settings->save_flag, + GetSettingsAddress()); #endif // ESP8266 #ifdef ESP32 WSContentSend_P(PSTR("}1" D_FLASH_WRITE_COUNT "}2%d"), Settings->save_flag); @@ -3005,11 +3095,15 @@ void HandleInformation(void) { if (IsModuleIfan()) { maxfn = 1; } #endif // USE_SONOFF_IFAN for (uint32_t i = 0; i < maxfn; i++) { - WSContentSend_P(PSTR("}1" D_FRIENDLY_NAME " %d}2%s"), i +1, SettingsTextEscaped(SET_FRIENDLYNAME1 +i).c_str()); + WSContentSend_P(PSTR("}1" D_FRIENDLY_NAME " %d}2%s"), + i +1, + SettingsTextEscaped(SET_FRIENDLYNAME1 +i).c_str()); } WSContentSeparatorIFat(); #ifdef CONFIG_ESP_WIFI_REMOTE_ENABLED - WSContentSend_P(PSTR("}1" D_HOSTED_MCU "}2%s (%s)"), GetHostedMCU().c_str(), GetHostedFwVersion(1).c_str()); + WSContentSend_P(PSTR("}1" D_HOSTED_MCU "}2%s (%s)"), + GetHostedMCU().c_str(), + GetHostedFwVersion(1).c_str()); WSContentSeparatorIFat(); #endif // CONFIG_ESP_WIFI_REMOTE_ENABLED bool show_hr = false; @@ -3029,7 +3123,9 @@ void HandleInformation(void) { WiFi.channel(), WiFi.BSSIDstr().c_str()); WSContentSeparatorIFat(); - WSContentSend_P(PSTR("}1" D_HOSTNAME "}2%s%s"), TasmotaGlobal.hostname, (Mdns.begun) ? PSTR(".local") : ""); + WSContentSend_P(PSTR("}1" D_HOSTNAME "}2%s%s"), + TasmotaGlobal.hostname, + (Mdns.begun) ? PSTR(".local") : ""); #ifdef USE_IPV6 String ipv6_addr = WifiGetIPv6Str(); if (ipv6_addr != "") { @@ -3063,7 +3159,9 @@ void HandleInformation(void) { if (show_hr) { WSContentSeparatorIThin(); } - WSContentSend_P(PSTR("}1" D_HOSTNAME "}2%s%s"), EthernetHostname(), (Mdns.begun) ? PSTR(".local") : ""); + WSContentSend_P(PSTR("}1" D_HOSTNAME "}2%s%s"), + EthernetHostname(), + (Mdns.begun) ? PSTR(".local") : ""); #ifdef USE_IPV6 String ipv6_eth_addr = EthernetGetIPv6Str(); if (ipv6_eth_addr != "") { @@ -3090,13 +3188,15 @@ void HandleInformation(void) { } #endif // USE_ETHERNET WSContentSeparatorIFat(); - WSContentSend_P(PSTR("}1" D_HTTP_API "}2%s"), Settings->flag5.disable_referer_chk ? PSTR(D_ENABLED) : PSTR(D_DISABLED)); // SetOption 128 + WSContentSend_P(PSTR("}1" D_HTTP_API "}2%s"), + Settings->flag5.disable_referer_chk ? PSTR(D_ENABLED) : PSTR(D_DISABLED)); // SetOption 128 WSContentSeparatorIFat(); if (Settings->flag.mqtt_enabled) { // SetOption3 - Enable MQTT WSContentSend_P(PSTR("}1" D_MQTT_HOST "}2%s"), SettingsTextEscaped(SET_MQTT_HOST).c_str()); WSContentSend_P(PSTR("}1" D_MQTT_PORT "}2%d"), Settings->mqtt_port); #ifdef USE_MQTT_TLS - WSContentSend_P(PSTR("}1" D_MQTT_TLS_ENABLE "}2%s"), Settings->flag4.mqtt_tls ? PSTR(D_ENABLED) : PSTR(D_DISABLED)); + WSContentSend_P(PSTR("}1" D_MQTT_TLS_ENABLE "}2%s"), + Settings->flag4.mqtt_tls ? PSTR(D_ENABLED) : PSTR(D_DISABLED)); #endif // USE_MQTT_TLS WSContentSend_P(PSTR("}1" D_MQTT_USER "}2%s"), SettingsTextEscaped(SET_MQTT_USER).c_str()); WSContentSend_P(PSTR("}1" D_MQTT_CLIENT "}2%s"), TasmotaGlobal.mqtt_client); @@ -3105,12 +3205,18 @@ void HandleInformation(void) { for (uint32_t i = 0; i < MAX_GROUP_TOPICS; i++) { if (1 == i) { real_index = SET_MQTT_GRP_TOPIC2 -1; } if (strlen(SettingsText(real_index +i))) { - WSContentSend_P(PSTR("}1" D_MQTT_GROUP_TOPIC " %d}2%s"), 1 +i, GetGroupTopic_P(stopic, "", real_index +i)); + WSContentSend_P(PSTR("}1" D_MQTT_GROUP_TOPIC " %d}2%s"), + 1 +i, + GetGroupTopic_P(stopic, "", + real_index +i)); } } - WSContentSend_P(PSTR("}1" D_MQTT_FULL_TOPIC "}2%s"), GetTopic_P(stopic, CMND, TasmotaGlobal.mqtt_topic, "")); - WSContentSend_P(PSTR("}1" D_MQTT " " D_FALLBACK_TOPIC "}2%s"), GetFallbackTopic_P(stopic, "")); - WSContentSend_P(PSTR("}1" D_MQTT_NO_RETAIN "}2%s"), Settings->flag4.mqtt_no_retain ? PSTR(D_ENABLED) : PSTR(D_DISABLED)); + WSContentSend_P(PSTR("}1" D_MQTT_FULL_TOPIC "}2%s"), + GetTopic_P(stopic, CMND, TasmotaGlobal.mqtt_topic, "")); + WSContentSend_P(PSTR("}1" D_MQTT " " D_FALLBACK_TOPIC "}2%s"), + GetFallbackTopic_P(stopic, "")); + WSContentSend_P(PSTR("}1" D_MQTT_NO_RETAIN "}2%s"), + Settings->flag4.mqtt_no_retain ? PSTR(D_ENABLED) : PSTR(D_DISABLED)); } else { WSContentSend_P(PSTR("}1" D_MQTT "}2" D_DISABLED)); } @@ -3119,11 +3225,13 @@ void HandleInformation(void) { WSContentSeparatorIFat(); #endif // USE_EMULATION or USE_DISCOVERY #ifdef USE_EMULATION - WSContentSend_P(PSTR("}1" D_EMULATION "}2%s"), GetTextIndexed(stopic, sizeof(stopic), Settings->flag2.emulation, kEmulationOptions)); + WSContentSend_P(PSTR("}1" D_EMULATION "}2%s"), + GetTextIndexed(stopic, sizeof(stopic), Settings->flag2.emulation, kEmulationOptions)); #endif // USE_EMULATION #ifdef USE_DISCOVERY - WSContentSend_P(PSTR("}1" D_MDNS_DISCOVERY "}2%s"), (Settings->flag3.mdns_enabled) ? D_ENABLED : D_DISABLED); // SetOption55 - Control mDNS service + WSContentSend_P(PSTR("}1" D_MDNS_DISCOVERY "}2%s"), + (Settings->flag3.mdns_enabled) ? D_ENABLED : D_DISABLED); // SetOption55 - Control mDNS service if (Settings->flag3.mdns_enabled) { // SetOption55 - Control mDNS service #ifdef WEBSERVER_ADVERTISE WSContentSend_P(PSTR("}1" D_MDNS_ADVERTISE "}2" D_WEB_SERVER)); @@ -3134,7 +3242,9 @@ void HandleInformation(void) { #endif // USE_DISCOVERY WSContentSeparatorIFat(); - WSContentSend_P(PSTR("}1" D_ESP_CHIP_ID "}2%d (%s)"), ESP_getChipId(), GetDeviceHardwareRevision().c_str()); + WSContentSend_P(PSTR("}1" D_ESP_CHIP_ID "}2%d (%s)"), + ESP_getChipId(), + GetDeviceHardwareRevision().c_str()); WSContentSend_P(PSTR("}1" D_FLASH_CHIP_ID "}20x%06X (" D_TASMOTA_FLASHMODE ")"), ESP_getFlashChipId()); #ifdef ESP32 WSContentSend_P(PSTR("}1" D_FLASH_CHIP_SIZE "}2%d KB"), ESP.getFlashChipSize() / 1024); @@ -3150,7 +3260,9 @@ void HandleInformation(void) { #ifdef USE_GT911 WSContentSend_PD(PSTR("}1" D_FREE_MEMORY "}2%1_f KB"), &freemem); #else - WSContentSend_PD(PSTR("}1" D_FREE_MEMORY "}2%1_f KB (" D_FRAGMENTATION " %d%%)"), &freemem, ESP_getHeapFragmentation()); + WSContentSend_PD(PSTR("}1" D_FREE_MEMORY "}2%1_f KB (" D_FRAGMENTATION " %d%%)"), + &freemem, + ESP_getHeapFragmentation()); #endif // USE_GT911 if (UsePSRAM()) { WSContentSend_P(PSTR("}1" D_PSR_MAX_MEMORY "}2%d KB"), ESP.getPsramSize() / 1024); @@ -3204,10 +3316,10 @@ void HandleInformation(void) { WSContentSend_P(HTTP_SCRIPT_INFO_END); WSContentSendStyle(); - // WSContentSend_P(PSTR("
 Information ")); +// WSContentSend_P(HTTP_FIELDSET_LEGEND, PSTR("Information")); WSContentSend_P(PSTR("" "
")); - // WSContentSend_P(PSTR("
")); +// WSContentSend_P(PSTR("")); WSContentSpaceButton(BUTTON_MAIN); WSContentStop(); } @@ -3278,8 +3390,10 @@ void HandleUpgradeFirmware(void) { WSContentStart_P(PSTR(D_FIRMWARE_UPGRADE)); WSContentSendStyle(); WSContentSend_P(HTTP_MENU_HEAD, D_FIRMWARE_UPGRADE); - + WSContentSend_P(HTTP_DIV_BLOCK); + WSContentSend_P(HTTP_FIELDSET_LEGEND, PSTR(D_UPGRADE_BY_WEBSERVER)); WSContentSend_P(HTTP_FORM_UPG, SettingsTextEscaped(SET_OTAURL).c_str()); + WSContentSend_P(HTTP_FIELDSET_LEGEND, PSTR(D_UPGRADE_BY_FILE_UPLOAD)); #ifdef ESP32 if (EspSingleOtaPartition() && !EspRunningFactoryPartition()) { WSContentSend_P(HTTP_FORM_RST_UPG_FCT, PSTR(D_START_UPGRADE)); @@ -3346,7 +3460,8 @@ void HandleUploadDone(void) { WSContentStart_P(PSTR(D_INFORMATION)); if (!Web.upload_error) { - WSContentSend_P(HTTP_SCRIPT_RELOAD_TIME, (UPL_TASMOTA == Web.upload_file_type) ? HTTP_OTA_RESTART_RECONNECT_TIME : HTTP_RESTART_RECONNECT_TIME); // Refesh main web ui after OTA upgrade + WSContentSend_P(HTTP_SCRIPT_RELOAD_TIME, + (UPL_TASMOTA == Web.upload_file_type) ? HTTP_OTA_RESTART_RECONNECT_TIME : HTTP_RESTART_RECONNECT_TIME); // Refesh main web ui after OTA upgrade } WSContentSendStyle(); WSContentSend_P(PSTR("
" D_UPLOAD " "; const char HTTP_FORM_MQTT1[] PROGMEM = - "
 " D_MQTT_PARAMETERS " " "
" "

" D_HOST " (" MQTT_HOST ")

" "

" D_PORT " (" STR(MQTT_PORT) ")

" @@ -2085,6 +2084,7 @@ void HandleMqttConfiguration(void) WSContentStart_P(PSTR(D_CONFIGURE_MQTT)); WSContentSendStyle(); + WSContentSend_P(HTTP_FIELDSET_LEGEND, PSTR(D_MQTT_PARAMETERS)); WSContentSend_P(HTTP_FORM_MQTT1, SettingsTextEscaped(SET_MQTT_HOST).c_str(), Settings->mqtt_port, diff --git a/tasmota/tasmota_xdrv_driver/xdrv_07_domoticz.ino b/tasmota/tasmota_xdrv_driver/xdrv_07_domoticz.ino index b6f240c2d..7e5f36504 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_07_domoticz.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_07_domoticz.ino @@ -640,7 +640,6 @@ const char HTTP_BTN_MENU_DOMOTICZ[] PROGMEM = "

"; const char HTTP_FORM_DOMOTICZ[] PROGMEM = - "
 " D_DOMOTICZ_PARAMETERS " " "
" ""; const char HTTP_FORM_DOMOTICZ_RELAY[] PROGMEM = @@ -668,6 +667,7 @@ void HandleDomoticzConfiguration(void) { WSContentStart_P(PSTR(D_CONFIGURE_DOMOTICZ)); WSContentSendStyle(); + WSContentSend_P(HTTP_FIELDSET_LEGEND, PSTR(D_DOMOTICZ_PARAMETERS)); WSContentSend_P(HTTP_FORM_DOMOTICZ); for (uint32_t i = 0; i < MAX_DOMOTICZ_IDX; i++) { if (i < TasmotaGlobal.devices_present) { diff --git a/tasmota/tasmota_xdrv_driver/xdrv_07_ufs_domoticz.ino b/tasmota/tasmota_xdrv_driver/xdrv_07_ufs_domoticz.ino index 0b6bc90b8..3b55eb872 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_07_ufs_domoticz.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_07_ufs_domoticz.ino @@ -107,7 +107,7 @@ Domoticz_t* Domoticz; * Driver Settings load and save \*********************************************************************************************/ -#define XDRV_07_KEY "drvset03" +#define XDRV_07_KEY "drvset03" // Should have been drvset07 bool DomoticzLoadData(void) { char key[] = XDRV_07_KEY; @@ -876,7 +876,6 @@ const char HTTP_BTN_MENU_DOMOTICZ[] PROGMEM = "

"; const char HTTP_FORM_DOMOTICZ[] PROGMEM = - "
 " D_DOMOTICZ_PARAMETERS " " "
" "
" ""; @@ -903,7 +902,9 @@ void HandleDomoticzConfiguration(void) { WSContentStart_P(PSTR(D_CONFIGURE_DOMOTICZ)); WSContentSendStyle(); - WSContentSend_P(HTTP_FORM_DOMOTICZ, (Domoticz->switches)? D_DOMOTICZ_SWITCH :"", (Domoticz->keys)? D_DOMOTICZ_KEY :""); + WSContentSend_P(HTTP_FIELDSET_LEGEND, PSTR(D_DOMOTICZ_PARAMETERS)); + WSContentSend_P(HTTP_FORM_DOMOTICZ, + (Domoticz->switches)? D_DOMOTICZ_SWITCH :"", (Domoticz->keys)? D_DOMOTICZ_KEY :""); for (uint32_t i = 0; i < Domoticz->devices; i++) { WSContentSend_P(HTTP_FORM_DOMOTICZ_INDEX, i +1); if (i < Domoticz->switches) { diff --git a/tasmota/tasmota_xdrv_driver/xdrv_10_scripter.ino b/tasmota/tasmota_xdrv_driver/xdrv_10_scripter.ino index 6efbe7050..e2d65c88f 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_10_scripter.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_10_scripter.ino @@ -10048,7 +10048,6 @@ const char HTTP_BTN_MENU_RULES[] PROGMEM = "

"; const char HTTP_FORM_SCRIPT[] PROGMEM = - "
 " D_SCRIPT " " "
"; const char HTTP_FORM_SCRIPT1[] PROGMEM = @@ -10456,6 +10455,7 @@ void HandleScriptConfiguration(void) { WSContentStart_P(PSTR(D_CONFIGURE_SCRIPT)); WSContentSendStyle(); + WSContentSend_P(HTTP_FIELDSET_LEGEND, PSTR(D_SCRIPT)); WSContentSend_P(HTTP_FORM_SCRIPT); #ifdef xSCRIPT_STRIP_COMMENTS diff --git a/tasmota/tasmota_xdrv_driver/xdrv_28_pcf8574_v2.ino b/tasmota/tasmota_xdrv_driver/xdrv_28_pcf8574_v2.ino index 86cd23c50..42e474c81 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_28_pcf8574_v2.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_28_pcf8574_v2.ino @@ -519,7 +519,6 @@ const char HTTP_BTN_MENU_PCF8574[] PROGMEM = "

"; const char HTTP_FORM_I2C_PCF8574_1[] PROGMEM = - "
 " D_PCF8574_PARAMETERS " " "
" "


"; @@ -544,6 +543,7 @@ void HandlePcf8574(void) { WSContentStart_P(D_CONFIGURE_PCF8574); WSContentSendStyle(); + WSContentSend_P(HTTP_FIELDSET_LEGEND, PSTR(D_PCF8574_PARAMETERS)); WSContentSend_P(HTTP_FORM_I2C_PCF8574_1, (Settings->flag3.pcf8574_ports_inverted) ? PSTR(" checked") : ""); // SetOption81 - Invert all ports on PCF8574 devices WSContentSend_P(HTTP_TABLE100); for (uint32_t idx = 0; idx < Pcf8574.max_devices; idx++) { diff --git a/tasmota/tasmota_xdrv_driver/xdrv_50_filesystem.ino b/tasmota/tasmota_xdrv_driver/xdrv_50_filesystem.ino index 137950fd7..a5f83a91c 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_50_filesystem.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_50_filesystem.ino @@ -1271,9 +1271,6 @@ const char UFS_CURRDIR[] PROGMEM = #define D_CURR_DIR "Folder" #endif -const char UFS_FORM_FILE_UPLOAD[] PROGMEM = - "
" - "
 " D_MANAGE_FILE_SYSTEM " "; const char UFS_FORM_FILE_UPGc[] PROGMEM = "
" D_FS_SIZE " %s MB - " D_FS_FREE " %s MB"; @@ -1329,7 +1326,6 @@ const char UFS_FORM_SDC_HREFedit[] PROGMEM = "📝"; // 📝 const char HTTP_EDITOR_FORM_START[] PROGMEM = - "
 " D_EDIT_FILE " " "" "

" "
%s%s