reduse ram consuption!!!

This commit is contained in:
Dmitry Borisenko
2020-03-30 01:45:42 +02:00
parent abfc847793
commit c7ba7fecbc
55 changed files with 300 additions and 294 deletions

View File

@@ -46,7 +46,6 @@ void CMD_init() {
handle_time_init();
}

240
Init.ino
View File

@@ -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");

View File

@@ -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() {

View File

@@ -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));

View File

@@ -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;
}

View File

@@ -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();

View File

@@ -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);

View File

@@ -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",

View File

@@ -1,4 +1,5 @@
analog 0 Аналоговый#вход,#% Датчики progress-round 310 620 1 100 1
logging analog 5 100 slow Аналоговый#вход Датчики 2
//если датчик углекислого газа выдает напряжение от 1 вольта до 2 вольт, то значит
//значение чтения аналогового входа будут примерно равным

View File

@@ -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

View File

@@ -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

View File

@@ -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

View 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

View File

@@ -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

View File

@@ -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 - это расстояние от датчика до поверхности воды когда бак полный в сантиметрах

View File

@@ -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 - номер пина датчика
//при срабатывании датчика движения устройство пошлет пуш и в приложении будет
//написано в текстовом поле, что движение было обнаружено, так же будет зафиксирован
//момент времени срабатывания датчика
//написано в текстовом поле, что движение было обнаружено
//так же будет зафиксирован момент времени срабатывания датчика
//в приложении можно отключать отправку пуш сообщений на тот случай если дома хозяин
//перевести датчик снова в режим ожидания движения можно нажав кнопку сброса в приложении

View File

@@ -1,8 +1,10 @@
switch1 = 1
textSet 1 обнаружено#движение-time
push Внимание обнаружено#движение!
end
button1 = 1
textSet 1 не#обнаружено-time
buttonSet 1 0
end
switch1 = 1
push Внимание обнаружено#движение!
end

View File

@@ -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 - номер пина реле

View File

@@ -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
View 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

View File

@@ -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

View File

@@ -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

View File

@@ -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======================================================================

View File

@@ -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");

2
set.h
View File

@@ -155,3 +155,5 @@ boolean get_url_flag = false;
boolean start_connecting_to_mqtt = false;
String test;
boolean chart_data_in_solid_array;