mirror of
https://github.com/IoTManagerProject/IoTManager.git
synced 2026-03-26 22:22:16 +03:00
ver4
This commit is contained in:
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
7
data_svelte/lile.json
Normal file
7
data_svelte/lile.json
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"type": "binary",
|
||||||
|
"subtype": "button-out",
|
||||||
|
"id": "btn1",
|
||||||
|
"gpio": 1,
|
||||||
|
"inv": false
|
||||||
|
}
|
||||||
@@ -2,8 +2,10 @@
|
|||||||
#include "Class/TCircularBuffer.h"
|
#include "Class/TCircularBuffer.h"
|
||||||
#include "Global.h"
|
#include "Global.h"
|
||||||
void wsInit();
|
void wsInit();
|
||||||
void wsSendSetup();
|
|
||||||
void wsSendSetupBuffer();
|
|
||||||
void wsPublishData(String topic, String data);
|
void wsPublishData(String topic, String data);
|
||||||
void sendDataWs();
|
|
||||||
void loopWsExecute();
|
// void wsSendSetup();
|
||||||
|
// void wsSendSetupBuffer();
|
||||||
|
//
|
||||||
|
// void sendDataWs();
|
||||||
|
// void loopWsExecute();
|
||||||
|
|||||||
@@ -75,8 +75,8 @@ void deviceInit() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
savedFromWeb = false;
|
savedFromWeb = false;
|
||||||
//publishWidgets();
|
// publishWidgets();
|
||||||
//publishState();
|
// publishState();
|
||||||
}
|
}
|
||||||
|
|
||||||
void loadScenario() {
|
void loadScenario() {
|
||||||
|
|||||||
780
src/Web.cpp
780
src/Web.cpp
@@ -1,4 +1,5 @@
|
|||||||
#include "Web.h"
|
#include "Web.h"
|
||||||
|
|
||||||
#include "BufferExecute.h"
|
#include "BufferExecute.h"
|
||||||
#include "Class/NotAsync.h"
|
#include "Class/NotAsync.h"
|
||||||
#include "Global.h"
|
#include "Global.h"
|
||||||
@@ -18,396 +19,395 @@ bool parseRequestForPreset(AsyncWebServerRequest* request, uint8_t& preset) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void web_init() {
|
void web_init() {
|
||||||
// server.on("/set", HTTP_GET, [](AsyncWebServerRequest* request) {
|
server.on("/set", HTTP_GET, [](AsyncWebServerRequest* request) {
|
||||||
// //==============================set.device.json====================================================================================================
|
//==============================set.device.json====================================================================================================
|
||||||
// if (request->hasArg(F("addItem"))) {
|
if (request->hasArg(F("addItem"))) {
|
||||||
// addItem2(request->getParam("addItem")->value().toInt());
|
addItem2(request->getParam("addItem")->value().toInt());
|
||||||
// request->redirect("/?set.device");
|
request->redirect("/?set.device");
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// if (request->hasArg(F("addPreset"))) {
|
if (request->hasArg(F("addPreset"))) {
|
||||||
// addPreset2(request->getParam(F("addPreset"))->value().toInt());
|
addPreset2(request->getParam(F("addPreset"))->value().toInt());
|
||||||
//
|
|
||||||
// jsonWriteStr(configSetupJson, F("warning1"), F("<div style='margin-top:10px;margin-bottom:10px;'><font color='black'><p style='border: 1px solid #DCDCDC; border-radius: 3px; background-color: #ffc7c7; padding: 10px;'>Требуется перезагрузка</p></font></div>"));
|
jsonWriteStr(configSetupJson, F("warning1"), F("<div style='margin-top:10px;margin-bottom:10px;'><font color='black'><p style='border: 1px solid #DCDCDC; border-radius: 3px; background-color: #ffc7c7; padding: 10px;'>Требуется перезагрузка</p></font></div>"));
|
||||||
//
|
|
||||||
// request->redirect(F("/?set.device"));
|
request->redirect(F("/?set.device"));
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// if (request->hasArg(F("delChoosingItems"))) {
|
if (request->hasArg(F("delChoosingItems"))) {
|
||||||
// jsonWriteStr(configSetupJson, F("warning1"), F("<div style='margin-top:10px;margin-bottom:10px;'><font color='black'><p style='border: 1px solid #DCDCDC; border-radius: 3px; background-color: #ffc7c7; padding: 10px;'>Требуется перезагрузка</p></font></div>"));
|
jsonWriteStr(configSetupJson, F("warning1"), F("<div style='margin-top:10px;margin-bottom:10px;'><font color='black'><p style='border: 1px solid #DCDCDC; border-radius: 3px; background-color: #ffc7c7; padding: 10px;'>Требуется перезагрузка</p></font></div>"));
|
||||||
// myNotAsyncActions->make(do_delChoosingItems);
|
myNotAsyncActions->make(do_delChoosingItems);
|
||||||
// request->send(200);
|
request->send(200);
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// if (request->hasArg(F("delAllItems"))) {
|
if (request->hasArg(F("delAllItems"))) {
|
||||||
// delAllItems();
|
delAllItems();
|
||||||
//#ifdef EnableLogging
|
#ifdef EnableLogging
|
||||||
// cleanLogAndData();
|
cleanLogAndData();
|
||||||
//#endif
|
#endif
|
||||||
// jsonWriteStr(configSetupJson, F("warning1"), F("<div style='margin-top:10px;margin-bottom:10px;'><font color='black'><p style='border: 1px solid #DCDCDC; border-radius: 3px; background-color: #ffc7c7; padding: 10px;'>Требуется перезагрузка</p></font></div>"));
|
jsonWriteStr(configSetupJson, F("warning1"), F("<div style='margin-top:10px;margin-bottom:10px;'><font color='black'><p style='border: 1px solid #DCDCDC; border-radius: 3px; background-color: #ffc7c7; padding: 10px;'>Требуется перезагрузка</p></font></div>"));
|
||||||
// request->redirect(F("/?set.device"));
|
request->redirect(F("/?set.device"));
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// if (request->hasArg(F("saveItems"))) {
|
if (request->hasArg(F("saveItems"))) {
|
||||||
// myNotAsyncActions->make(do_deviceInit);
|
myNotAsyncActions->make(do_deviceInit);
|
||||||
// savedFromWeb = true;
|
savedFromWeb = true;
|
||||||
// request->send(200);
|
request->send(200);
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// if (request->hasArg(F("scen"))) {
|
if (request->hasArg(F("scen"))) {
|
||||||
// bool value = request->getParam(F("scen"))->value().toInt();
|
bool value = request->getParam(F("scen"))->value().toInt();
|
||||||
// jsonWriteBool(configSetupJson, F("scen"), value);
|
jsonWriteBool(configSetupJson, F("scen"), value);
|
||||||
// saveConfig();
|
saveConfig();
|
||||||
// loadScenario();
|
loadScenario();
|
||||||
// request->send(200);
|
request->send(200);
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// if (request->hasArg(F("sceninit"))) {
|
if (request->hasArg(F("sceninit"))) {
|
||||||
// loadScenario();
|
loadScenario();
|
||||||
// request->send(200);
|
request->send(200);
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// if (request->hasArg(F("MqttIn"))) {
|
if (request->hasArg(F("MqttIn"))) {
|
||||||
// bool value = request->getParam(F("MqttIn"))->value().toInt();
|
bool value = request->getParam(F("MqttIn"))->value().toInt();
|
||||||
// jsonWriteBool(configSetupJson, "MqttIn", value);
|
jsonWriteBool(configSetupJson, "MqttIn", value);
|
||||||
// saveConfig();
|
saveConfig();
|
||||||
// mqtt.subscribe((mqttPrefix + "/+/+/event").c_str());
|
mqtt.subscribe((mqttPrefix + "/+/+/event").c_str());
|
||||||
// mqtt.subscribe((mqttPrefix + "/+/+/info").c_str());
|
mqtt.subscribe((mqttPrefix + "/+/+/info").c_str());
|
||||||
// request->send(200);
|
request->send(200);
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// if (request->hasArg(F("MqttOut"))) {
|
if (request->hasArg(F("MqttOut"))) {
|
||||||
// bool value = request->getParam(F("MqttOut"))->value().toInt();
|
bool value = request->getParam(F("MqttOut"))->value().toInt();
|
||||||
// jsonWriteBool(configSetupJson, F("MqttOut"), value);
|
jsonWriteBool(configSetupJson, F("MqttOut"), value);
|
||||||
// saveConfig();
|
saveConfig();
|
||||||
// request->send(200);
|
request->send(200);
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// if (request->hasArg(F("scenMqtt"))) {
|
if (request->hasArg(F("scenMqtt"))) {
|
||||||
// myNotAsyncActions->make(do_sendScenMQTT);
|
myNotAsyncActions->make(do_sendScenMQTT);
|
||||||
// request->send(200);
|
request->send(200);
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// if (request->hasArg(F("cleanlog"))) {
|
if (request->hasArg(F("cleanlog"))) {
|
||||||
//#ifdef EnableLogging
|
#ifdef EnableLogging
|
||||||
// cleanLogAndData();
|
cleanLogAndData();
|
||||||
//#endif
|
#endif
|
||||||
// request->send(200);
|
request->send(200);
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// //==============================wifi settings=============================================
|
//==============================wifi settings=============================================
|
||||||
// if (request->hasArg(F("devname"))) {
|
if (request->hasArg(F("devname"))) {
|
||||||
// jsonWriteStr(configSetupJson, F("name"), request->getParam(F("devname"))->value());
|
jsonWriteStr(configSetupJson, F("name"), request->getParam(F("devname"))->value());
|
||||||
// saveConfig();
|
saveConfig();
|
||||||
// request->send(200);
|
request->send(200);
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// if (request->hasArg(F("routerssid"))) {
|
if (request->hasArg(F("routerssid"))) {
|
||||||
// jsonWriteStr(configSetupJson, F("routerssid"), request->getParam(F("routerssid"))->value());
|
jsonWriteStr(configSetupJson, F("routerssid"), request->getParam(F("routerssid"))->value());
|
||||||
// saveConfig();
|
saveConfig();
|
||||||
// request->send(200);
|
request->send(200);
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// if (request->hasArg(F("routerpass"))) {
|
if (request->hasArg(F("routerpass"))) {
|
||||||
// jsonWriteStr(configSetupJson, F("routerpass"), request->getParam(F("routerpass"))->value());
|
jsonWriteStr(configSetupJson, F("routerpass"), request->getParam(F("routerpass"))->value());
|
||||||
// saveConfig();
|
saveConfig();
|
||||||
// request->send(200);
|
request->send(200);
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// if (request->hasArg(F("apssid"))) {
|
if (request->hasArg(F("apssid"))) {
|
||||||
// jsonWriteStr(configSetupJson, F("apssid"), request->getParam(F("apssid"))->value());
|
jsonWriteStr(configSetupJson, F("apssid"), request->getParam(F("apssid"))->value());
|
||||||
// saveConfig();
|
saveConfig();
|
||||||
// request->send(200, "text/text", "OK");
|
request->send(200, "text/text", "OK");
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// if (request->hasArg(F("appass"))) {
|
if (request->hasArg(F("appass"))) {
|
||||||
// jsonWriteStr(configSetupJson, F("appass"), request->getParam(F("appass"))->value());
|
jsonWriteStr(configSetupJson, F("appass"), request->getParam(F("appass"))->value());
|
||||||
// saveConfig();
|
saveConfig();
|
||||||
// request->send(200);
|
request->send(200);
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// if (request->hasArg(F("weblogin"))) {
|
if (request->hasArg(F("weblogin"))) {
|
||||||
// jsonWriteStr(configSetupJson, F("weblogin"), request->getParam(F("weblogin"))->value());
|
jsonWriteStr(configSetupJson, F("weblogin"), request->getParam(F("weblogin"))->value());
|
||||||
// saveConfig();
|
saveConfig();
|
||||||
// request->send(200);
|
request->send(200);
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// if (request->hasArg(F("webpass"))) {
|
if (request->hasArg(F("webpass"))) {
|
||||||
// jsonWriteStr(configSetupJson, F("webpass"), request->getParam(F("webpass"))->value());
|
jsonWriteStr(configSetupJson, F("webpass"), request->getParam(F("webpass"))->value());
|
||||||
// saveConfig();
|
saveConfig();
|
||||||
// request->send(200);
|
request->send(200);
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// if (request->hasArg(F("timezone"))) {
|
if (request->hasArg(F("timezone"))) {
|
||||||
// String timezoneStr = request->getParam(F("timezone"))->value();
|
String timezoneStr = request->getParam(F("timezone"))->value();
|
||||||
// jsonWriteStr(configSetupJson, F("timezone"), timezoneStr);
|
jsonWriteStr(configSetupJson, F("timezone"), timezoneStr);
|
||||||
// saveConfig();
|
saveConfig();
|
||||||
// timeNow->setTimezone(timezoneStr.toInt());
|
timeNow->setTimezone(timezoneStr.toInt());
|
||||||
// request->send(200);
|
request->send(200);
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// if (request->hasArg(F("ntp"))) {
|
if (request->hasArg(F("ntp"))) {
|
||||||
// String ntpStr = request->getParam(F("ntp"))->value();
|
String ntpStr = request->getParam(F("ntp"))->value();
|
||||||
// jsonWriteStr(configSetupJson, F("ntp"), ntpStr);
|
jsonWriteStr(configSetupJson, F("ntp"), ntpStr);
|
||||||
// saveConfig();
|
saveConfig();
|
||||||
// timeNow->setNtpPool(ntpStr);
|
timeNow->setNtpPool(ntpStr);
|
||||||
// request->send(200);
|
request->send(200);
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// if (request->hasArg(F("blink"))) {
|
if (request->hasArg(F("blink"))) {
|
||||||
// bool value = request->getParam(F("blink"))->value().toInt();
|
bool value = request->getParam(F("blink"))->value().toInt();
|
||||||
// jsonWriteBool(configSetupJson, F("blink"), value);
|
jsonWriteBool(configSetupJson, F("blink"), value);
|
||||||
// saveConfig();
|
saveConfig();
|
||||||
// request->send(200);
|
request->send(200);
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// if (request->hasArg(F("reqReset"))) {
|
if (request->hasArg(F("reqReset"))) {
|
||||||
// String tmp = "{}";
|
String tmp = "{}";
|
||||||
// jsonWriteStr(tmp, "title", F("<button class=\"close\" onclick=\"toggle('reset-block')\">×</button>Вы действительно хотите перезагрузить устройство?<a href=\"#\" class=\"btn btn-block btn-danger\" onclick=\"send_request(this, '/set?reset');setTimeout(function(){ location.href='/?set.device'; }, 15000);html('reset-block','<span class=loader></span>Идет перезагрузка устройства')\">Перезагрузить</a>"));
|
jsonWriteStr(tmp, "title", F("<button class=\"close\" onclick=\"toggle('reset-block')\">×</button>Вы действительно хотите перезагрузить устройство?<a href=\"#\" class=\"btn btn-block btn-danger\" onclick=\"send_request(this, '/set?reset');setTimeout(function(){ location.href='/?set.device'; }, 15000);html('reset-block','<span class=loader></span>Идет перезагрузка устройства')\">Перезагрузить</a>"));
|
||||||
// jsonWriteStr(tmp, "class", "pop-up");
|
jsonWriteStr(tmp, "class", "pop-up");
|
||||||
// request->send(200, "text/html", tmp);
|
request->send(200, "text/html", tmp);
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// if (request->hasArg(F("reset"))) {
|
if (request->hasArg(F("reset"))) {
|
||||||
// ESP.restart();
|
ESP.restart();
|
||||||
// request->send(200);
|
request->send(200);
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// //==============================mqtt settings=============================================
|
//==============================mqtt settings=============================================
|
||||||
// //primary
|
// primary
|
||||||
// if (request->hasArg(F("mqttServer"))) {
|
if (request->hasArg(F("mqttServer"))) {
|
||||||
// jsonWriteStr(configSetupJson, F("mqttServer"), request->getParam(F("mqttServer"))->value());
|
jsonWriteStr(configSetupJson, F("mqttServer"), request->getParam(F("mqttServer"))->value());
|
||||||
// saveConfig();
|
saveConfig();
|
||||||
// myNotAsyncActions->make(do_MQTTPARAMSCHANGED);
|
myNotAsyncActions->make(do_MQTTPARAMSCHANGED);
|
||||||
// request->send(200);
|
request->send(200);
|
||||||
// }
|
}
|
||||||
// if (request->hasArg(F("mqttPort"))) {
|
if (request->hasArg(F("mqttPort"))) {
|
||||||
// int port = (request->getParam(F("mqttPort"))->value()).toInt();
|
int port = (request->getParam(F("mqttPort"))->value()).toInt();
|
||||||
// jsonWriteInt(configSetupJson, F("mqttPort"), port);
|
jsonWriteInt(configSetupJson, F("mqttPort"), port);
|
||||||
// saveConfig();
|
saveConfig();
|
||||||
// myNotAsyncActions->make(do_MQTTPARAMSCHANGED);
|
myNotAsyncActions->make(do_MQTTPARAMSCHANGED);
|
||||||
// request->send(200);
|
request->send(200);
|
||||||
// }
|
}
|
||||||
// if (request->hasArg(F("mqttPrefix"))) {
|
if (request->hasArg(F("mqttPrefix"))) {
|
||||||
// jsonWriteStr(configSetupJson, F("mqttPrefix"), request->getParam(F("mqttPrefix"))->value());
|
jsonWriteStr(configSetupJson, F("mqttPrefix"), request->getParam(F("mqttPrefix"))->value());
|
||||||
// saveConfig();
|
saveConfig();
|
||||||
// myNotAsyncActions->make(do_MQTTPARAMSCHANGED);
|
myNotAsyncActions->make(do_MQTTPARAMSCHANGED);
|
||||||
// request->send(200);
|
request->send(200);
|
||||||
// }
|
}
|
||||||
// if (request->hasArg(F("mqttUser"))) {
|
if (request->hasArg(F("mqttUser"))) {
|
||||||
// jsonWriteStr(configSetupJson, F("mqttUser"), request->getParam(F("mqttUser"))->value());
|
jsonWriteStr(configSetupJson, F("mqttUser"), request->getParam(F("mqttUser"))->value());
|
||||||
// saveConfig();
|
saveConfig();
|
||||||
// myNotAsyncActions->make(do_MQTTPARAMSCHANGED);
|
myNotAsyncActions->make(do_MQTTPARAMSCHANGED);
|
||||||
// request->send(200);
|
request->send(200);
|
||||||
// }
|
}
|
||||||
// if (request->hasArg(F("mqttPass"))) {
|
if (request->hasArg(F("mqttPass"))) {
|
||||||
// jsonWriteStr(configSetupJson, F("mqttPass"), request->getParam(F("mqttPass"))->value());
|
jsonWriteStr(configSetupJson, F("mqttPass"), request->getParam(F("mqttPass"))->value());
|
||||||
// saveConfig();
|
saveConfig();
|
||||||
// myNotAsyncActions->make(do_MQTTPARAMSCHANGED);
|
myNotAsyncActions->make(do_MQTTPARAMSCHANGED);
|
||||||
// request->send(200);
|
request->send(200);
|
||||||
// }
|
}
|
||||||
// //secondary
|
// secondary
|
||||||
// if (request->hasArg(F("mqttServer2"))) {
|
if (request->hasArg(F("mqttServer2"))) {
|
||||||
// jsonWriteStr(configSetupJson, F("mqttServer2"), request->getParam(F("mqttServer2"))->value());
|
jsonWriteStr(configSetupJson, F("mqttServer2"), request->getParam(F("mqttServer2"))->value());
|
||||||
// saveConfig();
|
saveConfig();
|
||||||
// myNotAsyncActions->make(do_MQTTPARAMSCHANGED);
|
myNotAsyncActions->make(do_MQTTPARAMSCHANGED);
|
||||||
// request->send(200);
|
request->send(200);
|
||||||
// }
|
}
|
||||||
// if (request->hasArg(F("mqttPort2"))) {
|
if (request->hasArg(F("mqttPort2"))) {
|
||||||
// int port = (request->getParam(F("mqttPort2"))->value()).toInt();
|
int port = (request->getParam(F("mqttPort2"))->value()).toInt();
|
||||||
// jsonWriteInt(configSetupJson, F("mqttPort2"), port);
|
jsonWriteInt(configSetupJson, F("mqttPort2"), port);
|
||||||
// saveConfig();
|
saveConfig();
|
||||||
// myNotAsyncActions->make(do_MQTTPARAMSCHANGED);
|
myNotAsyncActions->make(do_MQTTPARAMSCHANGED);
|
||||||
// request->send(200);
|
request->send(200);
|
||||||
// }
|
}
|
||||||
// if (request->hasArg(F("mqttPrefix2"))) {
|
if (request->hasArg(F("mqttPrefix2"))) {
|
||||||
// jsonWriteStr(configSetupJson, F("mqttPrefix2"), request->getParam(F("mqttPrefix2"))->value());
|
jsonWriteStr(configSetupJson, F("mqttPrefix2"), request->getParam(F("mqttPrefix2"))->value());
|
||||||
// saveConfig();
|
saveConfig();
|
||||||
// myNotAsyncActions->make(do_MQTTPARAMSCHANGED);
|
myNotAsyncActions->make(do_MQTTPARAMSCHANGED);
|
||||||
// request->send(200);
|
request->send(200);
|
||||||
// }
|
}
|
||||||
// if (request->hasArg(F("mqttUser2"))) {
|
if (request->hasArg(F("mqttUser2"))) {
|
||||||
// jsonWriteStr(configSetupJson, F("mqttUser2"), request->getParam(F("mqttUser2"))->value());
|
jsonWriteStr(configSetupJson, F("mqttUser2"), request->getParam(F("mqttUser2"))->value());
|
||||||
// saveConfig();
|
saveConfig();
|
||||||
// myNotAsyncActions->make(do_MQTTPARAMSCHANGED);
|
myNotAsyncActions->make(do_MQTTPARAMSCHANGED);
|
||||||
// request->send(200);
|
request->send(200);
|
||||||
// }
|
}
|
||||||
// if (request->hasArg(F("mqttPass2"))) {
|
if (request->hasArg(F("mqttPass2"))) {
|
||||||
// jsonWriteStr(configSetupJson, F("mqttPass2"), request->getParam(F("mqttPass2"))->value());
|
jsonWriteStr(configSetupJson, F("mqttPass2"), request->getParam(F("mqttPass2"))->value());
|
||||||
// saveConfig();
|
saveConfig();
|
||||||
// myNotAsyncActions->make(do_MQTTPARAMSCHANGED);
|
myNotAsyncActions->make(do_MQTTPARAMSCHANGED);
|
||||||
// request->send(200);
|
request->send(200);
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// if (request->hasArg("mqttsend")) {
|
if (request->hasArg("mqttsend")) {
|
||||||
// //myNotAsyncActions->make(do_MQTTUDP);
|
// myNotAsyncActions->make(do_MQTTUDP);
|
||||||
// request->send(200);
|
request->send(200);
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// if (request->hasArg("mqttcheck")) {
|
if (request->hasArg("mqttcheck")) {
|
||||||
// String buf = "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>" + getStateStr();
|
String buf = "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>" + getStateStr();
|
||||||
//
|
|
||||||
// String payload = "{}";
|
String payload = "{}";
|
||||||
// jsonWriteStr(payload, "title", buf);
|
jsonWriteStr(payload, "title", buf);
|
||||||
// jsonWriteStr(payload, "class", "pop-up");
|
jsonWriteStr(payload, "class", "pop-up");
|
||||||
//
|
|
||||||
// request->send(200, "text/html", payload);
|
request->send(200, "text/html", payload);
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// //==============================telegram settings=============================================
|
//==============================telegram settings=============================================
|
||||||
// if (request->hasArg("telegramApi")) {
|
if (request->hasArg("telegramApi")) {
|
||||||
// jsonWriteStr(configSetupJson, "telegramApi", request->getParam("telegramApi")->value());
|
jsonWriteStr(configSetupJson, "telegramApi", request->getParam("telegramApi")->value());
|
||||||
// saveConfig();
|
saveConfig();
|
||||||
// request->send(200);
|
request->send(200);
|
||||||
// }
|
}
|
||||||
// if (request->hasArg("autos")) {
|
if (request->hasArg("autos")) {
|
||||||
// bool value = request->getParam("autos")->value().toInt();
|
bool value = request->getParam("autos")->value().toInt();
|
||||||
// jsonWriteBool(configSetupJson, "autos", value);
|
jsonWriteBool(configSetupJson, "autos", value);
|
||||||
// saveConfig();
|
saveConfig();
|
||||||
// request->send(200);
|
request->send(200);
|
||||||
// }
|
}
|
||||||
// if (request->hasArg("chatId")) {
|
if (request->hasArg("chatId")) {
|
||||||
// jsonWriteStr(configSetupJson, "chatId", request->getParam("chatId")->value());
|
jsonWriteStr(configSetupJson, "chatId", request->getParam("chatId")->value());
|
||||||
// saveConfig();
|
saveConfig();
|
||||||
// request->send(200);
|
request->send(200);
|
||||||
// }
|
}
|
||||||
// if (request->hasArg("telegonof")) {
|
if (request->hasArg("telegonof")) {
|
||||||
// bool value = request->getParam("telegonof")->value().toInt();
|
bool value = request->getParam("telegonof")->value().toInt();
|
||||||
// jsonWriteBool(configSetupJson, "telegonof", value);
|
jsonWriteBool(configSetupJson, "telegonof", value);
|
||||||
// saveConfig();
|
saveConfig();
|
||||||
// request->send(200);
|
request->send(200);
|
||||||
// }
|
}
|
||||||
// if (request->hasArg("teleginput")) {
|
if (request->hasArg("teleginput")) {
|
||||||
// bool value = request->getParam("teleginput")->value().toInt();
|
bool value = request->getParam("teleginput")->value().toInt();
|
||||||
// jsonWriteBool(configSetupJson, "teleginput", value);
|
jsonWriteBool(configSetupJson, "teleginput", value);
|
||||||
// saveConfig();
|
saveConfig();
|
||||||
// request->send(200);
|
request->send(200);
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// //==============================utilities settings=============================================
|
//==============================utilities settings=============================================
|
||||||
// if (request->hasArg("i2c")) {
|
if (request->hasArg("i2c")) {
|
||||||
// myNotAsyncActions->make(do_BUSSCAN);
|
myNotAsyncActions->make(do_BUSSCAN);
|
||||||
// request->redirect("/?set.utilities");
|
request->redirect("/?set.utilities");
|
||||||
// }
|
}
|
||||||
// if (request->hasArg("uart")) {
|
if (request->hasArg("uart")) {
|
||||||
// bool value = request->getParam("uart")->value().toInt();
|
bool value = request->getParam("uart")->value().toInt();
|
||||||
// jsonWriteBool(configSetupJson, "uart", value);
|
jsonWriteBool(configSetupJson, "uart", value);
|
||||||
// saveConfig();
|
saveConfig();
|
||||||
//#ifdef EnableUart
|
#ifdef EnableUart
|
||||||
// uartInit();
|
uartInit();
|
||||||
//#endif
|
#endif
|
||||||
// request->send(200);
|
request->send(200);
|
||||||
// }
|
}
|
||||||
// if (request->hasArg("uartEvents")) {
|
if (request->hasArg("uartEvents")) {
|
||||||
// bool value = request->getParam("uartEvents")->value().toInt();
|
bool value = request->getParam("uartEvents")->value().toInt();
|
||||||
// jsonWriteBool(configSetupJson, "uartEvents", value);
|
jsonWriteBool(configSetupJson, "uartEvents", value);
|
||||||
// saveConfig();
|
saveConfig();
|
||||||
// request->send(200);
|
request->send(200);
|
||||||
// }
|
}
|
||||||
// if (request->hasArg("uartS")) {
|
if (request->hasArg("uartS")) {
|
||||||
// jsonWriteStr(configSetupJson, "uartS", request->getParam("uartS")->value());
|
jsonWriteStr(configSetupJson, "uartS", request->getParam("uartS")->value());
|
||||||
// saveConfig();
|
saveConfig();
|
||||||
//#ifdef EnableUart
|
#ifdef EnableUart
|
||||||
// uartInit();
|
uartInit();
|
||||||
//#endif
|
#endif
|
||||||
// request->send(200);
|
request->send(200);
|
||||||
// }
|
}
|
||||||
// if (request->hasArg("uartTX")) {
|
if (request->hasArg("uartTX")) {
|
||||||
// jsonWriteStr(configSetupJson, "uartTX", request->getParam("uartTX")->value());
|
jsonWriteStr(configSetupJson, "uartTX", request->getParam("uartTX")->value());
|
||||||
// saveConfig();
|
saveConfig();
|
||||||
//#ifdef EnableUart
|
#ifdef EnableUart
|
||||||
// uartInit();
|
uartInit();
|
||||||
//#endif
|
#endif
|
||||||
// request->send(200);
|
request->send(200);
|
||||||
// }
|
}
|
||||||
// if (request->hasArg("uartRX")) {
|
if (request->hasArg("uartRX")) {
|
||||||
// jsonWriteStr(configSetupJson, "uartRX", request->getParam("uartRX")->value());
|
jsonWriteStr(configSetupJson, "uartRX", request->getParam("uartRX")->value());
|
||||||
// saveConfig();
|
saveConfig();
|
||||||
//#ifdef EnableUart
|
#ifdef EnableUart
|
||||||
// uartInit();
|
uartInit();
|
||||||
//#endif
|
#endif
|
||||||
// request->send(200);
|
request->send(200);
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// //==============================developer settings=============================================
|
//==============================developer settings=============================================
|
||||||
// if (request->hasArg("serverip")) {
|
if (request->hasArg("serverip")) {
|
||||||
// jsonWriteStr(configSetupJson, "serverip", request->getParam("serverip")->value());
|
jsonWriteStr(configSetupJson, "serverip", request->getParam("serverip")->value());
|
||||||
// saveConfig();
|
saveConfig();
|
||||||
// serverIP = jsonReadStr(configSetupJson, "serverip");
|
serverIP = jsonReadStr(configSetupJson, "serverip");
|
||||||
// request->send(200);
|
request->send(200);
|
||||||
// }
|
}
|
||||||
// //set?order=button_1
|
// set?order=button_1
|
||||||
// if (request->hasArg("order")) {
|
if (request->hasArg("order")) {
|
||||||
// String order = request->getParam("order")->value();
|
String order = request->getParam("order")->value();
|
||||||
// order.replace("_", " ");
|
order.replace("_", " ");
|
||||||
// loopCmdAdd(order + ",");
|
loopCmdAdd(order + ",");
|
||||||
// request->send(200, "text/html", order);
|
request->send(200, "text/html", order);
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// if (request->hasArg("grafmax")) {
|
if (request->hasArg("grafmax")) {
|
||||||
// int value = request->getParam("grafmax")->value().toInt();
|
int value = request->getParam("grafmax")->value().toInt();
|
||||||
// jsonWriteInt(configSetupJson, "grafmax", value);
|
jsonWriteInt(configSetupJson, "grafmax", value);
|
||||||
// saveConfig();
|
saveConfig();
|
||||||
// request->send(200);
|
request->send(200);
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// //gate mode
|
// gate mode
|
||||||
//
|
|
||||||
// if (request->hasArg("gateAuto")) {
|
if (request->hasArg("gateAuto")) {
|
||||||
// bool value = request->getParam("gateAuto")->value().toInt();
|
bool value = request->getParam("gateAuto")->value().toInt();
|
||||||
// jsonWriteBool(configSetupJson, "gateAuto", value);
|
jsonWriteBool(configSetupJson, "gateAuto", value);
|
||||||
// saveConfig();
|
saveConfig();
|
||||||
// request->send(200);
|
request->send(200);
|
||||||
// }
|
}
|
||||||
//
|
});
|
||||||
// });
|
|
||||||
//
|
// server.on("/del", HTTP_GET, [](AsyncWebServerRequest* request) {
|
||||||
// //server.on("/del", HTTP_GET, [](AsyncWebServerRequest* request) {
|
// if (request->hasArg("file") && request->hasArg("line")) {
|
||||||
// // if (request->hasArg("file") && request->hasArg("line")) {
|
// String fileName = request->getParam("file")->value();
|
||||||
// // String fileName = request->getParam("file")->value();
|
// Serial.println(fileName);
|
||||||
// // Serial.println(fileName);
|
// int line = request->getParam("line")->value().toInt();
|
||||||
// // int line = request->getParam("line")->value().toInt();
|
// Serial.println(line);
|
||||||
// // Serial.println(line);
|
// myNotAsyncActions->make(do_delChoosingItems);
|
||||||
// // myNotAsyncActions->make(do_delChoosingItems);
|
// request->redirect(F("/?set.device"));
|
||||||
// // request->redirect(F("/?set.device"));
|
// }
|
||||||
// // }
|
// });
|
||||||
// //});
|
|
||||||
//
|
server.on("/check", HTTP_GET, [](AsyncWebServerRequest* request) {
|
||||||
// server.on("/check", HTTP_GET, [](AsyncWebServerRequest* request) {
|
myNotAsyncActions->make(do_GETLASTVERSION);
|
||||||
// myNotAsyncActions->make(do_GETLASTVERSION);
|
SerialPrint("I", "Update", "firmware version: " + String(lastVersion));
|
||||||
// SerialPrint("I", "Update", "firmware version: " + String(lastVersion));
|
|
||||||
//
|
String msg = "";
|
||||||
// String msg = "";
|
|
||||||
//
|
if (USE_OTA) {
|
||||||
// if (USE_OTA) {
|
if (lastVersion == FIRMWARE_VERSION) {
|
||||||
// if (lastVersion == FIRMWARE_VERSION) {
|
msg = F("Актуальная версия прошивки уже установлена.");
|
||||||
// msg = F("Актуальная версия прошивки уже установлена.");
|
} else if (lastVersion > FIRMWARE_VERSION) {
|
||||||
// } else if (lastVersion > FIRMWARE_VERSION) {
|
msg = F("Новая версия прошивки<a href=\"#\" class=\"btn btn-block btn-danger\" onclick=\"send_request(this, '/upgrade');setTimeout(function(){ location.href='/?set.device'; }, 90000);html('my-block','<span class=loader></span>Идет обновление прошивки, после обновления страница перезагрузится автоматически...')\">Установить</a>");
|
||||||
// msg = F("Новая версия прошивки<a href=\"#\" class=\"btn btn-block btn-danger\" onclick=\"send_request(this, '/upgrade');setTimeout(function(){ location.href='/?set.device'; }, 90000);html('my-block','<span class=loader></span>Идет обновление прошивки, после обновления страница перезагрузится автоматически...')\">Установить</a>");
|
} else if (lastVersion == -1) {
|
||||||
// } else if (lastVersion == -1) {
|
msg = F("Cервер не найден. Попробуйте повторить позже...");
|
||||||
// msg = F("Cервер не найден. Попробуйте повторить позже...");
|
} else if (lastVersion == -2) {
|
||||||
// } else if (lastVersion == -2) {
|
msg = F("Устройство не подключено к роутеру!");
|
||||||
// msg = F("Устройство не подключено к роутеру!");
|
} else if (lastVersion < FIRMWARE_VERSION) {
|
||||||
// } else if (lastVersion < FIRMWARE_VERSION) {
|
msg = F("Ошибка версии. Попробуйте повторить позже...");
|
||||||
// msg = F("Ошибка версии. Попробуйте повторить позже...");
|
}
|
||||||
// }
|
} else {
|
||||||
// } else {
|
msg = F("Обновление невозможно, память устройства 1 мб");
|
||||||
// msg = F("Обновление невозможно, память устройства 1 мб");
|
}
|
||||||
// }
|
|
||||||
//
|
String tmp = "{}";
|
||||||
// String tmp = "{}";
|
jsonWriteStr(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>" + msg);
|
||||||
// jsonWriteStr(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>" + msg);
|
jsonWriteStr(tmp, "class", "pop-up");
|
||||||
// jsonWriteStr(tmp, "class", "pop-up");
|
request->send(200, "text/html", tmp);
|
||||||
// request->send(200, "text/html", tmp);
|
});
|
||||||
// });
|
|
||||||
//
|
/*
|
||||||
// /*
|
* Upgrade
|
||||||
// * Upgrade
|
*/
|
||||||
// */
|
server.on("/upgrade", HTTP_GET, [](AsyncWebServerRequest* request) {
|
||||||
// server.on("/upgrade", HTTP_GET, [](AsyncWebServerRequest* request) {
|
myNotAsyncActions->make(do_UPGRADE);
|
||||||
// myNotAsyncActions->make(do_UPGRADE);
|
request->send(200, "text/html");
|
||||||
// request->send(200, "text/html");
|
});
|
||||||
// });
|
|
||||||
|
|
||||||
SerialPrint("I", F("Web"), F("WebAdmin Init"));
|
SerialPrint("I", F("Web"), F("WebAdmin Init"));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ AsyncWebSocket ws("/ws");
|
|||||||
AsyncEventSource events("/events");
|
AsyncEventSource events("/events");
|
||||||
|
|
||||||
void HttpServerinit() {
|
void HttpServerinit() {
|
||||||
|
|
||||||
String login = jsonReadStr(configSetupJson, "weblogin");
|
String login = jsonReadStr(configSetupJson, "weblogin");
|
||||||
String pass = jsonReadStr(configSetupJson, "webpass");
|
String pass = jsonReadStr(configSetupJson, "webpass");
|
||||||
#ifdef ESP32
|
#ifdef ESP32
|
||||||
@@ -20,6 +19,12 @@ void HttpServerinit() {
|
|||||||
server.addHandler(new FSEditor(login, pass));
|
server.addHandler(new FSEditor(login, pass));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
//#ifdef CORS_DEBUG
|
||||||
|
DefaultHeaders::Instance().addHeader(F("Access-Control-Allow-Origin"), F("*"));
|
||||||
|
DefaultHeaders::Instance().addHeader(F("Access-Control-Allow-Headers"), F("content-type"));
|
||||||
|
//#endif
|
||||||
|
|
||||||
|
// server.sendHeader("Access-Control-Allow-Origin", "*");
|
||||||
server.serveStatic("/css/", FileFS, "/css/").setCacheControl("max-age=600");
|
server.serveStatic("/css/", FileFS, "/css/").setCacheControl("max-age=600");
|
||||||
server.serveStatic("/js/", FileFS, "/js/").setCacheControl("max-age=600");
|
server.serveStatic("/js/", FileFS, "/js/").setCacheControl("max-age=600");
|
||||||
server.serveStatic("/favicon.ico", FileFS, "/favicon.ico").setCacheControl("max-age=600");
|
server.serveStatic("/favicon.ico", FileFS, "/favicon.ico").setCacheControl("max-age=600");
|
||||||
@@ -32,9 +37,17 @@ void HttpServerinit() {
|
|||||||
server.serveStatic("/", FileFS, "/").setDefaultFile("index.htm").setAuthentication(login.c_str(), pass.c_str());
|
server.serveStatic("/", FileFS, "/").setDefaultFile("index.htm").setAuthentication(login.c_str(), pass.c_str());
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
//server.onNotFound([](AsyncWebServerRequest *request) {
|
||||||
|
// SerialPrint("[E]", "WebServer", "not found:\n" + getRequestInfo(request));
|
||||||
|
// request->send(404);
|
||||||
|
//});
|
||||||
|
|
||||||
server.onNotFound([](AsyncWebServerRequest *request) {
|
server.onNotFound([](AsyncWebServerRequest *request) {
|
||||||
SerialPrint("[E]", "WebServer", "not found:\n" + getRequestInfo(request));
|
if (request->method() == HTTP_OPTIONS) {
|
||||||
request->send(404);
|
request->send(200);
|
||||||
|
} else {
|
||||||
|
request->send(404);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
server.onFileUpload([](AsyncWebServerRequest *request, const String &filename, size_t index, uint8_t *data, size_t len, bool final) {
|
server.onFileUpload([](AsyncWebServerRequest *request, const String &filename, size_t index, uint8_t *data, size_t len, bool final) {
|
||||||
@@ -47,6 +60,11 @@ void HttpServerinit() {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
server.on("/file.json", HTTP_GET, [](AsyncWebServerRequest *request) {
|
||||||
|
String file = readFile("file.json", 1024);
|
||||||
|
request->send(200, "application/json", file);
|
||||||
|
});
|
||||||
|
|
||||||
// динамические данные
|
// динамические данные
|
||||||
server.on("/config.live.json", HTTP_GET, [](AsyncWebServerRequest *request) {
|
server.on("/config.live.json", HTTP_GET, [](AsyncWebServerRequest *request) {
|
||||||
request->send(200, "application/json", configLiveJson);
|
request->send(200, "application/json", configLiveJson);
|
||||||
@@ -117,7 +135,7 @@ void onWsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventTyp
|
|||||||
|
|
||||||
if (msg.startsWith("/config")) {
|
if (msg.startsWith("/config")) {
|
||||||
// myNotAsyncActions->make(do_webSocketSendSetup);
|
// myNotAsyncActions->make(do_webSocketSendSetup);
|
||||||
wsSetupFlag = true;
|
// wsSetupFlag = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (info->opcode == WS_TEXT) {
|
if (info->opcode == WS_TEXT) {
|
||||||
|
|||||||
@@ -6,58 +6,58 @@
|
|||||||
#include "Global.h"
|
#include "Global.h"
|
||||||
|
|
||||||
void wsInit() {
|
void wsInit() {
|
||||||
myWsBuffer = new TCircularBuffer<char*, 20480>;
|
// myWsBuffer = new TCircularBuffer<char*, 20480>;
|
||||||
// myNotAsyncActions->add(
|
// myNotAsyncActions->add(
|
||||||
// do_webSocketSendSetup, [&](void*) {
|
// do_webSocketSendSetup, [&](void*) {
|
||||||
// delay(100);
|
// delay(100);
|
||||||
// wsSendSetup();
|
// wsSendSetup();
|
||||||
// },
|
// },
|
||||||
// nullptr);
|
// nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void wsPublishData(String topic, String data) {
|
void wsPublishData(String topic, String data) {
|
||||||
if (ws.enabled()) {
|
if (ws.enabled()) {
|
||||||
// if (ws.availableForWriteAll()) {
|
if (ws.availableForWriteAll()) {
|
||||||
data = "[" + topic + "]" + data;
|
data = "[" + topic + "]" + data;
|
||||||
ws.textAll(data);
|
ws.textAll(data);
|
||||||
//}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//отправка setup массива в sockets способом через буфер string, рабочий способ но буфер стринг - плохой метод
|
//отправка setup массива в sockets способом через буфер string, рабочий способ но буфер стринг - плохой метод
|
||||||
// void wsSendSetup3() {
|
void wsSendSetup3() {
|
||||||
// File file = seekFile("/setup.json");
|
File file = seekFile("/setup.json");
|
||||||
// DynamicJsonDocument doc(2048);
|
DynamicJsonDocument doc(2048);
|
||||||
// int i = 0;
|
int i = 0;
|
||||||
// file.find("[");
|
file.find("[");
|
||||||
// SerialPrint("I", F("WS"), F("start send config"));
|
SerialPrint("I", F("WS"), F("start send config"));
|
||||||
// do {
|
do {
|
||||||
// i++;
|
i++;
|
||||||
// deserializeJson(doc, file);
|
deserializeJson(doc, file);
|
||||||
// wsBuf += doc.as<String>() + "\n";
|
wsBuf += doc.as<String>() + "\n";
|
||||||
// } while (file.findUntil(",", "]"));
|
} while (file.findUntil(",", "]"));
|
||||||
// SerialPrint("I", F("WS"), F("completed send config"));
|
SerialPrint("I", F("WS"), F("completed send config"));
|
||||||
//}
|
}
|
||||||
|
|
||||||
// void loopWsExecute3() {
|
void loopWsExecute3() {
|
||||||
// static int attampts = wsAttempts;
|
static int attampts = wsAttempts;
|
||||||
// if (wsBuf.length()) {
|
if (wsBuf.length()) {
|
||||||
// if (attampts > 0) {
|
if (attampts > 0) {
|
||||||
// if (ws.availableForWriteAll()) {
|
if (ws.availableForWriteAll()) {
|
||||||
// String tmp = selectToMarker(wsBuf, "\n");
|
String tmp = selectToMarker(wsBuf, "\n");
|
||||||
// wsPublishData("config", tmp);
|
wsPublishData("config", tmp);
|
||||||
// wsBuf = deleteBeforeDelimiter(wsBuf, "\n");
|
wsBuf = deleteBeforeDelimiter(wsBuf, "\n");
|
||||||
// attampts = wsAttempts;
|
attampts = wsAttempts;
|
||||||
// } else {
|
} else {
|
||||||
// attampts--;
|
attampts--;
|
||||||
// SerialPrint("I", F("WS"), String(attampts));
|
SerialPrint("I", F("WS"), String(attampts));
|
||||||
// }
|
}
|
||||||
// } else {
|
} else {
|
||||||
// SerialPrint("I", F("WS"), F("socket fatal error"));
|
SerialPrint("I", F("WS"), F("socket fatal error"));
|
||||||
// attampts = wsAttempts;
|
attampts = wsAttempts;
|
||||||
// }
|
}
|
||||||
// }
|
}
|
||||||
// }
|
}
|
||||||
|
|
||||||
//отправка setup массива в sockets способом через кольцевой буфер char
|
//отправка setup массива в sockets способом через кольцевой буфер char
|
||||||
// void wsSendSetup() {
|
// void wsSendSetup() {
|
||||||
|
|||||||
10
src/main.cpp
10
src/main.cpp
@@ -113,12 +113,12 @@ void loop() {
|
|||||||
|
|
||||||
testLoop();
|
testLoop();
|
||||||
|
|
||||||
if (wsSetupFlag) {
|
// if (wsSetupFlag) {
|
||||||
wsSetupFlag = false;
|
// wsSetupFlag = false;
|
||||||
wsSendSetup();
|
// wsSendSetup();
|
||||||
}
|
//}
|
||||||
|
|
||||||
loopWsExecute();
|
// loopWsExecute();
|
||||||
|
|
||||||
#ifdef OTA_UPDATES_ENABLED
|
#ifdef OTA_UPDATES_ENABLED
|
||||||
ArduinoOTA.handle();
|
ArduinoOTA.handle();
|
||||||
|
|||||||
Reference in New Issue
Block a user