From d66ef2347e7fb9f597fa4834dbca89c4de21cc79 Mon Sep 17 00:00:00 2001 From: arendst Date: Fri, 26 Jan 2018 15:21:57 +0100 Subject: [PATCH] v5.11.1f - Revert chunks (#1706) 5.11.1f * Revert chunked webserver pages as it fails on many browsers due to chunks being too small (#1706) * Reduce initial console weblog from 20 to 13 lines due to memory constraints --- README.md | 2 +- sonoff/_releasenotes.ino | 6 +- sonoff/sonoff.h | 6 +- sonoff/sonoff.ino | 3 +- sonoff/sonoff_post.h | 2 +- sonoff/webserver.ino | 163 ++++++++++++-------------------------- sonoff/xsns_interface.ino | 17 ---- 7 files changed, 66 insertions(+), 133 deletions(-) diff --git a/README.md b/README.md index 301b1def6..710fe1359 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ ## Sonoff-Tasmota Provide ESP8266 based Sonoff by [iTead Studio](https://www.itead.cc/) and ElectroDragon IoT Relay with Serial, Web and MQTT control allowing 'Over the Air' or OTA firmware updates using Arduino IDE. -Current version is **5.11.1e** - See [sonoff/_releasenotes.ino](https://github.com/arendst/Sonoff-Tasmota/blob/development/sonoff/_releasenotes.ino) for change information. +Current version is **5.11.1f** - See [sonoff/_releasenotes.ino](https://github.com/arendst/Sonoff-Tasmota/blob/development/sonoff/_releasenotes.ino) for change information. ### ATTENTION All versions diff --git a/sonoff/_releasenotes.ino b/sonoff/_releasenotes.ino index 02b23f821..5fabdbf57 100644 --- a/sonoff/_releasenotes.ino +++ b/sonoff/_releasenotes.ino @@ -1,4 +1,8 @@ -/* 5.11.1e +/* 5.11.1f + * Revert chunked webserver pages as it fails on many browsers due to chunks being too small (#1706) + * Reduce initial console weblog from 20 to 13 lines due to memory constraints + * + * 5.11.1e * Replaced command Ina219Mode with command Sensor13 * Add chunked webserver pages for large pages saving memory * Fix Non-English JSON temperature unit attachement diff --git a/sonoff/sonoff.h b/sonoff/sonoff.h index 2b5348f7a..54813c7eb 100644 --- a/sonoff/sonoff.h +++ b/sonoff/sonoff.h @@ -90,7 +90,11 @@ typedef unsigned long power_t; // Power (Relay) type #ifdef USE_MQTT_TLS #define MAX_LOG_LINES 10 // Max number of lines in weblog #else - #define MAX_LOG_LINES 20 // Max number of lines in weblog + #ifdef ARDUINO_ESP8266_RELEASE_2_3_0 + #define MAX_LOG_LINES 20 // Max number of lines in weblog + #else + #define MAX_LOG_LINES 13 // Max number of lines in weblog (less due to more memory usage) + #endif #endif #define MAX_BACKLOG 16 // Max number of commands in backlog (chk backlog_index and backlog_pointer code) #define MIN_BACKLOG_DELAY 2 // Minimal backlog delay in 0.1 seconds diff --git a/sonoff/sonoff.ino b/sonoff/sonoff.ino index 80e37d80d..047d416a2 100644 --- a/sonoff/sonoff.ino +++ b/sonoff/sonoff.ino @@ -25,9 +25,10 @@ - Select IDE Tools - Flash Size: "1M (no SPIFFS)" ====================================================*/ -#define VERSION 0x050B0105 // 5.11.1e +#define VERSION 0x050B0106 // 5.11.1f // Location specific includes +#include // Arduino_Esp8266 version information (ARDUINO_ESP8266_RELEASE and ARDUINO_ESP8266_RELEASE_2_3_0) #include "sonoff.h" // Enumeration used in user_config.h #include "user_config.h" // Fixed user configurable options #include "user_config_override.h" // Configuration overrides for user_config.h diff --git a/sonoff/sonoff_post.h b/sonoff/sonoff_post.h index 855914a12..bb0e2392d 100644 --- a/sonoff/sonoff_post.h +++ b/sonoff/sonoff_post.h @@ -108,7 +108,7 @@ void WifiWpsStatusCallback(wps_cb_status status); #define MESSZ (MQTT_MAX_PACKET_SIZE -TOPSZ -7) // Max number of characters in JSON message string (6 x DS18x20 sensors) #endif -#include // Arduino_Esp8266 version information (ARDUINO_ESP8266_RELEASE and ARDUINO_ESP8266_RELEASE_2_3_0) +//#include // Arduino_Esp8266 version information (ARDUINO_ESP8266_RELEASE and ARDUINO_ESP8266_RELEASE_2_3_0) #ifndef ARDUINO_ESP8266_RELEASE #define ARDUINO_ESP8266_RELEASE "STAGED" #endif diff --git a/sonoff/webserver.ino b/sonoff/webserver.ino index b0c20c5a2..0010f1020 100644 --- a/sonoff/webserver.ino +++ b/sonoff/webserver.ino @@ -414,6 +414,8 @@ void PollDnsWebserver() } } +/*********************************************************************************************/ + void SetHeader() { WebServer->sendHeader(F("Cache-Control"), F("no-cache, no-store, must-revalidate")); @@ -424,8 +426,6 @@ void SetHeader() #endif } -/*********************************************************************************************/ - void ShowPage(String &page, bool auth) { if (auth && (Settings.web_password[0] != 0) && !WebServer->authenticate(WEB_USERNAME, Settings.web_password)) { @@ -453,57 +453,6 @@ void ShowPage(String &page) /*********************************************************************************************/ -void ShowPageStartChunk() -{ - WebServer->setContentLength(CONTENT_LENGTH_UNKNOWN); - WebServer->send(200, FPSTR(HDR_CTYPE_HTML), ""); -} - -void ShowPageChunk(String &page) -{ - page.replace(F("{ha"), my_module.name); - page.replace(F("{h}"), Settings.friendlyname[0]); - if (HTTP_MANAGER == webserver_state) { - if (WifiConfigCounter()) { - page.replace(F(""), F("")); - page += FPSTR(HTTP_COUNTER); - } - } - WebServer->sendContent(page); -} - -void ShowPageStart(String &page, bool auth) -{ - if (auth && (Settings.web_password[0] != 0) && !WebServer->authenticate(WEB_USERNAME, Settings.web_password)) { - return WebServer->requestAuthentication(); - } - SetHeader(); - ShowPageStartChunk(); - ShowPageChunk(page); -} - -void ShowPageStart(String &page) -{ - ShowPageStart(page, true); -} - -void ShowPageStopChunk() -{ - WebServer->sendContent(""); - WebServer->client().stop(); // Stop is needed because we sent no content length -} - -void ShowPageEnd(String &page) -{ - ShowPageChunk(page); - String endpart = FPSTR(HTTP_END); - endpart.replace(F("{mv"), my_version); - WebServer->sendContent(endpart); - ShowPageStopChunk(); -} - -/*********************************************************************************************/ - void HandleWifiLogin() { String page = FPSTR(HTTP_HEAD); @@ -534,7 +483,6 @@ void HandleRoot() } } else { char stemp[10]; - char line[160]; String page = FPSTR(HTTP_HEAD); page.replace(F("{v}"), FPSTR(S_MAIN_MENU)); page += FPSTR(HTTP_HEAD_STYLE); @@ -544,19 +492,19 @@ void HandleRoot() if (devices_present) { if (light_type) { if ((LST_COLDWARM == (light_type &7)) || (LST_RGBWC == (light_type &7))) { - snprintf_P(line, sizeof(line), HTTP_MSG_SLIDER1, LightGetColorTemp()); - page += line; + snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_MSG_SLIDER1, LightGetColorTemp()); + page += mqtt_data; } - snprintf_P(line, sizeof(line), HTTP_MSG_SLIDER2, Settings.light_dimmer); - page += line; + snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_MSG_SLIDER2, Settings.light_dimmer); + page += mqtt_data; } page += FPSTR(HTTP_TABLE100); page += F(""); for (byte idx = 1; idx <= devices_present; idx++) { snprintf_P(stemp, sizeof(stemp), PSTR(" %d"), idx); - snprintf_P(line, sizeof(line), PSTR(""), + snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR(""), 100 / devices_present, idx, (devices_present < 5) ? D_BUTTON_TOGGLE : "", (devices_present > 1) ? stemp : ""); - page += line; + page += mqtt_data; } page += F(""); } @@ -570,8 +518,8 @@ void HandleRoot() } for (byte j = 0; j < 4; j++) { idx++; - snprintf_P(line, sizeof(line), PSTR(""), idx, idx); - page += line; + snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR(""), idx, idx); + page += mqtt_data; } } page += F(""); @@ -605,23 +553,28 @@ void HandleAjaxStatusRefresh() ExecuteCommand(svalue); } - ShowPageStartChunk(); - WebServer->sendContent(HTTP_TABLE100); + String page = ""; + mqtt_data[0] = '\0'; XsnsCall(FUNC_WEB_APPEND); - WebServer->sendContent(PSTR("")); + if (strlen(mqtt_data)) { + page += FPSTR(HTTP_TABLE100); + page += mqtt_data; + page.replace(F("."), F(D_DECIMAL_SEPARATOR)); + page += F(""); + } if (devices_present) { - WebServer->sendContent(HTTP_TABLE100); - WebServer->sendContent(PSTR("")); + page += FPSTR(HTTP_TABLE100); + page += F(""); uint8_t fsize = (devices_present < 5) ? 70 - (devices_present * 8) : 32; for (byte idx = 1; idx <= devices_present; idx++) { snprintf_P(svalue, sizeof(svalue), PSTR("%d"), bitRead(power, idx -1)); snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s"), // {t} = %'>
%s " D_GPIO "%d %s"), + snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s " D_GPIO "%d %s"), (WEMOS==Settings.module)?stemp:"", i, (0==i)? D_SENSOR_BUTTON "1":(1==i)? D_SERIAL_OUT :(3==i)? D_SERIAL_IN :(12==i)? D_SENSOR_RELAY "1":(13==i)? D_SENSOR_LED "1i":(14==i)? D_SENSOR :"", i, i); - page += line; - snprintf_P(line, sizeof(line), PSTR("sk(%d,%d);"), my_module.gp.io[i], i); // g0 - g16 - func += line; + part2 += mqtt_data; + snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("sk(%d,%d);"), my_module.gp.io[i], i); // g0 - g16 + page += mqtt_data; } } - func += F("}"); - ShowPageChunk(func); - + page += F("}"); + page += part2; page.replace(F(""), F("")); page += F(""); - ShowPageChunk(page); - - page = FPSTR(HTTP_FORM_END); + page += FPSTR(HTTP_FORM_END); page += FPSTR(HTTP_BTN_CONF); - ShowPageEnd(page); + ShowPage(page); } void HandleWifiConfigurationWithScan() @@ -1472,7 +1415,6 @@ void HandleHttpCommand() } SetHeader(); WebServer->send(200, FPSTR(HDR_CTYPE_JSON), message); -// WebServer->sendContent(""); } void HandleConsole() @@ -1517,10 +1459,8 @@ void HandleAjaxConsoleRefresh() counter = atoi(WebServer->arg("c2").c_str()); } - WebServer->setContentLength(CONTENT_LENGTH_UNKNOWN); - WebServer->send(200, FPSTR(HDR_CTYPE_XML), ""); snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%d%d"), web_log_index, reset_web_log_flag); - WebServer->sendContent(mqtt_data); + String message = F("}9"); // Cannot load mqtt_data here as <> will be encoded by replacements below if (!reset_web_log_flag) { counter = 99; reset_web_log_flag = 1; @@ -1533,23 +1473,24 @@ void HandleAjaxConsoleRefresh() do { if (web_log[counter].length()) { if (cflg) { - WebServer->sendContent(PSTR("\n")); + message += F("\n"); } else { cflg = 1; } - web_log[counter].replace(F("<"), F("%3C")); // XML encoding to fix blank console log in concert with javascript decodeURIComponent - web_log[counter].replace(F(">"), F("%3E")); - web_log[counter].replace(F("&"), F("%26")); - WebServer->sendContent(web_log[counter]); + message += web_log[counter]; } counter++; if (counter > MAX_LOG_LINES -1) { counter = 0; } } while (counter != web_log_index); + message.replace(F("<"), F("%3C")); // XML encoding to fix blank console log in concert with javascript decodeURIComponent + message.replace(F(">"), F("%3E")); + message.replace(F("&"), F("%26")); } - WebServer->sendContent(PSTR("")); - ShowPageStopChunk(); + message.replace(F("}9"), mqtt_data); // Save to load here + message += F(""); + WebServer->send(200, FPSTR(HDR_CTYPE_XML), message); } void HandleInformation() diff --git a/sonoff/xsns_interface.ino b/sonoff/xsns_interface.ino index 5c5e0b3a7..633c6955c 100644 --- a/sonoff/xsns_interface.ino +++ b/sonoff/xsns_interface.ino @@ -119,27 +119,10 @@ boolean XsnsCall(byte Function) boolean result = false; for (byte x = 0; x < xsns_present; x++) { -#ifdef USE_WEBSERVER - if (FUNC_WEB_APPEND == Function) { - mqtt_data[0] = '\0'; - } -#endif // USE_WEBSERVER result = xsns_func_ptr[x](Function); if (result) { break; } -#ifdef USE_WEBSERVER - if ((FUNC_WEB_APPEND == Function) && strlen(mqtt_data)) { - if (D_DECIMAL_SEPARATOR[0] != '.') { - for (int i = 0; i < strlen(mqtt_data); i++) { - if ('.' == mqtt_data[i]) { - mqtt_data[i] = D_DECIMAL_SEPARATOR[0]; - } - } - } - WebServer->sendContent(mqtt_data); - } -#endif // USE_WEBSERVER } return result;