mirror of
https://github.com/HASwitchPlate/openHASP.git
synced 2025-07-29 22:26:37 +00:00
Memory Optimizations
This commit is contained in:
parent
c6cba385f1
commit
abaa37ee5c
@ -29,6 +29,7 @@ FS * filesystem = &SPIFFS;
|
|||||||
File fsUploadFile;
|
File fsUploadFile;
|
||||||
char httpUser[32] = "";
|
char httpUser[32] = "";
|
||||||
char httpPassword[32] = "";
|
char httpPassword[32] = "";
|
||||||
|
HTTPUpload * upload;
|
||||||
|
|
||||||
#if defined(ARDUINO_ARCH_ESP8266)
|
#if defined(ARDUINO_ARCH_ESP8266)
|
||||||
#include <ESP8266WebServer.h>
|
#include <ESP8266WebServer.h>
|
||||||
@ -192,18 +193,20 @@ void webHandleRoot()
|
|||||||
|
|
||||||
webSendPage(nodename, httpMessage.length(), false);
|
webSendPage(nodename, httpMessage.length(), false);
|
||||||
webServer.sendContent(httpMessage);
|
webServer.sendContent(httpMessage);
|
||||||
|
httpMessage.clear();
|
||||||
webSendFooter();
|
webSendFooter();
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
void httpHandleReboot()
|
void httpHandleReboot()
|
||||||
{ // http://plate01/reboot
|
{ // http://plate01/reboot
|
||||||
if(!httpIsAuthenticated(F("/reboot"))) return;
|
if(!httpIsAuthenticated(F("reboot"))) return;
|
||||||
|
|
||||||
String nodename = haspGetNodename();
|
String nodename = haspGetNodename();
|
||||||
String httpMessage = F("Rebooting Device");
|
String httpMessage = F("Rebooting Device");
|
||||||
webSendPage(nodename, httpMessage.length(), true);
|
webSendPage(nodename, httpMessage.length(), true);
|
||||||
webServer.sendContent(httpMessage);
|
webServer.sendContent(httpMessage);
|
||||||
|
httpMessage.clear();
|
||||||
webSendFooter();
|
webSendFooter();
|
||||||
|
|
||||||
delay(200);
|
delay(200);
|
||||||
@ -213,7 +216,7 @@ void httpHandleReboot()
|
|||||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
void webHandleScreenshot()
|
void webHandleScreenshot()
|
||||||
{ // http://plate01/screenshot
|
{ // http://plate01/screenshot
|
||||||
if(!httpIsAuthenticated(F("/screenshot"))) return;
|
if(!httpIsAuthenticated(F("screenshot"))) return;
|
||||||
|
|
||||||
if(webServer.hasArg(F("q"))) {
|
if(webServer.hasArg(F("q"))) {
|
||||||
webServer.setContentLength(138 + 320 * 240 * 4);
|
webServer.setContentLength(138 + 320 * 240 * 4);
|
||||||
@ -234,6 +237,7 @@ void webHandleScreenshot()
|
|||||||
|
|
||||||
webSendPage(nodename, httpMessage.length(), false);
|
webSendPage(nodename, httpMessage.length(), false);
|
||||||
webServer.sendContent(httpMessage);
|
webServer.sendContent(httpMessage);
|
||||||
|
httpMessage.clear();
|
||||||
webSendFooter();
|
webSendFooter();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -242,7 +246,7 @@ void webHandleScreenshot()
|
|||||||
|
|
||||||
void webHandleAbout()
|
void webHandleAbout()
|
||||||
{ // http://plate01/about
|
{ // http://plate01/about
|
||||||
if(!httpIsAuthenticated(F("/about"))) return;
|
if(!httpIsAuthenticated(F("about"))) return;
|
||||||
|
|
||||||
String nodename = haspGetNodename();
|
String nodename = haspGetNodename();
|
||||||
String httpMessage((char *)0);
|
String httpMessage((char *)0);
|
||||||
@ -277,13 +281,14 @@ void webHandleAbout()
|
|||||||
|
|
||||||
webSendPage(nodename, httpMessage.length(), false);
|
webSendPage(nodename, httpMessage.length(), false);
|
||||||
webServer.sendContent(httpMessage);
|
webServer.sendContent(httpMessage);
|
||||||
|
httpMessage.clear();
|
||||||
webSendFooter();
|
webSendFooter();
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
void webHandleInfo()
|
void webHandleInfo()
|
||||||
{ // http://plate01/
|
{ // http://plate01/
|
||||||
if(!httpIsAuthenticated(F("/info"))) return;
|
if(!httpIsAuthenticated(F("info"))) return;
|
||||||
|
|
||||||
// char buffer[127];
|
// char buffer[127];
|
||||||
String nodename = haspGetNodename();
|
String nodename = haspGetNodename();
|
||||||
@ -356,6 +361,7 @@ void webHandleInfo()
|
|||||||
|
|
||||||
webSendPage(nodename, httpMessage.length(), false);
|
webSendPage(nodename, httpMessage.length(), false);
|
||||||
webServer.sendContent(httpMessage);
|
webServer.sendContent(httpMessage);
|
||||||
|
httpMessage.clear();
|
||||||
webSendFooter();
|
webSendFooter();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -444,35 +450,44 @@ bool handleFileRead(String path)
|
|||||||
|
|
||||||
void handleFileUpload()
|
void handleFileUpload()
|
||||||
{
|
{
|
||||||
if(!httpIsAuthenticated(F("fileupload"))) return;
|
|
||||||
|
|
||||||
if(webServer.uri() != "/edit") {
|
if(webServer.uri() != "/edit") {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
HTTPUpload & upload = webServer.upload();
|
upload = &webServer.upload();
|
||||||
if(upload.status == UPLOAD_FILE_START) {
|
if(upload->status == UPLOAD_FILE_START) {
|
||||||
String filename = upload.filename;
|
if(!httpIsAuthenticated(F("fileupload"))) return;
|
||||||
|
String filename((char *)0);
|
||||||
|
filename.reserve(127);
|
||||||
|
filename = upload->filename;
|
||||||
if(!filename.startsWith("/")) {
|
if(!filename.startsWith("/")) {
|
||||||
filename = "/" + filename;
|
filename = "/";
|
||||||
|
filename += upload->filename;
|
||||||
}
|
}
|
||||||
debugPrintln(String(F("handleFileUpload Name: ")) + filename);
|
if(filename.length() < 32) {
|
||||||
fsUploadFile = filesystem->open(filename, "w");
|
fsUploadFile = filesystem->open(filename, "w");
|
||||||
filename.clear();
|
}
|
||||||
} else if(upload.status == UPLOAD_FILE_WRITE) {
|
filename = String(F("handleFileUpload Name: ")) + filename;
|
||||||
|
debugPrintln(filename);
|
||||||
|
} else if(upload->status == UPLOAD_FILE_WRITE) {
|
||||||
// DBG_OUTPUT_PORT.print("handleFileUpload Data: "); debugPrintln(upload.currentSize);
|
// DBG_OUTPUT_PORT.print("handleFileUpload Data: "); debugPrintln(upload.currentSize);
|
||||||
if(fsUploadFile) {
|
if(fsUploadFile) {
|
||||||
fsUploadFile.write(upload.buf, upload.currentSize);
|
fsUploadFile.write(upload->buf, upload->currentSize);
|
||||||
char buffer[127];
|
char buffer[127];
|
||||||
sprintf_P(buffer, PSTR("Uploading %u of %u"), upload.currentSize, upload.totalSize);
|
sprintf_P(buffer, PSTR(" * Uploaded %u bytes"), upload->totalSize + upload->currentSize);
|
||||||
debugPrintln(buffer);
|
debugPrintln(buffer);
|
||||||
}
|
}
|
||||||
} else if(upload.status == UPLOAD_FILE_END) {
|
} else if(upload->status == UPLOAD_FILE_END) {
|
||||||
if(fsUploadFile) {
|
if(fsUploadFile) {
|
||||||
|
char buffer[127];
|
||||||
|
sprintf_P(buffer, PSTR("Uploaded %s (%u bytes)"), fsUploadFile.name(), upload->totalSize);
|
||||||
|
debugPrintln(buffer);
|
||||||
fsUploadFile.close();
|
fsUploadFile.close();
|
||||||
}
|
}
|
||||||
debugPrintln(String(F("handleFileUpload Size: ")) + String(upload.totalSize));
|
|
||||||
// String filename = upload.filename;
|
// Redirect to /config/hasp page. This flushes the web buffer and frees the memory
|
||||||
webHandleHaspConfig();
|
webServer.sendHeader(String(F("Location")), String(F("/config/hasp")), true);
|
||||||
|
webServer.send_P(302, PSTR("text/plain"), "");
|
||||||
|
// httpReconnect();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -594,7 +609,7 @@ void handleFileList()
|
|||||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
void webHandleConfig()
|
void webHandleConfig()
|
||||||
{ // http://plate01/config
|
{ // http://plate01/config
|
||||||
if(!httpIsAuthenticated(F("/config"))) return;
|
if(!httpIsAuthenticated(F("config"))) return;
|
||||||
|
|
||||||
if(webServer.method() == HTTP_POST) {
|
if(webServer.method() == HTTP_POST) {
|
||||||
if(webServer.hasArg(PSTR("save"))) {
|
if(webServer.hasArg(PSTR("save"))) {
|
||||||
@ -612,7 +627,7 @@ void webHandleConfig()
|
|||||||
httpSetConfig(settings.as<JsonObject>());
|
httpSetConfig(settings.as<JsonObject>());
|
||||||
|
|
||||||
// Password might have changed
|
// Password might have changed
|
||||||
if(!httpIsAuthenticated(F("/config"))) return;
|
if(!httpIsAuthenticated(F("config"))) return;
|
||||||
|
|
||||||
} else if(webServer.arg(PSTR("save")) == String(PSTR("wifi"))) {
|
} else if(webServer.arg(PSTR("save")) == String(PSTR("wifi"))) {
|
||||||
wifiSetConfig(settings.as<JsonObject>());
|
wifiSetConfig(settings.as<JsonObject>());
|
||||||
@ -658,6 +673,7 @@ void webHandleConfig()
|
|||||||
|
|
||||||
webSendPage(nodename, httpMessage.length(), false);
|
webSendPage(nodename, httpMessage.length(), false);
|
||||||
webServer.sendContent(httpMessage);
|
webServer.sendContent(httpMessage);
|
||||||
|
httpMessage.clear();
|
||||||
webSendFooter();
|
webSendFooter();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -665,7 +681,7 @@ void webHandleConfig()
|
|||||||
#if HASP_USE_MQTT > 0
|
#if HASP_USE_MQTT > 0
|
||||||
void webHandleMqttConfig()
|
void webHandleMqttConfig()
|
||||||
{ // http://plate01/config/mqtt
|
{ // http://plate01/config/mqtt
|
||||||
if(!httpIsAuthenticated(F("/config/mqtt"))) return;
|
if(!httpIsAuthenticated(F("config/mqtt"))) return;
|
||||||
|
|
||||||
DynamicJsonDocument settings(256);
|
DynamicJsonDocument settings(256);
|
||||||
mqttGetConfig(settings.to<JsonObject>());
|
mqttGetConfig(settings.to<JsonObject>());
|
||||||
@ -702,6 +718,7 @@ void webHandleMqttConfig()
|
|||||||
|
|
||||||
webSendPage(nodename, httpMessage.length(), false);
|
webSendPage(nodename, httpMessage.length(), false);
|
||||||
webServer.sendContent(httpMessage);
|
webServer.sendContent(httpMessage);
|
||||||
|
httpMessage.clear();
|
||||||
webSendFooter();
|
webSendFooter();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -709,7 +726,7 @@ void webHandleMqttConfig()
|
|||||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
void webHandleGuiConfig()
|
void webHandleGuiConfig()
|
||||||
{ // http://plate01/config/wifi
|
{ // http://plate01/config/wifi
|
||||||
if(!httpIsAuthenticated(F("/config/gui"))) return;
|
if(!httpIsAuthenticated(F("config/gui"))) return;
|
||||||
|
|
||||||
DynamicJsonDocument settings(256);
|
DynamicJsonDocument settings(256);
|
||||||
// guiGetConfig(settings.to<JsonObject>());
|
// guiGetConfig(settings.to<JsonObject>());
|
||||||
@ -730,6 +747,7 @@ void webHandleGuiConfig()
|
|||||||
|
|
||||||
webSendPage(nodename, httpMessage.length(), false);
|
webSendPage(nodename, httpMessage.length(), false);
|
||||||
webServer.sendContent(httpMessage);
|
webServer.sendContent(httpMessage);
|
||||||
|
httpMessage.clear();
|
||||||
webSendFooter();
|
webSendFooter();
|
||||||
|
|
||||||
if(webServer.hasArg(F("action"))) dispatchCommand(webServer.arg(F("action")));
|
if(webServer.hasArg(F("action"))) dispatchCommand(webServer.arg(F("action")));
|
||||||
@ -739,7 +757,7 @@ void webHandleGuiConfig()
|
|||||||
#if HASP_USE_WIFI > 0
|
#if HASP_USE_WIFI > 0
|
||||||
void webHandleWifiConfig()
|
void webHandleWifiConfig()
|
||||||
{ // http://plate01/config/wifi
|
{ // http://plate01/config/wifi
|
||||||
if(!httpIsAuthenticated(F("/config/wifi"))) return;
|
if(!httpIsAuthenticated(F("config/wifi"))) return;
|
||||||
|
|
||||||
DynamicJsonDocument settings(256);
|
DynamicJsonDocument settings(256);
|
||||||
wifiGetConfig(settings.to<JsonObject>());
|
wifiGetConfig(settings.to<JsonObject>());
|
||||||
@ -767,6 +785,7 @@ void webHandleWifiConfig()
|
|||||||
|
|
||||||
webSendPage(nodename, httpMessage.length(), false);
|
webSendPage(nodename, httpMessage.length(), false);
|
||||||
webServer.sendContent(httpMessage);
|
webServer.sendContent(httpMessage);
|
||||||
|
httpMessage.clear();
|
||||||
webSendFooter();
|
webSendFooter();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -775,7 +794,7 @@ void webHandleWifiConfig()
|
|||||||
#if HASP_USE_HTTP > 0
|
#if HASP_USE_HTTP > 0
|
||||||
void webHandleHttpConfig()
|
void webHandleHttpConfig()
|
||||||
{ // http://plate01/config/http
|
{ // http://plate01/config/http
|
||||||
if(!httpIsAuthenticated(F("/config/http"))) return;
|
if(!httpIsAuthenticated(F("config/http"))) return;
|
||||||
|
|
||||||
DynamicJsonDocument settings(256);
|
DynamicJsonDocument settings(256);
|
||||||
httpGetConfig(settings.to<JsonObject>());
|
httpGetConfig(settings.to<JsonObject>());
|
||||||
@ -803,6 +822,7 @@ void webHandleHttpConfig()
|
|||||||
|
|
||||||
webSendPage(nodename, httpMessage.length(), false);
|
webSendPage(nodename, httpMessage.length(), false);
|
||||||
webServer.sendContent(httpMessage);
|
webServer.sendContent(httpMessage);
|
||||||
|
httpMessage.clear();
|
||||||
webSendFooter();
|
webSendFooter();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -810,7 +830,7 @@ void webHandleHttpConfig()
|
|||||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
void webHandleHaspConfig()
|
void webHandleHaspConfig()
|
||||||
{ // http://plate01/config/http
|
{ // http://plate01/config/http
|
||||||
if(!httpIsAuthenticated(F("/config/hasp"))) return;
|
if(!httpIsAuthenticated(F("config/hasp"))) return;
|
||||||
|
|
||||||
DynamicJsonDocument settings(256);
|
DynamicJsonDocument settings(256);
|
||||||
haspGetConfig(settings.to<JsonObject>());
|
haspGetConfig(settings.to<JsonObject>());
|
||||||
@ -891,6 +911,10 @@ void webHandleHaspConfig()
|
|||||||
httpMessage += String(F("'></br><b>Startup Page</b> <i><small>(required)</small></i><input id='startpage' required "
|
httpMessage += String(F("'></br><b>Startup Page</b> <i><small>(required)</small></i><input id='startpage' required "
|
||||||
"name='startpage' type='number' min='0' max='3' value='"));
|
"name='startpage' type='number' min='0' max='3' value='"));
|
||||||
httpMessage += settings[FPSTR(F_CONFIG_STARTPAGE)].as<String>();
|
httpMessage += settings[FPSTR(F_CONFIG_STARTPAGE)].as<String>();
|
||||||
|
httpMessage +=
|
||||||
|
F("'></p><p><b>Startup Brightness</b> <i><small>(required)</small></i><input id='startpage' required "
|
||||||
|
"name='startdim' type='number' min='0' max='100' value='");
|
||||||
|
httpMessage += settings[FPSTR(F_CONFIG_STARTDIM)].as<String>();
|
||||||
httpMessage += F("'></p>");
|
httpMessage += F("'></p>");
|
||||||
|
|
||||||
httpMessage += F("<p><button type='submit' name='save' value='hasp'>Save Settings</button></form></p>");
|
httpMessage += F("<p><button type='submit' name='save' value='hasp'>Save Settings</button></form></p>");
|
||||||
@ -899,6 +923,7 @@ void webHandleHaspConfig()
|
|||||||
|
|
||||||
webSendPage(nodename, httpMessage.length(), false);
|
webSendPage(nodename, httpMessage.length(), false);
|
||||||
webServer.sendContent(httpMessage);
|
webServer.sendContent(httpMessage);
|
||||||
|
httpMessage.clear();
|
||||||
webSendFooter();
|
webSendFooter();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -927,7 +952,7 @@ void httpHandleNotFound()
|
|||||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
void webHandleSaveConfig()
|
void webHandleSaveConfig()
|
||||||
{
|
{
|
||||||
if(!httpIsAuthenticated(F("/saveConfig"))) return;
|
if(!httpIsAuthenticated(F("saveConfig"))) return;
|
||||||
|
|
||||||
configWriteConfig();
|
configWriteConfig();
|
||||||
}
|
}
|
||||||
@ -935,13 +960,13 @@ void webHandleSaveConfig()
|
|||||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
void webHandleFirmware()
|
void webHandleFirmware()
|
||||||
{
|
{
|
||||||
if(!httpIsAuthenticated(F("/firmware"))) return;
|
if(!httpIsAuthenticated(F("firmware"))) return;
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
void httpHandleEspFirmware()
|
void httpHandleEspFirmware()
|
||||||
{ // http://plate01/espfirmware
|
{ // http://plate01/espfirmware
|
||||||
if(!httpIsAuthenticated(F("/espfirmware"))) return;
|
if(!httpIsAuthenticated(F("espfirmware"))) return;
|
||||||
|
|
||||||
String nodename = haspGetNodename();
|
String nodename = haspGetNodename();
|
||||||
// char buffer[127];
|
// char buffer[127];
|
||||||
@ -954,6 +979,7 @@ void httpHandleEspFirmware()
|
|||||||
|
|
||||||
webSendPage(nodename, httpMessage.length(), true);
|
webSendPage(nodename, httpMessage.length(), true);
|
||||||
webServer.sendContent(httpMessage);
|
webServer.sendContent(httpMessage);
|
||||||
|
httpMessage.clear();
|
||||||
webSendFooter();
|
webSendFooter();
|
||||||
|
|
||||||
debugPrintln(String(F("HTTP: Attempting ESP firmware update from: ")) + String(webServer.arg("espFirmware")));
|
debugPrintln(String(F("HTTP: Attempting ESP firmware update from: ")) + String(webServer.arg("espFirmware")));
|
||||||
@ -963,7 +989,7 @@ void httpHandleEspFirmware()
|
|||||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
void httpHandleResetConfig()
|
void httpHandleResetConfig()
|
||||||
{ // http://plate01/resetConfig
|
{ // http://plate01/resetConfig
|
||||||
if(!httpIsAuthenticated(F("/resetConfig"))) return;
|
if(!httpIsAuthenticated(F("resetConfig"))) return;
|
||||||
|
|
||||||
bool resetConfirmed = webServer.arg(F("confirm")) == F("yes");
|
bool resetConfirmed = webServer.arg(F("confirm")) == F("yes");
|
||||||
String nodename = haspGetNodename();
|
String nodename = haspGetNodename();
|
||||||
@ -996,6 +1022,7 @@ void httpHandleResetConfig()
|
|||||||
|
|
||||||
webSendPage(nodename, httpMessage.length(), resetConfirmed);
|
webSendPage(nodename, httpMessage.length(), resetConfirmed);
|
||||||
webServer.sendContent(httpMessage);
|
webServer.sendContent(httpMessage);
|
||||||
|
httpMessage.clear();
|
||||||
webSendFooter();
|
webSendFooter();
|
||||||
|
|
||||||
if(resetConfirmed) {
|
if(resetConfirmed) {
|
||||||
|
@ -89,12 +89,13 @@ void IRAM_ATTR mqttSendState(const char * subtopic, const char * payload)
|
|||||||
// brightness = 100
|
// brightness = 100
|
||||||
|
|
||||||
char topic[127];
|
char topic[127];
|
||||||
|
char value[254];
|
||||||
|
|
||||||
snprintf_P(topic, sizeof(topic), PSTR("%sstate/%s"), mqttNodeTopic.c_str(), subtopic);
|
snprintf_P(topic, sizeof(topic), PSTR("%sstate/%s"), mqttNodeTopic.c_str(), subtopic);
|
||||||
mqttClient.publish(topic, payload);
|
mqttClient.publish(topic, payload);
|
||||||
debugPrintln(String(F("MQTT OUT: ")) + String(topic) + " = " + String(payload));
|
debugPrintln(String(F("MQTT OUT: ")) + String(topic) + " = " + String(payload));
|
||||||
|
|
||||||
// as json
|
// as json
|
||||||
char value[254];
|
|
||||||
snprintf_P(topic, sizeof(topic), PSTR("%sstate/json"), mqttNodeTopic.c_str());
|
snprintf_P(topic, sizeof(topic), PSTR("%sstate/json"), mqttNodeTopic.c_str());
|
||||||
snprintf_P(value, sizeof(value), PSTR("{\"%s\":\"%s\"}"), subtopic, payload);
|
snprintf_P(value, sizeof(value), PSTR("{\"%s\":\"%s\"}"), subtopic, payload);
|
||||||
mqttClient.publish(topic, value);
|
mqttClient.publish(topic, value);
|
||||||
@ -311,7 +312,7 @@ void mqttReconnect()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
debugPrintln(F("MQTT: [SUCCESS] MQTT Client is Connected"));
|
debugPrintln(F("MQTT: MQTT Client is Connected"));
|
||||||
haspReconnect();
|
haspReconnect();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
x
Reference in New Issue
Block a user