" D_CONFIGURATION_SAVED ""));
- if (2 == type) {
- WSContentSend_P(PSTR("
" D_TRYING_TO_CONNECT "
"));
+ if (!(3 == type)) {
+ 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)
+ WSContentSend_P(PSTR("
" D_SUCCESSFUL_WIFI_CONNECTION "
" D_REDIRECTING_TO_NEW_IP "
"), WebColor(COL_TEXT_SUCCESS) );
+#else
+ WSContentSend_P(PSTR("
" D_SUCCESSFUL_WIFI_CONNECTION "
" D_NOW_YOU_CAN_CLOSE_THIS_WINDOW "
"), WebColor(COL_TEXT_SUCCESS) );
+#endif
}
- WSContentSend_P(PSTR("
"));
}
- WSContentSend_P(HTTP_MSG_RSTRT);
- if (HTTP_MANAGER == Web.state || reset_only) {
- Web.state = HTTP_ADMIN;
- } else {
- WSContentSpaceButton(BUTTON_MAIN);
+ if (type<2) {
+ WSContentSend_P(HTTP_MSG_RSTRT);
+ if (HTTP_MANAGER == Web.state || reset_only) {
+ Web.state = HTTP_ADMIN;
+ } else {
+ WSContentSpaceButton(BUTTON_MAIN);
+ }
}
WSContentStop();
- ShowWebSource(SRC_WEBGUI);
- TasmotaGlobal.restart_flag = 2;
+ if (!(2 == type)) {
+ AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_HTTP D_RESTART));
+ ShowWebSource(SRC_WEBGUI);
+ TasmotaGlobal.restart_flag = 2;
+ }
}
/*********************************************************************************************/
@@ -916,6 +976,10 @@ void HandleRoot(void)
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 (!Web.initial_config) {
+ Web.initial_config = !strlen(SettingsText(SET_STASSID1));
+ if (Web.initial_config) { AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_HTTP "Blank Device - Initial Configuration")); }
+ }
HandleWifiConfiguration();
} else {
// wrong user and pass
@@ -1168,7 +1232,7 @@ bool HandleRootStatusRefresh(void)
int32_t ShutterWebButton;
if (ShutterWebButton = IsShutterWebButton(device)) {
snprintf_P(svalue, sizeof(svalue), PSTR("ShutterPosition%d %s"), abs(ShutterWebButton), (ShutterWebButton>0) ? PSTR(D_CMND_SHUTTER_STOPOPEN) : PSTR(D_CMND_SHUTTER_STOPCLOSE));
- ExecuteWebCommand(svalue, SRC_WEBGUI);
+ ExecuteWebCommand(svalue);
} else {
#endif // USE_SHUTTER
ExecuteCommandPower(device, POWER_TOGGLE, SRC_IGNORE);
@@ -1186,12 +1250,12 @@ bool HandleRootStatusRefresh(void)
WebGetArg(PSTR("d0"), tmp, sizeof(tmp)); // 0 - 100 Dimmer value
if (strlen(tmp)) {
snprintf_P(svalue, sizeof(svalue), PSTR(D_CMND_DIMMER " %s"), tmp);
- ExecuteWebCommand(svalue, SRC_WEBGUI);
+ ExecuteWebCommand(svalue);
}
WebGetArg(PSTR("w0"), tmp, sizeof(tmp)); // 0 - 100 White value
if (strlen(tmp)) {
snprintf_P(svalue, sizeof(svalue), PSTR(D_CMND_WHITE " %s"), tmp);
- ExecuteWebCommand(svalue, SRC_WEBGUI);
+ ExecuteWebCommand(svalue);
}
uint32_t light_device = LightDevice(); // Channel number offset
uint32_t pwm_channels = (TasmotaGlobal.light_type & 7) > LST_MAX ? LST_MAX : (TasmotaGlobal.light_type & 7);
@@ -1200,23 +1264,23 @@ bool HandleRootStatusRefresh(void)
WebGetArg(webindex, tmp, sizeof(tmp)); // 0 - 100 percent
if (strlen(tmp)) {
snprintf_P(svalue, sizeof(svalue), PSTR(D_CMND_CHANNEL "%d %s"), j +light_device, tmp);
- ExecuteWebCommand(svalue, SRC_WEBGUI);
+ ExecuteWebCommand(svalue);
}
}
WebGetArg(PSTR("t0"), tmp, sizeof(tmp)); // 153 - 500 Color temperature
if (strlen(tmp)) {
snprintf_P(svalue, sizeof(svalue), PSTR(D_CMND_COLORTEMPERATURE " %s"), tmp);
- ExecuteWebCommand(svalue, SRC_WEBGUI);
+ ExecuteWebCommand(svalue);
}
WebGetArg(PSTR("h0"), tmp, sizeof(tmp)); // 0 - 359 Hue value
if (strlen(tmp)) {
snprintf_P(svalue, sizeof(svalue), PSTR(D_CMND_HSBCOLOR "1 %s"), tmp);
- ExecuteWebCommand(svalue, SRC_WEBGUI);
+ ExecuteWebCommand(svalue);
}
WebGetArg(PSTR("n0"), tmp, sizeof(tmp)); // 0 - 99 Saturation value
if (strlen(tmp)) {
snprintf_P(svalue, sizeof(svalue), PSTR(D_CMND_HSBCOLOR "2 %s"), tmp);
- ExecuteWebCommand(svalue, SRC_WEBGUI);
+ ExecuteWebCommand(svalue);
}
#endif // USE_LIGHT
#ifdef USE_SHUTTER
@@ -1225,7 +1289,7 @@ bool HandleRootStatusRefresh(void)
WebGetArg(webindex, tmp, sizeof(tmp)); // 0 - 100 percent
if (strlen(tmp)) {
snprintf_P(svalue, sizeof(svalue), PSTR("ShutterPosition%d %s"), j, tmp);
- ExecuteWebCommand(svalue, SRC_WEBGUI);
+ ExecuteWebCommand(svalue);
}
}
#endif // USE_SHUTTER
@@ -1233,19 +1297,19 @@ bool HandleRootStatusRefresh(void)
WebGetArg(PSTR("k"), tmp, sizeof(tmp)); // 1 - 16 Pre defined RF keys
if (strlen(tmp)) {
snprintf_P(svalue, sizeof(svalue), PSTR(D_CMND_RFKEY "%s"), tmp);
- ExecuteWebCommand(svalue, SRC_WEBGUI);
+ ExecuteWebCommand(svalue);
}
#endif // USE_SONOFF_RF
#ifdef USE_ZIGBEE
WebGetArg(PSTR("zbj"), tmp, sizeof(tmp));
if (strlen(tmp)) {
snprintf_P(svalue, sizeof(svalue), PSTR("ZbPermitJoin"));
- ExecuteWebCommand(svalue, SRC_WEBGUI);
+ ExecuteWebCommand(svalue);
}
WebGetArg(PSTR("zbr"), tmp, sizeof(tmp));
if (strlen(tmp)) {
snprintf_P(svalue, sizeof(svalue), PSTR("ZbMap"));
- ExecuteWebCommand(svalue, SRC_WEBGUI);
+ ExecuteWebCommand(svalue);
}
#endif // USE_ZIGBEE
@@ -1400,8 +1464,7 @@ void WSContentSendAdcNiceList(uint32_t option) {
/*-------------------------------------------------------------------------------------------*/
-void HandleTemplateConfiguration(void)
-{
+void HandleTemplateConfiguration(void) {
if (!HttpCheckPriviledgedAccess()) { return; }
if (Webserver->hasArg(F("save"))) {
@@ -1501,40 +1564,38 @@ uint16_t WebGetGpioArg(uint32_t i) {
return gpio;
}
-void TemplateSaveSettings(void)
-{
- char tmp[TOPSZ]; // WebGetArg NAME and GPIO/BASE/FLAG byte value
- char svalue[300]; // Template command string
+void TemplateSaveSettings(void) {
+ char tmp[TOPSZ]; // WebGetArg NAME and GPIO/BASE/FLAG byte value
+ char command[300]; // Template command string
- WebGetArg(PSTR("s1"), tmp, sizeof(tmp)); // NAME
- snprintf_P(svalue, sizeof(svalue), PSTR(D_CMND_TEMPLATE " {\"" D_JSON_NAME "\":\"%s\",\"" D_JSON_GPIO "\":["), tmp);
+ WebGetArg(PSTR("s1"), tmp, sizeof(tmp)); // NAME
+ snprintf_P(command, sizeof(command), PSTR(D_CMND_TEMPLATE " {\"" D_JSON_NAME "\":\"%s\",\"" D_JSON_GPIO "\":["), tmp);
uint32_t j = 0;
for (uint32_t i = 0; i < nitems(Settings.user_template.gp.io); i++) {
if (6 == i) { j = 9; }
if (8 == i) { j = 12; }
- snprintf_P(svalue, sizeof(svalue), PSTR("%s%s%d"), svalue, (i>0)?",":"", WebGetGpioArg(j));
+ snprintf_P(command, sizeof(command), PSTR("%s%s%d"), command, (i>0)?",":"", WebGetGpioArg(j));
j++;
}
uint32_t flag = 0;
- char webindex[5]; // WebGetArg name
+ char webindex[5]; // WebGetArg name
for (uint32_t i = 0; i < GPIO_FLAG_USED; i++) {
snprintf_P(webindex, sizeof(webindex), PSTR("c%d"), i);
- uint32_t state = Webserver->hasArg(webindex) << i; // FLAG
+ uint32_t state = Webserver->hasArg(webindex) << i; // FLAG
flag += state;
}
- WebGetArg(PSTR("g99"), tmp, sizeof(tmp)); // BASE
+ WebGetArg(PSTR("g99"), tmp, sizeof(tmp)); // BASE
uint32_t base = atoi(tmp) +1;
- snprintf_P(svalue, sizeof(svalue), PSTR("%s],\"" D_JSON_FLAG "\":%d,\"" D_JSON_BASE "\":%d}"), svalue, flag, base);
- ExecuteWebCommand(svalue, SRC_WEBGUI);
+ snprintf_P(command, sizeof(command), PSTR("%s],\"" D_JSON_FLAG "\":%d,\"" D_JSON_BASE "\":%d}"), command, flag, base);
+ ExecuteWebCommand(command);
}
/*-------------------------------------------------------------------------------------------*/
-void HandleModuleConfiguration(void)
-{
+void HandleModuleConfiguration(void) {
if (!HttpCheckPriviledgedAccess()) { return; }
if (Webserver->hasArg(F("save"))) {
@@ -1600,30 +1661,27 @@ void HandleModuleConfiguration(void)
WSContentStop();
}
-void ModuleSaveSettings(void)
-{
+void ModuleSaveSettings(void) {
char tmp[8]; // WebGetArg numbers only
-
- WebGetArg(PSTR("g99"), tmp, sizeof(tmp));
+ WebGetArg(PSTR("g99"), tmp, sizeof(tmp)); // Module
uint32_t new_module = (!strlen(tmp)) ? MODULE : atoi(tmp);
Settings.last_module = Settings.module;
Settings.module = new_module;
SetModuleType();
myio template_gp;
TemplateGpios(&template_gp);
- String gpios = "";
for (uint32_t i = 0; i < nitems(template_gp.io); i++) {
if (Settings.last_module != new_module) {
Settings.my_gp.io[i] = GPIO_NONE;
} else {
if (ValidGPIO(i, template_gp.io[i])) {
- Settings.my_gp.io[i] = WebGetGpioArg(i);
- gpios += F(", IO"); gpios += String(i); gpios += F(" "); gpios += String(Settings.my_gp.io[i]);
+ Settings.my_gp.io[i] = WebGetGpioArg(i); // Gpio
}
}
}
-
- AddLog_P(LOG_LEVEL_INFO, PSTR(D_LOG_MODULE "%s " D_CMND_MODULE "%s"), ModuleName().c_str(), gpios.c_str());
+ char command[32];
+ snprintf_P(command, sizeof(command), PSTR(D_CMND_BACKLOG "0 " D_CMND_MODULE ";" D_CMND_GPIO));
+ ExecuteWebCommand(command);
}
/*-------------------------------------------------------------------------------------------*/
@@ -1647,31 +1705,80 @@ String HtmlEscape(const String unescaped) {
return result;
}
-// Indexed by enum wl_enc_type in file wl_definitions.h starting from -1
-const char kEncryptionType[] PROGMEM = "|||" D_WPA_PSK "||" D_WPA2_PSK "|" D_WEP "||" D_NONE "|" D_AUTO;
+void HandleWifiConfiguration(void) {
+ char tmp[TOPSZ]; // Max length is currently 150
-void HandleWifiConfiguration(void)
-{
if (!HttpCheckPriviledgedAccess(!WifiIsInManagerMode())) { return; }
AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_HTTP D_CONFIGURE_WIFI));
if (Webserver->hasArg(F("save")) && HTTP_MANAGER_RESET_ONLY != Web.state) {
- WifiSaveSettings();
- WebRestart(2);
+ if ( WifiIsInManagerMode() ) {
+ // Test WIFI Connection to Router
+ // As Tasmota is in this case in AP mode, a STA connection can be established too at the same time
+ Web.wifi_test_counter = 9; // seconds to test user's proposed AP
+ Web.wifiTest = WIFI_TESTING;
+
+ Web.save_data_counter = TasmotaGlobal.save_data_counter;
+ TasmotaGlobal.save_data_counter = 0; // Stop auto saving data - Updating Settings
+ Settings.save_data = 0;
+
+ Web.old_wificonfig = TasmotaGlobal.wifi_state_flag;
+ Settings.sta_config = WIFI_MANAGER;
+ TasmotaGlobal.wifi_state_flag = Settings.sta_config;
+
+ TasmotaGlobal.sleep = 0; // Disable sleep
+ TasmotaGlobal.restart_flag = 0; // No restart
+ TasmotaGlobal.ota_state_flag = 0; // No OTA
+// TasmotaGlobal.blinks = 0; // Disable blinks initiated by WifiManager
+
+ WebGetArg(PSTR("s1"), tmp, sizeof(tmp)); // SSID1
+ SettingsUpdateText(SET_STASSID1, tmp);
+ WebGetArg(PSTR("p1"), tmp, sizeof(tmp)); // PASSWORD1
+ SettingsUpdateText(SET_STAPWD1, tmp);
+
+ AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_WIFI D_CONNECTING_TO_AP " %s " D_AS " %s ..."),
+ SettingsText(SET_STASSID1), TasmotaGlobal.hostname);
+
+ WiFi.begin(SettingsText(SET_STASSID1), SettingsText(SET_STAPWD1));
+
+ WebRestart(2);
+ } else {
+ // STATION MODE or MIXED
+ // Save the config and restart
+ WifiSaveSettings();
+ WebRestart(1);
+ }
return;
}
+ if ( WIFI_TEST_FINISHED_SUCCESSFUL == Web.wifiTest ) {
+ Web.wifiTest = WIFI_NOT_TESTING;
+#if (RESTART_AFTER_INITIAL_WIFI_CONFIG)
+ WebRestart(3);
+#else
+ HandleRoot();
+#endif
+ }
+
WSContentStart_P(PSTR(D_CONFIGURE_WIFI), !WifiIsInManagerMode());
WSContentSend_P(HTTP_SCRIPT_WIFI);
+ if (WifiIsInManagerMode()) { WSContentSend_P(HTTP_SCRIPT_HIDE); }
+ if (WIFI_TESTING == Web.wifiTest) { WSContentSend_P(HTTP_SCRIPT_RELOAD_TIME, HTTP_RESTART_RECONNECT_TIME); }
#ifdef USE_ENHANCED_GUI_WIFI_SCAN
WSContentSendStyle_P(HTTP_HEAD_STYLE_SSI, WebColor(COL_TEXT));
#else
WSContentSendStyle();
#endif // USE_ENHANCED_GUI_WIFI_SCAN
+ bool limitScannedNetworks = true;
if (HTTP_MANAGER_RESET_ONLY != Web.state) {
- if (Webserver->hasArg(F("scan"))) {
+ if (WIFI_TESTING == Web.wifiTest) {
+ limitScannedNetworks = false;
+ } else {
+ if (Webserver->hasArg(F("scan"))) { limitScannedNetworks = false; }
+
+ AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_WIFI "Scanning..."));
#ifdef USE_EMULATION
UdpDisconnect();
#endif // USE_EMULATION
@@ -1681,7 +1788,7 @@ void HandleWifiConfiguration(void)
if (0 == n) {
AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_WIFI D_NO_NETWORKS_FOUND));
WSContentSend_P(PSTR(D_NO_NETWORKS_FOUND));
- WSContentSend_P(PSTR(". " D_REFRESH_TO_SCAN_AGAIN "."));
+ limitScannedNetworks = false; // in order to show D_SCAN_FOR_WIFI_NETWORKS
} else {
//sort networks
int indices[n];
@@ -1689,7 +1796,6 @@ void HandleWifiConfiguration(void)
indices[i] = i;
}
-
// RSSI SORT
for (uint32_t i = 0; i < n; i++) {
for (uint32_t j = i + 1; j < n; j++) {
@@ -1699,44 +1805,65 @@ void HandleWifiConfiguration(void)
}
}
+ uint32_t networksToShow = n;
+ if ((limitScannedNetworks) && (networksToShow > MAX_WIFI_NETWORKS_TO_SHOW)) { networksToShow = MAX_WIFI_NETWORKS_TO_SHOW; }
+
+ if (WifiIsInManagerMode()) { WSContentSend_P(PSTR("%s"), HtmlEscape(ssid).c_str());
-
+ if (!limitScannedNetworks) {
+ WSContentSend_P(PSTR("
%s"), HtmlEscape(ssid_copy).c_str());
+ }
+ skipduplicated = false;
String nextSSID = "";
// Handle all APs with the same SSID
for (uint32_t j = 0; j < n; j++) {
if ((indices[j] < n) && ((nextSSID = WiFi.SSID(indices[j])) == ssid)) {
- // Update RSSI / quality
- rssi = WiFi.RSSI(indices[j]);
- uint32_t rssi_as_quality = WifiGetRssiAsQuality(rssi);
- uint32_t num_bars = changeUIntScale(rssi_as_quality, 0, 100, 0, 4);
+ if (!skipduplicated) {
+ // Update RSSI / quality
+ rssi = WiFi.RSSI(indices[j]);
+ uint32_t rssi_as_quality = WifiGetRssiAsQuality(rssi);
+ uint32_t num_bars = changeUIntScale(rssi_as_quality, 0, 100, 0, 4);
- // Print item
- WSContentSend_P(PSTR("
%s
(%d) "),
- rssi, rssi_as_quality,
- WiFi.BSSIDstr(indices[j]).c_str(),
- WiFi.channel(indices[j])
- );
- // Print signal strength indicator
- for (uint32_t k = 0; k < 4; ++k) {
- WSContentSend_P(PSTR("
"), k, (num_bars < k) ? PSTR(" o30") : PSTR(""));
+ WSContentSend_P(PSTR("
"), rssi, rssi_as_quality);
+ if (limitScannedNetworks) {
+ // Print SSID and item
+ WSContentSend_P(PSTR("
%s"), HtmlEscape(ssid_copy).c_str());
+ ssid_showed++;
+ skipduplicated = true; // For the simplified page, just show 1 SSID if there are many Networks with the same
+ } else {
+ // Print item
+ WSContentSend_P(PSTR("%s
(%d) "), WiFi.BSSIDstr(indices[j]).c_str(), WiFi.channel(indices[j])
+ );
+ }
+ // Print signal strength indicator
+ for (uint32_t k = 0; k < 4; ++k) {
+ WSContentSend_P(PSTR(""), k, (num_bars < k) ? PSTR(" o30") : PSTR(""));
+ }
+ WSContentSend_P(PSTR("
"));
+ } else {
+ if (ssid_showed <= networksToShow ) { networksToShow++; }
}
- WSContentSend_P(PSTR(" "));
-
indices[j] = n;
}
delay(0);
}
- WSContentSend_P(PSTR(""));
+ if (!limitScannedNetworks) {
+ WSContentSend_P(PSTR("
"));
+ }
}
}
#else // No USE_ENHANCED_GUI_WIFI_SCAN
@@ -1754,24 +1881,16 @@ void HandleWifiConfiguration(void)
}
//display networks in page
- for (uint32_t i = 0; i < n; i++) {
+ for (uint32_t i = 0; i < networksToShow; i++) {
if (-1 == indices[i]) { continue; } // skip dups
int32_t rssi = WiFi.RSSI(indices[i]);
DEBUG_CORE_LOG(PSTR(D_LOG_WIFI D_SSID " %s, " D_BSSID " %s, " D_CHANNEL " %d, " D_RSSI " %d"),
WiFi.SSID(indices[i]).c_str(), WiFi.BSSIDstr(indices[i]).c_str(), WiFi.channel(indices[i]), rssi);
int quality = WifiGetRssiAsQuality(rssi);
-/*
- int auth = WiFi.encryptionType(indices[i]);
- char encryption[20];
- WSContentSend_P(PSTR("
%s (%d) 
%s %d%% (%d dBm) "),
- HtmlEscape(WiFi.SSID(indices[i])).c_str(),
- WiFi.channel(indices[i]),
- GetTextIndexed(encryption, sizeof(encryption), auth +1, kEncryptionType),
- quality, rssi
- );
-*/
+ String ssid_copy = WiFi.SSID(indices[i]);
+ if (!ssid_copy.length()) { ssid_copy = F("no_name"); }
WSContentSend_P(PSTR("
%s (%d) 
%d%% (%d dBm) "),
- HtmlEscape(WiFi.SSID(indices[i])).c_str(),
+ HtmlEscape(ssid_copy).c_str(),
WiFi.channel(indices[i]),
quality, rssi
);
@@ -1782,54 +1901,69 @@ void HandleWifiConfiguration(void)
WSContentSend_P(PSTR("
"));
}
- } else {
- WSContentSend_P(PSTR("
"));
}
- // As WIFI_HOSTNAME may contain %s-%04d it cannot be part of HTTP_FORM_WIFI where it will exception
- WSContentSend_P(HTTP_FORM_WIFI, SettingsText(SET_STASSID1), SettingsText(SET_STASSID2), WIFI_HOSTNAME, WIFI_HOSTNAME, SettingsText(SET_HOSTNAME), SettingsText(SET_CORS));
+ 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 ")"), SettingsText(SET_STASSID1));
+ 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 {
+ WSContentSend_P(HTTP_FORM_WIFI_PART2, SettingsText(SET_STASSID2), WIFI_HOSTNAME, WIFI_HOSTNAME, SettingsText(SET_HOSTNAME), SettingsText(SET_CORS));
+ }
+
WSContentSend_P(HTTP_FORM_END);
}
if (WifiIsInManagerMode()) {
#ifndef FIRMWARE_MINIMAL
- WSContentSpaceButton(BUTTON_RESTORE);
- WSContentButton(BUTTON_RESET_CONFIGURATION);
+ WSContentSend_P(PSTR("
"), WebColor(COL_TEXT_WARNING));
+ if (WIFI_TESTING == Web.wifiTest) {
+ WSContentSend_P(PSTR(D_TRYING_TO_CONNECT "
%s
"), SettingsText(SET_STASSID1));
+ } else if (WIFI_TEST_FINISHED_BAD == Web.wifiTest) {
+ WSContentSend_P(PSTR(D_CONNECT_FAILED_TO " %s
" D_CHECK_CREDENTIALS "
"), SettingsText(SET_STASSID1));
+ }
+ // More Options Button
+ WSContentSend_P(PSTR("