Merge pull request #15 from ytrikoz/platformio

LittleFS
This commit is contained in:
Yuri Trikoz
2020-06-20 23:03:19 +03:00
committed by GitHub
22 changed files with 869 additions and 891 deletions

View File

@@ -43,7 +43,7 @@
},
{
"type": "h4",
"title": "SPIFFS version: 2.3.4"
"title": "LittleFS version: 2.3.4"
},
{
"type": "hr"
@@ -109,7 +109,6 @@
"action": "/set?sceninit",
"class": "btn btn-block btn-default"
},
{
"type": "link",
"title": "Инструкция к системе автоматизации",
@@ -131,7 +130,6 @@
"style": "position:fixed;top:50%;left:50%;width:400px;margin-left:-200px;text-align:center;",
"class": "hidden"
},
{
"type": "button",
"title": "Обновить прошивку устройства",

View File

@@ -6,7 +6,7 @@
#include <ESP32Servo.h>
#include <HTTPClient.h>
#include <HTTPUpdate.h>
#include <SPIFFS.h>
#include <LittleFS.h>
#include <WiFi.h>
#include <analogWrite.h>

View File

@@ -8,6 +8,7 @@
#include <ArduinoJson.h>
#include <ESP8266HTTPUpdateServer.h>
#include <ESPAsyncWebServer.h>
#include <LittleFS.h>
#include <SPIFFSEditor.h>
#include "Consts.h"
@@ -44,7 +45,7 @@
#ifdef WS_enable
extern AsyncWebSocket ws;
//extern AsyncEventSource events;
#endif
#endif
extern TickerScheduler ts;
@@ -58,9 +59,6 @@ extern AsyncWebServer server;
extern DallasTemperature sensors;
/*
* Global vars
*/
@@ -84,14 +82,13 @@ enum { ROUTER_SEARCHING,
UDP_DB,
TEST };
extern boolean just_load;
extern String configSetupJson; //все настройки
extern String configLiveJson; //все данные с датчиков (связан с mqtt)
extern String configOptionJson; //для трансфера
extern String chipID;
extern String chipId;
extern String prex;
extern String all_widgets;
extern String scenario;
@@ -189,6 +186,7 @@ extern void clean_log_date();
extern void choose_log_date_and_send();
// Main
extern void setChipId();
extern void getMemoryLoad(String text);
extern void saveConfig();
extern String getURL(const String &urls);

View File

@@ -7,24 +7,24 @@
* Чтение строки из файла
* возвращает стоку из файла в которой есть искомое слово found
*/
String readFileString(const String& filename, const String& str_to_found);
String readFileString(const String filename, const String to_find);
/*
* Добовление строки в файл
*/
String addFile(const String& fileName, const String& str);
String addFile(const String filename, const String str);
/*
* Запись строки в файл
*/
String writeFile(const String& fileName, const String& str);
String writeFile(const String filename, const String str);
/*
* Чтение файла в строку
*/
String readFile(const String& fileName, size_t len);
String readFile(const String filename, size_t max_size);
/*
* Размер файла
*/
String sizeFile(const String& fileName);
String getFileSize(const String filename);

View File

@@ -1,6 +1,7 @@
#pragma once
#include <Arduino.h>
#include <TZ.h>
void Time_Init();
@@ -23,11 +24,14 @@ String getTimeUnix();
*/
boolean getUnixTimeStr(String&);
String GetTimeWOsec();
String getTimeWOsec();
String GetDate();
/*
* Получение даты
*/
String getDate();
String GetDataDigital();
String getDateDigitalFormated();
int timeToMin(String Time);

View File

@@ -1,24 +1,26 @@
#ifndef SPIFFSEditor_H_
#define SPIFFSEditor_H_
#include <ESPAsyncWebServer.h>
#include <LittleFS.h>
class SPIFFSEditor: public AsyncWebHandler {
private:
class SPIFFSEditor : public AsyncWebHandler {
private:
fs::FS _fs;
String _username;
String _password;
String _password;
bool _authenticated;
uint32_t _startTime;
public:
public:
#ifdef ESP32
SPIFFSEditor(const fs::FS& fs, const String& username=String(), const String& password=String());
SPIFFSEditor(const fs::FS& fs, const String& username = String(), const String& password = String());
#else
SPIFFSEditor(const String& username=String(), const String& password=String(), const fs::FS& fs=SPIFFS);
SPIFFSEditor(const String& username = String(), const String& password = String(), const fs::FS& fs = LittleFS);
#endif
virtual bool canHandle(AsyncWebServerRequest *request) override final;
virtual void handleRequest(AsyncWebServerRequest *request) override final;
virtual void handleUpload(AsyncWebServerRequest *request, const String& filename, size_t index, uint8_t *data, size_t len, bool final) override final;
virtual bool isRequestHandlerTrivial() override final {return false;}
virtual bool canHandle(AsyncWebServerRequest* request) override final;
virtual void handleRequest(AsyncWebServerRequest* request) override final;
virtual void handleUpload(AsyncWebServerRequest* request, const String& filename, size_t index, uint8_t* data, size_t len, bool final) override final;
virtual bool isRequestHandlerTrivial() override final { return false; }
};
#endif

View File

@@ -274,12 +274,14 @@ void inputDigit() {
jsonWriteStr(configLiveJson, "digit" + number, start_state);
createWidget(widget_name, page_name, page_number, "widgets/widget.inputNum.json", "digit" + number);
}
void digitSet() {
String number = sCmd.next();
String value = sCmd.next();
jsonWriteStr(configLiveJson, "digit" + number, value);
sendSTATUS("digit" + number, value);
}
//=====================================================================================================================================
//=========================================Добавление окна ввода времени===============================================================
void inputTime() {
@@ -294,6 +296,7 @@ void inputTime() {
jsonWriteStr(configLiveJson, "time" + number, start_state);
createWidget(widget_name, page_name, page_number, "widgets/widget.inputTime.json", "time" + number);
}
void timeSet() {
String number = sCmd.next();
String value = sCmd.next();
@@ -334,7 +337,7 @@ void textSet() {
text.replace("#", " ");
String time = getTime();
time.replace(":", ".");
text = text + " " + GetDataDigital() + " " + time;
text = text + " " + getDateDigitalFormated() + " " + time;
}
jsonWriteStr(configLiveJson, "text" + number, text);

View File

@@ -1,40 +0,0 @@
#include "Global.h"
void File_system_init() {
Serial.begin(115200);
//Serial.setDebugOutput(true);
Serial.println("--------------started----------------");
//--------------------------------------------------------------
SPIFFS.begin();
configSetupJson = readFile("config.json", 4096);
configSetupJson.replace(" ", "");
configSetupJson.replace("\r\n", "");
Serial.println(configSetupJson);
//jsonWriteStr(configLiveJson, "name", jsonReadStr(configSetupJson, "name"));
//jsonWriteStr(configLiveJson, "lang", jsonReadStr(configSetupJson, "lang"));
#ifdef ESP32
uint32_t chipID_u = ESP.getEfuseMac();
chipID = String(chipID_u);
jsonWriteStr(configSetupJson, "chipID", chipID);
#endif
#ifdef ESP8266
chipID = String( ESP.getChipId() ) + "-" + String(ESP.getFlashChipId());
jsonWriteStr(configSetupJson, "chipID", chipID);
Serial.setDebugOutput(0);
#endif
jsonWriteStr(configSetupJson, "firmware_version", firmware_version);
prex = jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipID;
Serial.println(chipID);
}
void get_esp_info() {
}

View File

@@ -11,7 +11,7 @@ AsyncWebSocket ws;
TickerScheduler ts(TEST + 1);
//WiFiClient espClient;
WiFiClient espClient;
PubSubClient client_mqtt(espClient);
@@ -21,10 +21,6 @@ AsyncWebServer server(80);
DallasTemperature sensors;
WiFiClient espClient;
/*
* Global vars
*/
@@ -37,11 +33,11 @@ String configLiveJson = "{}";
String configOptionJson = "{}";
// Mqtt
String chipID = "";
String prex;
String chipId = "";
String prex = "";
String all_widgets = "";
String scenario;
String order_loop;
String scenario = "";
String order_loop = "";
// Sensors
String analog_value_names_list;

View File

@@ -7,6 +7,24 @@ UptimeInterval myUptime(10);
void handle_uptime();
void handle_statistics();
void File_system_init() {
if (!LittleFS.begin()) {
Serial.println("[E] LittleFS");
return;
}
configSetupJson = readFile("config.json", 4096);
configSetupJson.replace(" ", "");
configSetupJson.replace("\r\n", "");
jsonWriteStr(configSetupJson, "chipID", chipId);
jsonWriteStr(configSetupJson, "firmware_version", firmware_version);
prex = jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipId;
Serial.println(configSetupJson);
}
void All_init() {
Device_init();
Scenario_init();
@@ -47,7 +65,7 @@ void Device_init() {
#ifdef layout_in_ram
all_widgets = "";
#else
SPIFFS.remove("/layout.txt");
LittleFS.remove("/layout.txt");
#endif
txtExecution("firmware.c.txt");

View File

@@ -22,7 +22,7 @@ void logging() {
LOG1, period_min.toInt() * 1000 * 60, [&](void*) {
String tmp_buf_1 = selectFromMarkerToMarker(logging_value_names_list, ",", 0);
deleteOldDate("log." + tmp_buf_1 + ".txt", jsonReadInt(configOptionJson, tmp_buf_1 + "_c"), jsonReadStr(configLiveJson, tmp_buf_1));
Serial.println("[i] LOGGING for sensor '" + tmp_buf_1 + "' done");
Serial.println("[I] LOGGING for sensor '" + tmp_buf_1 + "' done");
},
nullptr, false);
}
@@ -31,7 +31,7 @@ void logging() {
LOG2, period_min.toInt() * 1000 * 60, [&](void*) {
String tmp_buf_2 = selectFromMarkerToMarker(logging_value_names_list, ",", 1);
deleteOldDate("log." + tmp_buf_2 + ".txt", jsonReadInt(configOptionJson, tmp_buf_2 + "_c"), jsonReadStr(configLiveJson, tmp_buf_2));
Serial.println("[i] LOGGING for sensor '" + tmp_buf_2 + "' done");
Serial.println("[I] LOGGING for sensor '" + tmp_buf_2 + "' done");
},
nullptr, false);
}
@@ -40,7 +40,7 @@ void logging() {
LOG3, period_min.toInt() * 1000 * 60, [&](void*) {
String tmp_buf_3 = selectFromMarkerToMarker(logging_value_names_list, ",", 2);
deleteOldDate("log." + tmp_buf_3 + ".txt", jsonReadInt(configOptionJson, tmp_buf_3 + "_c"), jsonReadStr(configLiveJson, tmp_buf_3));
Serial.println("[i] LOGGING for sensor '" + tmp_buf_3 + "' done");
Serial.println("[I] LOGGING for sensor '" + tmp_buf_3 + "' done");
},
nullptr, false);
}
@@ -49,7 +49,7 @@ void logging() {
LOG4, period_min.toInt() * 1000 * 60, [&](void*) {
String tmp_buf_4 = selectFromMarkerToMarker(logging_value_names_list, ",", 3);
deleteOldDate("log." + tmp_buf_4 + ".txt", jsonReadInt(configOptionJson, tmp_buf_4 + "_c"), jsonReadStr(configLiveJson, tmp_buf_4));
Serial.println("[i] LOGGING for sensor '" + tmp_buf_4 + "' done");
Serial.println("[I] LOGGING for sensor '" + tmp_buf_4 + "' done");
},
nullptr, false);
}
@@ -58,7 +58,7 @@ void logging() {
LOG5, period_min.toInt() * 1000 * 60, [&](void*) {
String tmp_buf_5 = selectFromMarkerToMarker(logging_value_names_list, ",", 4);
deleteOldDate("log." + tmp_buf_5 + ".txt", jsonReadInt(configOptionJson, tmp_buf_5 + "_c"), jsonReadStr(configLiveJson, tmp_buf_5));
Serial.println("[i] LOGGING for sensor '" + tmp_buf_5 + "' done");
Serial.println("[I] LOGGING for sensor '" + tmp_buf_5 + "' done");
},
nullptr, false);
}
@@ -71,11 +71,11 @@ void deleteOldDate(String file, int seted_number_of_lines, String date_to_add) {
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);
LittleFS.remove("/" + file);
current_number_of_lines = 0;
}
if (current_number_of_lines == 0) {
SPIFFS.remove("/" + file);
LittleFS.remove("/" + file);
current_number_of_lines = 0;
}
if (current_number_of_lines > seted_number_of_lines) {
@@ -133,7 +133,7 @@ void sendLogData(String file, String topic) {
Serial.println(json_array);
sendCHART(topic, json_array);
json_array = "";
getMemoryLoad("[i] after send log date");
getMemoryLoad("[I] after send log date");
}
}
@@ -152,14 +152,14 @@ void sendLogData(String file, String topic) {
//Serial.println(final_line);
sendCHART(topic, final_line);
}
getMemoryLoad("[i] after send log date");
getMemoryLoad("[I] after send log date");
*/
//=========================================Очистка данных===================================================================================
void clean_log_date() {
String all_line = logging_value_names_list;
while (all_line.length() != 0) {
String tmp = selectToMarker(all_line, ",");
SPIFFS.remove("/log." + tmp + ".txt");
LittleFS.remove("/log." + tmp + ".txt");
all_line = deleteBeforeDelimiter(all_line, ",");
}
all_line = "";

View File

@@ -60,16 +60,16 @@ boolean MQTT_Connecting() {
if (WiFi.status() == WL_CONNECTED) {
if (!client_mqtt.connected()) {
Serial.println("[V] Connecting to MQTT server commenced");
if (client_mqtt.connect(chipID.c_str(), jsonReadStr(configSetupJson, "mqttUser").c_str(), jsonReadStr(configSetupJson, "mqttPass").c_str())) {
if (client_mqtt.connect(chipId.c_str(), jsonReadStr(configSetupJson, "mqttUser").c_str(), jsonReadStr(configSetupJson, "mqttPass").c_str())) {
Serial.println("[VV] MQTT connected");
led_blink("off");
client_mqtt.setCallback(callback);
client_mqtt.subscribe(jsonReadStr(configSetupJson, "mqttPrefix").c_str()); // Для приема получения HELLOW и подтверждения связи
client_mqtt.subscribe((jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipID + "/+/control").c_str()); // Подписываемся на топики control
client_mqtt.subscribe((jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipID + "/order").c_str()); // Подписываемся на топики order
client_mqtt.subscribe((jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipID + "/update").c_str());
client_mqtt.subscribe((jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipID + "/devc").c_str());
client_mqtt.subscribe((jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipID + "/devs").c_str());
client_mqtt.subscribe((jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipId + "/+/control").c_str()); // Подписываемся на топики control
client_mqtt.subscribe((jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipId + "/order").c_str()); // Подписываемся на топики order
client_mqtt.subscribe((jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipId + "/update").c_str());
client_mqtt.subscribe((jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipId + "/devc").c_str());
client_mqtt.subscribe((jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipId + "/devs").c_str());
Serial.println("[V] Callback set, subscribe done");
res = true;
} else {
@@ -142,7 +142,7 @@ void outcoming_date() {
//======================================CONFIG==================================================
boolean sendMQTT(String end_of_topik, String data) {
String topik = jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipID + "/" + end_of_topik;
String topik = jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipId + "/" + end_of_topik;
boolean send_status = client_mqtt.beginPublish(topik.c_str(), data.length(), false);
client_mqtt.print(data);
client_mqtt.endPublish();
@@ -150,7 +150,7 @@ boolean sendMQTT(String end_of_topik, String data) {
}
boolean sendCHART(String topik, String data) {
topik = jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipID + "/" + topik + "/" + "status";
topik = jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipId + "/" + topik + "/" + "status";
boolean send_status = client_mqtt.beginPublish(topik.c_str(), data.length(), false);
client_mqtt.print(data);
client_mqtt.endPublish();
@@ -158,14 +158,14 @@ boolean sendCHART(String topik, String data) {
}
boolean sendCHART_test(String topik, String data) {
topik = jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipID + "/" + topik + "/" + "status";
topik = jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipId + "/" + topik + "/" + "status";
boolean send_status = client_mqtt.publish(topik.c_str(), data.c_str(), false);
return send_status;
}
//======================================STATUS==================================================
void sendSTATUS(String topik, String state) {
topik = jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipID + "/" + topik + "/" + "status";
topik = jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipId + "/" + topik + "/" + "status";
String json_ = "{}";
jsonWriteStr(json_, "status", state);
client_mqtt.publish(topik.c_str(), json_.c_str(), false);
@@ -198,20 +198,21 @@ void sendAllWigets() {
Serial.println("[V] " + line);
psn_1 = psn_2 + 1;
} while (psn_2 + 2 < all_widgets.length());
getMemoryLoad("[i] after send all widgets");
getMemoryLoad("[I] after send all widgets");
}
}
#endif
#ifndef layout_in_ram
void sendAllWigets() {
File configFile = SPIFFS.open("/layout.txt", "r");
if (!configFile) {
auto file = LittleFS.open("/layout.txt", "r");
if (!file) {
Serial.println("[e] on open layout.txt");
return;
}
configFile.seek(0, SeekSet); //поставим курсор в начало файла
while (configFile.position() != configFile.size()) {
String widget_to_send = configFile.readStringUntil('\n');
file.seek(0, SeekSet); //поставим курсор в начало файла
while (file.position() != file.size()) {
String widget_to_send = file.readStringUntil('\n');
Serial.println("[V] " + widget_to_send);
sendMQTT("config", widget_to_send);
}
@@ -221,7 +222,7 @@ void sendAllWigets() {
void sendAllData() { //берет строку json и ключи превращает в топики а значения колючей в них посылает
String current_config = configLiveJson; //{"name":"MODULES","lang":"","ip":"192.168.43.60","DS":"34.00","rel1":"1","rel2":"1"}
getMemoryLoad("[i] after send all date");
getMemoryLoad("[I] after send all date");
current_config.replace("{", "");
current_config.replace("}", ""); //"name":"MODULES","lang":"","ip":"192.168.43.60","DS":"34.00","rel1":"1","rel2":"1"
current_config += ","; //"name":"MODULES","lang":"","ip":"192.168.43.60","DS":"34.00","rel1":"1","rel2":"1",

View File

@@ -147,12 +147,12 @@ void ultrasonic_reading() {
jsonWriteInt(configLiveJson, levelPr_value_name, level);
eventGen(levelPr_value_name, "");
sendSTATUS(levelPr_value_name, String(level));
Serial.println("[i] sensor '" + levelPr_value_name + "' data: " + String(level));
Serial.println("[I] sensor '" + levelPr_value_name + "' data: " + String(level));
jsonWriteInt(configLiveJson, ultrasonicCm_value_name, distance_cm);
eventGen(ultrasonicCm_value_name, "");
sendSTATUS(ultrasonicCm_value_name, String(distance_cm));
Serial.println("[i] sensor '" + ultrasonicCm_value_name + "' data: " + String(distance_cm));
Serial.println("[I] sensor '" + ultrasonicCm_value_name + "' data: " + String(distance_cm));
}
}
#endif
@@ -202,7 +202,7 @@ void analog_reading1() {
jsonWriteInt(configLiveJson, value_name, analog);
eventGen(value_name, "");
sendSTATUS(value_name, String(analog));
Serial.println("[i] sensor '" + value_name + "' data: " + String(analog));
Serial.println("[I] sensor '" + value_name + "' data: " + String(analog));
}
void analog_reading2() {
@@ -221,7 +221,7 @@ void analog_reading2() {
jsonWriteInt(configLiveJson, value_name, analog);
eventGen(value_name, "");
sendSTATUS(value_name, String(analog));
Serial.println("[i] sensor '" + value_name + "' data: " + String(analog));
Serial.println("[I] sensor '" + value_name + "' data: " + String(analog));
}
#endif
//=========================================================================================================================================
@@ -250,7 +250,7 @@ void dallas_reading() {
jsonWriteStr(configLiveJson, "dallas", String(temp));
eventGen("dallas", "");
sendSTATUS("dallas", String(temp));
Serial.println("[i] sensor 'dallas' send date " + String(temp));
Serial.println("[I] sensor 'dallas' send date " + String(temp));
}
#endif
//=========================================================================================================================================
@@ -289,7 +289,7 @@ void dhtT_reading() {
eventGen(dhtT_value_name, "");
jsonWriteStr(configLiveJson, dhtT_value_name, String(value));
sendSTATUS(dhtT_value_name, String(value));
Serial.println("[i] sensor '" + dhtT_value_name + "' data: " + String(value));
Serial.println("[I] sensor '" + dhtT_value_name + "' data: " + String(value));
}
}
}
@@ -327,7 +327,7 @@ void dhtH_reading() {
eventGen(dhtH_value_name, "");
jsonWriteStr(configLiveJson, dhtH_value_name, String(value));
sendSTATUS(dhtH_value_name, String(value));
Serial.println("[i] sensor '" + dhtH_value_name + "' data: " + String(value));
Serial.println("[I] sensor '" + dhtH_value_name + "' data: " + String(value));
}
}
}
@@ -352,7 +352,7 @@ void dhtP_reading() {
eventGen("dhtPerception", "");
sendSTATUS("dhtPerception", final_line);
if (client_mqtt.connected()) {
Serial.println("[i] sensor 'dhtPerception' data: " + final_line);
Serial.println("[I] sensor 'dhtPerception' data: " + final_line);
}
}
}
@@ -409,7 +409,7 @@ void dhtC_reading() {
jsonWriteStr(configLiveJson, "dhtComfort", final_line);
eventGen("dhtComfort", "");
sendSTATUS("dhtComfort", final_line);
Serial.println("[i] sensor 'dhtComfort' send date " + final_line);
Serial.println("[I] sensor 'dhtComfort' send date " + final_line);
}
}
@@ -468,7 +468,7 @@ void dhtD_reading() {
jsonWriteInt(configLiveJson, "dhtDewpoint", value);
eventGen("dhtDewpoint", "");
sendSTATUS("dhtDewpoint", String(value));
Serial.println("[i] sensor 'dhtDewpoint' data: " + String(value));
Serial.println("[I] sensor 'dhtDewpoint' data: " + String(value));
}
}
#endif
@@ -504,7 +504,7 @@ void bmp280T_reading() {
jsonWriteStr(configLiveJson, bmp280T_value_name, String(value));
eventGen(bmp280T_value_name, "");
sendSTATUS(bmp280T_value_name, String(value));
Serial.println("[i] sensor '" + bmp280T_value_name + "' data: " + String(value));
Serial.println("[I] sensor '" + bmp280T_value_name + "' data: " + String(value));
}
//bmp280P press1 0x76 Давление#bmp280 Датчики any-data 2
@@ -536,7 +536,7 @@ void bmp280P_reading() {
jsonWriteStr(configLiveJson, bmp280P_value_name, String(value));
eventGen(bmp280P_value_name, "");
sendSTATUS(bmp280P_value_name, String(value));
Serial.println("[i] sensor '" + bmp280P_value_name + "' data: " + String(value));
Serial.println("[I] sensor '" + bmp280P_value_name + "' data: " + String(value));
}
//=========================================================================================================================================
@@ -561,7 +561,7 @@ void bme280T_reading() {
jsonWriteStr(configLiveJson, bme280T_value_name, String(value));
eventGen(bme280T_value_name, "");
sendSTATUS(bme280T_value_name, String(value));
Serial.println("[i] sensor '" + bme280T_value_name + "' data: " + String(value));
Serial.println("[I] sensor '" + bme280T_value_name + "' data: " + String(value));
}
//bme280P pres1 0x76 Давление#bmp280 Датчики any-data 1
@@ -585,7 +585,7 @@ void bme280P_reading() {
jsonWriteStr(configLiveJson, bme280P_value_name, String(value));
eventGen(bme280P_value_name, "");
sendSTATUS(bme280P_value_name, String(value));
Serial.println("[i] sensor '" + bme280P_value_name + "' data: " + String(value));
Serial.println("[I] sensor '" + bme280P_value_name + "' data: " + String(value));
}
//bme280H hum1 0x76 Влажность#bmp280 Датчики any-data 1
@@ -608,7 +608,7 @@ void bme280H_reading() {
jsonWriteStr(configLiveJson, bme280H_value_name, String(value));
eventGen(bme280H_value_name, "");
sendSTATUS(bme280H_value_name, String(value));
Serial.println("[i] sensor '" + bme280H_value_name + "' data: " + String(value));
Serial.println("[I] sensor '" + bme280H_value_name + "' data: " + String(value));
}
//bme280A altit1 0x76 Высота#bmp280 Датчики any-data 1
@@ -631,5 +631,5 @@ void bme280A_reading() {
jsonWriteStr(configLiveJson, bme280A_value_name, String(value));
eventGen(bme280A_value_name, "");
sendSTATUS(bme280A_value_name, String(value));
Serial.println("[i] sensor '" + bme280A_value_name + "' data: " + String(value));
Serial.println("[I] sensor '" + bme280A_value_name + "' data: " + String(value));
}

View File

@@ -1,88 +1,85 @@
#include "Global.h"
void initUpgrade() {
#ifdef ESP8266
if (WiFi.status() == WL_CONNECTED) last_version = getURL("http://91.204.228.124:1100/update/esp8266/version.txt");
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");
if (WiFi.status() == WL_CONNECTED) last_version = getURL("http://91.204.228.124:1100/update/esp32/version.txt");
#endif
jsonWriteStr(configSetupJson, "last_version", last_version);
Serial.print("[i] Last firmware version: ");
Serial.println(last_version);
jsonWriteStr(configSetupJson, "last_version", last_version);
Serial.print("[I] Last firmware version: ");
Serial.println(last_version);
}
void do_upgrade_url() {
if (upgrade_url) {
upgrade_url = false;
if (upgrade_url) {
upgrade_url = false;
#ifdef ESP32
last_version = getURL("http://91.204.228.124:1100/update/esp32/version.txt");
last_version = getURL("http://91.204.228.124:1100/update/esp32/version.txt");
#endif
#ifdef ESP8266
last_version = getURL("http://91.204.228.124:1100/update/esp8266/version.txt");
last_version = getURL("http://91.204.228.124:1100/update/esp8266/version.txt");
#endif
jsonWriteStr(configSetupJson, "last_version", last_version);
}
jsonWriteStr(configSetupJson, "last_version", last_version);
}
}
void upgrade_firmware() {
String scenario_for_update;
String config_for_update;
String configSetup_for_update;
scenario_for_update = readFile("firmware.s.txt", 4000);
config_for_update = readFile("firmware.c.txt", 4000);
configSetup_for_update = configSetupJson;
String scenario_for_update;
String config_for_update;
String configSetup_for_update;
scenario_for_update = readFile("firmware.s.txt", 4000);
config_for_update = readFile("firmware.c.txt", 4000);
configSetup_for_update = configSetupJson;
Serial.println("Start upgrade SPIFFS, please wait...");
Serial.println("Start upgrade SPIFFS, please wait...");
WiFiClient client_for_upgrade;
WiFiClient client_for_upgrade;
#ifdef ESP32
httpUpdate.rebootOnUpdate(false);
t_httpUpdate_return ret = httpUpdate.updateSpiffs(client_for_upgrade, "http://91.204.228.124:1100/update/esp32/esp32-esp8266_iot-manager_modules_firmware.spiffs.bin");
httpUpdate.rebootOnUpdate(false);
t_httpUpdate_return ret = httpUpdate.updateSpiffs(client_for_upgrade, "http://91.204.228.124:1100/update/esp32/esp32-esp8266_iot-manager_modules_firmware.spiffs.bin");
#endif
#ifdef ESP8266
ESPhttpUpdate.rebootOnUpdate(false);
t_httpUpdate_return ret = ESPhttpUpdate.updateSpiffs(client_for_upgrade, "http://91.204.228.124:1100/update/esp8266/esp32-esp8266_iot-manager_modules_firmware.spiffs.bin");
#endif
if (ret == HTTP_UPDATE_OK) {
writeFile("firmware.s.txt", scenario_for_update);
writeFile("firmware.c.txt", config_for_update);
writeFile("config.json", configSetup_for_update);
saveConfig();
Serial.println("SPIFFS upgrade done!");
Serial.println("Start upgrade BUILD, please wait...");
#ifdef ESP32
//httpUpdate.rebootOnUpdate(true);
t_httpUpdate_return ret = httpUpdate.update(client_for_upgrade, "http://91.204.228.124:1100/update/esp32/esp32-esp8266_iot-manager_modules_firmware.ino.bin");
#endif
#ifdef ESP8266
//ESPhttpUpdate.rebootOnUpdate(true);
t_httpUpdate_return ret = ESPhttpUpdate.update(client_for_upgrade, "http://91.204.228.124:1100/update/esp8266/esp32-esp8266_iot-manager_modules_firmware.ino.bin");
ESPhttpUpdate.rebootOnUpdate(false);
t_httpUpdate_return ret = ESPhttpUpdate.updateSpiffs(client_for_upgrade, "http://91.204.228.124:1100/update/esp8266/esp32-esp8266_iot-manager_modules_firmware.spiffs.bin");
#endif
if (ret == HTTP_UPDATE_OK) {
writeFile("firmware.s.txt", scenario_for_update);
writeFile("firmware.c.txt", config_for_update);
writeFile("config.json", configSetup_for_update);
saveConfig();
Serial.println("BUILD upgrade done!");
Serial.println("Restart ESP....");
ESP.restart();
Serial.println("Upgrade done!");
Serial.println("Start upgrade BUILD, please wait...");
#ifdef ESP32
//httpUpdate.rebootOnUpdate(true);
t_httpUpdate_return ret = httpUpdate.update(client_for_upgrade, "http://91.204.228.124:1100/update/esp32/esp32-esp8266_iot-manager_modules_firmware.ino.bin");
#endif
#ifdef ESP8266
//ESPhttpUpdate.rebootOnUpdate(true);
t_httpUpdate_return ret = ESPhttpUpdate.update(client_for_upgrade, "http://91.204.228.124:1100/update/esp8266/esp32-esp8266_iot-manager_modules_firmware.ino.bin");
#endif
if (ret == HTTP_UPDATE_OK) {
Serial.println("Upgrade done!");
Serial.println("Restart...");
ESP.restart();
} else {
Serial.println("[e] on build");
}
} else {
Serial.println("!!!!BUILD upgrade ERROR");
Serial.println("[e] on upgrade");
}
} else {
Serial.println("!!!!SPIFFS upgrade ERROR");
}
}
void do_upgrade() {
if (upgrade) {
upgrade = false;
upgrade_firmware();
}
if (upgrade) {
upgrade = false;
upgrade_firmware();
}
}
/*

View File

@@ -1,42 +1,47 @@
#include "Utils/FileUtils.h"
String readFileString(const String& filename, const String& str_to_found) {
String res = "failed";
auto file = SPIFFS.open("/" + filename, "r");
if (file && file.find(str_to_found.c_str())) {
#include <LittleFS.h>
String readFileString(const String filename, const String to_find) {
String res = "Failed";
auto file = LittleFS.open("/" + filename, "r");
if (!file) {
return "Failed";
}
if (file.find(to_find.c_str())) {
res = file.readStringUntil('\n');
}
file.close();
return res;
}
String addFile(const String& fileName, const String& str) {
auto file = SPIFFS.open("/" + fileName, "a");
String addFile(const String filename, const String str) {
auto file = LittleFS.open("/" + filename, "a");
if (!file) {
return "Failed to open file";
return "Failed";
}
file.println(str);
file.close();
return "Write sucсess";
}
String writeFile(const String& fileName, const String& str) {
auto file = SPIFFS.open("/" + fileName, "w");
String writeFile(const String filename, const String str) {
auto file = LittleFS.open("/" + filename, "w");
if (!file) {
return "Failed to open file";
return "Failed";
}
file.print(str);
file.close();
return "Write sucсess";
}
String readFile(const String& fileName, size_t len) {
File file = SPIFFS.open("/" + fileName, "r");
String readFile(const String filename, size_t max_size) {
auto file = LittleFS.open("/" + filename, "r");
if (!file) {
return "Failed";
}
size_t size = file.size();
if (size > len) {
if (size > max_size) {
file.close();
return "Large";
}
@@ -45,8 +50,8 @@ String readFile(const String& fileName, size_t len) {
return temp;
}
String sizeFile(const String& fileName) {
auto file = SPIFFS.open("/" + fileName, "r");
String getFileSize(const String filename) {
auto file = LittleFS.open("/" + filename, "r");
if (!file) {
return "Failed";
}

View File

@@ -3,9 +3,6 @@
#include "Global.h"
#include "Utils\StringUtils.h"
static const char* TIME_FORMAT PROGMEM = "%2d:%2d:%2d";
static const char* TIME_FORMAT_WITH_DAYS PROGMEM = "%dd %2d:%2d";
void Time_Init() {
ts.add(
TIME_SYNC, 30000, [&](void*) {
@@ -14,33 +11,9 @@ void Time_Init() {
nullptr, true);
}
const String prettyMillis(unsigned long time_ms) {
unsigned long tmp = time_ms;
unsigned long seconds;
unsigned long minutes;
unsigned long hours;
unsigned long days;
seconds = tmp % 60;
tmp = tmp / 60;
minutes = tmp % 60;
tmp = tmp / 60;
hours = tmp % 24;
days = tmp / 24;
char buf[16];
if (days) {
sprintf_P(buf, TIME_FORMAT, hours, minutes, seconds);
} else {
sprintf_P(buf, TIME_FORMAT_WITH_DAYS, days, hours, minutes);
}
return String(buf);
}
void time_check() {
if (getTimeUnix() == "failed") {
Serial.println("[i] Time is not synchronized, start synchronization");
Serial.println("[I] Trying to obtain time");
reconfigTime();
}
}
@@ -50,7 +23,7 @@ void reconfigTime() {
String ntp = jsonReadStr(configSetupJson, "ntp");
configTime(0, 0, ntp.c_str());
int i = 0;
Serial.println("[i] Awaiting for time ");
Serial.println("[I] Start time sync");
#ifdef ESP32
struct tm timeinfo;
while (!getLocalTime(&timeinfo) && i <= 4) {
@@ -67,15 +40,15 @@ void reconfigTime() {
//}
#endif
if (getTimeUnix() != "failed") {
Serial.print("[V] Time synchronized = ");
Serial.print(GetDataDigital());
Serial.print(" ");
Serial.print("[V] Got time = ");
Serial.print(getDateDigitalFormated());
Serial.print(' ');
Serial.println(getTime());
} else {
Serial.println("[E] Time server or internet connection error, will try again in 30 sec");
Serial.println("[E] Failed to obtain time, retry in 30 sec");
}
} else {
Serial.println("[E] Get time impossible, no wifi connection");
Serial.println("[E] Unable to obtain time");
}
}
@@ -105,7 +78,7 @@ String getTime() {
return Time; // Возврашаем полученное время
}
String GetTimeWOsec() {
String getTimeWOsec() {
time_t now = time(nullptr); // получаем время с помощью библиотеки time.h
int zone = 3600 * jsonReadStr(configSetupJson, "timezone").toInt();
now = now + zone;
@@ -116,8 +89,7 @@ String GetTimeWOsec() {
return Time; // Возврашаем полученное время
}
// Получение даты
String GetDate() {
String getDate() {
time_t now = time(nullptr); // получаем время с помощью библиотеки time.h
int zone = 3600 * jsonReadStr(configSetupJson, "timezone").toInt();
now = now + zone;
@@ -130,8 +102,8 @@ String GetDate() {
return Data; // Возврашаем полученную дату
}
String GetDataDigital() {
String date = GetDate();
String getDateDigitalFormated() {
String date = getDate();
date = deleteBeforeDelimiter(date, " ");
@@ -167,4 +139,31 @@ int timeToMin(String Time) {
Time = deleteBeforeDelimiter(Time, ":"); // Теперь здесь минуты секунды
min += selectToMarker(Time, ":").toInt(); // Добавим секунды из полных минут
return min;
}
}
static const char* TIME_FORMAT PROGMEM = "%2d:%2d:%2d";
static const char* TIME_FORMAT_WITH_DAYS PROGMEM = "%dd %2d:%2d";
const String prettyMillis(unsigned long time_ms) {
unsigned long tmp = time_ms;
unsigned long seconds;
unsigned long minutes;
unsigned long hours;
unsigned long days;
seconds = tmp % 60;
tmp = tmp / 60;
minutes = tmp % 60;
tmp = tmp / 60;
hours = tmp % 24;
days = tmp / 24;
char buf[16];
if (days) {
sprintf_P(buf, TIME_FORMAT, hours, minutes, seconds);
} else {
sprintf_P(buf, TIME_FORMAT_WITH_DAYS, days, hours, minutes);
}
return String(buf);
}

View File

@@ -3,354 +3,351 @@
String stateMQTT();
void web_init() {
server.on("/set", HTTP_GET, [](AsyncWebServerRequest * request) {
String value;
//============================device settings=====================================
if (request->hasArg("preset")) {
//--------------------------------------------------------------------------------
String value;
value = request->getParam("preset")->value();
if (value == "1") {
writeFile("firmware.c.txt", readFile("configs/1-relay.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/1-relay.s.txt", 2048));
}
if (value == "2") {
writeFile("firmware.c.txt", readFile("configs/2-relay.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/2-relay.s.txt", 2048));
}
if (value == "3") {
writeFile("firmware.c.txt", readFile("configs/3-relay.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/3-relay.s.txt", 2048));
}
if (value == "4") {
writeFile("firmware.c.txt", readFile("configs/4-relay.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/4-relay.s.txt", 2048));
}
if (value == "5") {
writeFile("firmware.c.txt", readFile("configs/5-relay.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/5-relay.s.txt", 2048));
}
if (value == "6") {
writeFile("firmware.c.txt", readFile("configs/6-relay.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/6-relay.s.txt", 2048));
}
if (value == "7") {
writeFile("firmware.c.txt", readFile("configs/7-relay.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/7-relay.s.txt", 2048));
}
if (value == "8") {
writeFile("firmware.c.txt", readFile("configs/8-pwm.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/8-pwm.s.txt", 2048));
}
if (value == "9") {
writeFile("firmware.c.txt", readFile("configs/9-dht11.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/9-dht11.s.txt", 2048));
}
if (value == "10") {
writeFile("firmware.c.txt", readFile("configs/10-dht22.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/10-dht22.s.txt", 2048));
}
if (value == "11") {
writeFile("firmware.c.txt", readFile("configs/11-analog.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/11-analog.s.txt", 2048));
}
if (value == "12") {
writeFile("firmware.c.txt", readFile("configs/12-bmp280.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/12-bmp280.s.txt", 2048));
}
if (value == "13") {
writeFile("firmware.c.txt", readFile("configs/13-bme280.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/13-bme280.s.txt", 2048));
}
if (value == "14") {
writeFile("firmware.c.txt", readFile("configs/14-dallas.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/14-dallas.s.txt", 2048));
}
if (value == "15") {
writeFile("firmware.c.txt", readFile("configs/15-termostat.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/15-termostat.s.txt", 2048));
}
if (value == "16") {
writeFile("firmware.c.txt", readFile("configs/16-ultrasonic.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/16-ultrasonic.s.txt", 2048));
}
if (value == "17") {
writeFile("firmware.c.txt", readFile("configs/17-moution.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/17-moution.s.txt", 2048));
}
if (value == "18") {
writeFile("firmware.c.txt", readFile("configs/18-moution.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/18-moution.s.txt", 2048));
}
if (value == "19") {
writeFile("firmware.c.txt", readFile("configs/19-stepper.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/19-stepper.s.txt", 2048));
}
if (value == "20") {
writeFile("firmware.c.txt", readFile("configs/20-servo.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/20-servo.s.txt", 2048));
}
if (value == "21") {
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("/?set.device");
}
//--------------------------------------------------------------------------------
if (request->hasArg("devinit")) {
Device_init();
request->send(200, "text/text", "OK");
}
//--------------------------------------------------------------------------------
if (request->hasArg("scen")) {
value = request->getParam("scen")->value();
if (value == "0") {
jsonWriteStr(configSetupJson, "scen", value);
saveConfig();
Scenario_init();
}
if (value == "1") {
jsonWriteStr(configSetupJson, "scen", value);
saveConfig();
Scenario_init();
}
request->send(200, "text/text", "OK");
}
//--------------------------------------------------------------------------------
if (request->hasArg("sceninit")) {
Scenario_init();
request->send(200, "text/text", "OK");
}
//--------------------------------------------------------------------------------
server.on("/set", HTTP_GET, [](AsyncWebServerRequest* request) {
String value;
//============================device settings=====================================
if (request->hasArg("preset")) {
//--------------------------------------------------------------------------------
String value;
value = request->getParam("preset")->value();
if (value == "1") {
writeFile("firmware.c.txt", readFile("configs/1-relay.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/1-relay.s.txt", 2048));
}
if (value == "2") {
writeFile("firmware.c.txt", readFile("configs/2-relay.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/2-relay.s.txt", 2048));
}
if (value == "3") {
writeFile("firmware.c.txt", readFile("configs/3-relay.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/3-relay.s.txt", 2048));
}
if (value == "4") {
writeFile("firmware.c.txt", readFile("configs/4-relay.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/4-relay.s.txt", 2048));
}
if (value == "5") {
writeFile("firmware.c.txt", readFile("configs/5-relay.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/5-relay.s.txt", 2048));
}
if (value == "6") {
writeFile("firmware.c.txt", readFile("configs/6-relay.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/6-relay.s.txt", 2048));
}
if (value == "7") {
writeFile("firmware.c.txt", readFile("configs/7-relay.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/7-relay.s.txt", 2048));
}
if (value == "8") {
writeFile("firmware.c.txt", readFile("configs/8-pwm.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/8-pwm.s.txt", 2048));
}
if (value == "9") {
writeFile("firmware.c.txt", readFile("configs/9-dht11.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/9-dht11.s.txt", 2048));
}
if (value == "10") {
writeFile("firmware.c.txt", readFile("configs/10-dht22.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/10-dht22.s.txt", 2048));
}
if (value == "11") {
writeFile("firmware.c.txt", readFile("configs/11-analog.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/11-analog.s.txt", 2048));
}
if (value == "12") {
writeFile("firmware.c.txt", readFile("configs/12-bmp280.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/12-bmp280.s.txt", 2048));
}
if (value == "13") {
writeFile("firmware.c.txt", readFile("configs/13-bme280.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/13-bme280.s.txt", 2048));
}
if (value == "14") {
writeFile("firmware.c.txt", readFile("configs/14-dallas.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/14-dallas.s.txt", 2048));
}
if (value == "15") {
writeFile("firmware.c.txt", readFile("configs/15-termostat.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/15-termostat.s.txt", 2048));
}
if (value == "16") {
writeFile("firmware.c.txt", readFile("configs/16-ultrasonic.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/16-ultrasonic.s.txt", 2048));
}
if (value == "17") {
writeFile("firmware.c.txt", readFile("configs/17-moution.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/17-moution.s.txt", 2048));
}
if (value == "18") {
writeFile("firmware.c.txt", readFile("configs/18-moution.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/18-moution.s.txt", 2048));
}
if (value == "19") {
writeFile("firmware.c.txt", readFile("configs/19-stepper.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/19-stepper.s.txt", 2048));
}
if (value == "20") {
writeFile("firmware.c.txt", readFile("configs/20-servo.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/20-servo.s.txt", 2048));
}
if (value == "21") {
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("/?set.device");
}
//--------------------------------------------------------------------------------
if (request->hasArg("devinit")) {
Device_init();
request->send(200, "text/text", "OK");
}
//--------------------------------------------------------------------------------
if (request->hasArg("scen")) {
value = request->getParam("scen")->value();
if (value == "0") {
jsonWriteStr(configSetupJson, "scen", value);
saveConfig();
Scenario_init();
}
if (value == "1") {
jsonWriteStr(configSetupJson, "scen", value);
saveConfig();
Scenario_init();
}
request->send(200, "text/text", "OK");
}
//--------------------------------------------------------------------------------
if (request->hasArg("sceninit")) {
Scenario_init();
request->send(200, "text/text", "OK");
}
//--------------------------------------------------------------------------------
#ifdef logging_enable
if (request->hasArg("cleanlog")) {
clean_log_date();
request->send(200, "text/text", "OK");
}
if (request->hasArg("cleanlog")) {
clean_log_date();
request->send(200, "text/text", "OK");
}
#endif
//==============================udp settings=============================================
if (request->hasArg("udponoff")) {
value = request->getParam("udponoff")->value();
if (value == "0") {
jsonWriteStr(configSetupJson, "udponoff", value);
saveConfig();
Scenario_init();
}
if (value == "1") {
jsonWriteStr(configSetupJson, "udponoff", value);
saveConfig();
Scenario_init();
}
request->send(200, "text/text", "OK");
}
//--------------------------------------------------------------------------------
if (request->hasArg("updatelist")) {
SPIFFS.remove("/dev.csv");
addFile("dev.csv", "device id;device name;ip address");
request->redirect("/?set.udp");
}
//--------------------------------------------------------------------------------
if (request->hasArg("updatepage")) {
request->redirect("/?set.udp");
}
//--------------------------------------------------------------------------------
if (request->hasArg("devname")) {
jsonWriteStr(configSetupJson, "name", request->getParam("devname")->value());
saveConfig();
request->send(200, "text/text", "OK");
}
//==============================wifi settings=============================================
if (request->hasArg("routerssid")) {
jsonWriteStr(configSetupJson, "routerssid", request->getParam("routerssid")->value());
saveConfig();
request->send(200, "text/text", "OK");
}
if (request->hasArg("routerpass")) {
jsonWriteStr(configSetupJson, "routerpass", request->getParam("routerpass")->value());
saveConfig();
request->send(200, "text/text", "OK");
}
//--------------------------------------------------------------------------------
if (request->hasArg("apssid")) {
jsonWriteStr(configSetupJson, "apssid", request->getParam("apssid")->value());
saveConfig();
request->send(200, "text/text", "OK");
}
if (request->hasArg("appass")) {
jsonWriteStr(configSetupJson, "appass", request->getParam("appass")->value());
saveConfig();
request->send(200, "text/text", "OK");
}
//--------------------------------------------------------------------------------
if (request->hasArg("weblogin")) {
jsonWriteStr(configSetupJson, "weblogin", request->getParam("weblogin")->value());
saveConfig();
request->send(200, "text/text", "OK");
}
if (request->hasArg("webpass")) {
jsonWriteStr(configSetupJson, "webpass", request->getParam("webpass")->value());
saveConfig();
request->send(200, "text/text", "OK");
}
//--------------------------------------------------------------------------------
if (request->hasArg("timezone")) {
jsonWriteStr(configSetupJson, "timezone", request->getParam("timezone")->value());
saveConfig();
reconfigTime();
request->send(200, "text/text", "OK");
}
if (request->hasArg("ntp")) {
jsonWriteStr(configSetupJson, "ntp", request->getParam("ntp")->value());
saveConfig();
reconfigTime();
request->send(200, "text/text", "OK");
}
//--------------------------------------------------------------------------------
if (request->hasArg("device")) {
if (request->getParam("device")->value() == "ok") ESP.restart();
request->send(200, "text/text", "OK");
}
//--------------------------------------------------------------------------------
if (request->hasArg("blink")) {
value = request->getParam("blink")->value();
if (value == "0") {
jsonWriteStr(configSetupJson, "blink", value);
saveConfig();
}
if (value == "1") {
jsonWriteStr(configSetupJson, "blink", value);
saveConfig();
}
request->send(200, "text/text", "OK");
}
//==============================mqtt settings=============================================
if (request->hasArg("mqttServer")) {
jsonWriteStr(configSetupJson, "mqttServer", request->getParam("mqttServer")->value());
saveConfig();
mqtt_connection = true;
request->send(200, "text/text", "ok");
}
if (request->hasArg("mqttPort")) {
int port = (request->getParam("mqttPort")->value()).toInt();
jsonWriteInt(configSetupJson, "mqttPort", port);
saveConfig();
mqtt_connection = true;
request->send(200, "text/text", "ok");
}
if (request->hasArg("mqttPrefix")) {
jsonWriteStr(configSetupJson, "mqttPrefix", request->getParam("mqttPrefix")->value());
saveConfig();
mqtt_connection = true;
request->send(200, "text/text", "ok");
}
if (request->hasArg("mqttUser")) {
jsonWriteStr(configSetupJson, "mqttUser", request->getParam("mqttUser")->value());
saveConfig();
mqtt_connection = true;
request->send(200, "text/text", "ok");
}
if (request->hasArg("mqttPass")) {
jsonWriteStr(configSetupJson, "mqttPass", request->getParam("mqttPass")->value());
saveConfig();
mqtt_connection = true;
request->send(200, "text/text", "ok");
}
//--------------------------------------------------------------------------------
if (request->hasArg("mqttsend")) {
mqtt_send_settings_to_udp = true;
request->send(200, "text/text", "ok");
}
//--------------------------------------------------------------------------------
if (request->hasArg("mqttcheck")) {
String tmp = "{}";
jsonWriteStr(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>" + stateMQTT());
jsonWriteStr(tmp, "class", "pop-up");
request->send(200, "text/text", tmp);
}
//==============================push settings=============================================
//==============================udp settings=============================================
if (request->hasArg("udponoff")) {
value = request->getParam("udponoff")->value();
if (value == "0") {
jsonWriteStr(configSetupJson, "udponoff", value);
saveConfig();
Scenario_init();
}
if (value == "1") {
jsonWriteStr(configSetupJson, "udponoff", value);
saveConfig();
Scenario_init();
}
request->send(200, "text/text", "OK");
}
//--------------------------------------------------------------------------------
if (request->hasArg("updatelist")) {
LittleFS.remove("/dev.csv");
addFile("dev.csv", "device id;device name;ip address");
request->redirect("/?set.udp");
}
//--------------------------------------------------------------------------------
if (request->hasArg("updatepage")) {
request->redirect("/?set.udp");
}
//--------------------------------------------------------------------------------
if (request->hasArg("devname")) {
jsonWriteStr(configSetupJson, "name", request->getParam("devname")->value());
saveConfig();
request->send(200, "text/text", "OK");
}
//==============================wifi settings=============================================
if (request->hasArg("routerssid")) {
jsonWriteStr(configSetupJson, "routerssid", request->getParam("routerssid")->value());
saveConfig();
request->send(200, "text/text", "OK");
}
if (request->hasArg("routerpass")) {
jsonWriteStr(configSetupJson, "routerpass", request->getParam("routerpass")->value());
saveConfig();
request->send(200, "text/text", "OK");
}
//--------------------------------------------------------------------------------
if (request->hasArg("apssid")) {
jsonWriteStr(configSetupJson, "apssid", request->getParam("apssid")->value());
saveConfig();
request->send(200, "text/text", "OK");
}
if (request->hasArg("appass")) {
jsonWriteStr(configSetupJson, "appass", request->getParam("appass")->value());
saveConfig();
request->send(200, "text/text", "OK");
}
//--------------------------------------------------------------------------------
if (request->hasArg("weblogin")) {
jsonWriteStr(configSetupJson, "weblogin", request->getParam("weblogin")->value());
saveConfig();
request->send(200, "text/text", "OK");
}
if (request->hasArg("webpass")) {
jsonWriteStr(configSetupJson, "webpass", request->getParam("webpass")->value());
saveConfig();
request->send(200, "text/text", "OK");
}
//--------------------------------------------------------------------------------
if (request->hasArg("timezone")) {
jsonWriteStr(configSetupJson, "timezone", request->getParam("timezone")->value());
saveConfig();
reconfigTime();
request->send(200, "text/text", "OK");
}
if (request->hasArg("ntp")) {
jsonWriteStr(configSetupJson, "ntp", request->getParam("ntp")->value());
saveConfig();
reconfigTime();
request->send(200, "text/text", "OK");
}
//--------------------------------------------------------------------------------
if (request->hasArg("device")) {
if (request->getParam("device")->value() == "ok") ESP.restart();
request->send(200, "text/text", "OK");
}
//--------------------------------------------------------------------------------
if (request->hasArg("blink")) {
value = request->getParam("blink")->value();
if (value == "0") {
jsonWriteStr(configSetupJson, "blink", value);
saveConfig();
}
if (value == "1") {
jsonWriteStr(configSetupJson, "blink", value);
saveConfig();
}
request->send(200, "text/text", "OK");
}
//==============================mqtt settings=============================================
if (request->hasArg("mqttServer")) {
jsonWriteStr(configSetupJson, "mqttServer", request->getParam("mqttServer")->value());
saveConfig();
mqtt_connection = true;
request->send(200, "text/text", "ok");
}
if (request->hasArg("mqttPort")) {
int port = (request->getParam("mqttPort")->value()).toInt();
jsonWriteInt(configSetupJson, "mqttPort", port);
saveConfig();
mqtt_connection = true;
request->send(200, "text/text", "ok");
}
if (request->hasArg("mqttPrefix")) {
jsonWriteStr(configSetupJson, "mqttPrefix", request->getParam("mqttPrefix")->value());
saveConfig();
mqtt_connection = true;
request->send(200, "text/text", "ok");
}
if (request->hasArg("mqttUser")) {
jsonWriteStr(configSetupJson, "mqttUser", request->getParam("mqttUser")->value());
saveConfig();
mqtt_connection = true;
request->send(200, "text/text", "ok");
}
if (request->hasArg("mqttPass")) {
jsonWriteStr(configSetupJson, "mqttPass", request->getParam("mqttPass")->value());
saveConfig();
mqtt_connection = true;
request->send(200, "text/text", "ok");
}
//--------------------------------------------------------------------------------
if (request->hasArg("mqttsend")) {
mqtt_send_settings_to_udp = true;
request->send(200, "text/text", "ok");
}
//--------------------------------------------------------------------------------
if (request->hasArg("mqttcheck")) {
String tmp = "{}";
jsonWriteStr(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>" + stateMQTT());
jsonWriteStr(tmp, "class", "pop-up");
request->send(200, "text/text", tmp);
}
//==============================push settings=============================================
#ifdef push_enable
if (request->hasArg("pushingboxid")) {
jsonWriteStr(configSetupJson, "pushingboxid", request->getParam("pushingboxid")->value());
saveConfig();
request->send(200, "text/text", "ok");
}
if (request->hasArg("pushingboxid")) {
jsonWriteStr(configSetupJson, "pushingboxid", request->getParam("pushingboxid")->value());
saveConfig();
request->send(200, "text/text", "ok");
}
#endif
//==============================utilities settings=============================================
if (request->hasArg("itoc")) {
i2c_scanning = true;
request->redirect("/?set.utilities");
}
});
//==============================upgrade settings=============================================
server.on("/check", HTTP_GET, [](AsyncWebServerRequest * request) {
upgrade_url = true;
Serial.print("[i] Last firmware version: ");
Serial.println(last_version);
String tmp = "{}";
int case_of_update;
if (WiFi.status() != WL_CONNECTED) last_version = "nowifi";
if (!mb_4_of_memory) last_version = "less";
if (last_version == firmware_version) case_of_update = 1;
if (last_version != firmware_version) case_of_update = 2;
if (last_version == "error") case_of_update = 3;
if (last_version == "") case_of_update = 4;
if (last_version == "less") case_of_update = 5;
if (last_version == "nowifi") case_of_update = 6;
if (last_version == "notsupported") case_of_update = 7;
switch (case_of_update) {
case 1: {
jsonWriteStr(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>Последняя версия прошивки уже установлена.");
jsonWriteStr(tmp, "class", "pop-up");
//==============================utilities settings=============================================
if (request->hasArg("itoc")) {
i2c_scanning = true;
request->redirect("/?set.utilities");
}
break;
});
//==============================upgrade settings=============================================
server.on("/check", HTTP_GET, [](AsyncWebServerRequest* request) {
upgrade_url = true;
Serial.print("[I] Last firmware version: ");
Serial.println(last_version);
String tmp = "{}";
int case_of_update;
case 2: {
jsonWriteStr(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>Имеется новая версия прошивки<a href=\"#\" class=\"btn btn-block btn-danger\" onclick=\"send_request(this, '/upgrade');setTimeout(function(){ location.href='/'; }, 120000);html('my-block','<span class=loader></span>Идет обновление прошивки, после обновления страница перезагрузится автоматически...')\">Установить</a>");
jsonWriteStr(tmp, "class", "pop-up");
if (WiFi.status() != WL_CONNECTED) last_version = "nowifi";
if (!mb_4_of_memory) last_version = "less";
if (last_version == firmware_version) case_of_update = 1;
if (last_version != firmware_version) case_of_update = 2;
if (last_version == "error") case_of_update = 3;
if (last_version == "") case_of_update = 4;
if (last_version == "less") case_of_update = 5;
if (last_version == "nowifi") case_of_update = 6;
if (last_version == "notsupported") case_of_update = 7;
switch (case_of_update) {
case 1: {
jsonWriteStr(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>Последняя версия прошивки уже установлена.");
jsonWriteStr(tmp, "class", "pop-up");
} break;
case 2: {
jsonWriteStr(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>Имеется новая версия прошивки<a href=\"#\" class=\"btn btn-block btn-danger\" onclick=\"send_request(this, '/upgrade');setTimeout(function(){ location.href='/'; }, 120000);html('my-block','<span class=loader></span>Идет обновление прошивки, после обновления страница перезагрузится автоматически...')\">Установить</a>");
jsonWriteStr(tmp, "class", "pop-up");
} break;
case 3: {
jsonWriteStr(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>Ошибка... Cервер не найден. Попробуйте позже...");
jsonWriteStr(tmp, "class", "pop-up");
} break;
case 4: {
jsonWriteStr(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>Нажмите на кнопку \"обновить прошивку\" повторно...");
jsonWriteStr(tmp, "class", "pop-up");
break;
}
case 5: {
jsonWriteStr(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>Обновление по воздуху не поддерживается, модуль имеет меньше 4 мб памяти...");
jsonWriteStr(tmp, "class", "pop-up");
break;
}
case 6: {
jsonWriteStr(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>Устройство не подключено к роутеру...");
jsonWriteStr(tmp, "class", "pop-up");
break;
}
case 7: {
jsonWriteStr(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>Обновление на новую версию возможно только через usb...");
jsonWriteStr(tmp, "class", "pop-up");
break;
}
}
break;
request->send(200, "text/text", tmp);
});
case 3: {
jsonWriteStr(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>Ошибка... Cервер не найден. Попробуйте позже...");
jsonWriteStr(tmp, "class", "pop-up");
}
break;
case 4: {
jsonWriteStr(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>Нажмите на кнопку \"обновить прошивку\" повторно...");
jsonWriteStr(tmp, "class", "pop-up");
break;
}
case 5: {
jsonWriteStr(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>Обновление по воздуху не поддерживается, модуль имеет меньше 4 мб памяти...");
jsonWriteStr(tmp, "class", "pop-up");
break;
}
case 6: {
jsonWriteStr(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>Устройство не подключено к роутеру...");
jsonWriteStr(tmp, "class", "pop-up");
break;
}
case 7: {
jsonWriteStr(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>Обновление на новую версию возможно только через usb...");
jsonWriteStr(tmp, "class", "pop-up");
break;
}
}
request->send(200, "text/text", tmp);
});
server.on("/upgrade", HTTP_GET, [](AsyncWebServerRequest * request) {
upgrade = true;
String tmp = "{}";
request->send(200, "text/text", "ok");
});
server.on("/upgrade", HTTP_GET, [](AsyncWebServerRequest* request) {
upgrade = true;
String tmp = "{}";
request->send(200, "text/text", "ok");
});
}

View File

@@ -1,234 +1,236 @@
#include "Global.h"
void Web_server_init() {
/*********************************************************************************
/*********************************************************************************
***************************************OTA****************************************
*********************************************************************************/
#ifdef OTA_enable
ArduinoOTA.onStart([]() {
events.send("Update Start", "ota");
});
ArduinoOTA.onEnd([]() {
events.send("Update End", "ota");
});
ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
char p[32];
sprintf(p, "Progress: %u%%\n", (progress / (total / 100)));
events.send(p, "ota");
});
ArduinoOTA.onError([](ota_error_t error) {
if (error == OTA_AUTH_ERROR) events.send("Auth Failed", "ota");
else if (error == OTA_BEGIN_ERROR) events.send("Begin Failed", "ota");
else if (error == OTA_CONNECT_ERROR) events.send("Connect Failed", "ota");
else if (error == OTA_RECEIVE_ERROR) events.send("Recieve Failed", "ota");
else if (error == OTA_END_ERROR) events.send("End Failed", "ota");
});
ArduinoOTA.setHostname(hostName);
ArduinoOTA.begin();
ArduinoOTA.onStart([]() {
events.send("Update Start", "ota");
});
ArduinoOTA.onEnd([]() {
events.send("Update End", "ota");
});
ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
char p[32];
sprintf(p, "Progress: %u%%\n", (progress / (total / 100)));
events.send(p, "ota");
});
ArduinoOTA.onError([](ota_error_t error) {
if (error == OTA_AUTH_ERROR)
events.send("Auth Failed", "ota");
else if (error == OTA_BEGIN_ERROR)
events.send("Begin Failed", "ota");
else if (error == OTA_CONNECT_ERROR)
events.send("Connect Failed", "ota");
else if (error == OTA_RECEIVE_ERROR)
events.send("Recieve Failed", "ota");
else if (error == OTA_END_ERROR)
events.send("End Failed", "ota");
});
ArduinoOTA.setHostname(hostName);
ArduinoOTA.begin();
#endif
/*********************************************************************************
/*********************************************************************************
**************************************MDNS****************************************
*********************************************************************************/
#ifdef MDNS_enable
MDNS.addService("http", "tcp", 80);
MDNS.addService("http", "tcp", 80);
#endif
//SPIFFS.begin();
/*********************************************************************************
//LittleFS.begin();
/*********************************************************************************
**************************************WS******************************************
*********************************************************************************/
#ifdef WS_enable
ws.onEvent(onWsEvent);
server.addHandler(&ws);
ws.onEvent(onWsEvent);
server.addHandler(&ws);
events.onConnect([](AsyncEventSourceClient * client) {
//!!!client->send("hello!", NULL, millis(), 1000);
});
events.onConnect([](AsyncEventSourceClient *client) {
//!!!client->send("hello!", NULL, millis(), 1000);
});
server.addHandler(&events);
server.addHandler(&events);
#endif
/*********************************************************************************
/*********************************************************************************
**************************************WEB****************************************
*********************************************************************************/
#ifdef ESP32
server.addHandler(new SPIFFSEditor(SPIFFS, jsonReadStr(configSetupJson, "weblogin").c_str(), jsonReadStr(configSetupJson, "webpass").c_str()));
server.addHandler(new SPIFFSEditor(LittleFS, jsonReadStr(configSetupJson, "weblogin").c_str(), jsonReadStr(configSetupJson, "webpass").c_str()));
#elif defined(ESP8266)
server.addHandler(new SPIFFSEditor(jsonReadStr(configSetupJson, "weblogin").c_str(), jsonReadStr(configSetupJson, "webpass").c_str()));
server.addHandler(new SPIFFSEditor(jsonReadStr(configSetupJson, "weblogin").c_str(), jsonReadStr(configSetupJson, "webpass").c_str()));
#endif
/* server.on("/heap", HTTP_GET, [](AsyncWebServerRequest * request) {
/* server.on("/heap", HTTP_GET, [](AsyncWebServerRequest * request) {
request->send(200, "text/plain", String(ESP.getFreeHeap()));
});*/
server.serveStatic("/css/", SPIFFS, "/css/").setCacheControl("max-age=31536000");
server.serveStatic("/js/", SPIFFS, "/js/").setCacheControl("max-age=31536000");
server.serveStatic("/favicon.ico", SPIFFS, "/favicon.ico").setCacheControl("max-age=31536000");
server.serveStatic("/icon.jpeg", SPIFFS, "/icon.jpeg").setCacheControl("max-age=31536000");
server.serveStatic("/css/", LittleFS, "/css/").setCacheControl("max-age=31536000");
server.serveStatic("/js/", LittleFS, "/js/").setCacheControl("max-age=31536000");
server.serveStatic("/favicon.ico", LittleFS, "/favicon.ico").setCacheControl("max-age=31536000");
server.serveStatic("/icon.jpeg", LittleFS, "/icon.jpeg").setCacheControl("max-age=31536000");
server.serveStatic("/", SPIFFS, "/").setDefaultFile("index.htm")
.setAuthentication(jsonReadStr(configSetupJson, "weblogin").c_str(), jsonReadStr(configSetupJson, "webpass").c_str());
server.serveStatic("/", LittleFS, "/").setDefaultFile("index.htm").setAuthentication(jsonReadStr(configSetupJson, "weblogin").c_str(), jsonReadStr(configSetupJson, "webpass").c_str());
server.onNotFound([](AsyncWebServerRequest * request) {
Serial.printf("NOT_FOUND: ");
if (request->method() == HTTP_GET)
Serial.printf("GET");
else if (request->method() == HTTP_POST)
Serial.printf("POST");
else if (request->method() == HTTP_DELETE)
Serial.printf("DELETE");
else if (request->method() == HTTP_PUT)
Serial.printf("PUT");
else if (request->method() == HTTP_PATCH)
Serial.printf("PATCH");
else if (request->method() == HTTP_HEAD)
Serial.printf("HEAD");
else if (request->method() == HTTP_OPTIONS)
Serial.printf("OPTIONS");
else
Serial.printf("UNKNOWN");
Serial.printf(" http://%s%s\n", request->host().c_str(), request->url().c_str());
server.onNotFound([](AsyncWebServerRequest *request) {
Serial.printf("NOT_FOUND: ");
if (request->method() == HTTP_GET)
Serial.printf("GET");
else if (request->method() == HTTP_POST)
Serial.printf("POST");
else if (request->method() == HTTP_DELETE)
Serial.printf("DELETE");
else if (request->method() == HTTP_PUT)
Serial.printf("PUT");
else if (request->method() == HTTP_PATCH)
Serial.printf("PATCH");
else if (request->method() == HTTP_HEAD)
Serial.printf("HEAD");
else if (request->method() == HTTP_OPTIONS)
Serial.printf("OPTIONS");
else
Serial.printf("UNKNOWN");
Serial.printf(" http://%s%s\n", request->host().c_str(), request->url().c_str());
if (request->contentLength()) {
Serial.printf("_CONTENT_TYPE: %s\n", request->contentType().c_str());
Serial.printf("_CONTENT_LENGTH: %u\n", request->contentLength());
}
if (request->contentLength()) {
Serial.printf("_CONTENT_TYPE: %s\n", request->contentType().c_str());
Serial.printf("_CONTENT_LENGTH: %u\n", request->contentLength());
}
int headers = request->headers();
int i;
for (i = 0; i < headers; i++) {
AsyncWebHeader* h = request->getHeader(i);
Serial.printf("_HEADER[%s]: %s\n", h->name().c_str(), h->value().c_str());
}
int headers = request->headers();
int i;
for (i = 0; i < headers; i++) {
AsyncWebHeader *h = request->getHeader(i);
Serial.printf("_HEADER[%s]: %s\n", h->name().c_str(), h->value().c_str());
}
int params = request->params();
for (i = 0; i < params; i++) {
AsyncWebParameter* p = request->getParam(i);
if (p->isFile()) {
Serial.printf("_FILE[%s]: %s, size: %u\n", p->name().c_str(), p->value().c_str(), p->size());
} else if (p->isPost()) {
Serial.printf("_POST[%s]: %s\n", p->name().c_str(), p->value().c_str());
} else {
Serial.printf("_GET[%s]: %s\n", p->name().c_str(), p->value().c_str());
}
}
int params = request->params();
for (i = 0; i < params; i++) {
AsyncWebParameter *p = request->getParam(i);
if (p->isFile()) {
Serial.printf("_FILE[%s]: %s, size: %u\n", p->name().c_str(), p->value().c_str(), p->size());
} else if (p->isPost()) {
Serial.printf("_POST[%s]: %s\n", p->name().c_str(), p->value().c_str());
} else {
Serial.printf("_GET[%s]: %s\n", p->name().c_str(), p->value().c_str());
}
}
request->send(404);
});
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());
Serial.printf("%s", (const char *)data);
if (final)
Serial.printf("UploadEnd: %s (%u)\n", filename.c_str(), index + len);
});
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());
Serial.printf("%s", (const char*)data);
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);
Serial.printf("%s", (const char *)data);
if (index + len == total)
Serial.printf("BodyEnd: %u\n", total);
});
server.begin();
server.onRequestBody([](AsyncWebServerRequest * request, uint8_t *data, size_t len, size_t index, size_t total) {
if (!index)
Serial.printf("BodyStart: %u\n", total);
Serial.printf("%s", (const char*)data);
if (index + len == total)
Serial.printf("BodyEnd: %u\n", total);
});
// --------------------Выдаем данные configJson //config.live.json - динамические данные
server.on("/config.live.json", HTTP_GET, [](AsyncWebServerRequest *request) {
request->send(200, "application/json", configLiveJson);
});
// --------------------Выдаем данные optionJson //config.option.json - данные не являющиеся событиями
server.on("/config.option.json", HTTP_GET, [](AsyncWebServerRequest *request) {
request->send(200, "application/json", configOptionJson);
});
// -------------------Выдаем данные configSetup //config.setup.json - для хранения постоянных данных
server.on("/config.setup.json", HTTP_GET, [](AsyncWebServerRequest *request) {
request->send(200, "application/json", configSetupJson);
});
server.begin();
// --------------------Выдаем данные configJson //config.live.json - динамические данные
server.on("/config.live.json", HTTP_GET, [](AsyncWebServerRequest * request) {
request->send(200, "application/json", configLiveJson);
});
// --------------------Выдаем данные optionJson //config.option.json - данные не являющиеся событиями
server.on("/config.option.json", HTTP_GET, [](AsyncWebServerRequest * request) {
request->send(200, "application/json", configOptionJson);
});
// -------------------Выдаем данные configSetup //config.setup.json - для хранения постоянных данных
server.on("/config.setup.json", HTTP_GET, [](AsyncWebServerRequest * request) {
request->send(200, "application/json", configSetupJson);
});
// ------------------Выполнение команды из запроса
//http://192.168.88.45/cmd?command=rel%201%201
server.on("/cmd", HTTP_GET, [](AsyncWebServerRequest * request) {
String com = request->getParam("command")->value();
Serial.println(com);
order_loop += com + ",";
request->send(200, "text/text", "OK"); // отправляем ответ о выполнении
});
// ------------------Выполнение команды из запроса
//http://192.168.88.45/cmd?command=rel%201%201
server.on("/cmd", HTTP_GET, [](AsyncWebServerRequest *request) {
String com = request->getParam("command")->value();
Serial.println(com);
order_loop += com + ",";
request->send(200, "text/text", "OK"); // отправляем ответ о выполнении
});
}
/*********************************************************************************************************************************
*********************************************************WS**********************************************************************
********************************************************************************************************************************/
#ifdef WS_enable
void onWsEvent(AsyncWebSocket * server, AsyncWebSocketClient * client, AwsEventType type, void * arg, uint8_t *data, size_t len) {
if (type == WS_EVT_CONNECT) {
Serial.printf("ws[%s][%u] connect\n", server->url(), client->id());
client->printf(json.c_str(), client->id());
//client->ping();
} else if (type == WS_EVT_DISCONNECT) {
Serial.printf("ws[%s][%u] disconnect\n", server->url(), client->id());
} else if (type == WS_EVT_ERROR) {
Serial.printf("ws[%s][%u] error(%u): %s\n", server->url(), client->id(), *((uint16_t*)arg), (char*)data);
} else if (type == WS_EVT_PONG) {
Serial.printf("ws[%s][%u] pong[%u]: %s\n", server->url(), client->id(), len, (len) ? (char*)data : "");
} else if (type == WS_EVT_DATA) {
AwsFrameInfo * info = (AwsFrameInfo*)arg;
String msg = "";
if (info->final && info->index == 0 && info->len == len) {
//the whole message is in a single frame and we got all of it's data
Serial.printf("ws[%s][%u] %s-message[%llu]: ", server->url(), client->id(), (info->opcode == WS_TEXT) ? "text" : "binary", info->len);
void onWsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type, void *arg, uint8_t *data, size_t len) {
if (type == WS_EVT_CONNECT) {
Serial.printf("ws[%s][%u] connect\n", server->url(), client->id());
client->printf(json.c_str(), client->id());
//client->ping();
} else if (type == WS_EVT_DISCONNECT) {
Serial.printf("ws[%s][%u] disconnect\n", server->url(), client->id());
} else if (type == WS_EVT_ERROR) {
Serial.printf("ws[%s][%u] error(%u): %s\n", server->url(), client->id(), *((uint16_t *)arg), (char *)data);
} else if (type == WS_EVT_PONG) {
Serial.printf("ws[%s][%u] pong[%u]: %s\n", server->url(), client->id(), len, (len) ? (char *)data : "");
} else if (type == WS_EVT_DATA) {
AwsFrameInfo *info = (AwsFrameInfo *)arg;
String msg = "";
if (info->final && info->index == 0 && info->len == len) {
//the whole message is in a single frame and we got all of it's data
Serial.printf("ws[%s][%u] %s-message[%llu]: ", server->url(), client->id(), (info->opcode == WS_TEXT) ? "text" : "binary", info->len);
if (info->opcode == WS_TEXT) {
for (size_t i = 0; i < info->len; i++) {
msg += (char) data[i];
}
} else {
char buff[3];
for (size_t i = 0; i < info->len; i++) {
sprintf(buff, "%02x ", (uint8_t) data[i]);
msg += buff ;
}
}
Serial.printf("%s\n", msg.c_str());
if (info->opcode == WS_TEXT) {
for (size_t i = 0; i < info->len; i++) {
msg += (char)data[i];
}
} else {
char buff[3];
for (size_t i = 0; i < info->len; i++) {
sprintf(buff, "%02x ", (uint8_t)data[i]);
msg += buff;
}
}
Serial.printf("%s\n", msg.c_str());
if (info->opcode == WS_TEXT)
client->text("{}");
else
client->binary("{}");
} else {
//message is comprised of multiple frames or the frame is split into multiple packets
if (info->index == 0) {
if (info->num == 0)
Serial.printf("ws[%s][%u] %s-message start\n", server->url(), client->id(), (info->message_opcode == WS_TEXT) ? "text" : "binary");
Serial.printf("ws[%s][%u] frame[%u] start[%llu]\n", server->url(), client->id(), info->num, info->len);
}
if (info->opcode == WS_TEXT)
client->text("{}");
else
client->binary("{}");
} else {
//message is comprised of multiple frames or the frame is split into multiple packets
if (info->index == 0) {
if (info->num == 0)
Serial.printf("ws[%s][%u] %s-message start\n", server->url(), client->id(), (info->message_opcode == WS_TEXT) ? "text" : "binary");
Serial.printf("ws[%s][%u] frame[%u] start[%llu]\n", server->url(), client->id(), info->num, info->len);
}
Serial.printf("ws[%s][%u] frame[%u] %s[%llu - %llu]: ", server->url(), client->id(), info->num, (info->message_opcode == WS_TEXT) ? "text" : "binary", info->index, info->index + len);
Serial.printf("ws[%s][%u] frame[%u] %s[%llu - %llu]: ", server->url(), client->id(), info->num, (info->message_opcode == WS_TEXT) ? "text" : "binary", info->index, info->index + len);
if (info->opcode == WS_TEXT) {
for (size_t i = 0; i < len; i++) {
msg += (char) data[i];
}
} else {
char buff[3];
for (size_t i = 0; i < len; i++) {
sprintf(buff, "%02x ", (uint8_t) data[i]);
msg += buff ;
}
}
Serial.printf("%s\n", msg.c_str());
if (info->opcode == WS_TEXT) {
for (size_t i = 0; i < len; i++) {
msg += (char)data[i];
}
} else {
char buff[3];
for (size_t i = 0; i < len; i++) {
sprintf(buff, "%02x ", (uint8_t)data[i]);
msg += buff;
}
}
Serial.printf("%s\n", msg.c_str());
if ((info->index + len) == info->len) {
Serial.printf("ws[%s][%u] frame[%u] end[%llu]\n", server->url(), client->id(), info->num, info->len);
if (info->final) {
Serial.printf("ws[%s][%u] %s-message end\n", server->url(), client->id(), (info->message_opcode == WS_TEXT) ? "text" : "binary");
if (info->message_opcode == WS_TEXT)
client->text("I got your text message");
else
client->binary("I got your binary message");
if ((info->index + len) == info->len) {
Serial.printf("ws[%s][%u] frame[%u] end[%llu]\n", server->url(), client->id(), info->num, info->len);
if (info->final) {
Serial.printf("ws[%s][%u] %s-message end\n", server->url(), client->id(), (info->message_opcode == WS_TEXT) ? "text" : "binary");
if (info->message_opcode == WS_TEXT)
client->text("I got your text message");
else
client->binary("I got your binary message");
}
}
}
}
}
}
}
#endif

View File

@@ -3,131 +3,109 @@
boolean RouterFind(String ssid);
void ROUTER_Connecting() {
led_blink("slow");
led_blink("slow");
WiFi.mode(WIFI_STA);
WiFi.mode(WIFI_STA);
byte tries = 20;
String _ssid = jsonReadStr(configSetupJson, "routerssid");
String _password = jsonReadStr(configSetupJson, "routerpass");
//WiFi.persistent(false);
byte tries = 20;
String _ssid = jsonReadStr(configSetupJson, "routerssid");
String _password = jsonReadStr(configSetupJson, "routerpass");
//WiFi.persistent(false);
if (_ssid == "" && _password == "") {
WiFi.begin();
}
else {
WiFi.begin(_ssid.c_str(), _password.c_str());
Serial.print("ssid: ");
Serial.println(_ssid);
}
// Делаем проверку подключения до тех пор пока счетчик tries
// не станет равен нулю или не получим подключение
while (--tries && WiFi.status() != WL_CONNECTED) {
if (WiFi.status() == WL_CONNECT_FAILED) {
Serial.println("[E] password is not correct");
tries = 1;
jsonWriteInt(configOptionJson, "pass_status", 1);
if (_ssid == "" && _password == "") {
WiFi.begin();
} else {
WiFi.begin(_ssid.c_str(), _password.c_str());
Serial.print("ssid: ");
Serial.println(_ssid);
}
// Делаем проверку подключения до тех пор пока счетчик tries
// не станет равен нулю или не получим подключение
while (--tries && WiFi.status() != WL_CONNECTED) {
if (WiFi.status() == WL_CONNECT_FAILED) {
Serial.println("[E] password is not correct");
tries = 1;
jsonWriteInt(configOptionJson, "pass_status", 1);
}
Serial.print(".");
delay(1000);
}
Serial.print(".");
delay(1000);
}
if (WiFi.status() != WL_CONNECTED)
{
// Если не удалось подключиться запускаем в режиме AP
Serial.println("");
// WiFi.disconnect(true);
StartAPMode();
if (WiFi.status() != WL_CONNECTED) {
// Если не удалось подключиться запускаем в режиме AP
Serial.println("");
// WiFi.disconnect(true);
StartAPMode();
}
else {
// Иначе удалось подключиться отправляем сообщение
// о подключении и выводим адрес IP
Serial.println("");
Serial.println("[V] WiFi connected");
Serial.print("[V] IP address: http://");
Serial.print(WiFi.localIP());
Serial.println("");
jsonWriteStr(configSetupJson, "ip", WiFi.localIP().toString());
led_blink("off");
//add_dev_in_list("dev.txt", chipID, WiFi.localIP().toString());
MQTT_init();
}
} else {
// Иначе удалось подключиться отправляем сообщение
// о подключении и выводим адрес IP
Serial.println("");
Serial.println("[V] WiFi connected");
Serial.print("[V] IP address: http://");
Serial.print(WiFi.localIP());
Serial.println("");
jsonWriteStr(configSetupJson, "ip", WiFi.localIP().toString());
led_blink("off");
//add_dev_in_list("dev.txt", chipID, WiFi.localIP().toString());
MQTT_init();
}
}
bool StartAPMode() {
Serial.println("WiFi up AP");
WiFi.disconnect();
Serial.println("[I] WiFi AP");
WiFi.disconnect();
WiFi.mode(WIFI_AP);
WiFi.mode(WIFI_AP);
String _ssidAP = jsonReadStr(configSetupJson, "apssid");
String _passwordAP = jsonReadStr(configSetupJson, "appass");
WiFi.softAP(_ssidAP.c_str(), _passwordAP.c_str());
IPAddress myIP = WiFi.softAPIP();
led_blink("on");
Serial.print("AP IP address: ");
Serial.println(myIP);
jsonWriteStr(configSetupJson, "ip", myIP.toString());
String _ssidAP = jsonReadStr(configSetupJson, "apssid");
String _passwordAP = jsonReadStr(configSetupJson, "appass");
WiFi.softAP(_ssidAP.c_str(), _passwordAP.c_str());
IPAddress myIP = WiFi.softAPIP();
led_blink("on");
Serial.print("[I] AP IP: ");
Serial.println(myIP);
jsonWriteStr(configSetupJson, "ip", myIP.toString());
//if (jsonReadInt(configOptionJson, "pass_status") != 1) {
ts.add(ROUTER_SEARCHING, 10 * 1000, [&](void*) {
Serial.println("->try find router");
if (RouterFind(jsonReadStr(configSetupJson, "routerssid"))) {
ts.remove(ROUTER_SEARCHING);
WiFi.scanDelete();
ROUTER_Connecting();
}
}, nullptr, true);
//}
return true;
//if (jsonReadInt(configOptionJson, "pass_status") != 1) {
ts.add(
ROUTER_SEARCHING, 10 * 1000, [&](void*) {
Serial.println("[I] searching ssid");
if (RouterFind(jsonReadStr(configSetupJson, "routerssid"))) {
ts.remove(ROUTER_SEARCHING);
WiFi.scanDelete();
ROUTER_Connecting();
}
},
nullptr, true);
//}
return true;
}
boolean RouterFind(String ssid)
{
boolean RouterFind(String ssid) {
bool res = false;
int n = WiFi.scanComplete();
Serial.println("n = " + String(n));
if (n == -2)
{ //Сканирование не было запущено, запускаем
Serial.println("[WIFI][i] scanning has not been triggered, starting scanning");
WiFi.scanNetworks(true, false); //async, show_hidde
}
else if (n == -1)
{ //Сканирование все еще выполняется
Serial.println("[WIFI][i] scanning still in progress");
}
else if (n == 0)
{ //ни одна сеть не найдена
Serial.println("[WIFI][i] no any wifi sations, starting scanning");
int8_t n = WiFi.scanComplete();
Serial.printf("[I][WIFI] scan result = %d\n", n);
if (n == -2) {
// не было запущено, запускаем
Serial.println("[I][WIFI] scanning has not been triggered, start scanning");
// async, show_hidden
WiFi.scanNetworks(true, false);
}
else if (n > 0)
{
for (int i = 0; i <= n; i++)
{
if (WiFi.SSID(i) == ssid)
{
} else if (n == -1) {
// все еще выполняется
Serial.println("[I][WIFI] scanning in progress");
} else if (n == 0) {
// не найдена ни одна сеть
Serial.println("[I][WIFI] no wifi stations, start scanning");
WiFi.scanNetworks(true, false);
} else if (n > 0) {
for (int8_t i = 0; i < n; i++) {
if (WiFi.SSID(i) == ssid) {
WiFi.scanDelete();
res = true;
}
else
{
Serial.print(i);
Serial.print(")");
if (i == n)
{
Serial.print(WiFi.SSID(i));
Serial.println("; ");
}
else
{
Serial.print(WiFi.SSID(i));
Serial.println("; ");
}
} else {
Serial.printf("%d) %s;\n", i, WiFi.SSID(i).c_str());
}
}
WiFi.scanDelete();

View File

@@ -3,47 +3,51 @@
void not_async_actions();
void setup() {
//--------------------------------------------------------------
Serial.begin(115200);
Serial.println();
Serial.println("--------------started----------------");
//Serial.setDebugOutput(true);
setChipId();
File_system_init();
Serial.println("SPIFFS_init");
//--------------------------------------------------------------
Serial.println("[V] LittleFS");
CMD_init();
Serial.println("[V] CMD_init");
//--------------------------------------------------------------
Serial.println("[V] Commands");
sensors_init();
Serial.println("[V] sensors_init");
//--------------------------------------------------------------
Serial.println("[V] Sensors");
All_init();
Serial.println("[V] All_init");
//--------------------------------------------------------------
Serial.println("[V] All");
ROUTER_Connecting();
Serial.println("[V] ROUTER_Connecting");
//--------------------------------------------------------------
uptime_init();
Serial.println("[V] statistics_init");
//--------------------------------------------------------------
initUpgrade();
Serial.println("[V] initUpgrade");
//--------------------------------------------------------------
Web_server_init();
Serial.println("[V] Web_server_init");
//--------------------------------------------------------------
web_init();
Serial.println("[V] web_init");
//--------------------------------------------------------------
Time_Init();
Serial.println("[V] Time_Init");
//--------------------------------------------------------------
#ifdef UDP_enable
UDP_init();
Serial.println("[V] UDP_init");
#endif
//--------------------------------------------------------------
ts.add(
TEST, 10000, [&](void*) {
getMemoryLoad("[i] periodic check of");
//ws.textAll(json);
getMemoryLoad("[I] sysinfo ");
},
nullptr, true);

View File

@@ -33,7 +33,7 @@ void safeDataToFile(String data, String Folder) {
void sendCONFIG(String topik, String widgetConfig, String key, String date) {
yield();
topik = jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipID + "/" + topik + "/status";
topik = jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipId + "/" + topik + "/status";
String outer = "{\"widgetConfig\":";
String inner = "{\"";
inner = inner + key;
@@ -65,16 +65,32 @@ void led_blink(String satus) {
#endif
}
const String getChipId() {
String res;
#ifdef ESP32
res = String(ESP.getEfuseMac());
#endif
#ifdef ESP8266
res = String(ESP.getChipId()) + "-" + String(ESP.getFlashChipId());
#endif
return res;
}
void setChipId() {
chipId = getChipId();
Serial.println(chipId);
}
void getMemoryLoad(String text) {
#ifdef ESP8266
int all_memory = 52864;
uint32_t all_memory = 52864;
#endif
#ifdef ESP32
int all_memory = 362868;
uint32_t all_memory = 362868;
#endif
int memory_remain = ESP.getFreeHeap();
int memory_used = all_memory - memory_remain;
int memory_load = (memory_used * 100) / all_memory;
uint32_t memory_remain = ESP.getFreeHeap();
uint32_t memory_used = all_memory - memory_remain;
uint32_t memory_load = (memory_used * 100) / all_memory;
if (memory_load > 65) {
Serial.println("Memory low!");
}

View File

@@ -20,7 +20,7 @@ void add_dev_in_list(String fileName, String id, String dev_name, String ip);
#ifdef UDP_enable
void UDP_init() {
SPIFFS.remove("/dev.csv");
LittleFS.remove("/dev.csv");
addFile("dev.csv", "device id;device name;ip address");
#ifdef ESP8266
@@ -37,7 +37,7 @@ void UDP_init() {
if (jsonReadStr(configSetupJson, "udponoff") == "1") {
if (WiFi.status() == WL_CONNECTED) {
if (!udp_busy) {
String line_to_send = "iotm;" + chipID + ";" + jsonReadStr(configSetupJson, "name");
String line_to_send = "iotm;" + chipId + ";" + jsonReadStr(configSetupJson, "name");
#ifdef ESP8266
Udp.beginPacketMulticast(udp_multicastIP, udp_port, WiFi.localIP());
Udp.write(line_to_send.c_str());
@@ -122,10 +122,10 @@ void do_udp_data_parse() {
}
}
void add_dev_in_list(String fileName, String id, String dev_name, String ip) {
File configFile = SPIFFS.open("/" + fileName, "r");
void add_dev_in_list(String filename, String id, String dev_name, String ip) {
File configFile = LittleFS.open("/" + filename, "r");
if (!configFile.find(id.c_str())) {
addFile(fileName, id + ";" + dev_name + "; <a href=\"http://" + ip + "\" target=\"_blank\"\">" + ip + "</a>");
addFile(filename, id + ";" + dev_name + "; <a href=\"http://" + ip + "\" target=\"_blank\"\">" + ip + "</a>");
}
}