mirror of
https://github.com/IoTManagerProject/IoTManager.git
synced 2026-03-26 14:12:16 +03:00
reduse ram consuption!!!
This commit is contained in:
240
Init.ino
240
Init.ino
@@ -4,7 +4,6 @@ void All_init() {
|
||||
Device_init();
|
||||
request->send(200, "text/text", "OK"); // отправляем ответ о выполнении
|
||||
});
|
||||
|
||||
server.on("/scenario", HTTP_GET, [](AsyncWebServerRequest * request) {
|
||||
if (request->hasArg("status")) {
|
||||
jsonWriteStr(configSetup, "scenario", request->getParam("status")->value());
|
||||
@@ -13,11 +12,8 @@ void All_init() {
|
||||
Scenario_init();
|
||||
request->send(200, "text/text", "OK"); // отправляем ответ о выполнении
|
||||
});
|
||||
|
||||
server.on("/cleanlog", HTTP_GET, [](AsyncWebServerRequest * request) {
|
||||
|
||||
clean_log_date();
|
||||
|
||||
request->send(200, "text/text", "OK"); // отправляем ответ о выполнении
|
||||
});
|
||||
|
||||
@@ -41,171 +37,101 @@ void Device_init() {
|
||||
ts.remove(STEPPER1);
|
||||
ts.remove(STEPPER2);
|
||||
|
||||
#ifdef layout_in_ram
|
||||
#ifdef layout_in_ram
|
||||
all_widgets = "";
|
||||
#else
|
||||
#else
|
||||
SPIFFS.remove("/layout.txt");
|
||||
#endif
|
||||
|
||||
txtExecution("firmware.config.txt");
|
||||
#endif
|
||||
|
||||
txtExecution("firmware.c.txt");
|
||||
//outcoming_date();
|
||||
}
|
||||
//-------------------------------сценарии-----------------------------------------------------
|
||||
|
||||
void Scenario_init() {
|
||||
if (jsonRead(configSetup, "scenario") == "1") {
|
||||
scenario = readFile("firmware.scenario.txt", 2048);
|
||||
scenario = readFile("firmware.s.txt", 2048);
|
||||
}
|
||||
}
|
||||
|
||||
void prsets_init() {
|
||||
|
||||
//part 1===============================================================================
|
||||
|
||||
server.on("/relay", HTTP_GET, [](AsyncWebServerRequest * request) {
|
||||
writeFile("firmware.config.txt", readFile("configs/relay.config.txt", 2048));
|
||||
writeFile("firmware.scenario.txt", readFile("configs/relay.scenario.txt", 2048));
|
||||
Device_init();
|
||||
Scenario_init();
|
||||
String tmp = "";
|
||||
request->redirect("/page.htm?configuration");
|
||||
});
|
||||
|
||||
server.on("/relay_timer", HTTP_GET, [](AsyncWebServerRequest * request) {
|
||||
writeFile("firmware.config.txt", readFile("configs/relay_t.config.txt", 2048));
|
||||
writeFile("firmware.scenario.txt", readFile("configs/relay_t.scenario.txt", 2048));
|
||||
Device_init();
|
||||
Scenario_init();
|
||||
request->redirect("/page.htm?configuration");
|
||||
});
|
||||
|
||||
server.on("/relay_countdown", HTTP_GET, [](AsyncWebServerRequest * request) {
|
||||
writeFile("firmware.config.txt", readFile("configs/relay_c.config.txt", 2048));
|
||||
writeFile("firmware.scenario.txt", readFile("configs/relay_c.scenario.txt", 2048));
|
||||
Device_init();
|
||||
Scenario_init();
|
||||
request->redirect("/page.htm?configuration");
|
||||
});
|
||||
|
||||
server.on("/relay_several", HTTP_GET, [](AsyncWebServerRequest * request) {
|
||||
writeFile("firmware.config.txt", readFile("configs/relay_s.config.txt", 2048));
|
||||
writeFile("firmware.scenario.txt", readFile("configs/relay_s.scenario.txt", 2048));
|
||||
Device_init();
|
||||
Scenario_init();
|
||||
request->redirect("/page.htm?configuration");
|
||||
});
|
||||
|
||||
server.on("/relay_switch", HTTP_GET, [](AsyncWebServerRequest * request) {
|
||||
writeFile("firmware.config.txt", readFile("configs/relay_sw.config.txt", 2048));
|
||||
writeFile("firmware.scenario.txt", readFile("configs/relay_sw.scenario.txt", 2048));
|
||||
Device_init();
|
||||
Scenario_init();
|
||||
request->redirect("/page.htm?configuration");
|
||||
});
|
||||
|
||||
server.on("/relay_button_remote", HTTP_GET, [](AsyncWebServerRequest * request) {
|
||||
writeFile("firmware.config.txt", readFile("configs/relay_br.config.txt", 2048));
|
||||
writeFile("firmware.scenario.txt", readFile("configs/relay_br.scenario.txt", 2048));
|
||||
Device_init();
|
||||
Scenario_init();
|
||||
request->redirect("/page.htm?configuration");
|
||||
});
|
||||
|
||||
server.on("/relay_switch_remote", HTTP_GET, [](AsyncWebServerRequest * request) {
|
||||
writeFile("firmware.config.txt", readFile("configs/relay_sr.config.txt", 2048));
|
||||
writeFile("firmware.scenario.txt", readFile("configs/relay_sr.scenario.txt", 2048));
|
||||
Device_init();
|
||||
Scenario_init();
|
||||
request->redirect("/page.htm?configuration");
|
||||
});
|
||||
|
||||
server.on("/pwm", HTTP_GET, [](AsyncWebServerRequest * request) {
|
||||
writeFile("firmware.config.txt", readFile("configs/pwm.config.txt", 2048));
|
||||
writeFile("firmware.scenario.txt", readFile("configs/pwm.scenario.txt", 2048));
|
||||
Device_init();
|
||||
Scenario_init();
|
||||
request->redirect("/page.htm?configuration");
|
||||
});
|
||||
|
||||
//part 2===============================================================================
|
||||
|
||||
server.on("/dht11", HTTP_GET, [](AsyncWebServerRequest * request) {
|
||||
writeFile("firmware.config.txt", readFile("configs/dht11.config.txt", 2048));
|
||||
writeFile("firmware.scenario.txt", readFile("configs/dht11.scenario.txt", 2048));
|
||||
Device_init();
|
||||
Scenario_init();
|
||||
request->redirect("/page.htm?configuration");
|
||||
});
|
||||
|
||||
server.on("/dht22", HTTP_GET, [](AsyncWebServerRequest * request) {
|
||||
writeFile("firmware.config.txt", readFile("configs/dht22.config.txt", 2048));
|
||||
writeFile("firmware.scenario.txt", readFile("configs/dht22.scenario.txt", 2048));
|
||||
Device_init();
|
||||
Scenario_init();
|
||||
request->redirect("/page.htm?configuration");
|
||||
});
|
||||
|
||||
server.on("/analog", HTTP_GET, [](AsyncWebServerRequest * request) {
|
||||
writeFile("firmware.config.txt", readFile("configs/analog.config.txt", 2048));
|
||||
writeFile("firmware.scenario.txt", readFile("configs/analog.scenario.txt", 2048));
|
||||
Device_init();
|
||||
Scenario_init();
|
||||
request->redirect("/page.htm?configuration");
|
||||
});
|
||||
|
||||
server.on("/dallas", HTTP_GET, [](AsyncWebServerRequest * request) {
|
||||
writeFile("firmware.config.txt", readFile("configs/dallas.config.txt", 2048));
|
||||
writeFile("firmware.scenario.txt", readFile("configs/dallas.scenario.txt", 2048));
|
||||
Device_init();
|
||||
Scenario_init();
|
||||
request->redirect("/page.htm?configuration");
|
||||
});
|
||||
|
||||
server.on("/termostat", HTTP_GET, [](AsyncWebServerRequest * request) {
|
||||
writeFile("firmware.config.txt", readFile("configs/termostat.config.txt", 2048));
|
||||
writeFile("firmware.scenario.txt", readFile("configs/termostat.scenario.txt", 2048));
|
||||
Device_init();
|
||||
Scenario_init();
|
||||
request->redirect("/page.htm?configuration");
|
||||
});
|
||||
|
||||
server.on("/level", HTTP_GET, [](AsyncWebServerRequest * request) {
|
||||
writeFile("firmware.config.txt", readFile("configs/level.config.txt", 2048));
|
||||
writeFile("firmware.scenario.txt", readFile("configs/level.scenario.txt", 2048));
|
||||
Device_init();
|
||||
Scenario_init();
|
||||
request->redirect("/page.htm?configuration");
|
||||
});
|
||||
|
||||
server.on("/moution_relay", HTTP_GET, [](AsyncWebServerRequest * request) {
|
||||
writeFile("firmware.config.txt", readFile("configs/moution_r.config.txt", 2048));
|
||||
writeFile("firmware.scenario.txt", readFile("configs/moution_r.scenario.txt", 2048));
|
||||
Device_init();
|
||||
Scenario_init();
|
||||
request->redirect("/page.htm?configuration");
|
||||
});
|
||||
|
||||
server.on("/moution_security", HTTP_GET, [](AsyncWebServerRequest * request) {
|
||||
writeFile("firmware.config.txt", readFile("configs/moution_s.config.txt", 2048));
|
||||
writeFile("firmware.scenario.txt", readFile("configs/moution_s.scenario.txt", 2048));
|
||||
Device_init();
|
||||
Scenario_init();
|
||||
request->redirect("/page.htm?configuration");
|
||||
});
|
||||
|
||||
server.on("/stepper", HTTP_GET, [](AsyncWebServerRequest * request) {
|
||||
writeFile("firmware.config.txt", readFile("configs/stepper.config.txt", 2048));
|
||||
writeFile("firmware.scenario.txt", readFile("configs/stepper.scenario.txt", 2048));
|
||||
Device_init();
|
||||
Scenario_init();
|
||||
request->redirect("/page.htm?configuration");
|
||||
});
|
||||
|
||||
//default===============================================================================
|
||||
|
||||
server.on("/default", HTTP_GET, [](AsyncWebServerRequest * request) {
|
||||
writeFile("firmware.config.txt", readFile("configs/firmware.config.txt", 2048));
|
||||
writeFile("firmware.scenario.txt", readFile("configs/firmware.scenario.txt", 2048));
|
||||
server.on("/preset", HTTP_GET, [](AsyncWebServerRequest * request) {
|
||||
String value;
|
||||
if (request->hasArg("arg")) {
|
||||
value = request->getParam("arg")->value();
|
||||
}
|
||||
if (value == "1") {
|
||||
writeFile("firmware.c.txt", readFile("configs/relay.c.txt", 2048));
|
||||
writeFile("firmware.s.txt", readFile("configs/relay.s.txt", 2048));
|
||||
}
|
||||
if (value == "2") {
|
||||
writeFile("firmware.c.txt", readFile("configs/relay_t.c.txt", 2048));
|
||||
writeFile("firmware.s.txt", readFile("configs/relay_t.s.txt", 2048));
|
||||
}
|
||||
if (value == "3") {
|
||||
writeFile("firmware.c.txt", readFile("configs/relay_c.c.txt", 2048));
|
||||
writeFile("firmware.s.txt", readFile("configs/relay_c.s.txt", 2048));
|
||||
}
|
||||
if (value == "4") {
|
||||
writeFile("firmware.c.txt", readFile("configs/relay_s.c.txt", 2048));
|
||||
writeFile("firmware.s.txt", readFile("configs/relay_s.s.txt", 2048));
|
||||
}
|
||||
if (value == "5") {
|
||||
writeFile("firmware.c.txt", readFile("configs/relay_sw.c.txt", 2048));
|
||||
writeFile("firmware.s.txt", readFile("configs/relay_sw.s.txt", 2048));
|
||||
}
|
||||
if (value == "6") {
|
||||
writeFile("firmware.c.txt", readFile("configs/relay_br.c.txt", 2048));
|
||||
writeFile("firmware.s.txt", readFile("configs/relay_br.s.txt", 2048));
|
||||
}
|
||||
if (value == "7") {
|
||||
writeFile("firmware.c.txt", readFile("configs/relay_sr.c.txt", 2048));
|
||||
writeFile("firmware.s.txt", readFile("configs/relay_sr.s.txt", 2048));
|
||||
}
|
||||
if (value == "8") {
|
||||
writeFile("firmware.c.txt", readFile("configs/pwm.c.txt", 2048));
|
||||
writeFile("firmware.s.txt", readFile("configs/pwm.s.txt", 2048));
|
||||
}
|
||||
if (value == "9") {
|
||||
writeFile("firmware.c.txt", readFile("configs/dht11.c.txt", 2048));
|
||||
writeFile("firmware.s.txt", readFile("configs/dht11.s.txt", 2048));
|
||||
}
|
||||
if (value == "10") {
|
||||
writeFile("firmware.c.txt", readFile("configs/dht22.c.txt", 2048));
|
||||
writeFile("firmware.s.txt", readFile("configs/dht22.s.txt", 2048));
|
||||
}
|
||||
if (value == "11") {
|
||||
writeFile("firmware.c.txt", readFile("configs/analog.c.txt", 2048));
|
||||
writeFile("firmware.s.txt", readFile("configs/analog.s.txt", 2048));
|
||||
}
|
||||
if (value == "12") {
|
||||
writeFile("firmware.c.txt", readFile("configs/dallas.c.txt", 2048));
|
||||
writeFile("firmware.s.txt", readFile("configs/dallas.s.txt", 2048));
|
||||
}
|
||||
if (value == "13") {
|
||||
writeFile("firmware.c.txt", readFile("configs/termostat.c.txt", 2048));
|
||||
writeFile("firmware.s.txt", readFile("configs/termostat.s.txt", 2048));
|
||||
}
|
||||
if (value == "14") {
|
||||
writeFile("firmware.c.txt", readFile("configs/level.c.txt", 2048));
|
||||
writeFile("firmware.s.txt", readFile("configs/level.s.txt", 2048));
|
||||
}
|
||||
if (value == "15") {
|
||||
writeFile("firmware.c.txt", readFile("configs/moution_r.c.txt", 2048));
|
||||
writeFile("firmware.s.txt", readFile("configs/moution_r.s.txt", 2048));
|
||||
}
|
||||
if (value == "16") {
|
||||
writeFile("firmware.c.txt", readFile("configs/moution_s.c.txt", 2048));
|
||||
writeFile("firmware.s.txt", readFile("configs/moution_s.s.txt", 2048));
|
||||
}
|
||||
if (value == "17") {
|
||||
writeFile("firmware.c.txt", readFile("configs/stepper.c.txt", 2048));
|
||||
writeFile("firmware.s.txt", readFile("configs/stepper.s.txt", 2048));
|
||||
}
|
||||
if (value == "18") {
|
||||
writeFile("firmware.c.txt", readFile("configs/firmware.c.txt", 2048));
|
||||
writeFile("firmware.s.txt", readFile("configs/firmware.s.txt", 2048));
|
||||
}
|
||||
Device_init();
|
||||
Scenario_init();
|
||||
request->redirect("/page.htm?configuration");
|
||||
|
||||
117
Logging.ino
117
Logging.ino
@@ -7,11 +7,16 @@ void logging() {
|
||||
String period_min = sCmd.next();
|
||||
String maxCount = sCmd.next();
|
||||
|
||||
String optimozation = sCmd.next();
|
||||
|
||||
String widget_name = sCmd.next();
|
||||
widget_name.replace("#", " ");
|
||||
String page_name = sCmd.next();
|
||||
String page_number = sCmd.next();
|
||||
|
||||
if (optimozation == "fast") chart_data_in_solid_array = true;
|
||||
if (optimozation == "slow") chart_data_in_solid_array = false;
|
||||
|
||||
if (sensor_name == "analog") jsonWriteStr(optionJson, "analog_logging_count", maxCount);
|
||||
if (sensor_name == "level") jsonWriteStr(optionJson, "level_logging_count", maxCount);
|
||||
if (sensor_name == "dallas") jsonWriteStr(optionJson, "dallas_logging_count", maxCount);
|
||||
@@ -68,7 +73,7 @@ void logging() {
|
||||
//=========================================Удаление стрых данных и запись новых==================================================================
|
||||
void deleteOldDate(String file, int seted_number_of_lines, String date_to_add) {
|
||||
String log_date = readFile(file, 5000);
|
||||
int current_number_of_lines = count(log_date, "\n");
|
||||
int current_number_of_lines = count(log_date, "\r\n");
|
||||
Serial.println("=====> [i] in log file " + file + " " + current_number_of_lines + " lines");
|
||||
|
||||
if (current_number_of_lines > seted_number_of_lines + 1) {
|
||||
@@ -80,9 +85,9 @@ void deleteOldDate(String file, int seted_number_of_lines, String date_to_add) {
|
||||
current_number_of_lines = 0;
|
||||
}
|
||||
if (current_number_of_lines > seted_number_of_lines) {
|
||||
log_date = deleteBeforeDelimiter(log_date, "\n");
|
||||
log_date = deleteBeforeDelimiter(log_date, "\r\n");
|
||||
if (GetTimeUnix() != "failed") {
|
||||
log_date += GetTimeUnix() + " " + date_to_add + "\n";
|
||||
log_date += GetTimeUnix() + " " + date_to_add + "\r\n";
|
||||
writeFile(file, log_date);
|
||||
}
|
||||
} else {
|
||||
@@ -95,62 +100,66 @@ void deleteOldDate(String file, int seted_number_of_lines, String date_to_add) {
|
||||
|
||||
//=========================================Выбор какие данные отправлять==================================================================
|
||||
void choose_log_date_and_send() {
|
||||
if (flagLoggingAnalog) sendLogData("log.analog.txt", "loganalog");
|
||||
if (flagLoggingLevel) sendLogData("log.level.txt", "loglevel");
|
||||
if (flagLoggingDallas) sendLogData("log.dallas.txt", "logdallas");
|
||||
if (flagLoggingdhtT) sendLogData("log.dhtT.txt", "logdhtT");
|
||||
if (flagLoggingdhtH) sendLogData("log.dhtH.txt", "logdhtH");
|
||||
|
||||
if (flagLoggingAnalog) sendLogData("log.analog.txt", "loganalog", chart_data_in_solid_array);
|
||||
if (flagLoggingLevel) sendLogData("log.level.txt", "loglevel", chart_data_in_solid_array);
|
||||
if (flagLoggingDallas) sendLogData("log.dallas.txt", "logdallas", chart_data_in_solid_array);
|
||||
if (flagLoggingdhtT) sendLogData("log.dhtT.txt", "logdhtT", chart_data_in_solid_array);
|
||||
if (flagLoggingdhtH) sendLogData("log.dhtH.txt", "logdhtH", chart_data_in_solid_array);
|
||||
}
|
||||
|
||||
//=========================================Отправка данных===================================================================================
|
||||
//прямое выкидывание данных из файла в файловой системе в mqtt, без загрузки оперативной памяти
|
||||
void sendLogData(String file, String topic) {
|
||||
File configFile = SPIFFS.open("/" + file, "r");
|
||||
if (!configFile) {
|
||||
return;
|
||||
}
|
||||
configFile.seek(0, SeekSet); //поставим курсор в начало файла
|
||||
while (configFile.position() != configFile.size()) {
|
||||
String tmp = configFile.readStringUntil('\r\n');
|
||||
String unix_time = selectToMarker (tmp, " ");
|
||||
String value = deleteBeforeDelimiter(tmp, " ");
|
||||
String final_line = "{\"status\":{\"x\":" + unix_time + ",\"y1\":" + value + "}}";
|
||||
//Serial.println(final_line);
|
||||
sendCHART(topic, final_line);
|
||||
}
|
||||
getMemoryLoad("[i] after send log date");
|
||||
}
|
||||
//старый метод выкидывания данных с использованием оперативной памяти
|
||||
void sendLogData2(String file, String topic) {
|
||||
String log_date = readFile(file, 5000);
|
||||
log_date.replace("\r\n", "\n");
|
||||
log_date.replace("\r", "\n");
|
||||
String buf = "{}";
|
||||
String json_array;
|
||||
String unix_time;
|
||||
String value;
|
||||
while (log_date.length() != 0) {
|
||||
String tmp = selectToMarker (log_date, "\n");
|
||||
log_date = deleteBeforeDelimiter(log_date, "\n");
|
||||
unix_time = selectToMarker (tmp, " ");
|
||||
jsonWriteInt(buf, "x", unix_time.toInt());
|
||||
value = deleteBeforeDelimiter(tmp, " ");
|
||||
jsonWriteFloat(buf, "y1", value.toFloat());
|
||||
if (log_date.length() < 3) {
|
||||
json_array += buf;
|
||||
} else {
|
||||
json_array += buf + ",";
|
||||
void sendLogData(String file, String topic, boolean type) {
|
||||
if (type) {
|
||||
//----------------------------------------------
|
||||
String log_date = readFile(file, 5000);
|
||||
log_date.replace("\r\n", "\n");
|
||||
log_date.replace("\r", "\n");
|
||||
String buf = "{}";
|
||||
String json_array;
|
||||
String unix_time;
|
||||
String value;
|
||||
while (log_date.length() != 0) {
|
||||
String tmp = selectToMarker (log_date, "\n");
|
||||
log_date = deleteBeforeDelimiter(log_date, "\n");
|
||||
unix_time = selectToMarker (tmp, " ");
|
||||
jsonWriteInt(buf, "x", unix_time.toInt());
|
||||
value = deleteBeforeDelimiter(tmp, " ");
|
||||
jsonWriteFloat(buf, "y1", value.toFloat());
|
||||
if (log_date.length() < 3) {
|
||||
json_array += buf;
|
||||
} else {
|
||||
json_array += buf + ",";
|
||||
}
|
||||
buf = "{}";
|
||||
}
|
||||
buf = "{}";
|
||||
unix_time = "";
|
||||
value = "";
|
||||
log_date = "";
|
||||
json_array = "{\"status\":[" + json_array + "]}";
|
||||
Serial.println(json_array);
|
||||
sendCHART(topic, json_array);
|
||||
json_array = "";
|
||||
getMemoryLoad("[i] after send log date");
|
||||
//----------------------------------------------
|
||||
} else {
|
||||
//----------------------------------------------
|
||||
File configFile = SPIFFS.open("/" + file, "r");
|
||||
if (!configFile) {
|
||||
return;
|
||||
}
|
||||
configFile.seek(0, SeekSet); //поставим курсор в начало файла
|
||||
while (configFile.position() != configFile.size()) {
|
||||
String tmp = configFile.readStringUntil('\r\n');
|
||||
String unix_time = selectToMarker (tmp, " ");
|
||||
String value = deleteBeforeDelimiter(tmp, " ");
|
||||
String final_line = "{\"status\":{\"x\":" + unix_time + ",\"y1\":" + value + "}}";
|
||||
//Serial.println(final_line);
|
||||
sendCHART(topic, final_line);
|
||||
}
|
||||
getMemoryLoad("[i] after send log date");
|
||||
}
|
||||
unix_time = "";
|
||||
value = "";
|
||||
log_date = "";
|
||||
json_array = "{\"status\":[" + json_array + "]}";
|
||||
Serial.println(json_array);
|
||||
sendCHART(topic, json_array);
|
||||
json_array = "";
|
||||
getMemoryLoad("[i] after send log date");
|
||||
//----------------------------------------------
|
||||
}
|
||||
//=========================================Очистка данных===================================================================================
|
||||
void clean_log_date() {
|
||||
|
||||
@@ -187,7 +187,7 @@ void dhtH() {
|
||||
} else {
|
||||
counter = 0;
|
||||
value = dht.getHumidity();
|
||||
if (String(value) != "nan") {
|
||||
if (String(value) != "nan" || value <= 100 || value >= 0) {
|
||||
//if (value_old != value) {
|
||||
eventGen ("dhtH", "");
|
||||
jsonWriteStr(configJson, "dhtH", String(value));
|
||||
|
||||
8
Time.ino
8
Time.ino
@@ -125,3 +125,11 @@ String GetDataDigital() {
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
int timeToMin(String Time) {
|
||||
//"00:00:00" время в секунды
|
||||
long min = selectToMarker(Time, ":").toInt() * 60; //общее количество секунд в полных часах
|
||||
Time = deleteBeforeDelimiter (Time, ":"); // Теперь здесь минуты секунды
|
||||
min += selectToMarker(Time, ":").toInt(); // Добавим секунды из полных минут
|
||||
return min;
|
||||
}
|
||||
|
||||
12
Upgrade.ino
12
Upgrade.ino
@@ -74,8 +74,8 @@ void upgrade_firmware() {
|
||||
String scenario_for_update;
|
||||
String config_for_update;
|
||||
String configSetup_for_update;
|
||||
scenario_for_update = readFile("firmware.scenario.txt", 3072);
|
||||
config_for_update = readFile("firmware.config.txt", 3072);
|
||||
scenario_for_update = readFile("firmware.s.txt", 3072);
|
||||
config_for_update = readFile("firmware.c.txt", 3072);
|
||||
configSetup_for_update = configSetup;
|
||||
|
||||
Serial.println("Start upgrade SPIFFS, please wait...");
|
||||
@@ -93,8 +93,8 @@ void upgrade_firmware() {
|
||||
|
||||
if (ret == HTTP_UPDATE_OK) {
|
||||
|
||||
writeFile("firmware.scenario.txt", scenario_for_update);
|
||||
writeFile("firmware.config.txt", config_for_update);
|
||||
writeFile("firmware.s.txt", scenario_for_update);
|
||||
writeFile("firmware.c.txt", config_for_update);
|
||||
writeFile("config.json", configSetup_for_update);
|
||||
saveConfig();
|
||||
|
||||
@@ -212,12 +212,12 @@ void handle_upgrade() {
|
||||
String config_for_update;
|
||||
String configSetup_for_update;
|
||||
Serial.println(spiffsData);
|
||||
scenario_for_update = readFile("firmware.scenario.txt", 2048);
|
||||
scenario_for_update = readFile("firmware.s.txt", 2048);
|
||||
config_for_update = readFile("config.all.txt", 2048);
|
||||
configSetup_for_update = configSetup;
|
||||
ESPhttpUpdate.rebootOnUpdate(false); // Отключим перезагрузку после обновления
|
||||
updateHTTP(spiffsData, true);
|
||||
writeFile("firmware.scenario.txt", scenario_for_update);
|
||||
writeFile("firmware.s.txt", scenario_for_update);
|
||||
writeFile("config.all.txt", config_for_update);
|
||||
writeFile("config.json", configSetup_for_update);
|
||||
saveConfig();
|
||||
|
||||
@@ -113,6 +113,7 @@ void Web_server_init() {
|
||||
|
||||
request->send(404);
|
||||
});
|
||||
|
||||
server.onFileUpload([](AsyncWebServerRequest * request, const String & filename, size_t index, uint8_t *data, size_t len, bool final) {
|
||||
if (!index)
|
||||
Serial.printf("UploadStart: %s\n", filename.c_str());
|
||||
@@ -120,6 +121,7 @@ void Web_server_init() {
|
||||
if (final)
|
||||
Serial.printf("UploadEnd: %s (%u)\n", filename.c_str(), index + len);
|
||||
});
|
||||
|
||||
server.onRequestBody([](AsyncWebServerRequest * request, uint8_t *data, size_t len, size_t index, size_t total) {
|
||||
if (!index)
|
||||
Serial.printf("BodyStart: %u\n", total);
|
||||
|
||||
@@ -5,12 +5,12 @@
|
||||
"passwordAP": "",
|
||||
"ssid": "rise",
|
||||
"password": "hostel3333",
|
||||
"timezone": 3,
|
||||
"mqttServer": "m12.cloudmqtt.com",
|
||||
"mqttPort": 14053,
|
||||
"mqttPrefix": "/IoTmanager",
|
||||
"mqttUser": "lbscvzuj",
|
||||
"mqttPass": "bLxlveOgaF8F",
|
||||
"timezone": 2,
|
||||
"mqttServer": "mqtt.ioty.ru",
|
||||
"mqttPort": 1883,
|
||||
"mqttPrefix": "/rise",
|
||||
"mqttUser": "test",
|
||||
"mqttPass": "test",
|
||||
"scenario": "1",
|
||||
"pushingbox_id": "",
|
||||
"web_login": "admin",
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
analog 0 Аналоговый#вход,#% Датчики progress-round 310 620 1 100 1
|
||||
logging analog 5 100 slow Аналоговый#вход Датчики 2
|
||||
|
||||
//если датчик углекислого газа выдает напряжение от 1 вольта до 2 вольт, то значит
|
||||
//значение чтения аналогового входа будут примерно равным
|
||||
@@ -1,4 +1,5 @@
|
||||
dallas 2 Водонагреватель,#t°C Датчики any-data 1
|
||||
logging dallas 1 100 slow Температура Датчики 2
|
||||
|
||||
//2 - номер пина датчика
|
||||
//варианты отображения: any-data, progress-round, progress-line, fill-gauge
|
||||
@@ -3,8 +3,8 @@ dhtH DHT11 2 Влажность#DHT,#% Датчики any-data 2
|
||||
dhtComfort Степень#комфорта: Датчики 3
|
||||
dhtPerception Восприятие: Датчики 4
|
||||
dhtDewpoint Точка#росы: Датчики 5
|
||||
logging dhtT 1 10 Температура Датчики 6
|
||||
logging dhtH 1 10 Влажность Датчики 7
|
||||
logging dhtT 5 50 slow Температура Датчики 6
|
||||
logging dhtH 5 50 slow Влажность Датчики 7
|
||||
|
||||
//2 - номер пина датчика
|
||||
//варианты отображения: any-data, progress-round, progress-line, fill-gauge
|
||||
@@ -3,8 +3,8 @@ dhtH DHT22 2 Влажность#DHT,#% Датчики any-data 2
|
||||
dhtComfort Степень#комфорта: Датчики 3
|
||||
dhtPerception Восприятие: Датчики 4
|
||||
dhtDewpoint Точка#росы: Датчики 5
|
||||
logging dhtT 1 10 Температура Датчики 6
|
||||
logging dhtH 1 10 Влажность Датчики 7
|
||||
logging dhtT 5 50 slow Температура Датчики 6
|
||||
logging dhtH 5 50 slow Влажность Датчики 7
|
||||
|
||||
//2 - номер пина датчика
|
||||
//варианты отображения: any-data, progress-round, progress-line, fill-gauge
|
||||
14
data/configs/firmware.c.txt
Normal file
14
data/configs/firmware.c.txt
Normal file
@@ -0,0 +1,14 @@
|
||||
button 1 na Включить#все Реле 0 1
|
||||
button 2 13 Прихожая Реле 0 2
|
||||
button 3 14 Кухня Реле 0 3
|
||||
pwm 1 3 Яркость#коредор: Реле 1023 4
|
||||
pwm 2 4 Яркость#ванная: Реле 510 5
|
||||
analog 0 Аналоговый#вход Датчики fill-gauge 1 1023 1 1023 6
|
||||
logging analog 1 100 slow Аналоговый#вход Датчики 7
|
||||
|
||||
//Это демо конфигурация. В ней показано как связать кнопки c мощью сценариев
|
||||
//Кнопка номер 1 связана с кнопкой 2, 3 и с pwm 2
|
||||
//Так же продемонстрированна система логгирования данных строкой logging
|
||||
//1 - это интервал между точками в минутах, 100 это количество точек
|
||||
//slow или fast это два варианта выгрузки графика, slow более экономичный режим
|
||||
//больше подходит для esp8266
|
||||
@@ -1,9 +0,0 @@
|
||||
button 1 na Включить#все Реле 0 1
|
||||
button 2 13 Прихожая Реле 0 2
|
||||
button 3 14 Кухня Реле 0 3
|
||||
pwm 1 3 Яркость#коредор: Реле 1023 4
|
||||
pwm 2 4 Яркость#ванная: Реле 510 5
|
||||
analog 0 Аналоговый#вход Датчики fill-gauge 1 1023 1 1023 6
|
||||
|
||||
//Это демо конфигурация. В ней показано как связать сценариями кнопки.
|
||||
//Кнопка номер 1 связана с кнопкой 2, 3 и с pwm 2
|
||||
@@ -3,6 +3,7 @@ inputDigit digit1 При#скольки#выключить? Датчики 95 2
|
||||
inputDigit digit2 При#скольки#включить? Датчики 10 3
|
||||
button 1 5 Насос Датчики 0 4
|
||||
button 2 line1,line2, Автоматический#режим Датчики 1 5
|
||||
logging level 1 100 slow Вода#в#баке Датчики 6
|
||||
|
||||
//125 - это расстояние от датчика до дна бака в сантиметрах
|
||||
//20 - это расстояние от датчика до поверхности воды когда бак полный в сантиметрах
|
||||
@@ -2,9 +2,11 @@ switch 1 0 20
|
||||
text 1 Вход: Охрана 1
|
||||
textSet 1 не#обнаружено-time
|
||||
button 1 na Сбросить Охрана 0 2
|
||||
button 2 line3, Включить#push Охрана 1 3
|
||||
|
||||
//0 - номер пина датчика
|
||||
//при срабатывании датчика движения устройство пошлет пуш и в приложении будет
|
||||
//написано в текстовом поле, что движение было обнаружено, так же будет зафиксирован
|
||||
//момент времени срабатывания датчика
|
||||
//написано в текстовом поле, что движение было обнаружено
|
||||
//так же будет зафиксирован момент времени срабатывания датчика
|
||||
//в приложении можно отключать отправку пуш сообщений на тот случай если дома хозяин
|
||||
//перевести датчик снова в режим ожидания движения можно нажав кнопку сброса в приложении
|
||||
@@ -1,8 +1,10 @@
|
||||
switch1 = 1
|
||||
textSet 1 обнаружено#движение-time
|
||||
push Внимание обнаружено#движение!
|
||||
end
|
||||
button1 = 1
|
||||
textSet 1 не#обнаружено-time
|
||||
buttonSet 1 0
|
||||
end
|
||||
switch1 = 1
|
||||
push Внимание обнаружено#движение!
|
||||
end
|
||||
@@ -1,9 +1,9 @@
|
||||
dallas 2 Водонагреватель,#t°C Термостат any-data 1
|
||||
inputDigit digit1 При#скольки#выключить? Термостат 40 2
|
||||
inputDigit digit2 При#скольки#включить? Термостат 20 3
|
||||
button 1 5 Нагреватель Термостат 0 4
|
||||
button 2 line1,line2, Автоматический#режим Термостат 1 5
|
||||
|
||||
logging dallas 5 100 slow Температура Термостат 2
|
||||
inputDigit digit1 При#скольки#выключить? Термостат 40 3
|
||||
inputDigit digit2 При#скольки#включить? Термостат 20 4
|
||||
button 1 5 Нагреватель Термостат 0 5
|
||||
button 2 line1,line2, Автоматический#режим Термостат 1 6
|
||||
|
||||
//2 - номер пина датчика
|
||||
//5 - номер пина реле
|
||||
@@ -33,24 +33,24 @@
|
||||
"style": "display:inline",
|
||||
"title": {
|
||||
"#": "Выбирите то, во что Вы хотите превратить ESP <span class=\"caret\"></span>",
|
||||
"/relay": "1.Вкл. выкл. локального реле",
|
||||
"/relay_timer": "2.Вкл. выкл. локального реле в определенное время",
|
||||
"/relay_countdown": "3.Вкл. выкл. локального реле на определенный период времени",
|
||||
"/relay_several": "4.Вкл. выкл. нескольких локальных реле кнопкой в приложении",
|
||||
"/relay_switch": "5.Вкл. выкл. локального реле физической кнопкой (кнопка так же дублируется в приложении)",
|
||||
"/relay_button_remote": "6.Вкл. выкл. нескольких удаленных реле кнопкой в приложении (нужно указать Device ID)",
|
||||
"/relay_switch_remote": "7.Вкл. выкл. нескольких удаленных реле физической кнопкой (нужно указать Device ID)",
|
||||
"/pwm": "8.Широтно импульсная модуляция",
|
||||
"/dht11": "9.Сенсор DHT11",
|
||||
"/dht22": "10.Сенсор DHT22, DHT33, DHT44, AM2302, RHT03",
|
||||
"/analog": "11.Аналоговый сенсор",
|
||||
"/dallas": "12.Сенсор DS18B20",
|
||||
"/termostat": "13.Термостат на DS18B20 с переключением в ручной режим",
|
||||
"/level": "14.Контроль уровня в баке на сенсорах: JSN-SR04T, HC-SR04, HY-SRF05 (управление насосом)",
|
||||
"/moution_relay": "15.Датчик движения включающий свет",
|
||||
"/moution_security": "16.Охранный датчик движения",
|
||||
"/stepper": "17.Система управления шаговыми двигателями на основе драйвера A4988 (открытие закрытие штор)",
|
||||
"/default": "Настройки по умолчанию"
|
||||
"/preset?arg=1": "1.Вкл. выкл. локального реле",
|
||||
"/preset?arg=2": "2.Вкл. выкл. локального реле в определенное время",
|
||||
"/preset?arg=3": "3.Вкл. выкл. локального реле на определенный период времени",
|
||||
"/preset?arg=4": "4.Вкл. выкл. нескольких локальных реле кнопкой в приложении",
|
||||
"/preset?arg=5": "5.Вкл. выкл. локального реле физической кнопкой и кнопкой в приложении параллельно (для выключателя света)",
|
||||
"/preset?arg=6": "6.Вкл. выкл. нескольких удаленных реле кнопкой в приложении (нужно указать Device ID)",
|
||||
"/preset?arg=7": "7.Вкл. выкл. нескольких удаленных реле физической кнопкой (нужно указать Device ID)",
|
||||
"/preset?arg=8": "8.Широтно импульсная модуляция",
|
||||
"/preset?arg=9": "9.Сенсор DHT11 и логгирование",
|
||||
"/preset?arg=10": "10.Сенсор DHT22, DHT33, DHT44, AM2302, RHT03 и логгирование",
|
||||
"/preset?arg=11": "11.Аналоговый сенсор и логгирование",
|
||||
"/preset?arg=12": "12.Сенсор DS18B20 и логгирование",
|
||||
"/preset?arg=13": "13.Термостат на DS18B20 с переключением в ручной режим и логгированием",
|
||||
"/preset?arg=14": "14.Контроль уровня в баке на сенсорах: JSN-SR04T, HC-SR04, HY-SRF05 и логгирование (управление насосом)",
|
||||
"/preset?arg=15": "15.Датчик движения включающий свет",
|
||||
"/preset?arg=16": "16.Охранный датчик движения",
|
||||
"/preset?arg=17": "17.Система управления шаговыми двигателями на основе драйвера A4988 (открытие закрытие штор)",
|
||||
"/preset?arg=18": "Настройки по умолчанию"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -59,7 +59,7 @@
|
||||
},
|
||||
{
|
||||
"type": "file",
|
||||
"state": "firmware.config.txt",
|
||||
"state": "firmware.c.txt",
|
||||
"style": "width:100%;height:400px",
|
||||
"title": "Сохранить",
|
||||
"action": "/all_modules_init",
|
||||
@@ -88,7 +88,7 @@
|
||||
},
|
||||
{
|
||||
"type": "file",
|
||||
"state": "firmware.scenario.txt",
|
||||
"state": "firmware.s.txt",
|
||||
"style": "width:100%;height:400px",
|
||||
"title": "Сохранить и включить",
|
||||
"action": "/scenario?status=1",
|
||||
@@ -99,7 +99,7 @@
|
||||
},
|
||||
{
|
||||
"type": "link",
|
||||
"title": "Очистить все логи",
|
||||
"title": "Очистить логи сенсоров",
|
||||
"action": "/cleanlog",
|
||||
"class": "btn btn-block btn-success"
|
||||
},
|
||||
|
||||
14
data/firmware.c.txt
Normal file
14
data/firmware.c.txt
Normal file
@@ -0,0 +1,14 @@
|
||||
button 1 na Включить#все Реле 0 1
|
||||
button 2 13 Прихожая Реле 0 2
|
||||
button 3 14 Кухня Реле 0 3
|
||||
pwm 1 3 Яркость#коредор: Реле 1023 4
|
||||
pwm 2 4 Яркость#ванная: Реле 510 5
|
||||
analog 0 Аналоговый#вход Датчики fill-gauge 1 1023 1 1023 6
|
||||
logging analog 1 100 slow Аналоговый#вход Датчики 7
|
||||
|
||||
//Это демо конфигурация. В ней показано как связать кнопки c мощью сценариев
|
||||
//Кнопка номер 1 связана с кнопкой 2, 3 и с pwm 2
|
||||
//Так же продемонстрированна система логгирования данных строкой logging
|
||||
//1 - это интервал между точками в минутах, 100 это количество точек
|
||||
//slow или fast это два варианта выгрузки графика, slow более экономичный режим
|
||||
//больше подходит для esp8266
|
||||
@@ -1,9 +0,0 @@
|
||||
button 1 na Включить#все Реле 0 1
|
||||
button 2 13 Прихожая Реле 0 2
|
||||
button 3 14 Кухня Реле 0 3
|
||||
pwm 1 3 Яркость#коредор: Реле 1023 4
|
||||
pwm 2 4 Яркость#ванная: Реле 510 5
|
||||
analog 0 Аналоговый#вход Датчики fill-gauge 1 1023 1 1023 6
|
||||
|
||||
//Это демо конфигурация. В ней показано как связать сценариями кнопки.
|
||||
//Кнопка номер 1 связана с кнопкой 2, 3 и с pwm 2
|
||||
@@ -36,26 +36,14 @@ void setup() {
|
||||
Serial.println("[V] SSDP_init");
|
||||
//--------------------------------------------------------------
|
||||
|
||||
|
||||
ts.add(TEST, 10000, [&](void*) {
|
||||
|
||||
//String json = "{}";
|
||||
//jsonWriteStr(json, "test", GetTime());
|
||||
//ws.textAll(json);
|
||||
|
||||
//getMemoryLoad("[i] After loading");
|
||||
//Serial.print(GetDataDigital());
|
||||
//Serial.print(" ");
|
||||
//Serial.println(GetTime());
|
||||
|
||||
|
||||
}, nullptr, false);
|
||||
getMemoryLoad("[i] periodic check of");
|
||||
}, nullptr, true);
|
||||
|
||||
just_load = false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void loop() {
|
||||
|
||||
#ifdef OTA_enable
|
||||
|
||||
50
main.ino
50
main.ino
@@ -257,6 +257,56 @@ String readFileString(String fileName, String found) {
|
||||
configFile.close();
|
||||
}
|
||||
|
||||
// Запись данных в файл с частотой 1 секунда и более. Максимальное количество данных в суточном файле 1440 значений
|
||||
void safeDataToFile(int inter, String par, uint16_t data) {
|
||||
yield();
|
||||
// Формируем зоголовок (префикс) Интервал, Параметр, размер_параметра
|
||||
uint16_t dataSize = sizeof(data);
|
||||
String prifexFile;
|
||||
prifexFile += inter;
|
||||
prifexFile += "," + par;
|
||||
prifexFile += ",";
|
||||
prifexFile += dataSize;
|
||||
prifexFile += ":";
|
||||
uint16_t prifexLen = prifexFile.length(); //Размер префикса
|
||||
|
||||
// Сделаем имя файла
|
||||
String fileName = GetDate();
|
||||
fileName = deleteBeforeDelimiter(fileName, " "); // удалим день недели
|
||||
fileName.replace(" ", ".");
|
||||
fileName.replace("..", "."); // Заменяем пробелы точками
|
||||
fileName = par + "/" + fileName + ".txt"; // Имя файла параметр в виде директории и дата
|
||||
fileName.toLowerCase(); //fileName = "san aug 31 2018"; Имя файла строчными буквами
|
||||
Serial.println(fileName);
|
||||
File configFile = SPIFFS.open("/" + fileName, "a"); // Открываем файл на добавление
|
||||
size_t size = configFile.size();
|
||||
yield();
|
||||
if (size == 0) {
|
||||
configFile.print(prifexFile);
|
||||
}
|
||||
size = configFile.size();
|
||||
// Получим время и определим позицию в файле
|
||||
String time = GetTime();
|
||||
//time = "00:15:00";
|
||||
int timeM = timeToMin(time); // Здесь количество минут с начала суток
|
||||
timeM = timeM / inter;
|
||||
int poz = timeM * dataSize + prifexLen + 1; // позиция в которую нужно записать.
|
||||
int endF = (size - prifexLen) * dataSize + prifexLen + 1; // позиция конца файла
|
||||
if (poz >= endF) { // если файл имел пропуски в записи данных
|
||||
int i = (poz - endF) / dataSize;
|
||||
for (int j = 0; j < i; j++) { // Заполним недостающие данные
|
||||
for (int d = 0; d < dataSize; d++) {
|
||||
yield();
|
||||
configFile.write(0); // нулями
|
||||
}
|
||||
}
|
||||
}
|
||||
yield();
|
||||
configFile.write(data >> 8); // добавим текущие
|
||||
configFile.write(data); // данные
|
||||
configFile.close();
|
||||
}
|
||||
|
||||
//=======================================УПРАВЛЕНИЕ ВИДЖЕТАМИ MQTT======================================================================
|
||||
|
||||
|
||||
|
||||
13
mqtt.ino
13
mqtt.ino
@@ -76,14 +76,14 @@ boolean MQTT_Connecting() {
|
||||
//ssl//espClient.setCACert(local_root_ca1);
|
||||
client.setServer(mqtt_server.c_str(), jsonReadtoInt(configSetup, "mqttPort"));
|
||||
if (WiFi.status() == WL_CONNECTED) {
|
||||
if (!client.connected()) {
|
||||
if (!client.connected()) {
|
||||
Serial.println("[V] Connecting to MQTT server commenced");
|
||||
if (client.connect(chipID.c_str(), jsonRead(configSetup, "mqttUser").c_str(), jsonRead(configSetup, "mqttPass").c_str())) {
|
||||
if (client.connect(chipID.c_str(), jsonRead(configSetup, "mqttUser").c_str(), jsonRead(configSetup, "mqttPass").c_str())) {
|
||||
Serial.println("[V] MQTT connected");
|
||||
client.setCallback(callback);
|
||||
client.subscribe(jsonRead(configSetup, "mqttPrefix").c_str()); // Для приема получения HELLOW и подтверждения связи
|
||||
client.subscribe((jsonRead(configSetup, "mqttPrefix") + "/" + chipID + "/+/control").c_str()); // Подписываемся на топики control
|
||||
client.subscribe((jsonRead(configSetup, "mqttPrefix") + "/" + chipID + "/order").c_str()); // Подписываемся на топики order
|
||||
client.subscribe((jsonRead(configSetup, "mqttPrefix") + "/" + chipID + "/order").c_str()); // Подписываемся на топики order
|
||||
Serial.println("[V] Callback set, subscribe done");
|
||||
return true;
|
||||
} else {
|
||||
@@ -155,6 +155,11 @@ boolean sendCHART(String topik, String data) {
|
||||
client.endPublish();
|
||||
return send_status;
|
||||
}
|
||||
boolean sendCHART_test(String topik, String data) {
|
||||
topik = jsonRead(configSetup, "mqttPrefix") + "/" + chipID + "/" + topik + "/" + "status";
|
||||
boolean send_status = client.publish (topik.c_str(), data.c_str(), false);
|
||||
return send_status;
|
||||
}
|
||||
//======================================STATUS==================================================
|
||||
void sendSTATUS(String topik, String state) {
|
||||
topik = jsonRead(configSetup, "mqttPrefix") + "/" + chipID + "/" + topik + "/" + "status";
|
||||
@@ -264,7 +269,7 @@ String stateMQTT() {
|
||||
|
||||
//SCENARIO ANALOG > 5 800324-1458415 rel1 0
|
||||
if (jsonRead(configSetup, "scenario") == "1") {
|
||||
//String all_text = readFile("firmware.scenario.txt", 1024) + "\r\n";
|
||||
//String all_text = readFile("firmware.s.txt", 1024) + "\r\n";
|
||||
String all_text = scenario + "\r\n";
|
||||
all_text.replace("\r\n", "\n");
|
||||
all_text.replace("\r", "\n");
|
||||
|
||||
Reference in New Issue
Block a user