diff --git a/Cmd.ino b/Cmd.ino index d9bd1313..65285039 100644 --- a/Cmd.ino +++ b/Cmd.ino @@ -62,8 +62,8 @@ void button() { String start_state = sCmd.next(); String page_number = sCmd.next(); - jsonWrite(optionJson, "button_param" + button_number, button_param); - jsonWrite(configJson, "buttonSet" + button_number, start_state); + jsonWriteStr(optionJson, "button_param" + button_number, button_param); + jsonWriteStr(configJson, "buttonSet" + button_number, start_state); if (isDigitStr (button_param)) { pinMode(button_param.toInt(), OUTPUT); @@ -71,7 +71,7 @@ void button() { } if (button_param == "scenario") { - jsonWrite(configSetup, "scenario", start_state); + jsonWriteStr(configSetup, "scenario", start_state); Scenario_init(); saveConfig(); } @@ -103,7 +103,7 @@ void buttonSet() { } if (button_param == "scenario") { - jsonWrite(configSetup, "scenario", button_state); + jsonWriteStr(configSetup, "scenario", button_state); Scenario_init(); saveConfig(); } @@ -124,7 +124,7 @@ void buttonSet() { eventGen ("buttonSet", button_number); - jsonWrite(configJson, "buttonSet" + button_number, button_state); + jsonWriteStr(configJson, "buttonSet" + button_number, button_state); sendSTATUS("buttonSet" + button_number, button_state); } @@ -137,7 +137,7 @@ void buttonChange() { current_state = "1"; } order_loop += "buttonSet " + button_number + " " + current_state + ","; - jsonWrite(configJson, "buttonSet" + button_number, current_state); + jsonWriteStr(configJson, "buttonSet" + button_number, current_state); sendSTATUS("buttonSet" + button_number, current_state); } @@ -168,11 +168,11 @@ void pwm() { uint8_t pwm_pin_int = pwm_pin.toInt(); - jsonWrite(optionJson, "pwm_pin" + pwm_number, pwm_pin); + jsonWriteStr(optionJson, "pwm_pin" + pwm_number, pwm_pin); pinMode(pwm_pin_int, INPUT); analogWrite(pwm_pin_int, start_state.toInt()); //analogWriteFreq(32000); - jsonWrite(configJson, "pwmSet" + pwm_number, start_state); + jsonWriteStr(configJson, "pwmSet" + pwm_number, start_state); createWidget (widget_name, page_name, page_number, "widgets/widget.range.json", "pwmSet" + pwm_number); } @@ -188,7 +188,7 @@ void pwmSet() { eventGen ("pwmSet", pwm_number); - jsonWrite(configJson, "pwmSet" + pwm_number, pwm_state); + jsonWriteStr(configJson, "pwmSet" + pwm_number, pwm_state); sendSTATUS("pwmSet" + pwm_number, pwm_state); } //================================================================================================================== @@ -214,13 +214,13 @@ void handleButton() { eventGen ("switchSet", String(switch_number)); - jsonWrite(configJson, "switchSet" + String(switch_number), "1"); + jsonWriteStr(configJson, "switchSet" + String(switch_number), "1"); } if (buttons[switch_number].rose()) { eventGen ("switchSet", String(switch_number)); - jsonWrite(configJson, "switchSet" + String(switch_number), "0"); + jsonWriteStr(configJson, "switchSet" + String(switch_number), "0"); } } switch_number++; @@ -238,13 +238,13 @@ void inputDigit() { page_name.replace("#", " "); String start_state = sCmd.next(); String page_number = sCmd.next(); - jsonWrite(configJson, "digitSet" + number, start_state); + jsonWriteStr(configJson, "digitSet" + number, start_state); createWidget (widget_name, page_name, page_number, "widgets/widget.inputNum.json", "digitSet" + number); } void digitSet() { String number = sCmd.next(); String value = sCmd.next(); - jsonWrite(configJson, "digitSet" + number, value); + jsonWriteStr(configJson, "digitSet" + number, value); sendSTATUS("digitSet" + number, value); } //===================================================================================================================================== @@ -258,13 +258,13 @@ void inputTime() { page_name.replace("#", " "); String start_state = sCmd.next(); String page_number = sCmd.next(); - jsonWrite(configJson, "timeSet" + number, start_state); + jsonWriteStr(configJson, "timeSet" + number, start_state); createWidget (widget_name, page_name, page_number, "widgets/widget.inputTime.json", "timeSet" + number); } void timeSet() { String number = sCmd.next(); String value = sCmd.next(); - jsonWrite(configJson, "timeSet" + number, value); + jsonWriteStr(configJson, "timeSet" + number, value); sendSTATUS("timeSet" + number, value); } @@ -273,7 +273,7 @@ void handle_time_init() { String tmp = GetTime(); tmp.replace(":", "-"); - jsonWrite(configJson, "timenowSet", tmp); + jsonWriteStr(configJson, "timenowSet", tmp); eventGen ("timenowSet", ""); }, nullptr, true); @@ -306,7 +306,7 @@ void textSet() { text = text + " " + GetDataDigital() + " " + time; } - jsonWrite(configJson, "textSet" + number, text); + jsonWriteStr(configJson, "textSet" + number, text); sendSTATUS("textSet" + number, text); } @@ -319,7 +319,7 @@ void stepper() { String pin_step = sCmd.next(); String pin_dir = sCmd.next(); - jsonWrite(optionJson, "stepper" + stepper_number, pin_step + " " + pin_dir); + jsonWriteStr(optionJson, "stepper" + stepper_number, pin_step + " " + pin_dir); pinMode(pin_step.toInt(), OUTPUT); pinMode(pin_dir.toInt(), OUTPUT); } @@ -328,7 +328,7 @@ void stepper() { void stepperSet() { String stepper_number = sCmd.next(); String steps = sCmd.next(); - jsonWrite(optionJson, "steps" + stepper_number, steps); + jsonWriteStr(optionJson, "steps" + stepper_number, steps); String stepper_speed = sCmd.next(); String pin_step = selectToMarker (jsonRead(optionJson, "stepper" + stepper_number), " "); String pin_dir = deleteBeforeDelimiter (jsonRead(optionJson, "stepper" + stepper_number), " "); @@ -377,13 +377,13 @@ void stepperSet() { page_name.replace("#", " "); String start_state = sCmd.next(); String page_number = sCmd.next(); - jsonWrite(configJson, "inputTextSet" + number, start_state); + jsonWriteStr(configJson, "inputTextSet" + number, start_state); createWidget (widget_name, page_name, page_number, "widgets/widget.inputText.json", "inputTextSet" + number); } void inputTextSet() { String number = sCmd.next(); String value = sCmd.next(); - jsonWrite(configJson, "inputTextSet" + number, value); + jsonWriteStr(configJson, "inputTextSet" + number, value); sendSTATUS("inputTextSet" + number, value); } @@ -395,14 +395,14 @@ void stepperSet() { page_name.replace("#", " "); String start_state = sCmd.next(); String page_number = sCmd.next(); - jsonWrite(configJson, "inputTimeSet" + number, start_state); + jsonWriteStr(configJson, "inputTimeSet" + number, start_state); createWidget (widget_name, page_name, page_number, "widgets/widget.inputTime.json", "inputTimeSet" + number); } void inputTimeSet() { String number = sCmd.next(); String value = sCmd.next(); value.replace(":", "."); - jsonWrite(configJson, "inputTimeSet" + number, value); + jsonWriteStr(configJson, "inputTimeSet" + number, value); value.replace(".", ":"); sendSTATUS("inputTimeSet" + number, value); } @@ -416,13 +416,13 @@ void stepperSet() { page_name.replace("#", " "); String start_state = sCmd.next(); String page_number = sCmd.next(); - jsonWrite(configJson, "inputDateSet" + number, start_state); + jsonWriteStr(configJson, "inputDateSet" + number, start_state); createWidget (widget_name, page_name, page_number, "widgets/widget.inputDate.json", "inputDateSet" + number); } void inputDateSet() { String number = sCmd.next(); String value = sCmd.next(); - jsonWrite(configJson, "inputDateSet" + number, value); + jsonWriteStr(configJson, "inputDateSet" + number, value); sendSTATUS("inputDateSet" + number, value); } */ @@ -464,24 +464,6 @@ void handleCMD_loop() { } } -//=============================выполнение команд (через период) по очереди из строки order======================================= -/*void handleCMD_ticker() { - - ts.add(CMD, CMD_update_int, [&](void*) { - if (!busy) { - if (order_ticker != "") { - - String tmp = selectToMarker(order_ticker, ","); //выделяем из страки order первую команду pus title body - if (tmp != "no_command") sCmd.readStr(tmp); //выполняем первую команду - Serial.println("order_ticker => " + order_ticker); - order_ticker = deleteBeforeDelimiter(order_ticker, ","); //осекаем выполненную команду - } - } - }, nullptr, true); - }*/ - - - //======================================================================================================================================= //======================================================================================================================================= void txtExecution(String file) { @@ -497,6 +479,7 @@ void txtExecution(String file) { sCmd.readStr(tmp); command_all = deleteBeforeDelimiter(command_all, "\n"); } + command_all = ""; } void stringExecution(String str) { @@ -513,154 +496,3 @@ void stringExecution(String str) { str = deleteBeforeDelimiter(str, "\n"); } } - -//====================================================================================================================== -//===============================================Создание виджетов======================================================= - -void createWidget (String widget_name, String page_name, String page_number, String file, String topic) { - - String widget; - widget = readFile(file, 1024); - - if (widget == "Failed") return; - if (widget == "Large") return; - - widget_name.replace("#", " "); - page_name.replace("#", " "); - - jsonWrite(widget, "page", page_name); - jsonWrite(widget, "order", page_number); - jsonWrite(widget, "descr", widget_name); - jsonWrite(widget, "topic", prex + "/" + topic); - all_widgets += widget + "\r\n"; - widget = ""; -} - -void createChart (String widget_name, String page_name, String page_number, String file, String topic, String maxCount) { - - String widget; - widget = readFile(file, 1024); - - if (widget == "Failed") return; - if (widget == "Large") return; - - widget_name.replace("#", " "); - page_name.replace("#", " "); - - jsonWrite(widget, "page", page_name); - jsonWrite(widget, "order", page_number); - jsonWrite(widget, "descr", widget_name); - jsonWrite(widget, "series", widget_name); - jsonWrite(widget, "maxCount", maxCount); - jsonWrite(widget, "topic", prex + "/" + topic); - all_widgets += widget + "\r\n"; - widget = ""; -} - -/* - void createWidget (String widget_name, String page_name, String page_number, String file, String topic, String key, String value) { - - String widget; - widget = readFile(file, 1024); - - if (widget == "Failed") return; - if (widget == "Large") return; - - widget_name.replace("#", " "); - page_name.replace("#", " "); - - value.replace("#", " "); - - widget = vidgetConfigWrite(widget, key, value); - - jsonWrite(widget, "page", page_name); - jsonWrite(widget, "pageId", page_number); - jsonWrite(widget, "descr", widget_name); - jsonWrite(widget, "topic", prex + "/" + topic); - - all_widgets += widget + "\r\n"; - widget = ""; - } - - void createWidget (String widget_name, String page_name, String page_number, String file, String topic, String key, String value, String key2, String value2) { - - String widget; - widget = readFile(file, 1024); - - if (widget == "Failed") return; - if (widget == "Large") return; - - widget_name.replace("#", " "); - page_name.replace("#", " "); - - value.replace("#", " "); - - widget = vidgetConfigWrite(widget, key, value); - widget = vidgetConfigWrite(widget, key2, value2); - - jsonWrite(widget, "page", page_name); - jsonWrite(widget, "pageId", page_number); - jsonWrite(widget, "descr", widget_name); - jsonWrite(widget, "topic", prex + "/" + topic); - - all_widgets += widget + "\r\n"; - widget = ""; - } - -String vidgetConfigWrite(String widget, String key, String value) { - - if (widget == "") return ""; - if (widget == "{}") return ""; - int psn1 = widget.indexOf("{"); - if (psn1 != -1) { - psn1 = widget.indexOf("{", psn1 + 1); - if (psn1 != -1) { - int psn2 = widget.indexOf("}", psn1); - String WigetConfig = widget.substring(psn1, psn2) + "}"; - jsonWrite(WigetConfig, key, value); - String part1 = widget.substring(0, psn1); - widget = part1 + WigetConfig + "}"; - return widget; - - } - } -} -*/ - - - - - - - - - - - -//============разное - -/* - void delAlert() { - - String alert_id = sCmd.next(); - delwidget(alert_id); - sendAllWigets(); - } - - - void delwidget(String text_in_widget) { - String widget = all_widgets; - while (widget.length() != 0) { - String tmp = selectToMarkerPlus (widget, "\r\n", 2); - if (tmp.indexOf(text_in_widget) > 0) { - - all_widgets.replace(tmp, ""); - //Serial.println(all_widgets); - - widget = deleteBeforeDelimiter(widget, "\r\n"); - } else { - widget = deleteBeforeDelimiter(widget, "\r\n"); - } - } - } -*/ diff --git a/FS.ino b/FS.ino new file mode 100644 index 00000000..993c7dc8 --- /dev/null +++ b/FS.ino @@ -0,0 +1,38 @@ +void File_system_init() { + + Serial.begin(115200); + //Serial.setDebugOutput(true); + Serial.println("--------------started----------------"); + //-------------------------------------------------------------- + SPIFFS.begin(); + configSetup = readFile("config.json", 4096); + configSetup.replace(" ", ""); + configSetup.replace("\r\n", ""); + Serial.println(configSetup); + jsonWriteStr(configJson, "SSDP", jsonRead(configSetup, "SSDP")); + jsonWriteStr(configJson, "lang", jsonRead(configSetup, "lang")); + + +#ifdef ESP32 + uint32_t chipID_u = ESP.getEfuseMac(); + chipID = String(chipID_u); + jsonWriteStr(configSetup, "chipID", chipID); +#endif + +#ifdef ESP8266 + chipID = String( ESP.getChipId() ) + "-" + String(ESP.getFlashChipId()); + jsonWriteStr(configSetup, "chipID", chipID); + Serial.setDebugOutput(0); +#endif + + jsonWriteStr(configSetup, "firmware_version", firmware_version); + + prex = jsonRead(configSetup, "mqttPrefix") + "/" + chipID; + Serial.println(chipID); + +} + +void get_esp_info() { + + +} diff --git a/Init.ino b/Init.ino index bb36f33c..423a711e 100644 --- a/Init.ino +++ b/Init.ino @@ -7,7 +7,7 @@ void All_init() { server.on("/scenario", HTTP_GET, [](AsyncWebServerRequest * request) { if (request->hasArg("status")) { - jsonWrite(configSetup, "scenario", request->getParam("status")->value()); + jsonWriteStr(configSetup, "scenario", request->getParam("status")->value()); } saveConfig(); Scenario_init(); @@ -15,11 +15,9 @@ void All_init() { }); server.on("/cleanlog", HTTP_GET, [](AsyncWebServerRequest * request) { - SPIFFS.remove("/log.analog.txt"); - SPIFFS.remove("/log.dallas.txt"); - SPIFFS.remove("/log.level.txt"); - SPIFFS.remove("/log.ph.txt"); - SPIFFS.remove("/log.txt"); + + clean_log_date(); + request->send(200, "text/text", "OK"); // отправляем ответ о выполнении }); @@ -43,7 +41,12 @@ void Device_init() { ts.remove(STEPPER1); ts.remove(STEPPER2); + #ifdef layout_in_rom all_widgets = ""; + #else + SPIFFS.remove("/layout.txt"); + #endif + txtExecution("firmware.config.txt"); //outcoming_date(); } @@ -219,19 +222,19 @@ void up_time() { if (ss != 0) { out = "[i] uptime = " + String(ss) + " sec"; - jsonWrite(configJson, "uptime", String(ss) + " sec"); + jsonWriteStr(configJson, "uptime", String(ss) + " sec"); } if (mm != 0) { out = "[i] uptime = " + String(mm) + " min"; - jsonWrite(configJson, "uptime", String(mm) + " min"); + jsonWriteStr(configJson, "uptime", String(mm) + " min"); } if (hh != 0) { out = "[i] uptime = " + String(hh) + " hours"; - jsonWrite(configJson, "uptime", String(hh) + " hours"); + jsonWriteStr(configJson, "uptime", String(hh) + " hours"); } if (dd != 0) { out = "[i] uptime = " + String(dd) + " days"; - jsonWrite(configJson, "uptime", String(dd) + " days"); + jsonWriteStr(configJson, "uptime", String(dd) + " days"); } Serial.println(out + ", mqtt_lost_error: " + String(mqtt_lost_error) + ", wifi_lost_error: " + String(wifi_lost_error)); } @@ -245,29 +248,31 @@ void statistics_init() { } void statistics() { - String urls = "http://backup.privet.lv/visitors/?"; - //----------------------------------------------------------------- - urls += WiFi.macAddress().c_str(); - urls += "&"; - //----------------------------------------------------------------- + if (WiFi.status() == WL_CONNECTED) { + String urls = "http://backup.privet.lv/visitors/?"; + //----------------------------------------------------------------- + urls += WiFi.macAddress().c_str(); + urls += "&"; + //----------------------------------------------------------------- #ifdef ESP8266 - urls += "iot-manager_esp8266"; + urls += "iot-manager_esp8266"; #endif #ifdef ESP32 - urls += "iot-manager_esp32"; + urls += "iot-manager_esp32"; #endif - urls += "&"; - //----------------------------------------------------------------- + urls += "&"; + //----------------------------------------------------------------- #ifdef ESP8266 - urls += ESP.getResetReason(); + urls += ESP.getResetReason(); #endif #ifdef ESP32 - urls += "Unknown"; + urls += "Unknown"; #endif - urls += "&"; - //----------------------------------------------------------------- - urls += "firm version: " + firmware_version + " " + DATE_COMPILING + " " + TIME_COMPILING; - //----------------------------------------------------------------- - String stat = getURL(urls); - //Serial.println(stat); + urls += "&"; + //----------------------------------------------------------------- + urls += "firm version: " + firmware_version + " " + DATE_COMPILING + " " + TIME_COMPILING; + //----------------------------------------------------------------- + String stat = getURL(urls); + //Serial.println(stat); + } } diff --git a/Logging.ino b/Logging.ino new file mode 100644 index 00000000..423062bb --- /dev/null +++ b/Logging.ino @@ -0,0 +1,145 @@ +//===============================================Логирование============================================================ +void logging() { + + static boolean flag = true; + + String sensor_name = sCmd.next(); + String period_min = sCmd.next(); + String maxCount = sCmd.next(); + + String widget_name = sCmd.next(); + widget_name.replace("#", " "); + String page_name = sCmd.next(); + String page_number = sCmd.next(); + + 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); + if (sensor_name == "dhtT") jsonWriteStr(optionJson, "dhtT_logging_count", maxCount); + if (sensor_name == "dhtH") jsonWriteStr(optionJson, "dhtH_logging_count", maxCount); + + if (sensor_name == "analog") createChart (widget_name, page_name, page_number, "widgets/widget.chart.json", "loganalog", maxCount); + if (sensor_name == "level") createChart (widget_name, page_name, page_number, "widgets/widget.chart.json", "loglevel", maxCount); + if (sensor_name == "dallas") createChart (widget_name, page_name, page_number, "widgets/widget.chart.json", "logdallas", maxCount); + if (sensor_name == "dhtT") createChart (widget_name, page_name, page_number, "widgets/widget.chart.json", "logdhtT", maxCount); + if (sensor_name == "dhtH") createChart (widget_name, page_name, page_number, "widgets/widget.chart.json", "logdhtH", maxCount); + + if (sensor_name == "analog") { + flagLoggingAnalog = true; + ts.remove(ANALOG_LOG); + ts.add(ANALOG_LOG, period_min.toInt() * 1000 * 60, [&](void*) { + deleteOldDate("log.analog.txt", jsonReadtoInt(optionJson, "analog_logging_count"), jsonRead(configJson, "analog")); + }, nullptr, true); + } + + if (sensor_name == "level") { + flagLoggingLevel = true; + ts.remove(LEVEL_LOG); + ts.add(LEVEL_LOG, period_min.toInt() * 1000 * 60, [&](void*) { + deleteOldDate("log.level.txt", jsonReadtoInt(optionJson, "level_logging_count"), jsonRead(configJson, "level")); + }, nullptr, true); + } + + if (sensor_name == "dallas") { + flagLoggingDallas = true; + ts.remove(DALLAS_LOG); + ts.add(DALLAS_LOG, period_min.toInt() * 1000 * 60, [&](void*) { + deleteOldDate("log.dallas.txt", jsonReadtoInt(optionJson, "dallas_logging_count"), jsonRead(configJson, "dallas")); + }, nullptr, true); + } + + if (sensor_name == "dhtT") { + flagLoggingdhtT = true; + ts.remove(dhtT_LOG); + ts.add(dhtT_LOG, period_min.toInt() * 1000 * 60, [&](void*) { + deleteOldDate("log.dhtT.txt", jsonReadtoInt(optionJson, "dhtT_logging_count"), jsonRead(configJson, "dhtT")); + }, nullptr, true); + } + + if (sensor_name == "dhtH") { + flagLoggingdhtH = true; + ts.remove(dhtH_LOG); + ts.add(dhtH_LOG, period_min.toInt() * 1000 * 60, [&](void*) { + deleteOldDate("log.dhtH.txt", jsonReadtoInt(optionJson, "dhtH_logging_count"), jsonRead(configJson, "dhtH")); + }, nullptr, true); + } +} + +//=========================================Удаление стрых данных и запись новых================================================================== +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"); + Serial.println("=====> [i] in log file " + file + " " + current_number_of_lines + " lines"); + + if (current_number_of_lines > seted_number_of_lines + 1) { + SPIFFS.remove("/" + file); + current_number_of_lines = 0; + } + if (current_number_of_lines == 0) { + SPIFFS.remove("/" + file); + current_number_of_lines = 0; + } + if (current_number_of_lines > seted_number_of_lines) { + log_date = deleteBeforeDelimiter(log_date, "\n"); + if (GetTimeUnix() != "failed") { + log_date += GetTimeUnix() + " " + date_to_add + "\n"; + writeFile(file, log_date); + } + } else { + if (GetTimeUnix() != "failed") { + addFile(file, GetTimeUnix() + " " + date_to_add); + } + } + log_date = ""; +} + +//=========================================Выбор какие данные отправлять================================================================== +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"); +} + +//=========================================Отправка данных=================================================================================== +void sendLogData(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 + ","; + } + 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"); +} + +//=========================================Очистка данных=================================================================================== +void clean_log_date() { + SPIFFS.remove("/log.analog.txt"); + SPIFFS.remove("/log.level.txt"); + SPIFFS.remove("/log.dallas.txt"); + SPIFFS.remove("/log.dhtT.txt"); + SPIFFS.remove("/log.dhtH.txt"); +} diff --git a/SSDP.ino b/SSDP.ino index 2ee42981..2638e15a 100644 --- a/SSDP.ino +++ b/SSDP.ino @@ -1,11 +1,20 @@ -/* void SSDP_init() { + server.on("/ssdp", HTTP_GET, [](AsyncWebServerRequest * request) { + if (request->hasArg("ssdp")) { + jsonWriteStr(configSetup, "SSDP", request->getParam("ssdp")->value()); + jsonWriteStr(configJson, "SSDP", request->getParam("ssdp")->value()); + } + saveConfig(); + request->send(200, "text/text", "OK"); + }); +} +/* // --------------------Получаем ssdp со страницы server.on("/ssdp", HTTP_GET, [](AsyncWebServerRequest * request) { if (request->hasArg("ssdp")) { - jsonWrite(configSetup, "SSDP", request->getParam("ssdp")->value()); - jsonWrite(configJson, "SSDP", request->getParam("ssdp")->value()); + jsonWriteStr(configSetup, "SSDP", request->getParam("ssdp")->value()); + jsonWriteStr(configJson, "SSDP", request->getParam("ssdp")->value()); SSDP.setName(jsonRead(configSetup, "SSDP")); } saveConfig(); @@ -13,7 +22,7 @@ void SSDP_init() { }); // SSDP дескриптор - server.on("/description.xml", [](AsyncWebServerRequest * request) { + server.on("/description.xml", [](AsyncWebServerRequest * request) { //SSDP.schema(http.client()); request->send(200, "text/text", "OK"); }); @@ -36,5 +45,5 @@ void SSDP_init() { SSDP.setManufacturerURL("https://www.instagram.com/rriissee3"); SSDP.begin(); } -} + } */ diff --git a/Scenario.ino b/Scenario.ino index d4c17a98..67b422f4 100644 --- a/Scenario.ino +++ b/Scenario.ino @@ -69,7 +69,7 @@ void handleScenario() { } String tmp2 = jsonRead(optionJson, "scenario_status"); //читаем файл событий tmp2 = deleteBeforeDelimiter(tmp2, ","); //удаляем выполненное событие - jsonWrite(optionJson, "scenario_status", tmp2); //записываем обновленный файл событий + jsonWriteStr(optionJson, "scenario_status", tmp2); //записываем обновленный файл событий i = 0; } } @@ -80,7 +80,7 @@ void eventGen (String event_name, String number) { //событие выгля if (jsonRead(configSetup, "scenario") == "1") { String tmp = jsonRead(optionJson, "scenario_status") ; //генерирование события //Serial.println(event_name); - jsonWrite(optionJson, "scenario_status", tmp + event_name + number + ","); + jsonWriteStr(optionJson, "scenario_status", tmp + event_name + number + ","); } } diff --git a/Sensors.ino b/Sensors.ino index 3c1986f0..a1da758c 100644 --- a/Sensors.ino +++ b/Sensors.ino @@ -10,10 +10,10 @@ void analog() { String analog_start_out = sCmd.next(); String analog_end_out = sCmd.next(); String page_number = sCmd.next(); - jsonWrite(optionJson, "analog_start", analog_start); - jsonWrite(optionJson, "analog_end", analog_end); - jsonWrite(optionJson, "analog_start_out", analog_start_out); - jsonWrite(optionJson, "analog_end_out", analog_end_out); + jsonWriteStr(optionJson, "analog_start", analog_start); + jsonWriteStr(optionJson, "analog_end", analog_end); + jsonWriteStr(optionJson, "analog_start_out", analog_start_out); + jsonWriteStr(optionJson, "analog_end_out", analog_end_out); choose_widget_and_create(widget_name, page_name, page_number, type, "analog"); ts.add(ANALOG_, analog_update_int, [&](void*) { static int analog_old; @@ -24,13 +24,13 @@ void analog() { #ifdef ESP8266 int analog_in = analogRead(A0); #endif - jsonWrite(configJson, "analog_in", analog_in); + jsonWriteInt(configJson, "analog_in", analog_in); int analog = map(analog_in, jsonReadtoInt(optionJson, "analog_start") , jsonReadtoInt(optionJson, "analog_end"), jsonReadtoInt(optionJson, "analog_start_out"), jsonReadtoInt(optionJson, "analog_end_out")); - jsonWrite(configJson, "analog", analog); + jsonWriteInt(configJson, "analog", analog); // if (analog_old != analog) { eventGen ("analog", ""); sendSTATUS("analog", String(analog)); @@ -51,8 +51,8 @@ void level() { String empty_level = sCmd.next(); String full_level = sCmd.next(); String page_number = sCmd.next(); - jsonWrite(optionJson, "empty_level", empty_level); - jsonWrite(optionJson, "full_level", full_level); + jsonWriteStr(optionJson, "empty_level", empty_level); + jsonWriteStr(optionJson, "full_level", full_level); pinMode(14, OUTPUT); pinMode(12, INPUT); choose_widget_and_create(widget_name, page_name, page_number, type, "level"); @@ -73,11 +73,11 @@ void level() { counter++; if (counter > tank_level_times_to_send) { counter = 0; - jsonWrite(configJson, "level_in", distance_cm); + jsonWriteInt(configJson, "level_in", distance_cm); level = map(distance_cm, jsonReadtoInt(optionJson, "empty_level"), jsonReadtoInt(optionJson, "full_level"), 0, 100); - jsonWrite(configJson, "level", level); + jsonWriteInt(configJson, "level", level); //if (level_old != level) { eventGen ("level", ""); sendSTATUS("level", String(level)); @@ -108,7 +108,7 @@ void dallas() { static float temp_old; sensors.requestTemperatures(); temp = sensors.getTempCByIndex(0); - jsonWrite(configJson, "dallas", String(temp)); + jsonWriteStr(configJson, "dallas", String(temp)); //if (temp_old != temp) { eventGen ("dallas", ""); sendSTATUS("dallas", String(temp)); @@ -147,14 +147,16 @@ void dhtT() { } else { counter = 0; value = dht.getTemperature(); - jsonWrite(configJson, "dhtT", String(value)); //if (value_old != value) { - eventGen ("dhtT", ""); - sendSTATUS("dhtT", String(value)); - if (client.connected()) { - Serial.println("[i] sensor 'dhtT' send date " + String(value)); + if (String(value) != "nan") { + eventGen ("dhtT", ""); + jsonWriteStr(configJson, "dhtT", String(value)); + sendSTATUS("dhtT", String(value)); + if (client.connected()) { + Serial.println("[i] sensor 'dhtT' send date " + String(value)); + } + //} } - //} value_old = value; } }, nullptr, true); @@ -185,14 +187,16 @@ void dhtH() { } else { counter = 0; value = dht.getHumidity(); - jsonWrite(configJson, "dhtH", String(value)); - //if (value_old != value) { - eventGen ("dhtH", ""); - sendSTATUS("dhtH", String(value)); - if (client.connected()) { - Serial.println("[i] sensor 'dhtH' send date " + String(value)); + if (String(value) != "nan") { + //if (value_old != value) { + eventGen ("dhtH", ""); + jsonWriteStr(configJson, "dhtH", String(value)); + sendSTATUS("dhtH", String(value)); + if (client.connected()) { + Serial.println("[i] sensor 'dhtH' send date " + String(value)); + } + //} } - //} value_old = value; } }, nullptr, true); @@ -210,7 +214,7 @@ void dhtPerception() { } else { value = dht.computePerception(jsonRead(configJson, "dhtT").toFloat(), jsonRead(configJson, "dhtH").toFloat(), false); String final_line = perception(value); - jsonWrite(configJson, "dhtPerception", final_line); + jsonWriteStr(configJson, "dhtPerception", final_line); eventGen ("dhtPerception", ""); sendSTATUS("dhtPerception", final_line); if (client.connected()) { @@ -277,7 +281,7 @@ void dhtComfort() { break; }; String final_line = comfortStatus; - jsonWrite(configJson, "dhtComfort", final_line); + jsonWriteStr(configJson, "dhtComfort", final_line); eventGen ("dhtComfort", ""); sendSTATUS("dhtComfort", final_line); if (client.connected()) { @@ -298,7 +302,7 @@ void dhtDewpoint() { sendSTATUS("dhtDewpoint", String(dht.getStatusString())); } else { value = dht.computeDewPoint(jsonRead(configJson, "dhtT").toFloat(), jsonRead(configJson, "dhtH").toFloat(), false); - jsonWrite(configJson, "dhtDewpoint", value); + jsonWriteInt(configJson, "dhtDewpoint", value); eventGen ("dhtDewpoint", ""); sendSTATUS("dhtDewpoint", String(value)); if (client.connected()) { @@ -317,80 +321,3 @@ void choose_widget_and_create(String widget_name, String page_name, String page_ if (type == "fill-gauge") createWidget (widget_name, page_name, page_number, "widgets/widget.fillGauge.json", topik); } -//====================================================================================================================== -//===============================================Логирование============================================================ - -void logging() { - - static boolean flag = true; - - String sensor_name = sCmd.next(); - String period_min = sCmd.next(); - String maxCount = sCmd.next(); - String widget_name = sCmd.next(); - widget_name.replace("#", " "); - String page_name = sCmd.next(); - String page_number = sCmd.next(); - - if (sensor_name == "analog") jsonWrite(optionJson, "analog_logging_count", maxCount); - if (sensor_name == "level") jsonWrite(optionJson, "level_logging_count", maxCount); - if (sensor_name == "dallas") jsonWrite(optionJson, "dallas_logging_count", maxCount); - - if (sensor_name == "analog") createChart (widget_name, page_name, page_number, "widgets/widget.chart.json", "loganalog", maxCount); - if (sensor_name == "level") createChart (widget_name, page_name, page_number, "widgets/widget.chart.json", "loglevel", maxCount); - if (sensor_name == "dallas") createChart (widget_name, page_name, page_number, "widgets/widget.chart.json", "logdallas", maxCount); - - if (sensor_name == "analog") { - flagLoggingAnalog = true; - ts.remove(ANALOG_LOG); - ts.add(ANALOG_LOG, period_min.toInt() * 1000 * 60, [&](void*) { - deleteOldDate("log.analog.txt", jsonReadtoInt(optionJson, "analog_logging_count"), jsonRead(configJson, "analog")); - }, nullptr, true); - } - - if (sensor_name == "level") { - flagLoggingLevel = true; - ts.remove(LEVEL_LOG); - ts.add(LEVEL_LOG, period_min.toInt() * 1000 * 60, [&](void*) { - deleteOldDate("log.level.txt", jsonReadtoInt(optionJson, "level_logging_count"), jsonRead(configJson, "level")); - }, nullptr, true); - } - - if (sensor_name == "dallas") { - flagLoggingDallas = true; - ts.remove(DALLAS_LOG); - ts.add(DALLAS_LOG, period_min.toInt() * 1000 * 60, [&](void*) { - deleteOldDate("log.dallas.txt", jsonReadtoInt(optionJson, "dallas_logging_count"), jsonRead(configJson, "dallas")); - }, nullptr, true); - } -} - -void deleteOldDate(String file, int seted_number_of_lines, String date_to_add) { - - String log_date = readFile(file, 5000); - - //getMemoryLoad("[i] after logging procedure"); - //предел количества строк 255 - - log_date.replace("\r\n", "\n"); - log_date.replace("\r", "\n"); - - int current_number_of_lines = count(log_date, "\n"); - Serial.println("[i] in log file " + file + " " + current_number_of_lines + " lines"); - - if (current_number_of_lines > seted_number_of_lines + 1) { - SPIFFS.remove("/" + file); - current_number_of_lines = 0; - } - if (current_number_of_lines == 0) { - SPIFFS.remove("/" + file); - current_number_of_lines = 0; - } - if (current_number_of_lines > seted_number_of_lines) { - log_date = deleteBeforeDelimiter(log_date, "\n"); - log_date += String(GetTimeUnix()) + " " + date_to_add + "\n"; - writeFile(file, log_date); - } else { - addFile(file, String(GetTimeUnix()) + " " + date_to_add); - } -} diff --git a/Time.ino b/Time.ino index 792ade44..28880429 100644 --- a/Time.ino +++ b/Time.ino @@ -1,23 +1,26 @@ void Time_Init() { server.on("/timeZone", HTTP_GET, [](AsyncWebServerRequest * request) { if (request->hasArg("timezone")) { - jsonWrite(configSetup, "timezone", request->getParam("timezone")->value()); + jsonWriteStr(configSetup, "timezone", request->getParam("timezone")->value()); } saveConfig(); reconfigTime(); request->send(200, "text/text", "OK"); // отправляем ответ о выполнении }); - reconfigTime(); + + ts.add(TIME_SYNC, 30000, [&](void*) { + if (GetTimeUnix() == "failed") { + Serial.println("[i] Time is not synchronized, start synchronization"); + reconfigTime(); + } + }, nullptr, true); } void reconfigTime() { if (WiFi.status() == WL_CONNECTED) { - - configTime(jsonRead(configSetup, "timezone").toInt() * 3600, 0, ntpServer); - + configTime(0, 0, ntpServer); int i = 0; Serial.println("[i] Awaiting for time "); - #ifdef ESP32 struct tm timeinfo; while (!getLocalTime(&timeinfo) && i <= 4) { @@ -26,7 +29,6 @@ void reconfigTime() { delay(1000); } #endif - #ifdef ESP8266 // while (!time(nullptr) && i < 4) { // Serial.print("."); @@ -34,26 +36,33 @@ void reconfigTime() { delay(2000); // } #endif - - Serial.print("[i] Time = "); - Serial.print(GetDataDigital()); - Serial.print(" "); - Serial.println(GetTime()); - - - + if (GetTimeUnix() != "failed") { + Serial.print("[V] Time synchronized = "); + Serial.print(GetDataDigital()); + Serial.print(" "); + Serial.println(GetTime()); + } else { + Serial.println("[E] Time server or internet connection error, will try again in 30 sec"); + } } else { Serial.println("[E] Get time impossible, no wifi connection"); } } -//Получаем время в формате linux -int GetTimeUnix() { + +//Получаем время в формате linux gmt +String GetTimeUnix() { time_t now = time(nullptr); - return (now); + if (now < 30000) { + return "failed"; + } else { + return String(now); + } } // Получение текущего времени String GetTime() { time_t now = time(nullptr); // получаем время с помощью библиотеки time.h + int zone = 3600 * jsonRead(configSetup, "timezone").toInt(); + now = now + zone; String Time = ""; // Строка для результатов времени Time += ctime(&now); // Преобразуем время в строку формата Thu Jan 19 00:55:35 2017 int i = Time.indexOf(":"); //Ишем позицию первого символа : @@ -63,6 +72,8 @@ String GetTime() { String GetTimeWOsec() { time_t now = time(nullptr); // получаем время с помощью библиотеки time.h + int zone = 3600 * jsonRead(configSetup, "timezone").toInt(); + now = now + zone; String Time = ""; // Строка для результатов времени Time += ctime(&now); // Преобразуем время в строку формата Thu Jan 19 00:55:35 2017 int i = Time.indexOf(":"); //Ишем позицию первого символа : @@ -73,6 +84,8 @@ String GetTimeWOsec() { // Получение даты String GetDate() { time_t now = time(nullptr); // получаем время с помощью библиотеки time.h + int zone = 3600 * jsonRead(configSetup, "timezone").toInt(); + now = now + zone; String Data = ""; // Строка для результатов времени Data += ctime(&now); // Преобразуем время в строку формата Thu Jan 19 00:55:35 2017 Data.replace("\n", ""); diff --git a/Timers.ino b/Timers.ino index e6bfa22c..ea86117c 100644 --- a/Timers.ino +++ b/Timers.ino @@ -25,7 +25,7 @@ void Timer_countdown_init() { delTimer (String (number)); - jsonWrite(configJson, "timerSet" + String(number), "0"); + jsonWriteStr(configJson, "timerSet" + String(number), "0"); eventGen ("timerSet", String(number)); @@ -58,7 +58,7 @@ void timerStart() { if (type == "hours") period_of_time = String(period_of_time.toInt() * 60 * 60); addTimer(number, period_of_time); - jsonWrite(configJson, "timerSet" + number, "1"); + jsonWriteStr(configJson, "timerSet" + number, "1"); } void addTimer(String number, String time) { @@ -78,7 +78,7 @@ void addTimer(String number, String time) { } else { //если его нет tmp += new_timer + ","; } - jsonWrite(optionJson, "timers", tmp); + jsonWriteStr(optionJson, "timers", tmp); //Serial.println("ura"); } @@ -98,7 +98,7 @@ void delTimer (String number) { int psn2 = tmp.indexOf(",", psn1); //4 от этой позиции находим позицию запятой String timer = tmp.substring(psn1, psn2) + ","; //1:60, выделяем таймер который надо удалить tmp.replace(timer, ""); //удаляем таймер - jsonWrite(optionJson, "timers", tmp); + jsonWriteStr(optionJson, "timers", tmp); } } @@ -157,9 +157,9 @@ void time() { } - jsonWrite(optionJson, "times", replace_line); + jsonWriteStr(optionJson, "times", replace_line); - jsonWrite(configJson, "timeSet" + time_number, "1"); + jsonWriteStr(configJson, "timeSet" + time_number, "1"); ts.add(TIMERS, 1000, [&](void*) { @@ -177,7 +177,7 @@ void time() { Serial.println(seted_time); if (current_time == seted_time) { - jsonWrite(configJson, "timeSet" + time_number, "0"); + jsonWriteStr(configJson, "timeSet" + time_number, "0"); eventGen ("timeSet", time_number); } diff --git a/Upgrade.ino b/Upgrade.ino index c366966e..f8b19d1b 100644 --- a/Upgrade.ino +++ b/Upgrade.ino @@ -1,39 +1,55 @@ void initUpgrade() { + +#ifdef ESP8266 + if (WiFi.status() == WL_CONNECTED) last_version = getURL("http://91.204.228.124:1100/update/esp8266/version.txt"); +#endif +#ifdef ESP32 + if (WiFi.status() == WL_CONNECTED) last_version = getURL("http://91.204.228.124:1100/update/esp32/version.txt"); +#endif + jsonWriteStr(configSetup, "last_version", last_version); + Serial.print("[i] Last firmware version: "); + Serial.println(last_version); + server.on("/upgrade", HTTP_GET, [](AsyncWebServerRequest * request) { start_check_version = true; Serial.print("[i] Last firmware version: "); Serial.println(last_version); - +#ifdef ESP8266 + int ChipRealSize = ESP.getFlashChipRealSize() / 1048576; +#endif +#ifdef ESP32 + int ChipRealSize = 4; +#endif String tmp = "{}"; if (WiFi.status() == WL_CONNECTED) { - if (!flash_1mb) { + if (ChipRealSize >= 4) { if (last_version != "") { if (last_version != "error") { if (last_version == firmware_version) { - jsonWrite(tmp, "title", "Последняя версия прошивки уже установлена."); - jsonWrite(tmp, "class", "pop-up"); + jsonWriteStr(tmp, "title", "Последняя версия прошивки уже установлена."); + jsonWriteStr(tmp, "class", "pop-up"); } else { upgrade_flag = true; - jsonWrite(tmp, "title", "Идет обновление прошивки... После завершения устройство перезагрузится. Подождите одну минуту!!!"); - jsonWrite(tmp, "class", "pop-up"); + jsonWriteStr(tmp, "title", "Идет обновление прошивки... После завершения устройство перезагрузится. Подождите одну минуту!!!"); + jsonWriteStr(tmp, "class", "pop-up"); } } else { - jsonWrite(tmp, "title", "Ошибка... Cервер не найден. Попробуйте позже..."); - jsonWrite(tmp, "class", "pop-up"); + jsonWriteStr(tmp, "title", "Ошибка... Cервер не найден. Попробуйте позже..."); + jsonWriteStr(tmp, "class", "pop-up"); } } else { - jsonWrite(tmp, "title", "Нажмите на кнопку \"обновить прошивку\" повторно..."); - jsonWrite(tmp, "class", "pop-up"); + jsonWriteStr(tmp, "title", "Нажмите на кнопку \"обновить прошивку\" повторно..."); + jsonWriteStr(tmp, "class", "pop-up"); } } else { - jsonWrite(tmp, "title", "Обновление по воздуху не поддерживается, модуль имеет меньше 4 мб памяти..."); - jsonWrite(tmp, "class", "pop-up"); + jsonWriteStr(tmp, "title", "Обновление по воздуху не поддерживается, модуль имеет меньше 4 мб памяти..."); + jsonWriteStr(tmp, "class", "pop-up"); } } else { - jsonWrite(tmp, "title", "Модуль не подключен к роутеру..."); - jsonWrite(tmp, "class", "pop-up"); + jsonWriteStr(tmp, "title", "Устройство не подключен к роутеру..."); + jsonWriteStr(tmp, "class", "pop-up"); } request->send(200, "text/text", tmp); }); @@ -44,9 +60,11 @@ void handle_get_url() { start_check_version = false; #ifdef ESP32 last_version = getURL("http://91.204.228.124:1100/update/esp32/version.txt"); + jsonWriteStr(configSetup, "last_version", last_version); #endif #ifdef ESP8266 last_version = getURL("http://91.204.228.124:1100/update/esp8266/version.txt"); + jsonWriteStr(configSetup, "last_version", last_version); #endif } } @@ -232,24 +250,24 @@ void handle_upgrade() { case HTTP_UPDATE_FAILED: Serial.println(mode + "_FAILED"); var = "{}"; - jsonWrite(var, "title", "_FAILED"); - jsonWrite(var, "class", "pop-up"); + jsonWriteStr(var, "title", "_FAILED"); + jsonWriteStr(var, "class", "pop-up"); //request->send(200, "text/text", var); break; case HTTP_UPDATE_NO_UPDATES: Serial.println(mode + "_NO_UPDATES"); var = "{}"; - jsonWrite(var, "title", "_NO_UPDATES"); - jsonWrite(var, "class", "pop-up"); + jsonWriteStr(var, "title", "_NO_UPDATES"); + jsonWriteStr(var, "class", "pop-up"); //request->send(200, "text/text", var); break; case HTTP_UPDATE_OK: Serial.println(mode + "_UPDATE_OK"); var = "{}"; - jsonWrite(var, "title", "_UPDATE_OK"); - jsonWrite(var, "class", "pop-up"); + jsonWriteStr(var, "title", "_UPDATE_OK"); + jsonWriteStr(var, "class", "pop-up"); //request->send(200, "text/text", var); break; } diff --git a/WiFi.ino b/WiFi.ino index 086834d1..20f9f44c 100644 --- a/WiFi.ino +++ b/WiFi.ino @@ -3,10 +3,10 @@ void WIFI_init() { // --------------------Получаем ssid password со страницы server.on("/ssid", HTTP_GET, [](AsyncWebServerRequest * request) { if (request->hasArg("ssid")) { - jsonWrite(configSetup, "ssid", request->getParam("ssid")->value()); + jsonWriteStr(configSetup, "ssid", request->getParam("ssid")->value()); } if (request->hasArg("password")) { - jsonWrite(configSetup, "password", request->getParam("password")->value()); + jsonWriteStr(configSetup, "password", request->getParam("password")->value()); } saveConfig(); // Функция сохранения данных во Flash request->send(200, "text/text", "OK"); // отправляем ответ о выполнении @@ -14,10 +14,10 @@ void WIFI_init() { // --------------------Получаем ssidAP passwordAP со страницы server.on("/ssidap", HTTP_GET, [](AsyncWebServerRequest * request) { if (request->hasArg("ssidAP")) { - jsonWrite(configSetup, "ssidAP", request->getParam("ssidAP")->value()); + jsonWriteStr(configSetup, "ssidAP", request->getParam("ssidAP")->value()); } if (request->hasArg("passwordAP")) { - jsonWrite(configSetup, "passwordAP", request->getParam("passwordAP")->value()); + jsonWriteStr(configSetup, "passwordAP", request->getParam("passwordAP")->value()); } saveConfig(); // Функция сохранения данных во Flash request->send(200, "text/text", "OK"); // отправляем ответ о выполнении @@ -26,10 +26,10 @@ void WIFI_init() { // --------------------Получаем логин и пароль для web со страницы server.on("/web", HTTP_GET, [](AsyncWebServerRequest * request) { if (request->hasArg("web_login")) { - jsonWrite(configSetup, "web_login", request->getParam("web_login")->value()); + jsonWriteStr(configSetup, "web_login", request->getParam("web_login")->value()); } if (request->hasArg("web_pass")) { - jsonWrite(configSetup, "web_pass", request->getParam("web_pass")->value()); + jsonWriteStr(configSetup, "web_pass", request->getParam("web_pass")->value()); } saveConfig(); // Функция сохранения данных во Flash //Web_server_init(); @@ -69,7 +69,7 @@ void WIFI_init() { if (WiFi.status() == WL_CONNECT_FAILED) { Serial.println("[E] password is not correct"); tries = 1; - jsonWrite(optionJson, "pass_status", 1); + jsonWriteInt(optionJson, "pass_status", 1); } Serial.print("."); delay(1000); @@ -88,10 +88,10 @@ void WIFI_init() { // о подключении и выводим адрес IP Serial.println(""); Serial.println("[V] WiFi connected"); - Serial.print("[V] IP address: "); + Serial.print("[V] IP address: http://"); Serial.print(WiFi.localIP()); Serial.println(""); - jsonWrite(configJson, "ip", WiFi.localIP().toString()); + jsonWriteStr(configJson, "ip", WiFi.localIP().toString()); } } @@ -108,7 +108,7 @@ bool StartAPMode() { IPAddress myIP = WiFi.softAPIP(); Serial.print("AP IP address: "); Serial.println(myIP); - jsonWrite(configJson, "ip", myIP.toString()); + jsonWriteStr(configJson, "ip", myIP.toString()); if (jsonReadtoInt(optionJson, "pass_status") != 1) { ts.add(ROUTER_SEARCHING, 10 * 1000, [&](void*) { @@ -178,7 +178,7 @@ String scanWIFI() { int8_t dbm = WiFi.RSSI(i); data["dbm"] = dbm; if (ssidMy == jsonRead(configSetup, "ssid")) { - jsonWrite(configJson, "dbm", dbm); + jsonWriteStr(configJson, "dbm", dbm); } } String root; diff --git a/Widgets.ino b/Widgets.ino new file mode 100644 index 00000000..a1aedfa7 --- /dev/null +++ b/Widgets.ino @@ -0,0 +1,49 @@ +//====================================================================================================================== +//===============================================Создание виджетов======================================================= +void createWidget (String widget_name, String page_name, String page_number, String file, String topic) { + + String widget; + widget = readFile(file, 1024); + + if (widget == "Failed") return; + if (widget == "Large") return; + + widget_name.replace("#", " "); + page_name.replace("#", " "); + + jsonWriteStr(widget, "page", page_name); + jsonWriteStr(widget, "order", page_number); + jsonWriteStr(widget, "descr", widget_name); + jsonWriteStr(widget, "topic", prex + "/" + topic); + #ifdef layout_in_rom + all_widgets += widget + "\r\n"; + #else + addFile("layout.txt", widget); + #endif + widget = ""; +} + +void createChart (String widget_name, String page_name, String page_number, String file, String topic, String maxCount) { + + String widget; + widget = readFile(file, 1024); + + if (widget == "Failed") return; + if (widget == "Large") return; + + widget_name.replace("#", " "); + page_name.replace("#", " "); + + jsonWriteStr(widget, "page", page_name); + jsonWriteStr(widget, "order", page_number); + //jsonWriteStr(widget, "descr", widget_name); + jsonWriteStr(widget, "series", widget_name); + jsonWriteStr(widget, "maxCount", maxCount); + jsonWriteStr(widget, "topic", prex + "/" + topic); + #ifdef layout_in_rom + all_widgets += widget + "\r\n"; + #else + addFile("layout.txt", widget); + #endif + widget = ""; +} diff --git a/data/config.json b/data/config.json index e16986fa..531271e5 100644 --- a/data/config.json +++ b/data/config.json @@ -1,5 +1,5 @@ { - "SSDP": "MODULES", + "SSDP": "IoTmanager", "chipID": "", "ssidAP": "WiFi", "passwordAP": "", diff --git a/data/configs/dht11.config.txt b/data/configs/dht11.config.txt index cd0bb02f..721a98c0 100644 --- a/data/configs/dht11.config.txt +++ b/data/configs/dht11.config.txt @@ -3,6 +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 //2 - номер пина датчика //варианты отображения: any-data, progress-round, progress-line, fill-gauge \ No newline at end of file diff --git a/data/js/function.js.gz b/data/js/function.js.gz index 0dd356e1..de40f128 100644 Binary files a/data/js/function.js.gz and b/data/js/function.js.gz differ diff --git a/esp32-esp8266_iot-manager_modules_firmware.ino b/esp32-esp8266_iot-manager_modules_firmware.ino index 182cf42f..828f9e59 100644 --- a/esp32-esp8266_iot-manager_modules_firmware.ino +++ b/esp32-esp8266_iot-manager_modules_firmware.ino @@ -1,36 +1,9 @@ #include "set.h" void setup() { - - Serial.begin(115200); - //Serial.setDebugOutput(true); - Serial.println("--------------started----------------"); //-------------------------------------------------------------- - SPIFFS.begin(); - configSetup = readFile("config.json", 4096); - configSetup.replace(" ", ""); - configSetup.replace("\r\n", ""); - Serial.println(configSetup); - jsonWrite(configJson, "SSDP", jsonRead(configSetup, "SSDP")); - jsonWrite(configJson, "lang", jsonRead(configSetup, "lang")); + File_system_init(); Serial.println("SPIFFS_init"); - -#ifdef ESP32 - uint32_t chipID_u = ESP.getEfuseMac(); - chipID = String(chipID_u); - jsonWrite(configSetup, "chipID", chipID); -#endif - -#ifdef ESP8266 - chipID = String( ESP.getChipId() ) + "-" + String(ESP.getFlashChipId()); - jsonWrite(configSetup, "chipID", chipID); - Serial.setDebugOutput(0); -#endif - - jsonWrite(configSetup, "firmware_version", firmware_version); - - prex = jsonRead(configSetup, "mqttPrefix") + "/" + chipID; - Serial.println(chipID); //-------------------------------------------------------------- CMD_init(); Serial.println("[V] CMD_init"); @@ -59,26 +32,21 @@ void setup() { Push_init(); Serial.println("[V] Push_init"); //-------------------------------------------------------------- - //SSDP_init(); - //Serial.println("[V] SSDP_init"); + SSDP_init(); + Serial.println("[V] SSDP_init"); //-------------------------------------------------------------- - - Serial.print("[i] Date compiling: "); - Serial.println(DATE_COMPILING); + ts.add(TEST, 3000, [&](void*) { - getMemoryLoad("[i] After loading"); + String json = "{}"; + jsonWriteStr(json, "test", GetTime()); + ws.textAll(json); -#ifdef ESP8266 - last_version = getURL("http://91.204.228.124:1100/update/esp8266/version.txt"); -#endif -#ifdef ESP32 - last_version = getURL("http://91.204.228.124:1100/update/esp32/version.txt"); -#endif + getMemoryLoad("[i] After loading"); + //Serial.print(GetDataDigital()); + //Serial.print(" "); + //Serial.println(GetTime()); - jsonWrite(configSetup, "last_version", last_version); - - Serial.print("[i] Last firmware version: "); - Serial.println(last_version); + }, nullptr, true); just_load = false; } diff --git a/main.ino b/main.ino index 10810d35..478c65a3 100644 --- a/main.ino +++ b/main.ino @@ -14,7 +14,7 @@ int jsonReadtoInt(String &json, String name) { } // ------------- Запись значения json String -String jsonWrite(String &json, String name, String volume) { +String jsonWriteStr(String &json, String name, String volume) { DynamicJsonBuffer jsonBuffer; JsonObject& root = jsonBuffer.parseObject(json); root[name] = volume; @@ -24,7 +24,7 @@ String jsonWrite(String &json, String name, String volume) { } // ------------- Запись значения json int -String jsonWrite(String &json, String name, int volume) { +String jsonWriteInt(String &json, String name, int volume) { DynamicJsonBuffer jsonBuffer; JsonObject& root = jsonBuffer.parseObject(json); root[name] = volume; @@ -34,7 +34,7 @@ String jsonWrite(String &json, String name, int volume) { } // ------------- Запись значения json float -String jsonWrite(String &json, String name, float volume) { +String jsonWriteFloat(String &json, String name, float volume) { DynamicJsonBuffer jsonBuffer; JsonObject& root = jsonBuffer.parseObject(json); root[name] = volume; @@ -42,6 +42,26 @@ String jsonWrite(String &json, String name, float volume) { root.printTo(json); return json; } +/* +String jsonWriteArray(String &json, String value1, String value2, String value3) { + + const int capacity = JSON_ARRAY_SIZE(1) + 3 * JSON_OBJECT_SIZE(3); + + StaticJsonBuffer jb; + JsonArray& arr = jb.createArray(); + JsonObject& obj1 = jb.createObject(); + + obj1[value1] = 1; + obj1[value2] = 2; + obj1[value3] = 3; + + arr.add(obj1); + + arr.printTo(json); + + return json; +} +*/ //=============================================CONFIG=========================================================== void saveConfig () { writeFile("config.json", configSetup); @@ -159,7 +179,7 @@ String safeDataToFile(String data, String Folder) // addFile(fileName, GetTime() + "/" + data); Serial.println(fileName); - jsonWrite(configJson, "test", fileName); + jsonWriteStr(configJson, "test", fileName); } // ------------- Чтение файла в строку String readFile(String fileName, size_t len ) { @@ -218,9 +238,8 @@ String readFileString(String fileName, String found) return "Failed"; } if (configFile.find(found.c_str())) { - return configFile.readStringUntil('\r\n'); //'\r' + //return configFile.readStringUntil('\r'); //'\r' } - //return "|-|-|"; configFile.close(); } @@ -260,7 +279,7 @@ void led_blink(int pin, int fq, String blink_satus) { void getMemoryLoad(String text) { #ifdef ESP8266 - int all_memory = 53312; + int all_memory = 52864; #endif #ifdef ESP32 int all_memory = 362868; @@ -276,19 +295,19 @@ void getMemoryLoad(String text) { } //esp32 full memory = 362868 k bytes -//esp8266 full memory = 53312 k bytes +//esp8266 full memory = 52864 k bytes //=================================================================== /* void web_print (String text) { if (WiFi.status() == WL_CONNECTED) { - jsonWrite(json, "test1", jsonRead(json, "test2")); - jsonWrite(json, "test2", jsonRead(json, "test3")); - jsonWrite(json, "test3", jsonRead(json, "test4")); - jsonWrite(json, "test4", jsonRead(json, "test5")); - jsonWrite(json, "test5", jsonRead(json, "test6")); + jsonWriteStr(json, "test1", jsonRead(json, "test2")); + jsonWriteStr(json, "test2", jsonRead(json, "test3")); + jsonWriteStr(json, "test3", jsonRead(json, "test4")); + jsonWriteStr(json, "test4", jsonRead(json, "test5")); + jsonWriteStr(json, "test5", jsonRead(json, "test6")); - jsonWrite(json, "test6", GetTime() + " " + text); + jsonWriteStr(json, "test6", GetTime() + " " + text); ws.textAll(json); } @@ -345,7 +364,7 @@ void getMemoryLoad(String text) { /* -String getResetReason(uint8_t core) { + String getResetReason(uint8_t core) { int reason = rtc_get_reset_reason(core); switch (reason) { case 1 : return "Power on"; break; //Vbat power on reset @@ -365,10 +384,10 @@ String getResetReason(uint8_t core) { case 16 : return "RTC Watch dog reset digital core and rtc module"; break; default : return "NO_MEAN"; } -} + } -String EspClass::getResetReason(void) { + String EspClass::getResetReason(void) { char buff[32]; if (resetInfo.reason == REASON_DEFAULT_RST) { // normal startup by power on strcpy_P(buff, PSTR("Power on")); @@ -388,5 +407,5 @@ String EspClass::getResetReason(void) { strcpy_P(buff, PSTR("Unknown")); } return String(buff); -} + } */ diff --git a/mqtt.ino b/mqtt.ino index 61e1b97d..ac63248c 100644 --- a/mqtt.ino +++ b/mqtt.ino @@ -22,20 +22,20 @@ void MQTT_init() { server.on("/mqttSave", HTTP_GET, [](AsyncWebServerRequest * request) { if (request->hasArg("mqttServer")) { - jsonWrite(configSetup, "mqttServer", request->getParam("mqttServer")->value()); + jsonWriteStr(configSetup, "mqttServer", request->getParam("mqttServer")->value()); } if (request->hasArg("mqttPort")) { int port = (request->getParam("mqttPort")->value()).toInt(); - jsonWrite(configSetup, "mqttPort", port); + jsonWriteInt(configSetup, "mqttPort", port); } if (request->hasArg("mqttPrefix")) { - jsonWrite(configSetup, "mqttPrefix", request->getParam("mqttPrefix")->value()); + jsonWriteStr(configSetup, "mqttPrefix", request->getParam("mqttPrefix")->value()); } if (request->hasArg("mqttUser")) { - jsonWrite(configSetup, "mqttUser", request->getParam("mqttUser")->value()); + jsonWriteStr(configSetup, "mqttUser", request->getParam("mqttUser")->value()); } if (request->hasArg("mqttPass")) { - jsonWrite(configSetup, "mqttPass", request->getParam("mqttPass")->value()); + jsonWriteStr(configSetup, "mqttPass", request->getParam("mqttPass")->value()); } saveConfig(); start_connecting_to_mqtt = true; @@ -45,8 +45,8 @@ void MQTT_init() { server.on("/mqttCheck", HTTP_GET, [](AsyncWebServerRequest * request) { String tmp = "{}"; - jsonWrite(tmp, "title", "" + stateMQTT()); - jsonWrite(tmp, "class", "pop-up"); + jsonWriteStr(tmp, "title", "" + stateMQTT()); + jsonWriteStr(tmp, "class", "pop-up"); request->send(200, "text/text", tmp); }); } @@ -134,14 +134,12 @@ void outcoming_date() { sendAllWigets(); sendAllData(); - - if (flagLoggingAnalog) sendLogData("log.analog.txt", "loganalog"); - if (flagLoggingDallas) sendLogData("log.dallas.txt", "logdallas"); - if (flagLoggingLevel) sendLogData("log.level.txt", "loglevel"); + choose_log_date_and_send(); Serial.println("[V] Sending all date to iot manager completed"); - } + + //======================================CONFIG================================================== boolean sendMQTT(String end_of_topik, String data) { String topik = jsonRead(configSetup, "mqttPrefix") + "/" + chipID + "/" + end_of_topik; @@ -161,7 +159,7 @@ boolean sendCHART(String topik, String data) { void sendSTATUS(String topik, String state) { topik = jsonRead(configSetup, "mqttPrefix") + "/" + chipID + "/" + topik + "/" + "status"; String json_ = "{}"; - jsonWrite(json_, "status", state); + jsonWriteStr(json_, "status", state); int send_status = client.publish (topik.c_str(), json_.c_str(), false); } //======================================CONTROL================================================== @@ -172,26 +170,46 @@ void sendCONTROL(String id, String topik, String state) { //=====================================================ОТПРАВЛЯЕМ ВИДЖЕТЫ======================================================== void sendAllWigets() { + +#ifndef layout_in_rom + all_widgets = readFile("layout.txt", 5000); +#endif + if (all_widgets != "") { int counter = 0; String line; int psn_1 = 0; int psn_2; do { - psn_2 = all_widgets.indexOf("\r\n", psn_1); + psn_2 = all_widgets.indexOf("\r\n", psn_1); //\r\n line = all_widgets.substring(psn_1, psn_2); line.replace("\n", ""); line.replace("\r\n", ""); - //jsonWrite(line, "id", String(counter)); - //jsonWrite(line, "pageId", String(counter)); + //jsonWriteStr(line, "id", String(counter)); + //jsonWriteStr(line, "pageId", String(counter)); counter++; sendMQTT("config", line); Serial.println("[V] " + line); psn_1 = psn_2 + 1; } while (psn_2 + 2 < all_widgets.length()); getMemoryLoad("[i] after send all widgets"); +#ifndef layout_in_rom + all_widgets = ""; +#endif } } +/* +void sendAllWigets2() { + File configFile = SPIFFS.open("/layout.txt", "r"); + if (!configFile) { + return; + } + // while (str.length() != 0) { + + // configFile.readStringUntil("\r\n"); + + // } +}*/ //=====================================================ОТПРАВЛЯЕМ ДАННЫЕ В ВИДЖЕТЫ ПРИ ОБНОВЛЕНИИ СТРАНИЦЫ======================================================== void sendAllData() { //берет строку json и ключи превращает в топики а значения колючей в них посылает @@ -216,32 +234,7 @@ void sendAllData() { //берет строку json и ключи превра } } -void sendLogData(String file, String topic) { - String log_date = readFile(file, 5000) + "\r\n"; - - log_date.replace("\r\n", "\n"); - log_date.replace("\r", "\n"); - - String unix_time; - String value; - - while (log_date.length() != 0) { - String tmp = selectToMarker (log_date, "\n"); - - unix_time += (selectToMarker (tmp, " ") + ","); - value += (deleteBeforeDelimiter(tmp, " ") + ","); - - log_date = deleteBeforeDelimiter(log_date, "\n"); - } - - unix_time.replace(",,", ""); - value.replace(",,", ""); - String to_send = "{\"status\":[" + value + "],\"time\": [" + unix_time + "]}"; - sendCHART(topic, to_send); - - getMemoryLoad("[i] after send log date"); -} String stateMQTT() { @@ -312,7 +305,7 @@ String stateMQTT() { /* //----------------------------------------------------------------------------------------------------------------------------------------------- - //jsonWrite(tmp, "status", "1"); + //jsonWriteStr(tmp, "status", "1"); String current_config = configJson; //{"SSDP":"MODULES","lang":"","ip":"192.168.43.60","DS":"34.00","rel1":"1","rel2":"1"} current_config.replace("{", ""); @@ -329,7 +322,7 @@ String stateMQTT() { state.replace("\"", ""); //1 //if (widget.lastIndexOf(topic) > 0) { - jsonWrite(tmp, "status", state); + jsonWriteStr(tmp, "status", state); //} current_config = deleteBeforeDelimiter(current_config, ","); } diff --git a/push_pushingbox.ino b/push_pushingbox.ino index 6e89ade6..331f4eb7 100644 --- a/push_pushingbox.ino +++ b/push_pushingbox.ino @@ -2,7 +2,7 @@ void Push_init() { server.on("/pushingboxDate", HTTP_GET, [](AsyncWebServerRequest * request) { if (request->hasArg("pushingbox_id")) { - jsonWrite(configSetup, "pushingbox_id", request->getParam("pushingbox_id")->value()); + jsonWriteStr(configSetup, "pushingbox_id", request->getParam("pushingbox_id")->value()); } saveConfig(); diff --git a/set.h b/set.h index c3be5731..cb408502 100644 --- a/set.h +++ b/set.h @@ -1,12 +1,13 @@ String firmware_version = "2.3.1"; -boolean flash_1mb = false; //----------------------------------------------------------------- String last_version; boolean start_check_version = false; //#define OTA_enable //#define MDNS_enable -//#define WS_enable +#define WS_enable + +//#define layout_in_rom #define TIME_COMPILING String(__TIME__) #define DATE_COMPILING String(__DATE__) @@ -15,9 +16,6 @@ boolean start_check_version = false; //----------------------------------------------------------------- #define analog_update_int 5000 //----------------------------------------------------------------- -#define ph_shooting_interval 500 //интервал выстрела датчика -#define ph_times_to_send 10 //после скольки выстрелов делать отправку данных -//----------------------------------------------------------------- #define temp_update_int 5000 //----------------------------------------------------------------- #define tank_level_shooting_interval 500 //интервал выстрела датчика @@ -26,7 +24,8 @@ boolean start_check_version = false; #define dhtT_update_int 10000 #define dhtH_update_int 10000 #define dht_calculation_update_int 10000 -#define statistics_update 1000 * 60 * 60 * 4 +//----------------------------------------------------------------- +#define statistics_update 1000 * 60 * 60 * 2 //----------------------------------------------------------------- @@ -80,10 +79,10 @@ AsyncEventSource events("/events"); //--------------------------------------------------------------- #include TickerScheduler ts(30); -enum {ROUTER_SEARCHING, WIFI_MQTT_CONNECTION_CHECK, LEVEL, ANALOG_, DALLAS, DHTT, DHTH, DHTC, DHTP, DHTD, STEPPER1, STEPPER2, ANALOG_LOG, LEVEL_LOG, DALLAS_LOG, CMD, TIMER_COUNTDOWN, TIMERS, TIME, STATISTICS, TEST}; +enum {ROUTER_SEARCHING, WIFI_MQTT_CONNECTION_CHECK, LEVEL, ANALOG_, DALLAS, DHTT, DHTH, DHTC, DHTP, DHTD, STEPPER1, STEPPER2, ANALOG_LOG, LEVEL_LOG, DALLAS_LOG, dhtT_LOG, dhtH_LOG, CMD, TIMER_COUNTDOWN, TIMERS, TIME, TIME_SYNC, STATISTICS, TEST}; //--------------------------------------------------------------- //ssl//#include "dependencies/WiFiClientSecure/WiFiClientSecure.h" //using older WiFiClientSecure -//#include "Ticker_for_TickerScheduler/Ticker/Ticker.h" +//#include "Ticker_for_TickerScheduler/Ticker/Ticker.h" //--------------------------------------------------------------- #include WiFiClient espClient; @@ -134,7 +133,8 @@ String order_loop; boolean flagLoggingAnalog = false; boolean flagLoggingLevel = false; boolean flagLoggingDallas = false; -boolean flagLoggingPh = false; +boolean flagLoggingdhtT = false; +boolean flagLoggingdhtH = false; const char* ntpServer = "pool.ntp.org"; const long gmtOffset_sec = 3600; @@ -153,3 +153,5 @@ boolean upgrade_flag = false; boolean get_url_flag = false; boolean start_connecting_to_mqtt = false; + +String test; diff --git a/test.ino b/test.ino new file mode 100644 index 00000000..c8bad15d --- /dev/null +++ b/test.ino @@ -0,0 +1,55 @@ +/* +UPD +String br = "\n\n"; + + +void info_init(){ + server.on("/info", HTTP_GET, [](AsyncWebServerRequest * request) { + String r = ESP_info_html(); + request->send(200, "text/html", ""+r+""); // отправляем ответ о выполнении + }); + sCmd.addCommand("pwr", pwr); +} + +String ESP_info_str(){ + br = "\n\n"; + return ESP_info(); +} +String ESP_info_html(){ + br = "
"; + return ESP_info(); +} + +String ESP_info(){ + + FlashMode_t ideMode = ESP.getFlashChipMode(); + String message = "hello from esp8266!"+br; + int sec = millis() / 1000; + int min = sec / 60; + int hr = min / 60; + message += "Uptime: "+String(hr)+":"+String(min % 60)+":"+String(sec % 60)+br; + message += "Vcc: " + String(ESP.getVcc() / 1024.0)+br; + message += "ESP Core Version: \t"+ ESP.getCoreVersion()+br; + message += "ESP Sdk Version: \t"+ String(ESP.getSdkVersion())+br; + message += "ESP Boot Mode: \t"+ String(ESP.getBootMode())+br; + + message += "ESP Sketch Size: \t"+ String(ESP.getSketchSize())+br; + message += "ESP Free Sketch Space: \t"+ String(ESP.getFreeSketchSpace())+br; + +#ifdef ESP32 + message += "wifi station get hostname: \t"+ String(wifi_station_get_hostname())+br; + message += "ESP min Sketch Space: \t"+ String(esp_get_minimum_free_heap_size())+br; +#endif + message += "размер свободной памяти:\t"+String(ESP.getFreeHeap())+br; + message += "chip ID:\t"+String(ESP.getChipId(),HEX)+br; + message += "flash chip ID:\t"+String(ESP.getFlashChipId(),HEX)+br; + + message += "размер флеш памяти IDE:\t"+String(ESP.getFlashChipSize())+br; + message += "размер флеш памяти SDK:\t"+String(ESP.getFlashChipRealSize())+br; + + message += "частота флеш памяти, в Гц.:\t"+String(ESP.getFlashChipSpeed())+br; + message += "Flash ide mode:\t"+ String(ideMode == FM_QIO ? "QIO" : ideMode == FM_QOUT ? "QOUT" : ideMode == FM_DIO ? "DIO" : ideMode == FM_DOUT ? "DOUT" : "UNKNOWN")+br; +// message += "IP address: \t"+ WiFi.localIP()+br; + return message; +} +*/