2019-12-24 11:53:26 +03:00
|
|
|
|
void Time_Init() {
|
2020-05-02 12:20:30 +02:00
|
|
|
|
server.on("/time", HTTP_GET, [](AsyncWebServerRequest * request) {
|
2020-02-13 20:20:34 +03:00
|
|
|
|
if (request->hasArg("timezone")) {
|
2020-03-27 15:48:17 +01:00
|
|
|
|
jsonWriteStr(configSetup, "timezone", request->getParam("timezone")->value());
|
2020-02-13 20:20:34 +03:00
|
|
|
|
}
|
2020-05-02 12:20:30 +02:00
|
|
|
|
if (request->hasArg("ntp")) {
|
|
|
|
|
|
jsonWriteStr(configSetup, "ntp", request->getParam("ntp")->value());
|
|
|
|
|
|
}
|
2020-02-13 20:20:34 +03:00
|
|
|
|
saveConfig();
|
|
|
|
|
|
reconfigTime();
|
2019-12-24 11:53:26 +03:00
|
|
|
|
request->send(200, "text/text", "OK"); // отправляем ответ о выполнении
|
|
|
|
|
|
});
|
2020-03-27 15:48:17 +01:00
|
|
|
|
|
|
|
|
|
|
ts.add(TIME_SYNC, 30000, [&](void*) {
|
2020-05-02 12:20:30 +02:00
|
|
|
|
time_check();
|
2020-03-27 15:48:17 +01:00
|
|
|
|
}, nullptr, true);
|
2019-12-24 11:53:26 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
2020-05-02 12:20:30 +02:00
|
|
|
|
void time_check() {
|
|
|
|
|
|
if (GetTimeUnix() == "failed") {
|
|
|
|
|
|
Serial.println("[i] Time is not synchronized, start synchronization");
|
|
|
|
|
|
reconfigTime();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2020-02-13 20:20:34 +03:00
|
|
|
|
void reconfigTime() {
|
2020-05-19 21:13:54 +02:00
|
|
|
|
if (WiFi.status() == WL_CONNECTED) {
|
2020-05-02 12:20:30 +02:00
|
|
|
|
String ntp = jsonRead(configSetup, "ntp");
|
2020-05-19 21:13:54 +02:00
|
|
|
|
configTime(0, 0, ntp.c_str());
|
2020-02-13 20:20:34 +03:00
|
|
|
|
int i = 0;
|
2020-05-19 21:13:54 +02:00
|
|
|
|
Serial.println("[i] Awaiting for time ");
|
2020-02-13 20:20:34 +03:00
|
|
|
|
#ifdef ESP32
|
|
|
|
|
|
struct tm timeinfo;
|
|
|
|
|
|
while (!getLocalTime(&timeinfo) && i <= 4) {
|
|
|
|
|
|
Serial.print(".");
|
|
|
|
|
|
i++;
|
|
|
|
|
|
delay(1000);
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
#ifdef ESP8266
|
2020-05-19 21:13:54 +02:00
|
|
|
|
//while (!time(nullptr) && i < 4) {
|
|
|
|
|
|
// Serial.print(".");
|
|
|
|
|
|
// i++;
|
|
|
|
|
|
delay(2000);
|
|
|
|
|
|
//}
|
2020-02-13 20:20:34 +03:00
|
|
|
|
#endif
|
2020-03-27 15:48:17 +01:00
|
|
|
|
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");
|
|
|
|
|
|
}
|
2020-02-13 20:20:34 +03:00
|
|
|
|
} else {
|
|
|
|
|
|
Serial.println("[E] Get time impossible, no wifi connection");
|
|
|
|
|
|
}
|
2019-12-24 11:53:26 +03:00
|
|
|
|
}
|
2020-03-27 15:48:17 +01:00
|
|
|
|
|
|
|
|
|
|
//Получаем время в формате linux gmt
|
|
|
|
|
|
String GetTimeUnix() {
|
2020-03-24 19:01:11 +01:00
|
|
|
|
time_t now = time(nullptr);
|
2020-03-27 15:48:17 +01:00
|
|
|
|
if (now < 30000) {
|
|
|
|
|
|
return "failed";
|
|
|
|
|
|
} else {
|
|
|
|
|
|
return String(now);
|
|
|
|
|
|
}
|
2020-03-24 19:01:11 +01:00
|
|
|
|
}
|
2019-12-24 11:53:26 +03:00
|
|
|
|
// Получение текущего времени
|
|
|
|
|
|
String GetTime() {
|
|
|
|
|
|
time_t now = time(nullptr); // получаем время с помощью библиотеки time.h
|
2020-03-27 15:48:17 +01:00
|
|
|
|
int zone = 3600 * jsonRead(configSetup, "timezone").toInt();
|
|
|
|
|
|
now = now + zone;
|
2019-12-24 11:53:26 +03:00
|
|
|
|
String Time = ""; // Строка для результатов времени
|
|
|
|
|
|
Time += ctime(&now); // Преобразуем время в строку формата Thu Jan 19 00:55:35 2017
|
|
|
|
|
|
int i = Time.indexOf(":"); //Ишем позицию первого символа :
|
|
|
|
|
|
Time = Time.substring(i - 2, i + 6); // Выделяем из строки 2 символа перед символом : и 6 символов после
|
|
|
|
|
|
return Time; // Возврашаем полученное время
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
String GetTimeWOsec() {
|
|
|
|
|
|
time_t now = time(nullptr); // получаем время с помощью библиотеки time.h
|
2020-03-27 15:48:17 +01:00
|
|
|
|
int zone = 3600 * jsonRead(configSetup, "timezone").toInt();
|
|
|
|
|
|
now = now + zone;
|
2019-12-24 11:53:26 +03:00
|
|
|
|
String Time = ""; // Строка для результатов времени
|
|
|
|
|
|
Time += ctime(&now); // Преобразуем время в строку формата Thu Jan 19 00:55:35 2017
|
|
|
|
|
|
int i = Time.indexOf(":"); //Ишем позицию первого символа :
|
|
|
|
|
|
Time = Time.substring(i - 2, i + 3); // Выделяем из строки 2 символа перед символом : и 6 символов после
|
|
|
|
|
|
return Time; // Возврашаем полученное время
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Получение даты
|
|
|
|
|
|
String GetDate() {
|
|
|
|
|
|
time_t now = time(nullptr); // получаем время с помощью библиотеки time.h
|
2020-03-27 15:48:17 +01:00
|
|
|
|
int zone = 3600 * jsonRead(configSetup, "timezone").toInt();
|
|
|
|
|
|
now = now + zone;
|
2019-12-24 11:53:26 +03:00
|
|
|
|
String Data = ""; // Строка для результатов времени
|
|
|
|
|
|
Data += ctime(&now); // Преобразуем время в строку формата Thu Jan 19 00:55:35 2017
|
|
|
|
|
|
Data.replace("\n", "");
|
|
|
|
|
|
uint8_t i = Data.lastIndexOf(" "); //Ишем позицию последнего символа пробел
|
|
|
|
|
|
String Time = Data.substring(i - 8, i + 1); // Выделяем время и пробел
|
|
|
|
|
|
Data.replace(Time, ""); // Удаляем из строки 8 символов времени и пробел
|
|
|
|
|
|
return Data; // Возврашаем полученную дату
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
String GetDataDigital() {
|
|
|
|
|
|
String date = GetDate();
|
|
|
|
|
|
|
|
|
|
|
|
date = deleteBeforeDelimiter(date, " ");
|
|
|
|
|
|
|
|
|
|
|
|
date.replace("Jan", "01");
|
|
|
|
|
|
date.replace("Feb", "02");
|
|
|
|
|
|
date.replace("Mar", "03");
|
|
|
|
|
|
date.replace("Apr", "04");
|
|
|
|
|
|
date.replace("May", "05");
|
|
|
|
|
|
date.replace("Jun", "06");
|
|
|
|
|
|
date.replace("Jul", "07");
|
|
|
|
|
|
date.replace("Aug", "08");
|
|
|
|
|
|
date.replace("Sep", "09");
|
|
|
|
|
|
date.replace("Oct", "10");
|
|
|
|
|
|
date.replace("Nov", "11");
|
|
|
|
|
|
date.replace("Dec", "12");
|
|
|
|
|
|
|
|
|
|
|
|
String month = date.substring(0, 2);
|
|
|
|
|
|
String day = date.substring(3, 5);
|
|
|
|
|
|
String year = date.substring(8, 10);
|
|
|
|
|
|
|
|
|
|
|
|
String out = day;
|
|
|
|
|
|
out += ".";
|
|
|
|
|
|
out += month;
|
|
|
|
|
|
out += ".";
|
|
|
|
|
|
out += year;
|
|
|
|
|
|
|
|
|
|
|
|
return out;
|
|
|
|
|
|
}
|
2020-03-30 01:45:42 +02:00
|
|
|
|
|
2020-05-02 12:20:30 +02:00
|
|
|
|
int timeToMin(String Time) {
|
2020-03-30 01:45:42 +02:00
|
|
|
|
//"00:00:00" время в секунды
|
|
|
|
|
|
long min = selectToMarker(Time, ":").toInt() * 60; //общее количество секунд в полных часах
|
|
|
|
|
|
Time = deleteBeforeDelimiter (Time, ":"); // Теперь здесь минуты секунды
|
|
|
|
|
|
min += selectToMarker(Time, ":").toInt(); // Добавим секунды из полных минут
|
|
|
|
|
|
return min;
|
|
|
|
|
|
}
|