From 0e66898524bbe31104c83de255813d9ce1f20e90 Mon Sep 17 00:00:00 2001 From: TD-er Date: Sun, 12 Jul 2026 01:08:00 +0200 Subject: [PATCH 1/5] [Webserver] Remove code duplication send start of page --- src/src/WebServer/AdvancedConfigPage.cpp | 5 +---- src/src/WebServer/ConfigPage.cpp | 6 +----- src/src/WebServer/ControllerPage.cpp | 5 +---- src/src/WebServer/DevicesPage.cpp | 6 +----- src/src/WebServer/ESPEasy_WebServer.cpp | 11 +++++++++++ src/src/WebServer/ESPEasy_WebServer.h | 4 ++++ src/src/WebServer/FactoryResetPage.cpp | 6 ++---- src/src/WebServer/HardwarePage.cpp | 5 +---- src/src/WebServer/I2C_Scanner.cpp | 5 +---- src/src/WebServer/Log.cpp | 5 +---- src/src/WebServer/NetworkPage.cpp | 6 +----- src/src/WebServer/NotificationPage.cpp | 5 +---- src/src/WebServer/PinStates.cpp | 5 +---- src/src/WebServer/SettingsArchive.cpp | 6 ++---- src/src/WebServer/SysInfoPage.cpp | 5 +---- src/src/WebServer/SysVarPage.cpp | 4 +--- src/src/WebServer/ToolsPage.cpp | 5 +---- src/src/WebServer/UploadPage.cpp | 11 ++--------- src/src/WebServer/WiFiScanner.cpp | 6 +++--- 19 files changed, 37 insertions(+), 74 deletions(-) diff --git a/src/src/WebServer/AdvancedConfigPage.cpp b/src/src/WebServer/AdvancedConfigPage.cpp index 85a791b4c..2e5d6bf6f 100644 --- a/src/src/WebServer/AdvancedConfigPage.cpp +++ b/src/src/WebServer/AdvancedConfigPage.cpp @@ -37,10 +37,7 @@ void handle_advanced() { checkRAM(F("handle_advanced")); #endif - if (!isLoggedIn()) { return; } - navMenuIndex = MENU_INDEX_TOOLS; - TXBuffer.startStream(); - sendHeadandTail_stdtemplate(_HEAD); + if (!startStream_send_stdTemplate(MENU_INDEX_TOOLS)) { return; } if (!webArg(F("edit")).isEmpty()) { diff --git a/src/src/WebServer/ConfigPage.cpp b/src/src/WebServer/ConfigPage.cpp index e222c5083..11a4dd33a 100644 --- a/src/src/WebServer/ConfigPage.cpp +++ b/src/src/WebServer/ConfigPage.cpp @@ -34,11 +34,7 @@ void handle_config() { checkRAM(F("handle_config")); #endif - if (!isLoggedIn()) { return; } - - navMenuIndex = MENU_INDEX_CONFIG; - TXBuffer.startStream(); - sendHeadandTail_stdtemplate(_HEAD); + if (!startStream_send_stdTemplate(MENU_INDEX_CONFIG)) { return; } if (web_server.args() != 0) { diff --git a/src/src/WebServer/ControllerPage.cpp b/src/src/WebServer/ControllerPage.cpp index 328b659d3..adb0f5318 100644 --- a/src/src/WebServer/ControllerPage.cpp +++ b/src/src/WebServer/ControllerPage.cpp @@ -36,10 +36,7 @@ void handle_controllers() { checkRAM(F("handle_controllers")); # endif // ifndef BUILD_NO_RAM_TRACKER - if (!isLoggedIn()) { return; } - navMenuIndex = MENU_INDEX_CONTROLLERS; - TXBuffer.startStream(); - sendHeadandTail_stdtemplate(_HEAD); + if (!startStream_send_stdTemplate(MENU_INDEX_CONTROLLERS)) { return; } // 'index' value in the URL uint8_t controllerindex = getFormItemInt(F("index"), 0); diff --git a/src/src/WebServer/DevicesPage.cpp b/src/src/WebServer/DevicesPage.cpp index 2db6c29b2..fb8283154 100644 --- a/src/src/WebServer/DevicesPage.cpp +++ b/src/src/WebServer/DevicesPage.cpp @@ -48,11 +48,7 @@ void handle_devices() { checkRAM(F("handle_devices")); # endif // ifndef BUILD_NO_RAM_TRACKER - if (!isLoggedIn()) { return; } - navMenuIndex = MENU_INDEX_DEVICES; - TXBuffer.startStream(); - sendHeadandTail_stdtemplate(_HEAD); - + if (!startStream_send_stdTemplate(MENU_INDEX_DEVICES)) { return; } // char tmpString[41]; diff --git a/src/src/WebServer/ESPEasy_WebServer.cpp b/src/src/WebServer/ESPEasy_WebServer.cpp index d5b591e58..7250ce959 100644 --- a/src/src/WebServer/ESPEasy_WebServer.cpp +++ b/src/src/WebServer/ESPEasy_WebServer.cpp @@ -898,6 +898,17 @@ bool isLoggedIn(bool mustProvideLogin) return true; } +bool startStream_send_stdTemplate(uint8_t newNavIndex) +{ + if (!isLoggedIn()) { return false; } + + navMenuIndex = newNavIndex; + TXBuffer.startStream(); + sendHeadandTail_stdtemplate(_HEAD); + return true; +} + + String getControllerSymbol(uint8_t index) { String ret = F("&#"); diff --git a/src/src/WebServer/ESPEasy_WebServer.h b/src/src/WebServer/ESPEasy_WebServer.h index 787876d75..c002881e9 100644 --- a/src/src/WebServer/ESPEasy_WebServer.h +++ b/src/src/WebServer/ESPEasy_WebServer.h @@ -128,6 +128,10 @@ void addTaskValueSelect(const String& name, // ******************************************************************************** bool isLoggedIn(bool mustProvideLogin = true); +// Check isLoggedIn, set new navIndex and start serving standard template +// Thus not for non-HTML pages. +bool startStream_send_stdTemplate(uint8_t newNavIndex); + String getControllerSymbol(uint8_t index); /* diff --git a/src/src/WebServer/FactoryResetPage.cpp b/src/src/WebServer/FactoryResetPage.cpp index 13985a5ba..6a11ab620 100644 --- a/src/src/WebServer/FactoryResetPage.cpp +++ b/src/src/WebServer/FactoryResetPage.cpp @@ -25,10 +25,8 @@ void handle_factoryreset() { checkRAM(F("handle_factoryreset")); #endif - if (!isLoggedIn()) { return; } - navMenuIndex = MENU_INDEX_TOOLS; - TXBuffer.startStream(); - sendHeadandTail_stdtemplate(_HEAD); + if (!startStream_send_stdTemplate(MENU_INDEX_TOOLS)) { return; } + html_add_form(); html_table_class_normal(); html_TR(); diff --git a/src/src/WebServer/HardwarePage.cpp b/src/src/WebServer/HardwarePage.cpp index cc7ce1f0a..9abce52f2 100644 --- a/src/src/WebServer/HardwarePage.cpp +++ b/src/src/WebServer/HardwarePage.cpp @@ -30,10 +30,7 @@ void handle_hardware() { checkRAM(F("handle_hardware")); #endif - if (!isLoggedIn()) { return; } - navMenuIndex = MENU_INDEX_HARDWARE; - TXBuffer.startStream(); - sendHeadandTail_stdtemplate(_HEAD); + if (!startStream_send_stdTemplate(MENU_INDEX_HARDWARE)) { return; } if (isFormItem(F("pled"))) { String error; diff --git a/src/src/WebServer/I2C_Scanner.cpp b/src/src/WebServer/I2C_Scanner.cpp index f210220ad..9113f2d9f 100644 --- a/src/src/WebServer/I2C_Scanner.cpp +++ b/src/src/WebServer/I2C_Scanner.cpp @@ -489,10 +489,7 @@ void handle_i2cscanner() { checkRAM(F("handle_i2cscanner")); #endif - if (!isLoggedIn()) { return; } - navMenuIndex = MENU_INDEX_TOOLS; - TXBuffer.startStream(); - sendHeadandTail_stdtemplate(_HEAD); + if (!startStream_send_stdTemplate(MENU_INDEX_TOOLS)) { return; } int nDevices = 0; #if !FEATURE_I2C_MULTIPLE diff --git a/src/src/WebServer/Log.cpp b/src/src/WebServer/Log.cpp index 7ae46864d..a26896db8 100644 --- a/src/src/WebServer/Log.cpp +++ b/src/src/WebServer/Log.cpp @@ -21,11 +21,8 @@ // Web Interface log page // ******************************************************************************** void handle_log() { - if (!isLoggedIn()) { return; } - navMenuIndex = MENU_INDEX_TOOLS; + if (!startStream_send_stdTemplate(MENU_INDEX_TOOLS)) { return; } - TXBuffer.startStream(); - sendHeadandTail_stdtemplate(_HEAD); html_table_class_normal(); #ifdef WEBSERVER_LOG diff --git a/src/src/WebServer/NetworkPage.cpp b/src/src/WebServer/NetworkPage.cpp index 19bec41e0..87b212343 100644 --- a/src/src/WebServer/NetworkPage.cpp +++ b/src/src/WebServer/NetworkPage.cpp @@ -35,11 +35,7 @@ void handle_networks() checkRAM(F("handle_networks")); # endif // ifndef BUILD_NO_RAM_TRACKER - if (!isLoggedIn()) { return; } - navMenuIndex = MENU_INDEX_NETWORK; - TXBuffer.startStream(); - sendHeadandTail_stdtemplate(_HEAD); - + if (!startStream_send_stdTemplate(MENU_INDEX_NETWORK)) { return; } // 'index' value in the URL uint8_t networkindex = getFormItemInt(F("index"), 0); diff --git a/src/src/WebServer/NotificationPage.cpp b/src/src/WebServer/NotificationPage.cpp index 6014f2ce5..0636b29a6 100644 --- a/src/src/WebServer/NotificationPage.cpp +++ b/src/src/WebServer/NotificationPage.cpp @@ -39,10 +39,7 @@ void handle_notifications() { checkRAM(F("handle_notifications")); # endif // ifndef BUILD_NO_RAM_TRACKER - if (!isLoggedIn()) { return; } - navMenuIndex = MENU_INDEX_NOTIFICATIONS; - TXBuffer.startStream(); - sendHeadandTail_stdtemplate(_HEAD); + if (!startStream_send_stdTemplate(MENU_INDEX_NOTIFICATIONS)) { return; } struct EventStruct TempEvent; diff --git a/src/src/WebServer/PinStates.cpp b/src/src/WebServer/PinStates.cpp index 2e6c8be6e..25acd425e 100644 --- a/src/src/WebServer/PinStates.cpp +++ b/src/src/WebServer/PinStates.cpp @@ -75,10 +75,7 @@ void handle_pinstates() { checkRAM(F("handle_pinstates")); # endif // ifndef BUILD_NO_RAM_TRACKER - if (!isLoggedIn()) { return; } - navMenuIndex = MENU_INDEX_TOOLS; - TXBuffer.startStream(); - sendHeadandTail_stdtemplate(_HEAD); + if (!startStream_send_stdTemplate(MENU_INDEX_TOOLS)) { return; } # ifdef ESP32 html_BR(); diff --git a/src/src/WebServer/SettingsArchive.cpp b/src/src/WebServer/SettingsArchive.cpp index bd9f647ce..67a15e820 100644 --- a/src/src/WebServer/SettingsArchive.cpp +++ b/src/src/WebServer/SettingsArchive.cpp @@ -24,10 +24,8 @@ void handle_settingsarchive() { checkRAM(F("handle_settingsarchive")); # endif // ifndef BUILD_NO_RAM_TRACKER - if (!isLoggedIn()) { return; } - navMenuIndex = MENU_INDEX_TOOLS; - TXBuffer.startStream(); - sendHeadandTail_stdtemplate(_HEAD); + if (!startStream_send_stdTemplate(MENU_INDEX_TOOLS)) { return; } + html_add_form(); html_table_class_normal(); html_TR(); diff --git a/src/src/WebServer/SysInfoPage.cpp b/src/src/WebServer/SysInfoPage.cpp index 2d256bf75..ae8349ddd 100644 --- a/src/src/WebServer/SysInfoPage.cpp +++ b/src/src/WebServer/SysInfoPage.cpp @@ -235,13 +235,10 @@ void handle_sysinfo() { checkRAM(F("handle_sysinfo")); # endif // ifndef BUILD_NO_RAM_TRACKER - if (!isLoggedIn()) { return; } - navMenuIndex = MENU_INDEX_TOOLS; + if (!startStream_send_stdTemplate(MENU_INDEX_TOOLS)) { return; } #ifdef WEBSERVER_GITHUB_COPY html_reset_copyTextCounter(); #endif - TXBuffer.startStream(); - sendHeadandTail_stdtemplate(_HEAD); addHtml(printWebString); addHtml(F("
")); diff --git a/src/src/WebServer/SysVarPage.cpp b/src/src/WebServer/SysVarPage.cpp index a9a3c0eaa..10af2f21d 100644 --- a/src/src/WebServer/SysVarPage.cpp +++ b/src/src/WebServer/SysVarPage.cpp @@ -41,9 +41,7 @@ void handle_sysvars() { checkRAM(F("handle_sysvars")); # endif // ifndef BUILD_NO_RAM_TRACKER - if (!isLoggedIn()) { return; } - TXBuffer.startStream(); - sendHeadandTail_stdtemplate(_HEAD); + if (!startStream_send_stdTemplate(MENU_INDEX_TOOLS)) { return; } html_BR(); addHtml(F("

This page may load slow.
Do not load too often, since it may affect performance of the node.

")); diff --git a/src/src/WebServer/ToolsPage.cpp b/src/src/WebServer/ToolsPage.cpp index c4fa74bcc..84e5a7061 100644 --- a/src/src/WebServer/ToolsPage.cpp +++ b/src/src/WebServer/ToolsPage.cpp @@ -19,10 +19,7 @@ // Web Interface Tools page // ******************************************************************************** void handle_tools() { - if (!isLoggedIn()) { return; } - navMenuIndex = MENU_INDEX_TOOLS; - TXBuffer.startStream(); - sendHeadandTail_stdtemplate(_HEAD); + if (!startStream_send_stdTemplate(MENU_INDEX_TOOLS)) { return; } String webrequest = webArg(F("cmd")); diff --git a/src/src/WebServer/UploadPage.cpp b/src/src/WebServer/UploadPage.cpp index 8244b9ac3..1122d2439 100644 --- a/src/src/WebServer/UploadPage.cpp +++ b/src/src/WebServer/UploadPage.cpp @@ -25,10 +25,7 @@ uploadResult_e uploadResult = uploadResult_e::UploadStarted; void handle_upload() { - if (!isLoggedIn()) { return; } - navMenuIndex = MENU_INDEX_TOOLS; - TXBuffer.startStream(); - sendHeadandTail_stdtemplate(_HEAD); + if (!startStream_send_stdTemplate(MENU_INDEX_TOOLS)) { return; } addHtml(F( "

Upload settings file:

")); @@ -46,11 +43,7 @@ void handle_upload_post() { checkRAM(F("handle_upload_post")); # endif // ifndef BUILD_NO_RAM_TRACKER - if (!isLoggedIn()) { return; } - - navMenuIndex = MENU_INDEX_TOOLS; - TXBuffer.startStream(); - sendHeadandTail_stdtemplate(_HEAD); + if (!startStream_send_stdTemplate(MENU_INDEX_TOOLS)) { return; } switch (uploadResult) { case uploadResult_e::Success: diff --git a/src/src/WebServer/WiFiScanner.cpp b/src/src/WebServer/WiFiScanner.cpp index aea3c917b..1d34b8933 100644 --- a/src/src/WebServer/WiFiScanner.cpp +++ b/src/src/WebServer/WiFiScanner.cpp @@ -61,6 +61,7 @@ void handle_wifiscanner() { checkRAM(F("handle_wifiscanner")); #endif + // Check for logged in state before potentially interrupting WiFi connection if (!isLoggedIn()) { return; } WiFiMode_t cur_wifimode = WiFi.getMode(); @@ -69,9 +70,8 @@ void handle_wifiscanner() { int8_t scanCompleteStatus = ESPEasy::net::wifi::WiFi_AP_Candidates.scanComplete(); ESPEasy::net::wifi::setWifiMode(cur_wifimode); - navMenuIndex = MENU_INDEX_TOOLS; - TXBuffer.startStream(); - sendHeadandTail_stdtemplate(_HEAD); + if (!startStream_send_stdTemplate(MENU_INDEX_TOOLS)) { return; } + html_table_class_multirow(); html_TR(); html_table_header(getLabel(LabelType::SSID)); From 45827f36516edf0e14183746a6fbe9b7bedd29bf Mon Sep 17 00:00:00 2001 From: TD-er Date: Sun, 12 Jul 2026 14:00:22 +0200 Subject: [PATCH 2/5] [Webserver] Remove & simplify duplicate code send end of page --- src/src/WebServer/AdvancedConfigPage.cpp | 3 +- src/src/WebServer/ConfigPage.cpp | 3 +- src/src/WebServer/ControllerPage.cpp | 8 +- src/src/WebServer/DevicesPage.cpp | 3 +- src/src/WebServer/ESPEasy_WebServer.cpp | 109 ++++++++++++++--------- src/src/WebServer/ESPEasy_WebServer.h | 12 ++- src/src/WebServer/FactoryResetPage.cpp | 3 +- src/src/WebServer/FileList.cpp | 17 +--- src/src/WebServer/HardwarePage.cpp | 3 +- src/src/WebServer/I2C_Scanner.cpp | 8 +- src/src/WebServer/InterfacesPage.cpp | 25 +++--- src/src/WebServer/JSON.cpp | 6 +- src/src/WebServer/Log.cpp | 8 +- src/src/WebServer/NetworkPage.cpp | 8 +- src/src/WebServer/NotificationPage.cpp | 3 +- src/src/WebServer/PinStates.cpp | 7 +- src/src/WebServer/PluginListPage.cpp | 6 +- src/src/WebServer/RootPage.cpp | 21 +++-- src/src/WebServer/Rules.cpp | 23 ++--- src/src/WebServer/SettingsArchive.cpp | 3 +- src/src/WebServer/SetupPage.cpp | 11 ++- src/src/WebServer/SysInfoPage.cpp | 6 +- src/src/WebServer/SysVarPage.cpp | 3 +- src/src/WebServer/TimingStats.cpp | 9 +- src/src/WebServer/ToolsPage.cpp | 15 +--- src/src/WebServer/UploadPage.cpp | 6 +- src/src/WebServer/WebTemplateParser.h | 6 +- src/src/WebServer/WiFiScanner.cpp | 5 +- 28 files changed, 163 insertions(+), 177 deletions(-) diff --git a/src/src/WebServer/AdvancedConfigPage.cpp b/src/src/WebServer/AdvancedConfigPage.cpp index 2e5d6bf6f..4bda61b17 100644 --- a/src/src/WebServer/AdvancedConfigPage.cpp +++ b/src/src/WebServer/AdvancedConfigPage.cpp @@ -402,8 +402,7 @@ void handle_advanced() { addHtml(F("")); html_end_table(); html_end_form(); - sendHeadandTail_stdtemplate(_TAIL); - TXBuffer.endStream(); + sendTail_stdtemplate(); } void addFormDstSelect(bool isStart, uint16_t choice) { diff --git a/src/src/WebServer/ConfigPage.cpp b/src/src/WebServer/ConfigPage.cpp index 11a4dd33a..052cd3572 100644 --- a/src/src/WebServer/ConfigPage.cpp +++ b/src/src/WebServer/ConfigPage.cpp @@ -182,8 +182,7 @@ void handle_config() { html_end_table(); html_end_form(); - sendHeadandTail_stdtemplate(_TAIL); - TXBuffer.endStream(); + sendTail_stdtemplate(); } #endif // ifdef WEBSERVER_CONFIG \ No newline at end of file diff --git a/src/src/WebServer/ControllerPage.cpp b/src/src/WebServer/ControllerPage.cpp index adb0f5318..c6e737f7d 100644 --- a/src/src/WebServer/ControllerPage.cpp +++ b/src/src/WebServer/ControllerPage.cpp @@ -122,8 +122,6 @@ void handle_controllers() { } } - html_add_form(); - if (controllerIndexSet) { handle_controllers_ControllerSettingsPage(controllerindex); @@ -131,8 +129,7 @@ void handle_controllers() { handle_controllers_ShowAllControllersTable(); } - sendHeadandTail_stdtemplate(_TAIL); - TXBuffer.endStream(); + sendTail_stdtemplate(); } // ******************************************************************************** @@ -214,6 +211,7 @@ void handle_controllers_CopySubmittedSettings_CPluginCall(uint8_t controllerinde // ******************************************************************************** void handle_controllers_ShowAllControllersTable() { + html_add_form(); html_table_class_multirow(); html_TR(); html_table_header(F(""), 70); @@ -282,6 +280,8 @@ void handle_controllers_ControllerSettingsPage(controllerIndex_t controllerindex return; } + html_add_form(); + // Show controller settings page html_table_class_normal(); addFormHeader(F("Controller Settings")); diff --git a/src/src/WebServer/DevicesPage.cpp b/src/src/WebServer/DevicesPage.cpp index fb8283154..cfca00320 100644 --- a/src/src/WebServer/DevicesPage.cpp +++ b/src/src/WebServer/DevicesPage.cpp @@ -214,8 +214,7 @@ void handle_devices() { addLogMove(LOG_LEVEL_DEBUG_DEV, concat(F("DEBUG: String size:"), static_cast(TXBuffer.sentBytes))); } # endif // ifndef BUILD_NO_DEBUG - sendHeadandTail_stdtemplate(_TAIL); - TXBuffer.endStream(); + sendTail_stdtemplate(); } // ******************************************************************************** diff --git a/src/src/WebServer/ESPEasy_WebServer.cpp b/src/src/WebServer/ESPEasy_WebServer.cpp index 7250ce959..8f20a3d74 100644 --- a/src/src/WebServer/ESPEasy_WebServer.cpp +++ b/src/src/WebServer/ESPEasy_WebServer.cpp @@ -123,45 +123,9 @@ void sendHeadandTail(const __FlashStringHelper *tmplName, bool Tail, bool reboot STOP_TIMER(HANDLE_SERVING_WEBPAGE); } -void sendHeadandTail_stdtemplate(bool Tail, bool rebooting) { - sendHeadandTail(F("TmplStd"), Tail, rebooting); - - if (!Tail) { - // TODO TD-er: Must check clientConnectedToAP()? - if (!clientIPinSubnetDefaultNetwork() && ESPEasy::net::wifi::wifiAPmodeActivelyUsed()) { - addHtmlError(F("Warning: Connected via AP")); - } - - #ifndef BUILD_NO_DEBUG - - /* - if (loglevelActiveFor(LOG_LEVEL_INFO)) { - const int nrArgs = web_server.args(); - - if (nrArgs > 0) { - String log = F(" Webserver "); - log += nrArgs; - log += F(" Arguments"); - - if (nrArgs > 20) { - log += F(" (First 20)"); - } - log += ':'; - - for (int i = 0; i < nrArgs && i < 20; ++i) { - log += ' '; - log += i; - log += F(": '"); - log += web_server.argName(i); - log += F("' length: "); - log += webArg(i).length(); - } - addLogMove(LOG_LEVEL_INFO, log); - } - } - */ - #endif // ifndef BUILD_NO_DEBUG - } +void sendTail_stdtemplate(bool rebooting) { + sendHeadandTail(F("TmplStd"), _TAIL, rebooting); + TXBuffer.endStream(); // We have sent a lot of data at once. // try to flush it to the connected client to free up some RAM @@ -901,10 +865,62 @@ bool isLoggedIn(bool mustProvideLogin) bool startStream_send_stdTemplate(uint8_t newNavIndex) { if (!isLoggedIn()) { return false; } - + + startStream_send_stdTemplate_NoLoginCheck(newNavIndex); + return true; +} + +void startStream_send_stdTemplate_NoLoginCheck(uint8_t newNavIndex, bool rebooting) +{ navMenuIndex = newNavIndex; TXBuffer.startStream(); - sendHeadandTail_stdtemplate(_HEAD); + + sendHeadandTail(F("TmplStd"), _HEAD, rebooting); + // TODO TD-er: This should be the only place where sendHeadandTail_stdtemplate(_HEAD) is called + + + // TODO TD-er: Must check clientConnectedToAP()? + if (!clientIPinSubnetDefaultNetwork() && ESPEasy::net::wifi::wifiAPmodeActivelyUsed()) { + addHtmlError(F("Warning: Connected via AP")); + } + + #ifndef BUILD_NO_DEBUG + + /* + if (loglevelActiveFor(LOG_LEVEL_INFO)) { + const int nrArgs = web_server.args(); + + if (nrArgs > 0) { + String log = F(" Webserver "); + log += nrArgs; + log += F(" Arguments"); + + if (nrArgs > 20) { + log += F(" (First 20)"); + } + log += ':'; + + for (int i = 0; i < nrArgs && i < 20; ++i) { + log += ' '; + log += i; + log += F(": '"); + log += web_server.argName(i); + log += F("' length: "); + log += webArg(i).length(); + } + addLogMove(LOG_LEVEL_INFO, log); + } + } + */ + #endif // ifndef BUILD_NO_DEBUG +} + + +bool startJSON_Stream() +{ + if (!isLoggedIn()) { return false; } + + TXBuffer.startJsonStream(); return true; } @@ -918,6 +934,17 @@ String getControllerSymbol(uint8_t index) return ret; } +void handle_printWebString() +{ + if (printWebString.isEmpty()) return; + addRowColspan(2); + addHtml(F("Command Output
")); + free_string(printWebString); + printToWeb = false; +} + /* String getValueSymbol(uint8_t index) { diff --git a/src/src/WebServer/ESPEasy_WebServer.h b/src/src/WebServer/ESPEasy_WebServer.h index c002881e9..bb6517d97 100644 --- a/src/src/WebServer/ESPEasy_WebServer.h +++ b/src/src/WebServer/ESPEasy_WebServer.h @@ -22,8 +22,7 @@ void sendHeadandTail(const __FlashStringHelper * tmplName, bool Tail = false, bool rebooting = false); -void sendHeadandTail_stdtemplate(bool Tail, - bool rebooting = false); +void sendTail_stdtemplate(bool rebooting = false); void WebServerInit(); @@ -132,8 +131,17 @@ bool isLoggedIn(bool mustProvideLogin = true); // Thus not for non-HTML pages. bool startStream_send_stdTemplate(uint8_t newNavIndex); +void startStream_send_stdTemplate_NoLoginCheck(uint8_t newNavIndex, bool rebooting = false); + +// Check isLoggedIn and start JSON stream +// JSON can be called from anywhere, so no need to update the nav index +bool startJSON_Stream(); + String getControllerSymbol(uint8_t index); + +void handle_printWebString(); + /* String getValueSymbol(uint8_t index); */ diff --git a/src/src/WebServer/FactoryResetPage.cpp b/src/src/WebServer/FactoryResetPage.cpp index 6a11ab620..3e849eec9 100644 --- a/src/src/WebServer/FactoryResetPage.cpp +++ b/src/src/WebServer/FactoryResetPage.cpp @@ -107,8 +107,7 @@ void handle_factoryreset() { html_end_table(); html_end_form(); - sendHeadandTail_stdtemplate(_TAIL); - TXBuffer.endStream(); + sendTail_stdtemplate(); } // ******************************************************************************** diff --git a/src/src/WebServer/FileList.cpp b/src/src/WebServer/FileList.cpp index cbf691616..b089e6c5f 100644 --- a/src/src/WebServer/FileList.cpp +++ b/src/src/WebServer/FileList.cpp @@ -140,10 +140,7 @@ void handle_filelist() { checkRAM(F("handle_filelist")); #endif - if (!clientIPallowed()) { return; } - navMenuIndex = MENU_INDEX_TOOLS; - TXBuffer.startStream(); - sendHeadandTail_stdtemplate(_HEAD); + if (!startStream_send_stdTemplate(MENU_INDEX_TOOLS)) { return; } if (tryDeleteFile(webArg(F("delete")))) { @@ -333,8 +330,7 @@ void handle_filelist_buttons(int start_prev, int start_next, bool cacheFilesPres } #endif addHtml(F("

")); - sendHeadandTail_stdtemplate(_TAIL); - TXBuffer.endStream(); + sendTail_stdtemplate(); } #endif // ifdef WEBSERVER_FILELIST @@ -348,11 +344,7 @@ void handle_SDfilelist() { checkRAM(F("handle_SDfilelist")); #endif - if (!clientIPallowed()) { return; } - navMenuIndex = MENU_INDEX_TOOLS; - TXBuffer.startStream(); - sendHeadandTail_stdtemplate(_HEAD); - + if (!startStream_send_stdTemplate(MENU_INDEX_TOOLS)) { return; } String fdelete; String ddelete; @@ -498,8 +490,7 @@ void handle_SDfilelist() { html_BR(); addButton(F("/uploadsd"), F("Upload")); - sendHeadandTail_stdtemplate(_TAIL); - TXBuffer.endStream(); + sendTail_stdtemplate(); } #endif // if FEATURE_SD diff --git a/src/src/WebServer/HardwarePage.cpp b/src/src/WebServer/HardwarePage.cpp index 9abce52f2..df42a0c37 100644 --- a/src/src/WebServer/HardwarePage.cpp +++ b/src/src/WebServer/HardwarePage.cpp @@ -122,8 +122,7 @@ void handle_hardware() { html_end_table(); html_end_form(); - sendHeadandTail_stdtemplate(_TAIL); - TXBuffer.endStream(); + sendTail_stdtemplate(); } #endif // ifdef WEBSERVER_HARDWARE diff --git a/src/src/WebServer/I2C_Scanner.cpp b/src/src/WebServer/I2C_Scanner.cpp index 9113f2d9f..9238823df 100644 --- a/src/src/WebServer/I2C_Scanner.cpp +++ b/src/src/WebServer/I2C_Scanner.cpp @@ -109,9 +109,8 @@ void handle_i2cscanner_json() { checkRAM(F("handle_i2cscanner")); #endif - if (!isLoggedIn()) { return; } - navMenuIndex = MENU_INDEX_TOOLS; - TXBuffer.startJsonStream(); + if (!startJSON_Stream()) { return; } + json_init(); json_open(true); @@ -558,7 +557,6 @@ void handle_i2cscanner() { I2CSelectHighClockSpeed(0); // By default the bus is in standard speed } - sendHeadandTail_stdtemplate(_TAIL); - TXBuffer.endStream(); + sendTail_stdtemplate(); } #endif // WEBSERVER_I2C_SCANNER diff --git a/src/src/WebServer/InterfacesPage.cpp b/src/src/WebServer/InterfacesPage.cpp index 459957268..abdc7c927 100644 --- a/src/src/WebServer/InterfacesPage.cpp +++ b/src/src/WebServer/InterfacesPage.cpp @@ -75,26 +75,26 @@ void handle_interfaces() { checkRAM(F("handle_interfaces")); # endif - if (!isLoggedIn()) { return; } - if ((navMenuIndex != MENU_INDEX_INTERFACES) && (navMenuIndex <= MENU_MAX_INDEX_SHOWN)) { + uint8_t newNavIndex = navMenuIndex; + if ((newNavIndex != MENU_INDEX_INTERFACES) && (newNavIndex <= MENU_MAX_INDEX_SHOWN)) { #if FEATURE_I2C - navMenuIndex = MENU_INDEX_INTERFACES_I2C; + newNavIndex = MENU_INDEX_INTERFACES_I2C; #elif FEATURE_SPI - navMenuIndex = MENU_INDEX_INTERFACES_SPI; + newNavIndex = MENU_INDEX_INTERFACES_SPI; #elif FEATURE_MODBUS && FEATURE_MODBUS_INTERFACES_TAB - navMenuIndex = MENU_INDEX_INTERFACES_MODBUS; + newNavIndex = MENU_INDEX_INTERFACES_MODBUS; #elif FEATURE_CAN - navMenuIndex = MENU_INDEX_INTERFACES_CAN; + newNavIndex = MENU_INDEX_INTERFACES_CAN; #elif FEATURE_WRMBUS - navMenuIndex = MENU_INDEX_INTERFACES_WRMBUS; + newNavIndex = MENU_INDEX_INTERFACES_WRMBUS; #elif FEATURE_WIMBUS - navMenuIndex = MENU_INDEX_INTERFACES_WIMBUS; + newNavIndex = MENU_INDEX_INTERFACES_WIMBUS; #else - navMenuIndex = MENU_INDEX_INTERFACES; + // FIXME TD-er: Should we still continue here? Why not simply return; + newNavIndex = MENU_INDEX_INTERFACES; #endif } - TXBuffer.startStream(); - sendHeadandTail_stdtemplate(_HEAD); + if (!startStream_send_stdTemplate(newNavIndex)) return; save_interfaces(); @@ -149,8 +149,7 @@ void handle_interfaces() { html_end_table(); html_end_form(); - sendHeadandTail_stdtemplate(_TAIL); - TXBuffer.endStream(); + sendTail_stdtemplate(); } void save_interfaces() { diff --git a/src/src/WebServer/JSON.cpp b/src/src/WebServer/JSON.cpp index 90eb4ed79..74fab777f 100644 --- a/src/src/WebServer/JSON.cpp +++ b/src/src/WebServer/JSON.cpp @@ -734,8 +734,7 @@ void handle_timingstats_json() { # if FEATURE_ESPEASY_P2P void handle_nodes_list_json() { - if (!isLoggedIn()) { return; } - TXBuffer.startJsonStream(); + if (!startJSON_Stream()) { return; } json_init(); json_open(true); @@ -767,8 +766,7 @@ void handle_nodes_list_json() { # endif // if FEATURE_ESPEASY_P2P void handle_buildinfo() { - if (!isLoggedIn()) { return; } - TXBuffer.startJsonStream(); + if (!startJSON_Stream()) { return; } json_init(); json_open(); { diff --git a/src/src/WebServer/Log.cpp b/src/src/WebServer/Log.cpp index a26896db8..54f6996fb 100644 --- a/src/src/WebServer/Log.cpp +++ b/src/src/WebServer/Log.cpp @@ -42,18 +42,16 @@ void handle_log() { #else // ifdef WEBSERVER_LOG addHtml(F("Not included in build")); #endif // ifdef WEBSERVER_LOG - sendHeadandTail_stdtemplate(_TAIL); - TXBuffer.endStream(); + sendTail_stdtemplate(); } // ******************************************************************************** // Web Interface JSON log page // ******************************************************************************** void handle_log_JSON() { - if (!isLoggedIn()) { return; } #ifdef WEBSERVER_LOG START_TIMER; - TXBuffer.startJsonStream(); + if (!startJSON_Stream()) { return; } { KeyValueWriter_JSON top(true); { @@ -145,6 +143,8 @@ void handle_log_JSON() { updateLogLevelCache(); #else // ifdef WEBSERVER_LOG + if (!isLoggedIn()) { return; } + handleNotFound(); #endif // ifdef WEBSERVER_LOG } diff --git a/src/src/WebServer/NetworkPage.cpp b/src/src/WebServer/NetworkPage.cpp index 87b212343..5563442f7 100644 --- a/src/src/WebServer/NetworkPage.cpp +++ b/src/src/WebServer/NetworkPage.cpp @@ -111,8 +111,6 @@ void handle_networks() } - html_add_form(); - if (networkIndexSet) { handle_networks_NetworkSettingsPage(networkindex); @@ -122,8 +120,7 @@ void handle_networks() handle_networks_ShowAllNetworksTable(); } - sendHeadandTail_stdtemplate(_TAIL); - TXBuffer.endStream(); + sendTail_stdtemplate(); } void handle_networks_clearLoadDefaults(ESPEasy::net::networkIndex_t networkindex, NetworkSettingsStruct& NetworkSettings) { @@ -180,6 +177,7 @@ void handle_networks_CopySubmittedSettings_NWPluginCall(ESPEasy::net::networkInd void handle_networks_ShowAllNetworksTable() { + html_add_form(); html_table_class_multirow(); html_TR(); html_table_header(F(""), 70); @@ -317,6 +315,8 @@ void handle_networks_NetworkSettingsPage(ESPEasy::net::networkIndex_t networkind { if (!validNetworkIndex(networkindex)) { return; } + html_add_form(); + const networkDriverIndex_t networkDriverIndex = getNetworkDriverIndex_from_NWPluginID( Settings.getNWPluginID_for_network(networkindex)); diff --git a/src/src/WebServer/NotificationPage.cpp b/src/src/WebServer/NotificationPage.cpp index 0636b29a6..2d5b5d875 100644 --- a/src/src/WebServer/NotificationPage.cpp +++ b/src/src/WebServer/NotificationPage.cpp @@ -321,8 +321,7 @@ void handle_notifications() { html_end_table(); html_end_form(); } - sendHeadandTail_stdtemplate(_TAIL); - TXBuffer.endStream(); + sendTail_stdtemplate(); } #endif // FEATURE_NOTIFIER diff --git a/src/src/WebServer/PinStates.cpp b/src/src/WebServer/PinStates.cpp index 25acd425e..7df514720 100644 --- a/src/src/WebServer/PinStates.cpp +++ b/src/src/WebServer/PinStates.cpp @@ -32,9 +32,7 @@ void handle_pinstates_json() { checkRAM(F("handle_pinstates")); # endif // ifndef BUILD_NO_RAM_TRACKER - if (!isLoggedIn()) { return; } - navMenuIndex = MENU_INDEX_TOOLS; - TXBuffer.startJsonStream(); + if (!startJSON_Stream()) { return; } bool first = true; addHtml('['); @@ -300,8 +298,7 @@ void handle_pinstates() { # endif // if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 5, 0) # endif // ifdef ESP32 - sendHeadandTail_stdtemplate(_TAIL); - TXBuffer.endStream(); + sendTail_stdtemplate(); } #endif // ifdef WEBSERVER_PINSTATES diff --git a/src/src/WebServer/PluginListPage.cpp b/src/src/WebServer/PluginListPage.cpp index f6b08eac0..52d5afe42 100644 --- a/src/src/WebServer/PluginListPage.cpp +++ b/src/src/WebServer/PluginListPage.cpp @@ -28,8 +28,7 @@ void handle_pluginlist() { const int colspan = 5; # endif // if FEATURE_MQTT_TLS || FEATURE_HTTP_TLS - TXBuffer.startStream(); - sendHeadandTail_stdtemplate(_HEAD); + startStream_send_stdTemplate_NoLoginCheck(MENU_INDEX_DEVICES); // the table header html_table_class_normal(); @@ -196,8 +195,7 @@ void handle_pluginlist() { html_end_table(); html_end_form(); - sendHeadandTail_stdtemplate(_TAIL); - TXBuffer.endStream(); + sendTail_stdtemplate(); } #endif // if FEATURE_PLUGIN_LIST diff --git a/src/src/WebServer/RootPage.cpp b/src/src/WebServer/RootPage.cpp index d51308435..98a5036d1 100644 --- a/src/src/WebServer/RootPage.cpp +++ b/src/src/WebServer/RootPage.cpp @@ -79,19 +79,19 @@ void handle_root() { const bool loggedIn = isLoggedIn(false); - navMenuIndex = 0; + navMenuIndex = MENU_INDEX_MAIN; // if index.htm exists on FS serve that one (first check if gziped version exists) if (loadFromFS(F("/index.htm.gz"))) { return; } if (loadFromFS(F("/index.htm"))) { return; } - TXBuffer.startStream(); - boolean rebootCmd = false; String sCommand = webArg(F("cmd")); rebootCmd = strcasecmp_P(sCommand.c_str(), PSTR("reboot")) == 0; - sendHeadandTail_stdtemplate(_HEAD, rebootCmd); + + // Already checked for logged in state + startStream_send_stdTemplate_NoLoginCheck(MENU_INDEX_MAIN, rebootCmd); // TODO: move this to handle_tools, from where it is actually called? @@ -211,12 +211,8 @@ void handle_root() { addFormHeader(F("Command Argument")); addRowLabel(F("Command")); addHtml(sCommand); - - addRowColspan(2); - addHtml(F("Command Output
")); - free_string(printWebString); + + handle_printWebString(); } } html_end_table(); @@ -404,10 +400,13 @@ void handle_root() { html_end_table(); # endif // if FEATURE_ESPEASY_P2P html_end_form(); + sendTail_stdtemplate(); + // FIXME TD-er: Is this still needed? free_string(printWebString); printToWeb = false; - sendHeadandTail_stdtemplate(_TAIL); + + return; // TXBuffer.endStream() was already sent } TXBuffer.endStream(); } diff --git a/src/src/WebServer/Rules.cpp b/src/src/WebServer/Rules.cpp index 7383e0052..ac30ce099 100644 --- a/src/src/WebServer/Rules.cpp +++ b/src/src/WebServer/Rules.cpp @@ -55,8 +55,8 @@ void handle_rules() { if (f) { f.close(); } } - TXBuffer.startStream(); - sendHeadandTail_stdtemplate(_HEAD); + // Already checked for login + startStream_send_stdTemplate_NoLoginCheck(MENU_INDEX_RULES); addHtmlError(error); html_table_class_normal(); @@ -104,8 +104,7 @@ void handle_rules() { addButton(fileName, F("Download to file")); html_end_table(); - sendHeadandTail_stdtemplate(_TAIL); - TXBuffer.endStream(); + sendTail_stdtemplate(); checkRuleSets(); } @@ -127,10 +126,8 @@ void handle_rules_new() { # ifndef BUILD_NO_RAM_TRACKER checkRAM(F("handle_rules")); # endif // ifndef BUILD_NO_RAM_TRACKER - navMenuIndex = 5; - TXBuffer.startStream(); - sendHeadandTail(F("TmplStd"), _HEAD); - + if (!startStream_send_stdTemplate(MENU_INDEX_RULES)) { return; } + // define macro # if defined(ESP8266) String rootPath = F("rules"); @@ -254,8 +251,7 @@ void handle_rules_new() { } // TXBuffer += F("

"); - sendHeadandTail(F("TmplStd"), _TAIL); - TXBuffer.endStream(); + sendTail_stdtemplate(); # ifndef BUILD_NO_RAM_TRACKER checkRAM(F("handle_rules")); # endif // ifndef BUILD_NO_RAM_TRACKER @@ -477,9 +473,7 @@ bool handle_rules_edit(String originalUri, bool isAddNew) { } } } - navMenuIndex = 5; - TXBuffer.startStream(); - sendHeadandTail(F("TmplStd")); + startStream_send_stdTemplate_NoLoginCheck(MENU_INDEX_RULES); if (error.length() > 0) { addHtmlError(error); @@ -529,8 +523,7 @@ bool handle_rules_edit(String originalUri, bool isAddNew) { addHtml(F("")); - sendHeadandTail(F("TmplStd"), true); - TXBuffer.endStream(); + sendTail_stdtemplate(); # endif // WEBSERVER_NEW_RULES } # ifndef BUILD_NO_RAM_TRACKER diff --git a/src/src/WebServer/SettingsArchive.cpp b/src/src/WebServer/SettingsArchive.cpp index 67a15e820..c37214384 100644 --- a/src/src/WebServer/SettingsArchive.cpp +++ b/src/src/WebServer/SettingsArchive.cpp @@ -232,8 +232,7 @@ void handle_settingsarchive() { html_end_table(); html_end_form(); - sendHeadandTail_stdtemplate(_TAIL); - TXBuffer.endStream(); + sendTail_stdtemplate(); } // ******************************************************************************** diff --git a/src/src/WebServer/SetupPage.cpp b/src/src/WebServer/SetupPage.cpp index d2ccbb2d5..9d9a4316f 100644 --- a/src/src/WebServer/SetupPage.cpp +++ b/src/src/WebServer/SetupPage.cpp @@ -43,15 +43,15 @@ void handle_setup() { checkRAM(F("handle_setup")); # endif // ifndef BUILD_NO_RAM_TRACKER - // Do not check client IP range allowed. - TXBuffer.startStream(); const bool connected = ESPEasy::net::NetworkConnected(); // if (connected) { - navMenuIndex = MENU_INDEX_SETUP; - sendHeadandTail_stdtemplate(_HEAD); + + // TODO TD-er: Should also check for logged in state here? + // if (!startStream_send_stdTemplate(MENU_INDEX_SETUP)) { return; } + startStream_send_stdTemplate_NoLoginCheck(MENU_INDEX_SETUP); /* } else { sendHeadandTail(F("TmplAP")); @@ -260,13 +260,12 @@ void handle_setup() { } // if (connected) { - sendHeadandTail_stdtemplate(_TAIL); + sendTail_stdtemplate(); /* } else { sendHeadandTail(F("TmplAP"), true); } */ - TXBuffer.endStream(); delay(10); if (clearWiFiCredentials) { diff --git a/src/src/WebServer/SysInfoPage.cpp b/src/src/WebServer/SysInfoPage.cpp index ae8349ddd..c240d74b8 100644 --- a/src/src/WebServer/SysInfoPage.cpp +++ b/src/src/WebServer/SysInfoPage.cpp @@ -56,8 +56,7 @@ void handle_sysinfo_json() { checkRAM(F("handle_sysinfo")); # endif // ifndef BUILD_NO_RAM_TRACKER - if (!isLoggedIn()) { return; } - TXBuffer.startJsonStream(); + if (!startJSON_Stream()) { return; } { KeyValueWriter_JSON mainLevelWriter(true); { @@ -292,8 +291,7 @@ void handle_sysinfo() { html_end_table(); html_end_form(); - sendHeadandTail_stdtemplate(_TAIL); - TXBuffer.endStream(); + sendTail_stdtemplate(); } void handle_sysinfo_basicInfo() { diff --git a/src/src/WebServer/SysVarPage.cpp b/src/src/WebServer/SysVarPage.cpp index 10af2f21d..e05a62a74 100644 --- a/src/src/WebServer/SysVarPage.cpp +++ b/src/src/WebServer/SysVarPage.cpp @@ -543,8 +543,7 @@ void handle_sysvars() { } html_end_table(); html_end_form(); - sendHeadandTail_stdtemplate(_TAIL); - TXBuffer.endStream(); + sendTail_stdtemplate(); } void addSysVar_html(const __FlashStringHelper *input) { diff --git a/src/src/WebServer/TimingStats.cpp b/src/src/WebServer/TimingStats.cpp index 59c828646..db33ae689 100644 --- a/src/src/WebServer/TimingStats.cpp +++ b/src/src/WebServer/TimingStats.cpp @@ -17,9 +17,9 @@ void handle_timingstats() { #ifndef BUILD_NO_RAM_TRACKER checkRAM(F("handle_timingstats")); #endif - navMenuIndex = MENU_INDEX_TOOLS; - TXBuffer.startStream(); - sendHeadandTail_stdtemplate(_HEAD); + + startStream_send_stdTemplate_NoLoginCheck(MENU_INDEX_TOOLS); + html_table_class_multirow(); html_TR(); { @@ -55,8 +55,7 @@ void handle_timingstats() { addHtml(F("Duty cycle based on average < 1 msec is highly unreliable")); html_end_table(); - sendHeadandTail_stdtemplate(_TAIL); - TXBuffer.endStream(); + sendTail_stdtemplate(); } // ******************************************************************************** diff --git a/src/src/WebServer/ToolsPage.cpp b/src/src/WebServer/ToolsPage.cpp index 84e5a7061..5bab88ce5 100644 --- a/src/src/WebServer/ToolsPage.cpp +++ b/src/src/WebServer/ToolsPage.cpp @@ -48,15 +48,7 @@ void handle_tools() { addRTDHelpButton(F("Reference/Command.html")); html_TR_TD(); - if (printWebString.length() > 0) - { - addRowColspan(2); - addHtml(F("Command Output
")); - free_string(printWebString); - } - + handle_printWebString(); addFormSubHeader(F("System")); @@ -201,8 +193,9 @@ void handle_tools() { html_end_table(); html_end_form(); - sendHeadandTail_stdtemplate(_TAIL); - TXBuffer.endStream(); + sendTail_stdtemplate(); + + // FIXME TD-er: Is this still needed? free_string(printWebString); printToWeb = false; } diff --git a/src/src/WebServer/UploadPage.cpp b/src/src/WebServer/UploadPage.cpp index 1122d2439..72221eb5d 100644 --- a/src/src/WebServer/UploadPage.cpp +++ b/src/src/WebServer/UploadPage.cpp @@ -29,8 +29,7 @@ void handle_upload() { addHtml(F( "

Upload settings file:

")); - sendHeadandTail_stdtemplate(_TAIL); - TXBuffer.endStream(); + sendTail_stdtemplate(); free_string(printWebString); printToWeb = false; } @@ -77,8 +76,7 @@ void handle_upload_post() { } addHtml(F("Upload finished")); - sendHeadandTail_stdtemplate(_TAIL); - TXBuffer.endStream(); + sendTail_stdtemplate(); free_string(printWebString); printToWeb = false; } diff --git a/src/src/WebServer/WebTemplateParser.h b/src/src/WebServer/WebTemplateParser.h index 07bf13538..38ca093c5 100644 --- a/src/src/WebServer/WebTemplateParser.h +++ b/src/src/WebServer/WebTemplateParser.h @@ -15,10 +15,10 @@ #define MENU_INDEX_INTERFACES 3 #define MENU_INDEX_INTERFACES_I2C 30 #define MENU_INDEX_INTERFACES_SPI 31 -#define MENU_INDEX_INTERFACES_MODBUS 32 +#define MENU_INDEX_INTERFACES_MODBUS 32 // For now Modbus-RTU, maybe later also Modbus-TCP #define MENU_INDEX_INTERFACES_CAN 33 -#define MENU_INDEX_INTERFACES_WRMBUS 34 -#define MENU_INDEX_INTERFACES_WIMBUS 35 +#define MENU_INDEX_INTERFACES_WRMBUS 34 // Wired M-Bus +#define MENU_INDEX_INTERFACES_WIMBUS 35 // Wireless M-Bus #define MENU_INDEX_NETWORK 4 #define MENU_INDEX_CONTROLLERS 5 #define MENU_INDEX_BUSES 6 diff --git a/src/src/WebServer/WiFiScanner.cpp b/src/src/WebServer/WiFiScanner.cpp index 1d34b8933..a3a114614 100644 --- a/src/src/WebServer/WiFiScanner.cpp +++ b/src/src/WebServer/WiFiScanner.cpp @@ -71,7 +71,7 @@ void handle_wifiscanner() { ESPEasy::net::wifi::setWifiMode(cur_wifimode); if (!startStream_send_stdTemplate(MENU_INDEX_TOOLS)) { return; } - + html_table_class_multirow(); html_TR(); html_table_header(getLabel(LabelType::SSID)); @@ -97,8 +97,7 @@ void handle_wifiscanner() { } html_end_table(); - sendHeadandTail_stdtemplate(_TAIL); - TXBuffer.endStream(); + sendTail_stdtemplate(); } #endif // ifdef WEBSERVER_WIFI_SCANNER \ No newline at end of file From c570df9a3b68881d0563fbab8efa71e7f4f8e12e Mon Sep 17 00:00:00 2001 From: TD-er Date: Mon, 13 Jul 2026 16:02:56 +0200 Subject: [PATCH 3/5] [PPP] Show info even when no connection to provider is active --- src/ESPEasy/net/_NW005_PPP_modem.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ESPEasy/net/_NW005_PPP_modem.cpp b/src/ESPEasy/net/_NW005_PPP_modem.cpp index 97400de84..c71a3bf2e 100644 --- a/src/ESPEasy/net/_NW005_PPP_modem.cpp +++ b/src/ESPEasy/net/_NW005_PPP_modem.cpp @@ -60,7 +60,7 @@ bool NWPlugin_005(NWPlugin::Function function, EventStruct *event, String& strin ESPEasy::net::ppp::NW005_data_struct_PPP_modem *NW_data = static_cast(getNWPluginData(event->NetworkIndex)); - if (NW_data && NW_data->attached()) { + if (NW_data /*&& NW_data->attached()*/) { event->networkInterface = &PPP; success = event->networkInterface != nullptr; } From 760dcf724fff71a6a31f85aac71144986b3c1292 Mon Sep 17 00:00:00 2001 From: TD-er Date: Mon, 13 Jul 2026 16:03:26 +0200 Subject: [PATCH 4/5] [PPP Docs] Add documentation on NW005 PPP Modem --- docs/source/Network/NW005.rst | 77 +++++++++++++++++++ docs/source/Network/NW005_DeviceSettings.png | Bin 60821 -> 73407 bytes 2 files changed, 77 insertions(+) diff --git a/docs/source/Network/NW005.rst b/docs/source/Network/NW005.rst index 2d88ede0f..f9003b7d2 100644 --- a/docs/source/Network/NW005.rst +++ b/docs/source/Network/NW005.rst @@ -33,11 +33,88 @@ Configuration Device Settings ^^^^^^^^^^^^^^^ +.. image:: NW005_DeviceSettings.png + +DTR pin +------- + +For SIMCOM A76xx modems, there is an emergency fallback option possible to regain access to the modem while the modem is in 'data' mode and not in 'console' mode. +ESPEasy does send the required AT-command ``AT&D1`` right before starting the network connection to enable this fallback in the modem settings. + +These PPP modems do have a console/command mode and a data mode. +When entering AT commands, the modem must be pulled out of the data mode. However when the connection between the ESP and the modem got interrupted while the modem is still in data mode, it is impossible to regain access to the modem unless it is reset or power cycled. +This may occur when the ESP crashes or reboots without properly terminating the PPP network connection, or when the serial link between the ESP and the modem is not using flow control (which is strongly suggested to use!). + +Not all modem boards do have the DTR pin exposed. So make sure to either have the reset pin available, or as a last resort, have the option to power cycle the modem board. +Power cycling should be considered as last resort to regain access to the modem, as it may take several minutes for a modem to get connected again after a power cycle. + Connection Settings ^^^^^^^^^^^^^^^^^^^ +These settings are optional. + +.. note:: These specific settings are stored in the file ``devsecurity.dat`` as these are specific to this device. + +Access Point Name (APN) +----------------------- + +The APN is like a default gateway for your device to connect to another network. + +Typically the default APN as stored in the SIM card, or sent by the provider when setting up the connection, is just fine. + +For some use cases, it may be required to set a specific APN, to override the pre-configured one stored in the SIM card. + +A provider may offer several APNs, for example to connect to a specific customer network or to handle the traffic differently. + +Whether or not this is even useful to change depends on the use case and the specific provider. + + +SIM Card Pin +------------ + +A SIM card often has some 4-digit pin, which must be entered when powering up the device. +If needed, the Pin number can be entered here. + + +Modem State +^^^^^^^^^^^ + +.. image:: NW005_ModemState.png + +UE System Information +^^^^^^^^^^^^^^^^^^^^^ + +.. image:: NW005_UE_SystemInformation.png + +Useful AT commands +^^^^^^^^^^^^^^^^^^ + +The command ``ppp,write,`` can be used to interact directly with the modem. + +.. note:: The displayed output on the web interface often also includes the ``OK`` at the end. This is not part of the reply, but was originally printed on a separate line. However the way how these outputs are shown on the "Command Output" window, the extra newlines have been stripped from the response. The log on the serial port will output these on separate lines. + +* ``ppp,write,ATI`` Example output: ``+GCAP: +CGSM,+FCLASS,+DS`` +* ``ppp,write,AT+IPR=?`` Listing supported baud rates: ``+IPR: (300,600,1200,2400,4800,9600,19200,38400,57600,115200,230400,460800,921600,1842000,3686400)`` +* ``ppp,write,AT+CSPN?`` Show the SIM card carrier string: ``+CSPN: "Lebara",0`` +* ``ppp,write,AT+CCLK?`` Show local time as known by the modem: ``+CCLK: "70/01/01,00:53:53+00"`` + + +Example Devices +^^^^^^^^^^^^^^^ + +* `A7670E `_ (DTR pin exposed, no RST pin) +* `A7670G `_ (DTR pin exposed, no RST pin) +* `LilyGO T-PCIE V1.2 - AXP2101 - ESP32-WROVER - 16MB `_ with modem: `LilyGO TTGO T-PCIE A7670G `_ + +To use the last LilyGo T-PCIe v1.2 along with their A7670G modem combination as network interface #3, this config import can be used to get started: + +.. code-block:: + + networkimportconfig,3,`{"nwpluginID":5,"enabled":"true","route_prio":200,"fallback":"false","sn_block":"true","start_delay":1000,"en_ipv6":"false","serPort":4,"RX":26,"TX":27,"RTS":-1,"CTS":-1,"rst":4,"rst_act_low":"false","rst_delay":500,"baudrate":115200,"flowctrl":0,"phytype":2,"DTR":-1}` + + Change log ---------- diff --git a/docs/source/Network/NW005_DeviceSettings.png b/docs/source/Network/NW005_DeviceSettings.png index 89abbd08ef1e8fd534984fe7f21a75ad1ec57f8b..0b29b81acfceab3017894b69ad34ebc28c0585a7 100644 GIT binary patch literal 73407 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 literal 60821 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 Date: Mon, 13 Jul 2026 21:34:27 +0200 Subject: [PATCH 5/5] [PPP Docs] Add description and some tips regarding power --- docs/source/Network/NW005.rst | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/docs/source/Network/NW005.rst b/docs/source/Network/NW005.rst index f9003b7d2..52bd1ef97 100644 --- a/docs/source/Network/NW005.rst +++ b/docs/source/Network/NW005.rst @@ -25,10 +25,40 @@ Maintainer: |NW005_maintainer| Description ----------- +The PPP network interface allows to use one of many available GSM/GPRS/WCDMA/HSDPA/HSUPA/PSPA/LTE/4g modem modules to allow an ESPEasy node to be used literally "in the field". +When connected, a module offers a direct connection to the internet. Keep in mind this connection is like any other device behind a NAT router, thus no connection possible from the internet to the device itself. + +N.B. There are exceptions to this, for example when using a custom service with your own SIM cards. These kinds of configurations are not tested, but also not actively disabled in ESPEasy. + +All supported modules need to have an UART interface over which the ESP communicates using AT-commands. + +Currently supported PPP modules (others may also work): + +* SIMCOM A76xx +* SIMCOM A7070/A7000 +* BG96 +* SIM800 (obsolete) +* Generic + +The "Generic" option likely does work on most modules, however some specifics may not work. + Configuration ------------- +PPP modems need to communicate via a serial port. +It is strongly adviced to use flow control where possible and use hardware serial (not software serial). + +Most SIMCOM modules use 115200 as default baudrate, unless it is configured otherwise. + +Make sure to have at least the reset pin of the PPP modem connected, or at the very least have the option to power cycle the modem. But this should be used only as last resort as the modem may take minutes to find a network after a power cycle. + +LTE modules can draw a significant high current while connecting to the provider network. +This can be upto 2 Ampere. So make sure either the module has ample capacitors (e.g. 330 uF ... 470 uF) and preferrably also a soft-start circuit when enable power to the PPP modem. + +.. note:: Never run these PPP modem modules without an antenna connected! + + Device Settings ^^^^^^^^^^^^^^^