mirror of
https://github.com/IoTManagerProject/IoTManager.git
synced 2026-04-01 12:59:12 +03:00
@@ -1,5 +1,5 @@
|
|||||||
dhtT t 2 dht11 Температура#DHT,#t°C Датчики any-data 1
|
dhtT t 2 dht11 Температура#DHT,#t°C Датчики anydata 1
|
||||||
dhtH h 2 dht11 Влажность#DHT,#t°C Датчики any-data 2
|
dhtH h 2 dht11 Влажность#DHT,#t°C Датчики anydata 2
|
||||||
dhtComfort Степень#комфорта: Датчики 3
|
dhtComfort Степень#комфорта: Датчики 3
|
||||||
dhtPerception Восприятие: Датчики 4
|
dhtPerception Восприятие: Датчики 4
|
||||||
dhtDewpoint Точка#росы: Датчики 5
|
dhtDewpoint Точка#росы: Датчики 5
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
dhtT t 2 dht22 Температура#DHT,#t°C Датчики any-data 1
|
dhtT t 2 dht22 Температура#DHT,#t°C Датчики anydata 1
|
||||||
dhtH h 2 dht22 Влажность#DHT,#t°C Датчики any-data 2
|
dhtH h 2 dht22 Влажность#DHT,#t°C Датчики anydata 2
|
||||||
dhtComfort Степень#комфорта: Датчики 3
|
dhtComfort Степень#комфорта: Датчики 3
|
||||||
dhtPerception Восприятие: Датчики 4
|
dhtPerception Восприятие: Датчики 4
|
||||||
dhtDewpoint Точка#росы: Датчики 5
|
dhtDewpoint Точка#росы: Датчики 5
|
||||||
@@ -5,4 +5,4 @@ logging adc 5 100 Аналоговый#вход Датчики 2
|
|||||||
//значение чтения аналогового входа будут примерно равным
|
//значение чтения аналогового входа будут примерно равным
|
||||||
//при 1 вольте - 310, а при 2 вольтах - 620 (считаем по пропорции)
|
//при 1 вольте - 310, а при 2 вольтах - 620 (считаем по пропорции)
|
||||||
//данная строка переведет диапазон 310-620 в диапазон 1-100 и отобразит в приложении
|
//данная строка переведет диапазон 310-620 в диапазон 1-100 и отобразит в приложении
|
||||||
//варианты отображения: any-data, progress-round, progress-line, fill-gauge
|
//варианты отображения: anydata, progress-round, progress-line, fillgauge
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
bmp280T temp1 0x76 Температура#bmp280 Датчики any-data 1
|
bmp280T temp1 0x76 Температура#bmp280 Датчики anydata 1
|
||||||
bmp280P press1 0x76 Давление#bmp280 Датчики any-data 2
|
bmp280P press1 0x76 Давление#bmp280 Датчики anydata 2
|
||||||
logging temp1 1 100 Температура Датчики 3
|
logging temp1 1 100 Температура Датчики 3
|
||||||
logging press1 1 100 Давление Датчики 4
|
logging press1 1 100 Давление Датчики 4
|
||||||
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
bme280T temp1 0x76 Температура#bmp280 Датчики any-data 1
|
bme280T temp1 0x76 Температура#bmp280 Датчики anydata 1
|
||||||
bme280P pres1 0x76 Давление#bmp280 Датчики any-data 2
|
bme280P pres1 0x76 Давление#bmp280 Датчики anydata 2
|
||||||
bme280H hum1 0x76 Влажность#bmp280 Датчики any-data 3
|
bme280H hum1 0x76 Влажность#bmp280 Датчики anydata 3
|
||||||
bme280A altit1 0x76 Высота#bmp280 Датчики any-data 4
|
bme280A altit1 0x76 Высота#bmp280 Датчики anydata 4
|
||||||
logging temp1 1 100 Температура Датчики 5
|
logging temp1 1 100 Температура Датчики 5
|
||||||
logging press1 1 100 Давление Датчики 6
|
logging press1 1 100 Давление Датчики 6
|
||||||
logging hum1 1 100 Влажность Датчики 7
|
logging hum1 1 100 Влажность Датчики 7
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
dallas temp1 2 123456 Водонагреватель,#t°C Датчики any-data 1
|
dallas temp1 2 123456 Водонагреватель,#t°C Датчики anydata 1
|
||||||
logging dallas 1 100 Температура Датчики 2
|
logging dallas 1 100 Температура Датчики 2
|
||||||
|
|
||||||
//2 - номер пина датчика
|
//2 - номер пина датчика
|
||||||
//варианты отображения: any-data, progress-round, progress-line, fill-gauge
|
//варианты отображения: anydata, progress-round, progress-line, fillgauge
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
dallas 2 Водонагреватель,#t°C Термостат any-data 1
|
dallas 2 Водонагреватель,#t°C Термостат anydata 1
|
||||||
logging dallas 5 100 Температура Термостат 2
|
logging dallas 5 100 Температура Термостат 2
|
||||||
inputDigit digit1 При#скольки#выключить? Термостат 40 3
|
inputDigit digit1 При#скольки#выключить? Термостат 40 3
|
||||||
inputDigit digit2 При#скольки#включить? Термостат 20 4
|
inputDigit digit2 При#скольки#включить? Термостат 20 4
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
levelPr p 14 12 Уровень#в#баке,#% Датчики fill-gauge 125 25 1
|
levelPr p 14 12 Уровень#в#баке,#% Датчики fillgauge 125 25 1
|
||||||
ultrasonicCm cm 14 12 Дистанция,#см Датчики any-data 2
|
ultrasonicCm cm 14 12 Дистанция,#см Датчики anydata 2
|
||||||
inputDigit digit1 При#скольки#выключить? Датчики 95 3
|
inputDigit digit1 При#скольки#выключить? Датчики 95 3
|
||||||
inputDigit digit2 При#скольки#включить? Датчики 10 4
|
inputDigit digit2 При#скольки#включить? Датчики 10 4
|
||||||
button 1 5 Насос Датчики 0 5
|
button 1 5 Насос Датчики 0 5
|
||||||
@@ -9,4 +9,4 @@ logging p 1 100 Вода#в#баке Датчики 6
|
|||||||
//25 - это расстояние от датчика до поверхности воды когда бак полный в сантиметрах
|
//25 - это расстояние от датчика до поверхности воды когда бак полный в сантиметрах
|
||||||
//distancePr - эта строка выводит процент заполнения бака
|
//distancePr - эта строка выводит процент заполнения бака
|
||||||
//distanceCm - эта строка выводит расстояние в сантиметрах
|
//distanceCm - эта строка выводит расстояние в сантиметрах
|
||||||
//варианты отображения: any-data, progress-round, progress-line, fill-gauge
|
//варианты отображения: anydata, progress-round, progress-line, fillgauge
|
||||||
@@ -3,7 +3,7 @@ button 2 13 Прихожая Реле 0 2
|
|||||||
button 3 14 Кухня Реле 0 3
|
button 3 14 Кухня Реле 0 3
|
||||||
pwm 1 3 Яркость#коредор: Реле 1023 4
|
pwm 1 3 Яркость#коредор: Реле 1023 4
|
||||||
pwm 2 4 Яркость#ванная: Реле 510 5
|
pwm 2 4 Яркость#ванная: Реле 510 5
|
||||||
analog adc 0 Аналоговый#вход Датчики fill-gauge 1 1023 1 1023 6
|
analog adc 0 Аналоговый#вход Датчики fillgauge 1 1023 1 1023 6
|
||||||
logging adc 1 100 Аналоговый#вход Датчики 7
|
logging adc 1 100 Аналоговый#вход Датчики 7
|
||||||
|
|
||||||
//Это демо конфигурация. В ней показано как связать кнопки c помощью сценариев
|
//Это демо конфигурация. В ней показано как связать кнопки c помощью сценариев
|
||||||
@@ -3,19 +3,19 @@
|
|||||||
"chipID": "",
|
"chipID": "",
|
||||||
"apssid": "IoTmanager",
|
"apssid": "IoTmanager",
|
||||||
"appass": "",
|
"appass": "",
|
||||||
"routerssid": "rise",
|
"routerssid": "HomeNet",
|
||||||
"routerpass": "hostel3333",
|
"routerpass": "#19821111_",
|
||||||
"timezone": 2,
|
"timezone": 2,
|
||||||
"ntp": "pool.ntp.org",
|
"ntp": "pool.ntp.org",
|
||||||
"mqttServer": "91.204.228.124",
|
"mqttServer": "192.168.1.30",
|
||||||
"mqttPort": 1883,
|
"mqttPort": 1883,
|
||||||
"mqttPrefix": "/rise",
|
"mqttPrefix": "/iot",
|
||||||
"mqttUser": "test",
|
"mqttUser": "devices",
|
||||||
"mqttPass": "test",
|
"mqttPass": "devices",
|
||||||
"scen": "1",
|
"scen": "1",
|
||||||
"pushingboxid": "v7C133E426B0C69E",
|
"pushingboxid": "v7C133E426B0C69E",
|
||||||
"weblogin": "admin",
|
"weblogin": "admin",
|
||||||
"webpass": "admin",
|
"webpass": "admin",
|
||||||
"udponoff": "1",
|
"udponoff": "1",
|
||||||
"blink":"1"
|
"blink": "1"
|
||||||
}
|
}
|
||||||
@@ -3,7 +3,7 @@ button 2 13 Прихожая Реле 0 2
|
|||||||
button 3 14 Кухня Реле 0 3
|
button 3 14 Кухня Реле 0 3
|
||||||
pwm 1 3 Яркость#коредор: Реле 1023 4
|
pwm 1 3 Яркость#коредор: Реле 1023 4
|
||||||
pwm 2 4 Яркость#ванная: Реле 510 5
|
pwm 2 4 Яркость#ванная: Реле 510 5
|
||||||
analog adc 0 Аналоговый#вход Датчики fill-gauge 1 1023 1 1023 6
|
analog adc 0 Аналоговый#вход Датчики fillgauge 1 1023 1 1023 6
|
||||||
logging adc 1 100 Аналоговый#вход Датчики 7
|
logging adc 1 100 Аналоговый#вход Датчики 7
|
||||||
|
|
||||||
//Это демо конфигурация. В ней показано как связать кнопки c помощью сценариев
|
//Это демо конфигурация. В ней показано как связать кнопки c помощью сценариев
|
||||||
@@ -85,7 +85,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "file",
|
"type": "file",
|
||||||
"state": "100с.txt",
|
"state": "dev_conf.txt",
|
||||||
"style": "width:100%;height:350px",
|
"style": "width:100%;height:350px",
|
||||||
"title": "Сохранить",
|
"title": "Сохранить",
|
||||||
"action": "/set?devinit",
|
"action": "/set?devinit",
|
||||||
@@ -104,7 +104,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "file",
|
"type": "file",
|
||||||
"state": "100s.txt",
|
"state": "dev_scen.txt",
|
||||||
"style": "width:100%;height:350px",
|
"style": "width:100%;height:350px",
|
||||||
"title": "Сохранить",
|
"title": "Сохранить",
|
||||||
"action": "/set?sceninit",
|
"action": "/set?sceninit",
|
||||||
|
|||||||
@@ -1,7 +1,99 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "Global.h"
|
#include "Utils/TimeUtils.h"
|
||||||
|
#include "Utils/PrintMessage.h"
|
||||||
|
|
||||||
void startTimeSync();
|
#include "time.h"
|
||||||
|
|
||||||
void reconfigTime();
|
class Clock {
|
||||||
|
const char* MODULE = "Clock";
|
||||||
|
|
||||||
|
public:
|
||||||
|
Clock() : _timezone{0}, _ntp{}, _hasSynced{false}, _configured{false} {
|
||||||
|
}
|
||||||
|
|
||||||
|
bool hasSync() {
|
||||||
|
if (!_hasSynced) {
|
||||||
|
startSync();
|
||||||
|
}
|
||||||
|
return _hasSynced;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
|
||||||
|
setNtpPool(String ntp) {
|
||||||
|
_ntp = ntp;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setTimezone(int timezone) {
|
||||||
|
_timezone = timezone;
|
||||||
|
}
|
||||||
|
|
||||||
|
time_t getSystemTime() {
|
||||||
|
timeval tv{0, 0};
|
||||||
|
timezone tz = getTimeZone(getBiasInMinutes());
|
||||||
|
time_t epoch = 0;
|
||||||
|
if (gettimeofday(&tv, &tz) != -1)
|
||||||
|
epoch = tv.tv_sec;
|
||||||
|
return epoch;
|
||||||
|
}
|
||||||
|
|
||||||
|
void startSync() {
|
||||||
|
if (!_configured) {
|
||||||
|
pm.info("sync to: " + _ntp + " time zone: " + String(_timezone));
|
||||||
|
setupSntp();
|
||||||
|
_configured = true;
|
||||||
|
}
|
||||||
|
_hasSynced = hasTimeSynced();
|
||||||
|
if (_hasSynced) {
|
||||||
|
pm.info("synced " + getDateDigitalFormated() + " " + getTime());
|
||||||
|
} else {
|
||||||
|
pm.error("failed to obtain");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void setupSntp() {
|
||||||
|
int tzs = getBiasInSeconds();
|
||||||
|
int tzh = tzs / 3600;
|
||||||
|
tzs -= tzh * 3600;
|
||||||
|
int tzm = tzs / 60;
|
||||||
|
tzs -= tzm * 60;
|
||||||
|
|
||||||
|
char tzstr[64];
|
||||||
|
snprintf(tzstr, sizeof tzstr, "ESPUSER<%+d:%02d:%02d>", tzh, tzm, tzs);
|
||||||
|
pm.info(String(tzstr));
|
||||||
|
configTime(tzstr, _ntp.c_str());
|
||||||
|
}
|
||||||
|
// #ifdef ESP32
|
||||||
|
// uint8_t i = 0;
|
||||||
|
// struct tm timeinfo;
|
||||||
|
// while (!getLocalTime(&timeinfo) && i <= 4) {
|
||||||
|
// Serial.print(".");
|
||||||
|
// i++;
|
||||||
|
// delay(1000);
|
||||||
|
// }
|
||||||
|
// #endif
|
||||||
|
private:
|
||||||
|
bool hasTimeSynced() {
|
||||||
|
unsigned long now = time(nullptr);
|
||||||
|
return now > millis();
|
||||||
|
}
|
||||||
|
|
||||||
|
int getBiasInSeconds() {
|
||||||
|
return getBiasInMinutes() * 60;
|
||||||
|
}
|
||||||
|
|
||||||
|
int getBiasInMinutes() {
|
||||||
|
return _timezone * 60;
|
||||||
|
}
|
||||||
|
|
||||||
|
const timezone getTimeZone(int minutes) {
|
||||||
|
return timezone{minutes, 0};
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
int _timezone;
|
||||||
|
String _ntp;
|
||||||
|
bool _hasSynced;
|
||||||
|
bool _configured;
|
||||||
|
};
|
||||||
@@ -41,7 +41,7 @@ enum LedStatus_t {
|
|||||||
};
|
};
|
||||||
|
|
||||||
enum ConfigType_t {
|
enum ConfigType_t {
|
||||||
CT_MACRO,
|
CT_CONFIG,
|
||||||
CT_SCENARIO
|
CT_SCENARIO
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -10,6 +10,11 @@
|
|||||||
// 1000 * 60 * 60 * 2
|
// 1000 * 60 * 60 * 2
|
||||||
#define TELEMETRY_UPDATE_INTERVAL 0
|
#define TELEMETRY_UPDATE_INTERVAL 0
|
||||||
|
|
||||||
|
#define DEVICE_CONFIG_FILE "dev_conf.txt"
|
||||||
|
#define DEVICE_SCENARIO_FILE "dev_scen.txt"
|
||||||
|
#define DEFAULT_PRESET 100
|
||||||
|
#define DEFAULT_SCENARIO 100
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Optional
|
* Optional
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -21,7 +21,6 @@
|
|||||||
#include "Utils\JsonUtils.h"
|
#include "Utils\JsonUtils.h"
|
||||||
#include "Utils\StringUtils.h"
|
#include "Utils\StringUtils.h"
|
||||||
#include "Utils\SysUtils.h"
|
#include "Utils\SysUtils.h"
|
||||||
#include "Utils\TimeUtils.h"
|
|
||||||
#include "Utils\PrintMessage.h"
|
#include "Utils\PrintMessage.h"
|
||||||
#include "Utils\WiFiUtils.h"
|
#include "Utils\WiFiUtils.h"
|
||||||
|
|
||||||
@@ -45,6 +44,8 @@ extern AsyncWebSocket ws;
|
|||||||
//extern AsyncEventSource events;
|
//extern AsyncEventSource events;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
extern Clock* rtc;
|
||||||
|
|
||||||
extern TickerScheduler ts;
|
extern TickerScheduler ts;
|
||||||
|
|
||||||
extern WiFiClient espClient;
|
extern WiFiClient espClient;
|
||||||
@@ -107,6 +108,7 @@ extern boolean mqttParamsChanged;
|
|||||||
extern boolean udp_data_parse;
|
extern boolean udp_data_parse;
|
||||||
extern boolean mqtt_send_settings_to_udp;
|
extern boolean mqtt_send_settings_to_udp;
|
||||||
extern boolean i2c_scanning;
|
extern boolean i2c_scanning;
|
||||||
|
extern boolean fscheck_flag;
|
||||||
|
|
||||||
extern int sensors_reading_map[15];
|
extern int sensors_reading_map[15];
|
||||||
|
|
||||||
@@ -143,19 +145,15 @@ extern void mqttOrderSend();
|
|||||||
extern void httpOrderSend();
|
extern void httpOrderSend();
|
||||||
extern void firmwareVersion();
|
extern void firmwareVersion();
|
||||||
extern void firmwareUpdate();
|
extern void firmwareUpdate();
|
||||||
extern void Scenario_init();
|
extern void loadScenario();
|
||||||
extern void txtExecution(String file);
|
|
||||||
extern void stringExecution(String str);
|
|
||||||
|
|
||||||
// i2c_bu
|
|
||||||
extern void do_i2c_scanning();
|
|
||||||
extern String i2c_scan();
|
|
||||||
|
|
||||||
|
extern void fileExecute(const String& filename);
|
||||||
|
extern void stringExecute(String& cmdStr);
|
||||||
// Init
|
// Init
|
||||||
extern void loadConfig();
|
extern void loadConfig();
|
||||||
extern void All_init();
|
extern void All_init();
|
||||||
extern void statistics_init();
|
extern void statistics_init();
|
||||||
extern void Scenario_init();
|
extern void loadScenario();
|
||||||
extern void Device_init();
|
extern void Device_init();
|
||||||
extern void prsets_init();
|
extern void prsets_init();
|
||||||
extern void up_time();
|
extern void up_time();
|
||||||
@@ -168,7 +166,6 @@ extern void choose_log_date_and_send();
|
|||||||
|
|
||||||
// Main
|
// Main
|
||||||
extern void setChipId();
|
extern void setChipId();
|
||||||
extern void printMemoryStatus(String text);
|
|
||||||
extern void saveConfig();
|
extern void saveConfig();
|
||||||
extern String getURL(const String& urls);
|
extern String getURL(const String& urls);
|
||||||
|
|
||||||
@@ -232,9 +229,10 @@ extern int readTimer(int number);
|
|||||||
extern void init_updater();
|
extern void init_updater();
|
||||||
|
|
||||||
// widget
|
// widget
|
||||||
extern void createWidget(String widget_name, String page_name, String page_number, String file, String topic);
|
|
||||||
|
extern void createWidgetByType(String widget_name, String page_name, String page_number, String file, String topic);
|
||||||
extern void createWidgetParam(String widget_name, String page_name, String page_number, String file, String topic, String name1, String param1, String name2, String param2, String name3, String param3);
|
extern void createWidgetParam(String widget_name, String page_name, String page_number, String file, String topic, String name1, String param1, String name2, String param2, String name3, String param3);
|
||||||
extern void createWidgetByType(String widget_name, String page_name, String page_number, String type, String topik);
|
extern void createWidget(String widget_name, String page_name, String page_number, String type, String topik);
|
||||||
extern void createChart(String widget_name, String page_name, String page_number, String file, String topic, String maxCount);
|
extern void createChart(String widget_name, String page_name, String page_number, String file, String topic, String maxCount);
|
||||||
|
|
||||||
// PushingBox
|
// PushingBox
|
||||||
@@ -245,9 +243,6 @@ extern void UDP_init();
|
|||||||
extern void do_udp_data_parse();
|
extern void do_udp_data_parse();
|
||||||
extern void do_mqtt_send_settings_to_udp();
|
extern void do_mqtt_send_settings_to_udp();
|
||||||
|
|
||||||
// WebServer
|
|
||||||
extern void Web_server_init();
|
|
||||||
|
|
||||||
// iot_firmware
|
// iot_firmware
|
||||||
extern void addCommandLoop(const String& cmdStr);
|
extern void addCommandLoop(const String& cmdStr);
|
||||||
extern void loopSerial();
|
extern void loopSerial();
|
||||||
|
|||||||
@@ -20,37 +20,37 @@ bool fileSystemInit();
|
|||||||
/*
|
/*
|
||||||
* Удалить файл
|
* Удалить файл
|
||||||
*/
|
*/
|
||||||
void removeFile(const String filename);
|
void removeFile(const String& filename);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Открыть файл на позиции
|
* Открыть файл на позиции
|
||||||
*/
|
*/
|
||||||
File seekFile(const String filename, size_t position = 0);
|
File seekFile(const String& filename, size_t position = 0);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Чтение строки из файла
|
* Чтение строки из файла
|
||||||
* возвращает стоку из файла в которой есть искомое слово found
|
* возвращает стоку из файла в которой есть искомое слово found
|
||||||
*/
|
*/
|
||||||
String readFileString(const String filename, const String to_find);
|
const String readFileString(const String& filename, const String& to_find);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Добовление строки в файл
|
* Добовление строки в файл
|
||||||
*/
|
*/
|
||||||
String addFile(const String filename, const String str);
|
const String addFile(const String& filename, const String& str);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Запись строки в файл
|
* Запись строки в файл
|
||||||
*/
|
*/
|
||||||
String writeFile(const String filename, const String str);
|
const String writeFile(const String& filename, const String& str);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Чтение файла в строку
|
* Чтение файла в строку
|
||||||
*/
|
*/
|
||||||
String readFile(const String filename, size_t max_size);
|
const String readFile(const String& filename, size_t max_size);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Размер файла
|
* Размер файла
|
||||||
*/
|
*/
|
||||||
String getFileSize(const String filename);
|
const String getFileSize(const String& filename);
|
||||||
|
|
||||||
bool copyFile(const String src, const String dst, bool overwrite = true);
|
bool copyFile(const String& src, const String& dst, bool overwrite = true);
|
||||||
@@ -11,3 +11,5 @@ String jsonWriteStr(String& json, String name, String volume);
|
|||||||
String jsonWriteInt(String& json, String name, int volume);
|
String jsonWriteInt(String& json, String name, int volume);
|
||||||
|
|
||||||
String jsonWriteFloat(String& json, String name, float volume);
|
String jsonWriteFloat(String& json, String name, float volume);
|
||||||
|
|
||||||
|
boolean jsonReadBool(String& json, String name);
|
||||||
@@ -4,8 +4,7 @@
|
|||||||
|
|
||||||
#include "CommonTypes.h"
|
#include "CommonTypes.h"
|
||||||
|
|
||||||
const String getPresetFile(uint8_t preset, ConfigType_t type);
|
const String getConfigFile(uint8_t preset, ConfigType_t type);
|
||||||
|
|
||||||
const String getItemName(Item_t item);
|
const String getItemName(Item_t item);
|
||||||
|
|
||||||
const Item_t getPresetItem(uint8_t preset);
|
|
||||||
|
|||||||
@@ -14,11 +14,11 @@ class PrintMessage {
|
|||||||
_module = module;
|
_module = module;
|
||||||
}
|
}
|
||||||
|
|
||||||
void error(const String str) {
|
void error(const String& str) {
|
||||||
print(EL_ERROR, str);
|
print(EL_ERROR, str);
|
||||||
}
|
}
|
||||||
|
|
||||||
void info(const String str) {
|
void info(const String& str) {
|
||||||
print(EL_INFO, str);
|
print(EL_INFO, str);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,6 @@
|
|||||||
|
|
||||||
const String getChipId();
|
const String getChipId();
|
||||||
|
|
||||||
void printMemoryStatus(String text = "");
|
const String printMemoryStatus();
|
||||||
|
|
||||||
String getHeapStats();
|
const String getHeapStats();
|
||||||
|
|||||||
@@ -35,12 +35,6 @@ int timeToMin(String Time);
|
|||||||
|
|
||||||
const String prettyMillis(unsigned long time_ms = millis());
|
const String prettyMillis(unsigned long time_ms = millis());
|
||||||
|
|
||||||
int timeZoneInSeconds(const byte timeZone);
|
|
||||||
|
|
||||||
bool hasTimeSynced();
|
|
||||||
|
|
||||||
int getBiasInSeconds();
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Время (мс) прошедщее с @simce
|
* Время (мс) прошедщее с @simce
|
||||||
*/
|
*/
|
||||||
|
|||||||
7
include/Utils/i2c_bus.h
Normal file
7
include/Utils/i2c_bus.h
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
void do_i2c_scanning();
|
||||||
|
|
||||||
|
const String i2c_scan();
|
||||||
@@ -36,7 +36,8 @@ lib_deps =
|
|||||||
|
|
||||||
[env:esp8266]
|
[env:esp8266]
|
||||||
platform = https://github.com/platformio/platform-espressif8266.git
|
platform = https://github.com/platformio/platform-espressif8266.git
|
||||||
build_flags = ${env.build_flags} -D=${PIOENV}
|
build_flags = ${env.build_flags} -D=${PIOENV}
|
||||||
|
##-DCORE_DEBUG_LEVEL=5
|
||||||
board = nodemcuv2
|
board = nodemcuv2
|
||||||
monitor_filters = esp8266_exception_decoder
|
monitor_filters = esp8266_exception_decoder
|
||||||
monitor_speed = 115200
|
monitor_speed = 115200
|
||||||
@@ -51,3 +52,4 @@ lib_deps =
|
|||||||
DHT sensor library for ESPx
|
DHT sensor library for ESPx
|
||||||
Adafruit BMP280 Library
|
Adafruit BMP280 Library
|
||||||
Adafruit BME280 Library
|
Adafruit BME280 Library
|
||||||
|
|
||||||
|
|||||||
@@ -1,54 +0,0 @@
|
|||||||
#include "Clock.h"
|
|
||||||
|
|
||||||
#include "Utils/TimeUtils.h"
|
|
||||||
|
|
||||||
static const char* MODULE = "Clock";
|
|
||||||
|
|
||||||
void startTimeSync() {
|
|
||||||
if (!hasTimeSynced()) {
|
|
||||||
pm.info("Start syncing");
|
|
||||||
reconfigTime();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void setupSntp() {
|
|
||||||
int tzs = getBiasInSeconds();
|
|
||||||
int tzh = tzs / 3600;
|
|
||||||
tzs -= tzh * 3600;
|
|
||||||
int tzm = tzs / 60;
|
|
||||||
tzs -= tzm * 60;
|
|
||||||
|
|
||||||
String ntp = jsonReadStr(configSetupJson, "ntp");
|
|
||||||
pm.info("Setup ntp: " + ntp);
|
|
||||||
char tzstr[64];
|
|
||||||
snprintf(tzstr, sizeof tzstr, "ESPUSER<%+d:%02d:%02d>", tzh, tzm, tzs);
|
|
||||||
return configTime(tzstr, ntp.c_str(), "pool.ntp.org", "time.nist.gov");
|
|
||||||
}
|
|
||||||
|
|
||||||
void reconfigTime() {
|
|
||||||
#ifdef ESP32
|
|
||||||
uint8_t i = 0;
|
|
||||||
struct tm timeinfo;
|
|
||||||
while (!getLocalTime(&timeinfo) && i <= 4) {
|
|
||||||
Serial.print(".");
|
|
||||||
i++;
|
|
||||||
delay(1000);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef ESP8266
|
|
||||||
setupSntp();
|
|
||||||
uint8_t i = 0;
|
|
||||||
while (!hasTimeSynced() && i < 4) {
|
|
||||||
Serial.print(".");
|
|
||||||
i++;
|
|
||||||
delay(300);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (getTimeUnix() != "failed") {
|
|
||||||
pm.info("Time synced " + getDateDigitalFormated() + " " + getTime());
|
|
||||||
} else {
|
|
||||||
pm.error("Failed to obtain");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
112
src/Cmd.cpp
112
src/Cmd.cpp
@@ -13,6 +13,8 @@ Servo myServo1;
|
|||||||
Servo myServo2;
|
Servo myServo2;
|
||||||
SoftwareSerial *mySerial = nullptr;
|
SoftwareSerial *mySerial = nullptr;
|
||||||
|
|
||||||
|
void getData();
|
||||||
|
|
||||||
void CMD_init() {
|
void CMD_init() {
|
||||||
sCmd.addCommand("button", button);
|
sCmd.addCommand("button", button);
|
||||||
sCmd.addCommand("buttonSet", buttonSet);
|
sCmd.addCommand("buttonSet", buttonSet);
|
||||||
@@ -97,47 +99,50 @@ void CMD_init() {
|
|||||||
sCmd.addCommand("firmwareUpdate", firmwareUpdate);
|
sCmd.addCommand("firmwareUpdate", firmwareUpdate);
|
||||||
sCmd.addCommand("firmwareVersion", firmwareVersion);
|
sCmd.addCommand("firmwareVersion", firmwareVersion);
|
||||||
|
|
||||||
|
sCmd.addCommand("getData", getData);
|
||||||
|
|
||||||
handle_time_init();
|
handle_time_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
//==========================================================================================================
|
//==========================================================================================================
|
||||||
//==========================================Модуль кнопок===================================================
|
//==========================================Модуль кнопок===================================================
|
||||||
void button() {
|
void button() {
|
||||||
String button_number = sCmd.next();
|
pm.info("create 'button'");
|
||||||
String button_param = sCmd.next();
|
String number = sCmd.next();
|
||||||
String widget_name = sCmd.next();
|
String param = sCmd.next();
|
||||||
String page_name = sCmd.next();
|
String widget = sCmd.next();
|
||||||
String start_state = sCmd.next();
|
String page = sCmd.next();
|
||||||
String page_number = sCmd.next();
|
String state = sCmd.next();
|
||||||
|
String pageNumber = sCmd.next();
|
||||||
|
|
||||||
jsonWriteStr(configOptionJson, "button_param" + button_number, button_param);
|
jsonWriteStr(configOptionJson, "button_param" + number, param);
|
||||||
jsonWriteStr(configLiveJson, "button" + button_number, start_state);
|
jsonWriteStr(configLiveJson, "button" + number, state);
|
||||||
|
|
||||||
if (isDigitStr(button_param)) {
|
if (isDigitStr(param)) {
|
||||||
pinMode(button_param.toInt(), OUTPUT);
|
pinMode(param.toInt(), OUTPUT);
|
||||||
digitalWrite(button_param.toInt(), start_state.toInt());
|
digitalWrite(param.toInt(), state.toInt());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (button_param == "scen") {
|
if (param == "scen") {
|
||||||
jsonWriteStr(configSetupJson, "scen", start_state);
|
jsonWriteStr(configSetupJson, "scen", state);
|
||||||
Scenario_init();
|
loadScenario();
|
||||||
saveConfig();
|
saveConfig();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (button_param.indexOf("line") != -1) {
|
if (param.indexOf("line") != -1) {
|
||||||
String str = button_param;
|
String str = param;
|
||||||
while (str.length() != 0) {
|
while (str.length()) {
|
||||||
if (str == "") return;
|
if (str == "") return;
|
||||||
String tmp = selectToMarker(str, ","); //line1,
|
String tmp = selectToMarker(str, ","); //line1,
|
||||||
String number = deleteBeforeDelimiter(tmp, "e"); //1,
|
String number = deleteBeforeDelimiter(tmp, "e"); //1,
|
||||||
number.replace(",", "");
|
number.replace(",", "");
|
||||||
Serial.println(number);
|
Serial.println(number);
|
||||||
int number_int = number.toInt();
|
int number_int = number.toInt();
|
||||||
scenario_line_status[number_int] = start_state.toInt();
|
scenario_line_status[number_int] = state.toInt();
|
||||||
str = deleteBeforeDelimiter(str, ",");
|
str = deleteBeforeDelimiter(str, ",");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
createWidget(widget_name, page_name, page_number, "widgets/widget.toggle.json", "button" + button_number);
|
createWidget(widget, page, pageNumber, "toggle", "button" + number);
|
||||||
}
|
}
|
||||||
|
|
||||||
void buttonSet() {
|
void buttonSet() {
|
||||||
@@ -151,7 +156,7 @@ void buttonSet() {
|
|||||||
|
|
||||||
if (button_param == "scen") {
|
if (button_param == "scen") {
|
||||||
jsonWriteStr(configSetupJson, "scen", button_state);
|
jsonWriteStr(configSetupJson, "scen", button_state);
|
||||||
Scenario_init();
|
loadScenario();
|
||||||
saveConfig();
|
saveConfig();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -187,6 +192,7 @@ void buttonChange() {
|
|||||||
}
|
}
|
||||||
order_loop += "buttonSet " + button_number + " " + current_state + ",";
|
order_loop += "buttonSet " + button_number + " " + current_state + ",";
|
||||||
jsonWriteStr(configLiveJson, "button" + button_number, current_state);
|
jsonWriteStr(configLiveJson, "button" + button_number, current_state);
|
||||||
|
|
||||||
MqttClient::publishStatus("button" + button_number, current_state);
|
MqttClient::publishStatus("button" + button_number, current_state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -221,7 +227,7 @@ void pwm() {
|
|||||||
//analogWriteFreq(32000);
|
//analogWriteFreq(32000);
|
||||||
jsonWriteStr(configLiveJson, "pwm" + pwm_number, start_state);
|
jsonWriteStr(configLiveJson, "pwm" + pwm_number, start_state);
|
||||||
|
|
||||||
createWidget(widget_name, page_name, page_number, "widgets/widget.range.json", "pwm" + pwm_number);
|
createWidget(widget_name, page_name, page_number, "range", "pwm" + pwm_number);
|
||||||
}
|
}
|
||||||
|
|
||||||
void pwmSet() {
|
void pwmSet() {
|
||||||
@@ -290,7 +296,7 @@ void inputDigit() {
|
|||||||
String start_state = sCmd.next();
|
String start_state = sCmd.next();
|
||||||
String page_number = sCmd.next();
|
String page_number = sCmd.next();
|
||||||
jsonWriteStr(configLiveJson, "digit" + number, start_state);
|
jsonWriteStr(configLiveJson, "digit" + number, start_state);
|
||||||
createWidget(widget_name, page_name, page_number, "widgets/widget.inputNum.json", "digit" + number);
|
createWidget(widget_name, page_name, page_number, "inputNum", "digit" + number);
|
||||||
}
|
}
|
||||||
|
|
||||||
void digitSet() {
|
void digitSet() {
|
||||||
@@ -312,7 +318,7 @@ void inputTime() {
|
|||||||
String start_state = sCmd.next();
|
String start_state = sCmd.next();
|
||||||
String page_number = sCmd.next();
|
String page_number = sCmd.next();
|
||||||
jsonWriteStr(configLiveJson, "time" + number, start_state);
|
jsonWriteStr(configLiveJson, "time" + number, start_state);
|
||||||
createWidget(widget_name, page_name, page_number, "widgets/widget.inputTime.json", "time" + number);
|
createWidget(widget_name, page_name, page_number, "inputTime", "time" + number);
|
||||||
}
|
}
|
||||||
|
|
||||||
void timeSet() {
|
void timeSet() {
|
||||||
@@ -342,7 +348,7 @@ void text() {
|
|||||||
String page_name = sCmd.next();
|
String page_name = sCmd.next();
|
||||||
String page_number = sCmd.next();
|
String page_number = sCmd.next();
|
||||||
|
|
||||||
createWidget(widget_name, page_name, page_number, "widgets/widget.anyData.json", "text" + number);
|
createWidget(widget_name, page_name, page_number, "anydata", "text" + number);
|
||||||
}
|
}
|
||||||
|
|
||||||
void textSet() {
|
void textSet() {
|
||||||
@@ -475,7 +481,7 @@ void servo_() {
|
|||||||
|
|
||||||
jsonWriteStr(configLiveJson, "servo" + servo_number, start_state);
|
jsonWriteStr(configLiveJson, "servo" + servo_number, start_state);
|
||||||
|
|
||||||
createWidgetParam(widget_name, page_name, page_number, "widgets/widget.range.json", "servo" + servo_number, "min", min_value, "max", max_value, "k", "1");
|
createWidgetParam(widget_name, page_name, page_number, "range", "servo" + servo_number, "min", min_value, "max", max_value, "k", "1");
|
||||||
}
|
}
|
||||||
|
|
||||||
void servoSet() {
|
void servoSet() {
|
||||||
@@ -545,6 +551,14 @@ void serialBegin() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void getData() {
|
||||||
|
String param = sCmd.next();
|
||||||
|
String res = param.length() ? jsonReadStr(configLiveJson, param) : configLiveJson;
|
||||||
|
if (term) {
|
||||||
|
term->println(res.c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void serialWrite() {
|
void serialWrite() {
|
||||||
String payload = sCmd.next();
|
String payload = sCmd.next();
|
||||||
if (term) {
|
if (term) {
|
||||||
@@ -576,11 +590,13 @@ void firmwareUpdate() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void firmwareVersion() {
|
void firmwareVersion() {
|
||||||
String widget_name = sCmd.next();
|
String widget = sCmd.next();
|
||||||
String page_name = sCmd.next();
|
String page = sCmd.next();
|
||||||
String page_number = sCmd.next();
|
String pageNumber = sCmd.next();
|
||||||
|
|
||||||
jsonWriteStr(configLiveJson, "firmver", FIRMWARE_VERSION);
|
jsonWriteStr(configLiveJson, "firmver", FIRMWARE_VERSION);
|
||||||
createWidgetByType(widget_name, page_name, page_number, "any-data", "firmver");
|
|
||||||
|
createWidget(widget, page, pageNumber, "anydata", "firmver");
|
||||||
}
|
}
|
||||||
|
|
||||||
void addCommandLoop(const String &cmdStr) {
|
void addCommandLoop(const String &cmdStr) {
|
||||||
@@ -594,35 +610,33 @@ void loopCmd() {
|
|||||||
if (order_loop.length()) {
|
if (order_loop.length()) {
|
||||||
String tmp = selectToMarker(order_loop, ","); //выделяем первую команду rel 5 1,
|
String tmp = selectToMarker(order_loop, ","); //выделяем первую команду rel 5 1,
|
||||||
sCmd.readStr(tmp); //выполняем
|
sCmd.readStr(tmp); //выполняем
|
||||||
Serial.println("[ORDER] => " + order_loop);
|
pm.info("do: " + order_loop);
|
||||||
order_loop = deleteBeforeDelimiter(order_loop, ","); //осекаем
|
order_loop = deleteBeforeDelimiter(order_loop, ","); //осекаем
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void txtExecution(String file) {
|
void fileExecute(const String &filename) {
|
||||||
String command_all = readFile(file, 2048) + "\r\n";
|
String cmdStr = readFile(filename, 2048);
|
||||||
|
cmdStr += "\r\n";
|
||||||
|
cmdStr.replace("\r\n", "\n");
|
||||||
|
cmdStr.replace("\r", "\n");
|
||||||
|
|
||||||
command_all.replace("\r\n", "\n");
|
while (cmdStr.length() != 0) {
|
||||||
command_all.replace("\r", "\n");
|
String buf = selectToMarker(cmdStr, "\n");
|
||||||
|
sCmd.readStr(buf);
|
||||||
while (command_all.length() != 0) {
|
cmdStr = deleteBeforeDelimiter(cmdStr, "\n");
|
||||||
String tmp = selectToMarker(command_all, "\n");
|
|
||||||
sCmd.readStr(tmp);
|
|
||||||
command_all = deleteBeforeDelimiter(command_all, "\n");
|
|
||||||
}
|
}
|
||||||
command_all = "";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void stringExecution(String str) {
|
void stringExecute(String &cmdStr) {
|
||||||
str = str + "\r\n";
|
cmdStr = cmdStr + "\r\n";
|
||||||
|
|
||||||
str.replace("\r\n", "\n");
|
cmdStr.replace("\r\n", "\n");
|
||||||
str.replace("\r", "\n");
|
cmdStr.replace("\r", "\n");
|
||||||
|
|
||||||
while (str.length() != 0) {
|
while (cmdStr.length()) {
|
||||||
String tmp = selectToMarker(str, "\n");
|
String buf = selectToMarker(cmdStr, "\n");
|
||||||
sCmd.readStr(tmp);
|
sCmd.readStr(buf);
|
||||||
|
cmdStr = deleteBeforeDelimiter(cmdStr, "\n");
|
||||||
str = deleteBeforeDelimiter(str, "\n");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -5,6 +5,8 @@ AsyncWebSocket ws;
|
|||||||
//AsyncEventSource events;
|
//AsyncEventSource events;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
Clock* rtc;
|
||||||
|
|
||||||
TickerScheduler ts(TEST + 1);
|
TickerScheduler ts(TEST + 1);
|
||||||
|
|
||||||
WiFiClient espClient;
|
WiFiClient espClient;
|
||||||
@@ -17,8 +19,6 @@ AsyncWebServer server(80);
|
|||||||
|
|
||||||
DallasTemperature sensors;
|
DallasTemperature sensors;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Global vars
|
* Global vars
|
||||||
*/
|
*/
|
||||||
@@ -73,3 +73,4 @@ boolean mqttParamsChanged = false;
|
|||||||
boolean udp_data_parse = false;
|
boolean udp_data_parse = false;
|
||||||
boolean mqtt_send_settings_to_udp = false;
|
boolean mqtt_send_settings_to_udp = false;
|
||||||
boolean i2c_scanning = false;
|
boolean i2c_scanning = false;
|
||||||
|
boolean fscheck_flag = false;
|
||||||
|
|||||||
15
src/Init.cpp
15
src/Init.cpp
@@ -19,7 +19,7 @@ void loadConfig() {
|
|||||||
|
|
||||||
void All_init() {
|
void All_init() {
|
||||||
Device_init();
|
Device_init();
|
||||||
Scenario_init();
|
loadScenario();
|
||||||
Timer_countdown_init();
|
Timer_countdown_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -57,17 +57,17 @@ void Device_init() {
|
|||||||
#ifdef LAYOUT_IN_RAM
|
#ifdef LAYOUT_IN_RAM
|
||||||
all_widgets = "";
|
all_widgets = "";
|
||||||
#else
|
#else
|
||||||
removeFile("/layout.txt");
|
removeFile(String("layout.txt"));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
txtExecution("100с.txt");
|
fileExecute(String(DEVICE_CONFIG_FILE));
|
||||||
//outcoming_date();
|
//outcoming_date();
|
||||||
}
|
}
|
||||||
//-------------------------------сценарии-----------------------------------------------------
|
//-------------------------------сценарии-----------------------------------------------------
|
||||||
|
|
||||||
void Scenario_init() {
|
void loadScenario() {
|
||||||
if (jsonReadStr(configSetupJson, "scen") == "1") {
|
if (jsonReadStr(configSetupJson, "scen") == "1") {
|
||||||
scenario = readFile("100s.txt", 2048);
|
scenario = readFile(String(DEVICE_SCENARIO_FILE), 2048);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -107,20 +107,15 @@ void handle_statistics() {
|
|||||||
urls += "iot-manager_esp32";
|
urls += "iot-manager_esp32";
|
||||||
#endif
|
#endif
|
||||||
urls += "&";
|
urls += "&";
|
||||||
//-----------------------------------------------------------------
|
|
||||||
#ifdef ESP8266
|
#ifdef ESP8266
|
||||||
urls += ESP.getResetReason();
|
urls += ESP.getResetReason();
|
||||||
//Serial.println(ESP.getResetReason());
|
|
||||||
#endif
|
#endif
|
||||||
#ifdef ESP32
|
#ifdef ESP32
|
||||||
urls += "Power on";
|
urls += "Power on";
|
||||||
#endif
|
#endif
|
||||||
urls += "&";
|
urls += "&";
|
||||||
//-----------------------------------------------------------------
|
|
||||||
urls += "ver: ";
|
urls += "ver: ";
|
||||||
urls += String(FIRMWARE_VERSION);
|
urls += String(FIRMWARE_VERSION);
|
||||||
//-----------------------------------------------------------------
|
|
||||||
String stat = getURL(urls);
|
String stat = getURL(urls);
|
||||||
//Serial.println(stat);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -5,6 +5,8 @@
|
|||||||
|
|
||||||
void sendLogData(String file, String topic);
|
void sendLogData(String file, String topic);
|
||||||
|
|
||||||
|
static const char* MODULE = "Log";
|
||||||
|
|
||||||
#ifdef LOGGING_ENABLED
|
#ifdef LOGGING_ENABLED
|
||||||
//===============================================Логирование============================================================
|
//===============================================Логирование============================================================
|
||||||
//logging temp1 1 10 Температура Датчики 2
|
//logging temp1 1 10 Температура Датчики 2
|
||||||
@@ -17,15 +19,18 @@ void logging() {
|
|||||||
String page_name = sCmd.next();
|
String page_name = sCmd.next();
|
||||||
String page_number = sCmd.next();
|
String page_number = sCmd.next();
|
||||||
logging_value_names_list += value_name + ",";
|
logging_value_names_list += value_name + ",";
|
||||||
enter_to_logging_counter++; //считаем количество входов в эту функцию
|
enter_to_logging_counter++; //считаем количество входов в эту функцию
|
||||||
jsonWriteStr(configOptionJson, value_name + "_c", maxCount); //создаем в файловой системе переменную количества точек на графике с отметкой _c что значит count
|
jsonWriteStr(configOptionJson, value_name + "_c", maxCount); //создаем в файловой системе переменную количества точек на графике с отметкой _c что значит count
|
||||||
createChart(widget_name, page_name, page_number, "widgets/widget.chart.json", value_name + "_ch", maxCount); //создаем график в приложении с топиком _ch /prefix/3234045-1589487/value_name_ch
|
|
||||||
|
//создаем график в приложении с топиком _ch /prefix/3234045-1589487/value_name_ch
|
||||||
|
createChart(widget_name, page_name, page_number, "chart", value_name + "_ch", maxCount);
|
||||||
|
|
||||||
if (enter_to_logging_counter == LOG1) {
|
if (enter_to_logging_counter == LOG1) {
|
||||||
ts.add(
|
ts.add(
|
||||||
LOG1, period_min.toInt() * 1000 * 60, [&](void*) {
|
LOG1, period_min.toInt() * 1000 * 60, [&](void*) {
|
||||||
String tmp_buf_1 = selectFromMarkerToMarker(logging_value_names_list, ",", 0);
|
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));
|
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");
|
pm.info("logging for " + tmp_buf_1 + " done");
|
||||||
},
|
},
|
||||||
nullptr, false);
|
nullptr, false);
|
||||||
}
|
}
|
||||||
@@ -34,7 +39,7 @@ void logging() {
|
|||||||
LOG2, period_min.toInt() * 1000 * 60, [&](void*) {
|
LOG2, period_min.toInt() * 1000 * 60, [&](void*) {
|
||||||
String tmp_buf_2 = selectFromMarkerToMarker(logging_value_names_list, ",", 1);
|
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));
|
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");
|
pm.info("logging for " + tmp_buf_2 + " done");
|
||||||
},
|
},
|
||||||
nullptr, false);
|
nullptr, false);
|
||||||
}
|
}
|
||||||
@@ -43,7 +48,7 @@ void logging() {
|
|||||||
LOG3, period_min.toInt() * 1000 * 60, [&](void*) {
|
LOG3, period_min.toInt() * 1000 * 60, [&](void*) {
|
||||||
String tmp_buf_3 = selectFromMarkerToMarker(logging_value_names_list, ",", 2);
|
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));
|
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");
|
pm.info("logging for " + tmp_buf_3 + " done");
|
||||||
},
|
},
|
||||||
nullptr, false);
|
nullptr, false);
|
||||||
}
|
}
|
||||||
@@ -52,7 +57,7 @@ void logging() {
|
|||||||
LOG4, period_min.toInt() * 1000 * 60, [&](void*) {
|
LOG4, period_min.toInt() * 1000 * 60, [&](void*) {
|
||||||
String tmp_buf_4 = selectFromMarkerToMarker(logging_value_names_list, ",", 3);
|
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));
|
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");
|
pm.info("logging for " + tmp_buf_4 + " done");
|
||||||
},
|
},
|
||||||
nullptr, false);
|
nullptr, false);
|
||||||
}
|
}
|
||||||
@@ -61,7 +66,7 @@ void logging() {
|
|||||||
LOG5, period_min.toInt() * 1000 * 60, [&](void*) {
|
LOG5, period_min.toInt() * 1000 * 60, [&](void*) {
|
||||||
String tmp_buf_5 = selectFromMarkerToMarker(logging_value_names_list, ",", 4);
|
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));
|
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");
|
pm.info("logging for " + tmp_buf_5 + " done");
|
||||||
},
|
},
|
||||||
nullptr, false);
|
nullptr, false);
|
||||||
}
|
}
|
||||||
@@ -74,10 +79,10 @@ void deleteOldDate(const String filename, size_t max_lines_cnt, String date_to_a
|
|||||||
String log_date = readFile(filename, 5120);
|
String log_date = readFile(filename, 5120);
|
||||||
size_t lines_cnt = itemsCount(log_date, "\r\n");
|
size_t lines_cnt = itemsCount(log_date, "\r\n");
|
||||||
|
|
||||||
Serial.printf("[I] log %s (%d lines)\n", filename.c_str(), lines_cnt);
|
pm.info("log " + filename + " (" + String(lines_cnt, DEC) + ")");
|
||||||
|
|
||||||
if ((lines_cnt > max_lines_cnt + 1) || !lines_cnt) {
|
if ((lines_cnt > max_lines_cnt + 1) || !lines_cnt) {
|
||||||
removeFile("/" + filename);
|
removeFile(filename);
|
||||||
lines_cnt = 0;
|
lines_cnt = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -92,7 +97,6 @@ void deleteOldDate(const String filename, size_t max_lines_cnt, String date_to_a
|
|||||||
addFile(filename, getTimeUnix() + " " + date_to_add);
|
addFile(filename, getTimeUnix() + " " + date_to_add);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
log_date = "";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//=========================================Выбор какие данные отправлять==================================================================
|
//=========================================Выбор какие данные отправлять==================================================================
|
||||||
@@ -103,19 +107,18 @@ void choose_log_date_and_send() {
|
|||||||
sendLogData("log." + tmp + ".txt", tmp + "_ch");
|
sendLogData("log." + tmp + ".txt", tmp + "_ch");
|
||||||
all_line = deleteBeforeDelimiter(all_line, ",");
|
all_line = deleteBeforeDelimiter(all_line, ",");
|
||||||
}
|
}
|
||||||
all_line = "";
|
|
||||||
}
|
}
|
||||||
//=========================================Отправка данных===================================================================================
|
//=========================================Отправка данных===================================================================================
|
||||||
void sendLogData(String file, String topic) {
|
void sendLogData(String file, String topic) {
|
||||||
String log_date = readFile(file, 5000);
|
String log_date = readFile(file, 5120);
|
||||||
if (log_date != "Failed") {
|
if (log_date != "failed") {
|
||||||
log_date.replace("\r\n", "\n");
|
log_date.replace("\r\n", "\n");
|
||||||
log_date.replace("\r", "\n");
|
log_date.replace("\r", "\n");
|
||||||
String buf = "{}";
|
String buf = "{}";
|
||||||
String json_array;
|
String json_array;
|
||||||
String unix_time;
|
String unix_time;
|
||||||
String value;
|
String value;
|
||||||
while (log_date.length() != 0) {
|
while (log_date.length()) {
|
||||||
String tmp = selectToMarker(log_date, "\n");
|
String tmp = selectToMarker(log_date, "\n");
|
||||||
log_date = deleteBeforeDelimiter(log_date, "\n");
|
log_date = deleteBeforeDelimiter(log_date, "\n");
|
||||||
unix_time = selectToMarker(tmp, " ");
|
unix_time = selectToMarker(tmp, " ");
|
||||||
@@ -133,40 +136,18 @@ void sendLogData(String file, String topic) {
|
|||||||
value = "";
|
value = "";
|
||||||
log_date = "";
|
log_date = "";
|
||||||
json_array = "{\"status\":[" + json_array + "]}";
|
json_array = "{\"status\":[" + json_array + "]}";
|
||||||
Serial.println(json_array);
|
pm.info(json_array);
|
||||||
|
|
||||||
MqttClient::publishChart(topic, json_array);
|
MqttClient::publishChart(topic, json_array);
|
||||||
json_array = "";
|
|
||||||
printMemoryStatus("[I] send log date");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
//----------------------------------------------
|
|
||||||
File configFile = SPIFFS.open("/" + file, "r");
|
|
||||||
if (!configFile) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
configFile.seek(0, SeekSet); //поставим курсор в начало файла
|
|
||||||
while (configFile.position() != configFile.size()) {
|
|
||||||
String tmp = configFile.readStringUntil('\r\n');
|
|
||||||
String unix_time = selectToMarker (tmp, " ");
|
|
||||||
String value = deleteBeforeDelimiter(tmp, " ");
|
|
||||||
String final_line = "{\"status\":{\"x\":" + unix_time + ",\"y1\":" + value + "}}";
|
|
||||||
//Serial.println(final_line);
|
|
||||||
sendCHART(topic, final_line);
|
|
||||||
}
|
|
||||||
getMemoryLoad("[I] after send log date");
|
|
||||||
*/
|
|
||||||
|
|
||||||
//=========================================Очистка данных===================================================================================
|
|
||||||
void clean_log_date() {
|
void clean_log_date() {
|
||||||
String all_line = logging_value_names_list;
|
String all_line = logging_value_names_list;
|
||||||
while (all_line.length() != 0) {
|
while (all_line.length()) {
|
||||||
String tmp = selectToMarker(all_line, ",");
|
String tmp = selectToMarker(all_line, ",");
|
||||||
removeFile("/log." + tmp + ".txt");
|
removeFile("log." + tmp + ".txt");
|
||||||
all_line = deleteBeforeDelimiter(all_line, ",");
|
all_line = deleteBeforeDelimiter(all_line, ",");
|
||||||
}
|
}
|
||||||
all_line = "";
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -29,7 +29,7 @@ void init() {
|
|||||||
if (!just_load) mqtt_lost_error++;
|
if (!just_load) mqtt_lost_error++;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
pm.error("WiFi connection lost");
|
pm.error("connection lost");
|
||||||
ts.remove(WIFI_MQTT_CONNECTION_CHECK);
|
ts.remove(WIFI_MQTT_CONNECTION_CHECK);
|
||||||
wifi_lost_error++;
|
wifi_lost_error++;
|
||||||
startAPMode();
|
startAPMode();
|
||||||
@@ -86,7 +86,7 @@ boolean connect() {
|
|||||||
mqttRootDevice = mqttPrefix + "/" + chipId;
|
mqttRootDevice = mqttPrefix + "/" + chipId;
|
||||||
|
|
||||||
pm.info("broker " + addr + ":" + String(port, DEC));
|
pm.info("broker " + addr + ":" + String(port, DEC));
|
||||||
pm.info("root " + mqttRootDevice);
|
pm.info("topic " + mqttRootDevice);
|
||||||
|
|
||||||
setLedStatus(LED_FAST);
|
setLedStatus(LED_FAST);
|
||||||
mqtt.setServer(addr.c_str(), port);
|
mqtt.setServer(addr.c_str(), port);
|
||||||
@@ -115,10 +115,8 @@ void handleSubscribedUpdates(char* topic, uint8_t* payload, size_t length) {
|
|||||||
payloadStr += (char)payload[i];
|
payloadStr += (char)payload[i];
|
||||||
}
|
}
|
||||||
pm.info(payloadStr);
|
pm.info(payloadStr);
|
||||||
|
if (payloadStr.startsWith("HELLO")) {
|
||||||
if (payloadStr == "HELLO") {
|
pm.info("Full update");
|
||||||
//данные которые отправляем при подключении или отбновлении страницы
|
|
||||||
pm.info("Send web page updates");
|
|
||||||
publishWidgets();
|
publishWidgets();
|
||||||
publishState();
|
publishState();
|
||||||
#ifdef LOGGING_ENABLED
|
#ifdef LOGGING_ENABLED
|
||||||
@@ -148,11 +146,11 @@ void handleSubscribedUpdates(char* topic, uint8_t* payload, size_t length) {
|
|||||||
upgrade = true;
|
upgrade = true;
|
||||||
}
|
}
|
||||||
} else if (topicStr.indexOf("devc")) {
|
} else if (topicStr.indexOf("devc")) {
|
||||||
writeFile("100с.txt", payloadStr);
|
writeFile(String(DEVICE_CONFIG_FILE), payloadStr);
|
||||||
Device_init();
|
Device_init();
|
||||||
} else if (topicStr.indexOf("devs")) {
|
} else if (topicStr.indexOf("devs")) {
|
||||||
writeFile("100s.txt", payloadStr);
|
writeFile(String(DEVICE_SCENARIO_FILE), payloadStr);
|
||||||
Scenario_init();
|
loadScenario();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -225,13 +223,14 @@ void publishWidgets() {
|
|||||||
|
|
||||||
#ifndef LAYOUT_IN_RAM
|
#ifndef LAYOUT_IN_RAM
|
||||||
void publishWidgets() {
|
void publishWidgets() {
|
||||||
auto file = seekFile("/layout.txt");
|
auto file = seekFile("layout.txt");
|
||||||
if (!file) {
|
if (!file) {
|
||||||
|
pm.error("on seek layout.txt");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
while (file.position() != file.size()) {
|
while (file.available()) {
|
||||||
String payload = file.readStringUntil('\n');
|
String payload = file.readStringUntil('\n');
|
||||||
pm.info("publish: " + payload);
|
pm.info("widgets: " + payload);
|
||||||
publishData("config", payload);
|
publishData("config", payload);
|
||||||
}
|
}
|
||||||
file.close();
|
file.close();
|
||||||
@@ -243,14 +242,13 @@ void publishState() {
|
|||||||
// {"name":"MODULES","lang":"","ip":"192.168.43.60","DS":"34.00","rel1":"1","rel2":"1"}
|
// {"name":"MODULES","lang":"","ip":"192.168.43.60","DS":"34.00","rel1":"1","rel2":"1"}
|
||||||
// "name":"MODULES","lang":"","ip":"192.168.43.60","DS":"34.00","rel1":"1","rel2":"1"
|
// "name":"MODULES","lang":"","ip":"192.168.43.60","DS":"34.00","rel1":"1","rel2":"1"
|
||||||
// "name":"MODULES","lang":"","ip":"192.168.43.60","DS":"34.00","rel1":"1","rel2":"1",
|
// "name":"MODULES","lang":"","ip":"192.168.43.60","DS":"34.00","rel1":"1","rel2":"1",
|
||||||
String current_config = configLiveJson;
|
String str = configLiveJson;
|
||||||
printMemoryStatus("[I] after send all date");
|
str.replace("{", "");
|
||||||
current_config.replace("{", "");
|
str.replace("}", "");
|
||||||
current_config.replace("}", "");
|
str += ",";
|
||||||
current_config += ",";
|
|
||||||
|
|
||||||
while (current_config.length()) {
|
while (str.length()) {
|
||||||
String tmp = selectToMarker(current_config, ",");
|
String tmp = selectToMarker(str, ",");
|
||||||
|
|
||||||
String topic = selectToMarker(tmp, ":");
|
String topic = selectToMarker(tmp, ":");
|
||||||
topic.replace("\"", "");
|
topic.replace("\"", "");
|
||||||
@@ -261,7 +259,7 @@ void publishState() {
|
|||||||
if (topic != "name" && topic != "lang" && topic != "ip" && topic.indexOf("_in") < 0) {
|
if (topic != "name" && topic != "lang" && topic != "ip" && topic.indexOf("_in") < 0) {
|
||||||
publishStatus(topic, state);
|
publishStatus(topic, state);
|
||||||
}
|
}
|
||||||
current_config = deleteBeforeDelimiter(current_config, ",");
|
str = deleteBeforeDelimiter(str, ",");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ void loopScenario() {
|
|||||||
|
|
||||||
if (flag) {
|
if (flag) {
|
||||||
tmp = deleteBeforeDelimiter(tmp, "\n"); //удаляем строку самого сценария оставляя только команды
|
tmp = deleteBeforeDelimiter(tmp, "\n"); //удаляем строку самого сценария оставляя только команды
|
||||||
stringExecution(tmp); //выполняем все команды
|
stringExecute(tmp); //выполняем все команды
|
||||||
|
|
||||||
Serial.println("[SCENARIO] '" + condition + "'");
|
Serial.println("[SCENARIO] '" + condition + "'");
|
||||||
//Serial.println(" " + tmp);
|
//Serial.println(" " + tmp);
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ void sensors_init() {
|
|||||||
//=========================================================================================================================================
|
//=========================================================================================================================================
|
||||||
//=========================================Модуль измерения уровня в баке==================================================================
|
//=========================================Модуль измерения уровня в баке==================================================================
|
||||||
#ifdef LEVEL_ENABLED
|
#ifdef LEVEL_ENABLED
|
||||||
//levelPr p 14 12 Вода#в#баке,#% Датчики fill-gauge 125 20 1
|
//levelPr p 14 12 Вода#в#баке,#% Датчики fillgauge 125 20 1
|
||||||
void levelPr() {
|
void levelPr() {
|
||||||
String value_name = sCmd.next();
|
String value_name = sCmd.next();
|
||||||
String trig = sCmd.next();
|
String trig = sCmd.next();
|
||||||
@@ -102,7 +102,7 @@ void levelPr() {
|
|||||||
createWidgetByType(widget_name, page_name, page_number, type, value_name);
|
createWidgetByType(widget_name, page_name, page_number, type, value_name);
|
||||||
sensors_reading_map[0] = 1;
|
sensors_reading_map[0] = 1;
|
||||||
}
|
}
|
||||||
//ultrasonicCm cm 14 12 Дистанция,#см Датчики fill-gauge 1
|
//ultrasonicCm cm 14 12 Дистанция,#см Датчики fillgauge 1
|
||||||
void ultrasonicCm() {
|
void ultrasonicCm() {
|
||||||
String value_name = sCmd.next();
|
String value_name = sCmd.next();
|
||||||
String trig = sCmd.next();
|
String trig = sCmd.next();
|
||||||
@@ -399,7 +399,7 @@ void dhtC() {
|
|||||||
String widget_name = sCmd.next();
|
String widget_name = sCmd.next();
|
||||||
String page_name = sCmd.next();
|
String page_name = sCmd.next();
|
||||||
String page_number = sCmd.next();
|
String page_number = sCmd.next();
|
||||||
createWidgetByType(widget_name, page_name, page_number, "any-data", "dhtComfort");
|
createWidgetByType(widget_name, page_name, page_number, "anydata", "dhtComfort");
|
||||||
sensors_reading_map[7] = 1;
|
sensors_reading_map[7] = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -459,7 +459,7 @@ void dhtD() {
|
|||||||
String widget_name = sCmd.next();
|
String widget_name = sCmd.next();
|
||||||
String page_name = sCmd.next();
|
String page_name = sCmd.next();
|
||||||
String page_number = sCmd.next();
|
String page_number = sCmd.next();
|
||||||
createWidgetByType(widget_name, page_name, page_number, "any-data", "dhtDewpoint");
|
createWidgetByType(widget_name, page_name, page_number, "anydata", "dhtDewpoint");
|
||||||
sensors_reading_map[8] = 1;
|
sensors_reading_map[8] = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#include "Global.h"
|
#include "Global.h"
|
||||||
|
|
||||||
void init_updater() {
|
void init_updater() {
|
||||||
#ifdef ESP8266
|
#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");
|
||||||
@@ -28,8 +29,9 @@ void upgrade_firmware() {
|
|||||||
String scenario_for_update;
|
String scenario_for_update;
|
||||||
String config_for_update;
|
String config_for_update;
|
||||||
String configSetup_for_update;
|
String configSetup_for_update;
|
||||||
scenario_for_update = readFile("100s.txt", 4000);
|
|
||||||
config_for_update = readFile("100с.txt", 4000);
|
scenario_for_update = readFile(String(DEVICE_SCENARIO_FILE), 4000);
|
||||||
|
config_for_update = readFile(String(DEVICE_CONFIG_FILE), 4000);
|
||||||
configSetup_for_update = configSetupJson;
|
configSetup_for_update = configSetupJson;
|
||||||
|
|
||||||
Serial.println("Start upgrade SPIFFS, please wait...");
|
Serial.println("Start upgrade SPIFFS, please wait...");
|
||||||
@@ -46,8 +48,8 @@ void upgrade_firmware() {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (ret == HTTP_UPDATE_OK) {
|
if (ret == HTTP_UPDATE_OK) {
|
||||||
writeFile("100s.txt", scenario_for_update);
|
writeFile(String(DEVICE_SCENARIO_FILE), scenario_for_update);
|
||||||
writeFile("100с.txt", config_for_update);
|
writeFile(String(DEVICE_CONFIG_FILE), config_for_update);
|
||||||
writeFile("config.json", configSetup_for_update);
|
writeFile("config.json", configSetup_for_update);
|
||||||
saveConfig();
|
saveConfig();
|
||||||
|
|
||||||
|
|||||||
@@ -15,27 +15,34 @@ bool fileSystemInit() {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void removeFile(const String filename) {
|
void removeFile(const String& filename) {
|
||||||
if (!LittleFS.remove(filepath(filename))) {
|
String path = filepath(filename);
|
||||||
pm.error("remove " + filename);
|
if (LittleFS.exists(path)) {
|
||||||
|
if (!LittleFS.remove(path)) {
|
||||||
|
pm.error("remove " + path);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
pm.info("not exist" + path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
File seekFile(const String filename, size_t position) {
|
File seekFile(const String& filename, size_t position) {
|
||||||
auto file = LittleFS.open(filepath(filename), "r");
|
String path = filepath(filename);
|
||||||
|
auto file = LittleFS.open(path, "r");
|
||||||
if (!file) {
|
if (!file) {
|
||||||
pm.error("open " + filename);
|
pm.error("open " + path);
|
||||||
}
|
}
|
||||||
// поставим курсор в начало файла
|
// поставим курсор в начало файла
|
||||||
file.seek(position, SeekSet);
|
file.seek(position, SeekSet);
|
||||||
return file;
|
return file;
|
||||||
}
|
}
|
||||||
|
|
||||||
String readFileString(const String filename, const String to_find) {
|
const String readFileString(const String& filename, const String& to_find) {
|
||||||
String res = "Failed";
|
String path = filepath(filename);
|
||||||
auto file = LittleFS.open(filepath(filename), "r");
|
String res = "failed";
|
||||||
|
auto file = LittleFS.open(path, "r");
|
||||||
if (!file) {
|
if (!file) {
|
||||||
return "Failed";
|
return "failed";
|
||||||
}
|
}
|
||||||
if (file.find(to_find.c_str())) {
|
if (file.find(to_find.c_str())) {
|
||||||
res = file.readStringUntil('\n');
|
res = file.readStringUntil('\n');
|
||||||
@@ -44,19 +51,21 @@ String readFileString(const String filename, const String to_find) {
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
String addFile(const String filename, const String str) {
|
const String addFile(const String& filename, const String& str) {
|
||||||
auto file = LittleFS.open(filepath(filename), "a");
|
String path = filepath(filename);
|
||||||
|
auto file = LittleFS.open(path, "a");
|
||||||
if (!file) {
|
if (!file) {
|
||||||
return "Failed";
|
return "failed";
|
||||||
}
|
}
|
||||||
file.println(str);
|
file.println(str);
|
||||||
file.close();
|
file.close();
|
||||||
return "Sucсess";
|
return "sucсess";
|
||||||
}
|
}
|
||||||
|
|
||||||
bool copyFile(const String src, const String dst, bool overwrite) {
|
bool copyFile(const String& src, const String& dst, bool overwrite) {
|
||||||
String srcPath = filepath(src);
|
String srcPath = filepath(src);
|
||||||
String dstPath = filepath(dst);
|
String dstPath = filepath(dst);
|
||||||
|
pm.info("copy " + srcPath + " to " + dstPath);
|
||||||
if (!LittleFS.exists(srcPath)) {
|
if (!LittleFS.exists(srcPath)) {
|
||||||
pm.error("not exist: " + srcPath);
|
pm.error("not exist: " + srcPath);
|
||||||
return false;
|
return false;
|
||||||
@@ -81,35 +90,38 @@ bool copyFile(const String src, const String dst, bool overwrite) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
String writeFile(const String filename, const String str) {
|
const String writeFile(const String& filename, const String& str) {
|
||||||
auto file = LittleFS.open(filepath(filename), "w");
|
String path = filepath(filename);
|
||||||
|
auto file = LittleFS.open(path, "w");
|
||||||
if (!file) {
|
if (!file) {
|
||||||
return "Failed";
|
return "failed";
|
||||||
}
|
}
|
||||||
file.print(str);
|
file.print(str);
|
||||||
file.close();
|
file.close();
|
||||||
return "Sucсess";
|
return "sucсess";
|
||||||
}
|
}
|
||||||
|
|
||||||
String readFile(const String filename, size_t max_size) {
|
const String readFile(const String& filename, size_t max_size) {
|
||||||
auto file = LittleFS.open(filepath(filename), "r");
|
String path = filepath(filename);
|
||||||
|
auto file = LittleFS.open(path, "r");
|
||||||
if (!file) {
|
if (!file) {
|
||||||
return "Failed";
|
return "failed";
|
||||||
}
|
}
|
||||||
size_t size = file.size();
|
size_t size = file.size();
|
||||||
if (size > max_size) {
|
if (size > max_size) {
|
||||||
file.close();
|
file.close();
|
||||||
return "Large";
|
return "large";
|
||||||
}
|
}
|
||||||
String temp = file.readString();
|
String temp = file.readString();
|
||||||
file.close();
|
file.close();
|
||||||
return temp;
|
return temp;
|
||||||
}
|
}
|
||||||
|
|
||||||
String getFileSize(const String filename) {
|
const String getFileSize(const String filename) {
|
||||||
auto file = LittleFS.open(filepath(filename), "r");
|
String filepath(filename);
|
||||||
|
auto file = LittleFS.open(filepath, "r");
|
||||||
if (!file) {
|
if (!file) {
|
||||||
return "Failed";
|
return "failed";
|
||||||
}
|
}
|
||||||
size_t size = file.size();
|
size_t size = file.size();
|
||||||
file.close();
|
file.close();
|
||||||
|
|||||||
@@ -8,6 +8,12 @@ String jsonReadStr(String& json, String name) {
|
|||||||
return root[name].as<String>();
|
return root[name].as<String>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
boolean jsonReadBool(String& json, String name) {
|
||||||
|
DynamicJsonBuffer jsonBuffer;
|
||||||
|
JsonObject& root = jsonBuffer.parseObject(json);
|
||||||
|
return root[name].as<boolean>();
|
||||||
|
}
|
||||||
|
|
||||||
int jsonReadInt(String& json, String name) {
|
int jsonReadInt(String& json, String name) {
|
||||||
DynamicJsonBuffer jsonBuffer;
|
DynamicJsonBuffer jsonBuffer;
|
||||||
JsonObject& root = jsonBuffer.parseObject(json);
|
JsonObject& root = jsonBuffer.parseObject(json);
|
||||||
|
|||||||
@@ -1,54 +1,9 @@
|
|||||||
#include "Utils/PresetUtils.h"
|
#include "Utils/PresetUtils.h"
|
||||||
|
|
||||||
static const char* item_names[NUM_ITEMS] = {"relay", "pwm",
|
static const char* config_file_fmt PROGMEM = "/conf/%s%03d.txt";
|
||||||
"dht11", "dht22", "analog",
|
|
||||||
"bmp280", "bme280", "dallas",
|
|
||||||
"termostat", "ultrasonic",
|
|
||||||
"motion", "stepper",
|
|
||||||
"servo", "firmware"};
|
|
||||||
|
|
||||||
static const char* config_file_fmt = "/conf/%03d%s.txt";
|
const String getConfigFile(uint8_t preset, ConfigType_t type) {
|
||||||
|
|
||||||
const String getPresetFile(uint8_t preset, ConfigType_t type) {
|
|
||||||
char buf[64];
|
char buf[64];
|
||||||
sprintf(buf, config_file_fmt, preset, type == CT_MACRO ? "c" : "s");
|
sprintf_P(buf, config_file_fmt, (type == CT_CONFIG) ? "c" : "s", preset);
|
||||||
return String(buf);
|
return String(buf);
|
||||||
}
|
|
||||||
|
|
||||||
const String getItemName(Item_t item) {
|
|
||||||
return String(item_names[item]);
|
|
||||||
}
|
|
||||||
|
|
||||||
const Item_t getPresetItem(uint8_t num) {
|
|
||||||
Item_t res = NUM_ITEMS;
|
|
||||||
if (num >= 1 && num <= 7) {
|
|
||||||
res = RELAY;
|
|
||||||
} else if (num == 8) {
|
|
||||||
res = PWM;
|
|
||||||
} else if (num == 9) {
|
|
||||||
res = DHT11;
|
|
||||||
} else if (num == 10) {
|
|
||||||
res = DHT22;
|
|
||||||
} else if (num == 11) {
|
|
||||||
res = ANALOG;
|
|
||||||
} else if (num == 12) {
|
|
||||||
res = BMP280;
|
|
||||||
} else if (num == 13) {
|
|
||||||
res = BME280;
|
|
||||||
} else if (num == 14) {
|
|
||||||
res = DALLAS;
|
|
||||||
} else if (num == 15) {
|
|
||||||
res = TERMOSTAT;
|
|
||||||
} else if (num == 16) {
|
|
||||||
res = ULTRASONIC;
|
|
||||||
} else if (num >= 17 || num <= 18) {
|
|
||||||
res = MOTION;
|
|
||||||
} else if (num == 19) {
|
|
||||||
res = STEPPER;
|
|
||||||
} else if (num == 20) {
|
|
||||||
res = SERVO;
|
|
||||||
} else if (num == 21) {
|
|
||||||
res = FIRMWARE;
|
|
||||||
}
|
|
||||||
return res;
|
|
||||||
}
|
}
|
||||||
@@ -23,25 +23,24 @@ static uint32_t total_memory = 52864;
|
|||||||
static uint32_t total_memory = 362868;
|
static uint32_t total_memory = 362868;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void printMemoryStatus(String text) {
|
const String printMemoryStatus() {
|
||||||
uint32_t free = ESP.getFreeHeap();
|
uint32_t free = ESP.getFreeHeap();
|
||||||
uint32_t used = total_memory - free;
|
uint32_t used = total_memory - free;
|
||||||
uint32_t memory_load = (used * 100) / total_memory;
|
uint32_t memory_load = (used * 100) / total_memory;
|
||||||
if (text) {
|
char buf[64];
|
||||||
Serial.print(text);
|
sprintf(buf, "used: %d%% free: %s", memory_load, getHeapStats().c_str());
|
||||||
}
|
return String(buf);
|
||||||
Serial.printf(" used: %d%% free: %s\n", memory_load, prettyBytes(free).c_str());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef ESP8266
|
#ifdef ESP8266
|
||||||
String getHeapStats() {
|
const String getHeapStats() {
|
||||||
uint32_t free;
|
uint32_t free;
|
||||||
uint16_t max;
|
uint16_t max;
|
||||||
uint8_t frag;
|
uint8_t frag;
|
||||||
ESP.getHeapStats(&free, &max, &frag);
|
ESP.getHeapStats(&free, &max, &frag);
|
||||||
String buf;
|
String buf;
|
||||||
buf += prettyBytes(free);
|
buf += prettyBytes(free);
|
||||||
buf += " ";
|
buf += " frag: ";
|
||||||
buf += frag;
|
buf += frag;
|
||||||
buf += '%';
|
buf += '%';
|
||||||
return buf;
|
return buf;
|
||||||
|
|||||||
@@ -6,33 +6,17 @@
|
|||||||
#define ONE_MINUTE_s 60
|
#define ONE_MINUTE_s 60
|
||||||
#define ONE_HOUR_s 60 * ONE_MINUTE_s
|
#define ONE_HOUR_s 60 * ONE_MINUTE_s
|
||||||
|
|
||||||
int getBiasInSeconds() {
|
time_t t;
|
||||||
return 3600 * jsonReadStr(configSetupJson, "timezone").toInt();
|
struct tm* tm;
|
||||||
}
|
static const char* wd[7] = {"Sun", "Mon", "Tue", "Wed", "Thr", "Fri", "Sat"};
|
||||||
|
|
||||||
int getBiasInMinutes() {
|
|
||||||
return getBiasInSeconds() / 60;
|
|
||||||
}
|
|
||||||
|
|
||||||
const timezone getTimeZone() {
|
|
||||||
return timezone{getBiasInMinutes(), 0};
|
|
||||||
}
|
|
||||||
|
|
||||||
time_t getSystemTime() {
|
|
||||||
timeval tv{0, 0};
|
|
||||||
timezone tz = getTimeZone();
|
|
||||||
time_t epoch = 0;
|
|
||||||
if (gettimeofday(&tv, &tz) != -1)
|
|
||||||
epoch = tv.tv_sec;
|
|
||||||
return epoch;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool hasTimeSynced() {
|
|
||||||
time_t now = time(nullptr);
|
|
||||||
return now > millis();
|
|
||||||
}
|
|
||||||
|
|
||||||
String getTimeUnix() {
|
String getTimeUnix() {
|
||||||
|
t = time(NULL);
|
||||||
|
tm = localtime(&t);
|
||||||
|
Serial.printf("%04d/%02d/%02d(%s) %02d:%02d:%02d\n",
|
||||||
|
tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
|
||||||
|
wd[tm->tm_wday],
|
||||||
|
tm->tm_hour, tm->tm_min, tm->tm_sec);
|
||||||
|
delay(1000);
|
||||||
time_t now = time(nullptr);
|
time_t now = time(nullptr);
|
||||||
if (now < 30000) {
|
if (now < 30000) {
|
||||||
return "failed";
|
return "failed";
|
||||||
@@ -149,127 +133,6 @@ const String prettyMillis(unsigned long time_ms) {
|
|||||||
return String(buf);
|
return String(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
int timeZoneInSeconds(const byte timeZone) {
|
|
||||||
int res = 0;
|
|
||||||
switch (constrain(timeZone, 1, 38)) {
|
|
||||||
case 1:
|
|
||||||
res = -12 * ONE_HOUR_s;
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
res = -11 * ONE_HOUR_s;
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
res = -10 * ONE_HOUR_s;
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
res = -9 * ONE_HOUR_s - 30 * ONE_MINUTE_s;
|
|
||||||
break;
|
|
||||||
case 5:
|
|
||||||
res = -9 * ONE_HOUR_s;
|
|
||||||
break;
|
|
||||||
case 6:
|
|
||||||
res = -8 * ONE_HOUR_s;
|
|
||||||
break;
|
|
||||||
case 7:
|
|
||||||
res = -7 * ONE_HOUR_s;
|
|
||||||
break;
|
|
||||||
case 8:
|
|
||||||
res = -6 * ONE_HOUR_s;
|
|
||||||
break;
|
|
||||||
case 9:
|
|
||||||
res = -5 * ONE_HOUR_s;
|
|
||||||
break;
|
|
||||||
case 10:
|
|
||||||
res = -4 * ONE_HOUR_s;
|
|
||||||
break;
|
|
||||||
case 11:
|
|
||||||
res = -3 * ONE_HOUR_s - 30 * ONE_MINUTE_s;
|
|
||||||
break;
|
|
||||||
case 12:
|
|
||||||
res = -3 * ONE_HOUR_s;
|
|
||||||
break;
|
|
||||||
case 13:
|
|
||||||
res = -2 * ONE_HOUR_s;
|
|
||||||
break;
|
|
||||||
case 14:
|
|
||||||
res = -1 * ONE_HOUR_s;
|
|
||||||
break;
|
|
||||||
case 15:
|
|
||||||
res = 0;
|
|
||||||
break;
|
|
||||||
case 16:
|
|
||||||
res = 1 * ONE_HOUR_s;
|
|
||||||
break;
|
|
||||||
case 17:
|
|
||||||
res = 2 * ONE_HOUR_s;
|
|
||||||
break;
|
|
||||||
case 18:
|
|
||||||
res = 3 * ONE_HOUR_s;
|
|
||||||
break;
|
|
||||||
case 19:
|
|
||||||
res = 3 * ONE_HOUR_s + 30 * ONE_MINUTE_s;
|
|
||||||
break;
|
|
||||||
case 20:
|
|
||||||
res = 4 * ONE_HOUR_s;
|
|
||||||
break;
|
|
||||||
case 21:
|
|
||||||
res = 4 * ONE_HOUR_s + 30 * ONE_MINUTE_s;
|
|
||||||
break;
|
|
||||||
case 22:
|
|
||||||
res = 5 * ONE_HOUR_s;
|
|
||||||
break;
|
|
||||||
case 23:
|
|
||||||
res = 5 * ONE_HOUR_s + 30 * ONE_MINUTE_s;
|
|
||||||
break;
|
|
||||||
case 24:
|
|
||||||
res = 5 * ONE_HOUR_s + 45 * ONE_MINUTE_s;
|
|
||||||
break;
|
|
||||||
case 25:
|
|
||||||
res = 6 * ONE_HOUR_s;
|
|
||||||
break;
|
|
||||||
case 26:
|
|
||||||
res = 6 * ONE_HOUR_s + 30 * ONE_MINUTE_s;
|
|
||||||
break;
|
|
||||||
case 27:
|
|
||||||
res = 7 * ONE_HOUR_s;
|
|
||||||
break;
|
|
||||||
case 28:
|
|
||||||
res = 8 * ONE_HOUR_s;
|
|
||||||
break;
|
|
||||||
case 29:
|
|
||||||
res = 8 * ONE_HOUR_s + 45 * ONE_MINUTE_s;
|
|
||||||
break;
|
|
||||||
case 30:
|
|
||||||
res = 9 * ONE_HOUR_s;
|
|
||||||
break;
|
|
||||||
case 31:
|
|
||||||
res = 9 * ONE_HOUR_s + 30 * ONE_MINUTE_s;
|
|
||||||
break;
|
|
||||||
case 32:
|
|
||||||
res = 10 * ONE_HOUR_s;
|
|
||||||
break;
|
|
||||||
case 33:
|
|
||||||
res = 10 * ONE_HOUR_s + 30 * ONE_MINUTE_s;
|
|
||||||
break;
|
|
||||||
case 34:
|
|
||||||
res = 11 * ONE_HOUR_s;
|
|
||||||
break;
|
|
||||||
case 35:
|
|
||||||
res = 12 * ONE_HOUR_s;
|
|
||||||
break;
|
|
||||||
case 36:
|
|
||||||
res = 12 * ONE_HOUR_s + 45 * ONE_MINUTE_s;
|
|
||||||
break;
|
|
||||||
case 37:
|
|
||||||
res = 13 * ONE_HOUR_s;
|
|
||||||
break;
|
|
||||||
case 38:
|
|
||||||
res = 14 * ONE_HOUR_s;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned long millis_since(unsigned long sinse) {
|
unsigned long millis_since(unsigned long sinse) {
|
||||||
return millis_passed(sinse, millis());
|
return millis_passed(sinse, millis());
|
||||||
}
|
}
|
||||||
|
|||||||
30
src/Utils/i2c_bus.cpp
Normal file
30
src/Utils/i2c_bus.cpp
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
#include "Utils/i2c_bus.h"
|
||||||
|
|
||||||
|
#include "Global.h"
|
||||||
|
|
||||||
|
void do_i2c_scanning() {
|
||||||
|
String tmp = i2c_scan();
|
||||||
|
if (tmp == "error") {
|
||||||
|
tmp = i2c_scan();
|
||||||
|
}
|
||||||
|
jsonWriteStr(configLiveJson, "i2c", tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
const String i2c_scan() {
|
||||||
|
String out;
|
||||||
|
byte count = 0;
|
||||||
|
Wire.begin();
|
||||||
|
for (byte i = 8; i < 120; i++) {
|
||||||
|
Wire.beginTransmission(i);
|
||||||
|
if (Wire.endTransmission() == 0) {
|
||||||
|
count++;
|
||||||
|
out += String(count) + ". 0x" + String(i, HEX) + "; ";
|
||||||
|
delay(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (count == 0) {
|
||||||
|
return "error";
|
||||||
|
} else {
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
}
|
||||||
41
src/Web.cpp
41
src/Web.cpp
@@ -11,7 +11,7 @@ static const uint8_t MAX_PRESET = 21;
|
|||||||
bool parseRequestForPreset(AsyncWebServerRequest* request, uint8_t& preset) {
|
bool parseRequestForPreset(AsyncWebServerRequest* request, uint8_t& preset) {
|
||||||
if (request->hasArg("preset")) {
|
if (request->hasArg("preset")) {
|
||||||
preset = request->getParam("preset")->value().toInt();
|
preset = request->getParam("preset")->value().toInt();
|
||||||
return (preset >= MIN_PRESET && preset <= MAX_PRESET) || preset == 100;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -22,15 +22,13 @@ void web_init() {
|
|||||||
server.on("/set", HTTP_GET, [](AsyncWebServerRequest* request) {
|
server.on("/set", HTTP_GET, [](AsyncWebServerRequest* request) {
|
||||||
uint8_t preset;
|
uint8_t preset;
|
||||||
if (parseRequestForPreset(request, preset)) {
|
if (parseRequestForPreset(request, preset)) {
|
||||||
pm.info("activate # " + String(preset, DEC) + "(" + getItemName(getPresetItem(preset)) + ")");
|
pm.info("activate #" + String(preset, DEC));
|
||||||
String srcMacro = preset == 21 ? "configs/100с.txt" : getPresetFile(preset, CT_MACRO);
|
String configFile = DEVICE_CONFIG_FILE;
|
||||||
String srcScenario = preset == 21 ? "configs/100s.txt" : getPresetFile(preset, CT_SCENARIO);
|
String scenarioFile = DEVICE_SCENARIO_FILE;
|
||||||
copyFile(srcMacro, "100с.txt");
|
copyFile(getConfigFile(preset, CT_CONFIG), configFile);
|
||||||
copyFile(srcScenario, "100s.txt");
|
copyFile(getConfigFile(preset, CT_SCENARIO), scenarioFile);
|
||||||
|
|
||||||
Device_init();
|
Device_init();
|
||||||
Scenario_init();
|
loadScenario();
|
||||||
|
|
||||||
request->redirect("/?set.device");
|
request->redirect("/?set.device");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -45,18 +43,18 @@ void web_init() {
|
|||||||
if (value == "0") {
|
if (value == "0") {
|
||||||
jsonWriteStr(configSetupJson, "scen", value);
|
jsonWriteStr(configSetupJson, "scen", value);
|
||||||
saveConfig();
|
saveConfig();
|
||||||
Scenario_init();
|
loadScenario();
|
||||||
}
|
}
|
||||||
if (value == "1") {
|
if (value == "1") {
|
||||||
jsonWriteStr(configSetupJson, "scen", value);
|
jsonWriteStr(configSetupJson, "scen", value);
|
||||||
saveConfig();
|
saveConfig();
|
||||||
Scenario_init();
|
loadScenario();
|
||||||
}
|
}
|
||||||
request->send(200, "text/text", "OK");
|
request->send(200, "text/text", "OK");
|
||||||
}
|
}
|
||||||
//--------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------
|
||||||
if (request->hasArg("sceninit")) {
|
if (request->hasArg("sceninit")) {
|
||||||
Scenario_init();
|
loadScenario();
|
||||||
request->send(200, "text/text", "OK");
|
request->send(200, "text/text", "OK");
|
||||||
}
|
}
|
||||||
//--------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------
|
||||||
@@ -72,12 +70,12 @@ void web_init() {
|
|||||||
if (value == "0") {
|
if (value == "0") {
|
||||||
jsonWriteStr(configSetupJson, "udponoff", value);
|
jsonWriteStr(configSetupJson, "udponoff", value);
|
||||||
saveConfig();
|
saveConfig();
|
||||||
Scenario_init();
|
loadScenario();
|
||||||
}
|
}
|
||||||
if (value == "1") {
|
if (value == "1") {
|
||||||
jsonWriteStr(configSetupJson, "udponoff", value);
|
jsonWriteStr(configSetupJson, "udponoff", value);
|
||||||
saveConfig();
|
saveConfig();
|
||||||
Scenario_init();
|
loadScenario();
|
||||||
}
|
}
|
||||||
request->send(200, "text/text", "OK");
|
request->send(200, "text/text", "OK");
|
||||||
}
|
}
|
||||||
@@ -132,15 +130,17 @@ void web_init() {
|
|||||||
}
|
}
|
||||||
//--------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------
|
||||||
if (request->hasArg("timezone")) {
|
if (request->hasArg("timezone")) {
|
||||||
jsonWriteStr(configSetupJson, "timezone", request->getParam("timezone")->value());
|
String timezoneStr = request->getParam("timezone")->value();
|
||||||
|
jsonWriteStr(configSetupJson, "timezone", timezoneStr);
|
||||||
saveConfig();
|
saveConfig();
|
||||||
reconfigTime();
|
rtc->setTimezone(timezoneStr.toInt());
|
||||||
request->send(200, "text/text", "OK");
|
request->send(200, "text/text", "OK");
|
||||||
}
|
}
|
||||||
if (request->hasArg("ntp")) {
|
if (request->hasArg("ntp")) {
|
||||||
jsonWriteStr(configSetupJson, "ntp", request->getParam("ntp")->value());
|
String ntpStr = request->getParam("ntp")->value();
|
||||||
|
jsonWriteStr(configSetupJson, "ntp", ntpStr);
|
||||||
saveConfig();
|
saveConfig();
|
||||||
reconfigTime();
|
rtc->setNtpPool(ntpStr);
|
||||||
request->send(200, "text/text", "OK");
|
request->send(200, "text/text", "OK");
|
||||||
}
|
}
|
||||||
//--------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------
|
||||||
@@ -222,6 +222,11 @@ void web_init() {
|
|||||||
i2c_scanning = true;
|
i2c_scanning = true;
|
||||||
request->redirect("/?set.utilities");
|
request->redirect("/?set.utilities");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (request->hasArg("fscheck")) {
|
||||||
|
fscheck_flag = true;
|
||||||
|
request->redirect("/?set.utilities");
|
||||||
|
}
|
||||||
});
|
});
|
||||||
//==============================upgrade settings=============================================
|
//==============================upgrade settings=============================================
|
||||||
server.on("/check", HTTP_GET, [](AsyncWebServerRequest* request) {
|
server.on("/check", HTTP_GET, [](AsyncWebServerRequest* request) {
|
||||||
|
|||||||
@@ -1,18 +1,24 @@
|
|||||||
#include "Global.h"
|
#include "Global.h"
|
||||||
|
|
||||||
|
static const char* MODULE = "Widget";
|
||||||
|
|
||||||
const String getWidgetFile(const String& name);
|
const String getWidgetFile(const String& name);
|
||||||
|
|
||||||
bool loadWidget(const String filename, String& buf) {
|
bool loadWidget(const String& filename, String& buf) {
|
||||||
buf = readFile(filename, 1024);
|
buf = readFile(getWidgetFile(filename), 2048);
|
||||||
return !(buf == "Failed" || buf == "Large");
|
bool res = !(buf == "Failed" || buf == "Large");
|
||||||
|
if (!res) {
|
||||||
|
pm.error("on load" + filename);
|
||||||
|
}
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
void createWidget(String widget, String page, String pageNumber, String filename, String topic) {
|
void createWidget(String widget, String page, String pageNumber, String filename, String topic) {
|
||||||
String buf;
|
String buf = "{}";
|
||||||
if (!loadWidget(filename, buf)) {
|
if (!loadWidget(filename, buf)) {
|
||||||
|
pm.error("failed " + widget);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
widget.replace("#", " ");
|
widget.replace("#", " ");
|
||||||
page.replace("#", " ");
|
page.replace("#", " ");
|
||||||
|
|
||||||
@@ -29,7 +35,7 @@ void createWidget(String widget, String page, String pageNumber, String filename
|
|||||||
}
|
}
|
||||||
|
|
||||||
void createWidgetParam(String widget, String page, String pageNumber, String filename, String topic, String name1, String param1, String name2, String param2, String name3, String param3) {
|
void createWidgetParam(String widget, String page, String pageNumber, String filename, String topic, String name1, String param1, String name2, String param2, String name3, String param3) {
|
||||||
String buf;
|
String buf = "";
|
||||||
if (!loadWidget(filename, buf)) {
|
if (!loadWidget(filename, buf)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -54,7 +60,7 @@ void createWidgetParam(String widget, String page, String pageNumber, String fil
|
|||||||
}
|
}
|
||||||
|
|
||||||
void createChart(String widget, String page, String pageNumber, String filename, String topic, String maxCount) {
|
void createChart(String widget, String page, String pageNumber, String filename, String topic, String maxCount) {
|
||||||
String buf;
|
String buf = "";
|
||||||
if (!loadWidget(filename, buf)) {
|
if (!loadWidget(filename, buf)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -77,9 +83,11 @@ void createChart(String widget, String page, String pageNumber, String filename,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void createWidgetByType(String widget, String page, String pageNumber, String type, String topic) {
|
void createWidgetByType(String widget, String page, String pageNumber, String type, String topic) {
|
||||||
|
pm.info("create" + type);
|
||||||
createWidget(widget, page, pageNumber, getWidgetFile(type), topic);
|
createWidget(widget, page, pageNumber, getWidgetFile(type), topic);
|
||||||
}
|
}
|
||||||
|
|
||||||
const String getWidgetFile(const String& name) {
|
const String getWidgetFile(const String& name) {
|
||||||
return "widgets/" + name + ".json";
|
pm.info("get " + name);
|
||||||
|
return "/widgets/" + name + ".json";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,35 +0,0 @@
|
|||||||
#include "Global.h"
|
|
||||||
|
|
||||||
void do_i2c_scanning() {
|
|
||||||
if (i2c_scanning) {
|
|
||||||
i2c_scanning = false;
|
|
||||||
String tmp = i2c_scan();
|
|
||||||
if (tmp == "error") {
|
|
||||||
tmp = i2c_scan();
|
|
||||||
Serial.println(tmp);
|
|
||||||
jsonWriteStr(configLiveJson, "i2c", tmp);
|
|
||||||
} else {
|
|
||||||
Serial.println(tmp);
|
|
||||||
jsonWriteStr(configLiveJson, "i2c", tmp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
String i2c_scan() {
|
|
||||||
String out;
|
|
||||||
byte count = 0;
|
|
||||||
Wire.begin();
|
|
||||||
for (byte i = 8; i < 120; i++) {
|
|
||||||
Wire.beginTransmission(i);
|
|
||||||
if (Wire.endTransmission() == 0) {
|
|
||||||
count++;
|
|
||||||
out += String(count) + ". 0x" + String(i, HEX) + "; ";
|
|
||||||
delay(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (count == 0) {
|
|
||||||
return "error";
|
|
||||||
} else {
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
28
src/main.cpp
28
src/main.cpp
@@ -1,11 +1,15 @@
|
|||||||
#include "Global.h"
|
#include "Global.h"
|
||||||
|
|
||||||
#include "HttpServer.h"
|
#include "HttpServer.h"
|
||||||
|
#include "Utils/i2c_bus.h"
|
||||||
|
|
||||||
void not_async_actions();
|
void not_async_actions();
|
||||||
|
|
||||||
static const char* MODULE = "Main";
|
static const char* MODULE = "Main";
|
||||||
|
|
||||||
|
void do_fscheck(String& results) {
|
||||||
|
}
|
||||||
|
|
||||||
void setup() {
|
void setup() {
|
||||||
WiFi.setAutoConnect(false);
|
WiFi.setAutoConnect(false);
|
||||||
WiFi.persistent(false);
|
WiFi.persistent(false);
|
||||||
@@ -52,10 +56,14 @@ void setup() {
|
|||||||
pm.info("WebAdmin");
|
pm.info("WebAdmin");
|
||||||
web_init();
|
web_init();
|
||||||
|
|
||||||
pm.info("TimeSync");
|
pm.info("Clock");
|
||||||
|
rtc = new Clock();
|
||||||
|
rtc->setNtpPool(jsonReadStr(configSetupJson, "ntp"));
|
||||||
|
rtc->setTimezone(jsonReadStr(configSetupJson, "timezone").toInt());
|
||||||
|
|
||||||
ts.add(
|
ts.add(
|
||||||
TIME_SYNC, 30000, [&](void*) {
|
TIME_SYNC, 30000, [&](void*) {
|
||||||
startTimeSync();
|
rtc->hasSync();
|
||||||
},
|
},
|
||||||
nullptr, true);
|
nullptr, true);
|
||||||
|
|
||||||
@@ -65,7 +73,7 @@ void setup() {
|
|||||||
#endif
|
#endif
|
||||||
ts.add(
|
ts.add(
|
||||||
TEST, 10000, [&](void*) {
|
TEST, 10000, [&](void*) {
|
||||||
printMemoryStatus();
|
pm.info(printMemoryStatus());
|
||||||
},
|
},
|
||||||
nullptr, true);
|
nullptr, true);
|
||||||
|
|
||||||
@@ -73,7 +81,7 @@ void setup() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void saveConfig() {
|
void saveConfig() {
|
||||||
writeFile("config.json", configSetupJson);
|
writeFile(String("config.json"), configSetupJson);
|
||||||
}
|
}
|
||||||
|
|
||||||
void loop() {
|
void loop() {
|
||||||
@@ -114,7 +122,17 @@ void not_async_actions() {
|
|||||||
do_mqtt_send_settings_to_udp();
|
do_mqtt_send_settings_to_udp();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
do_i2c_scanning();
|
if (i2c_scanning) {
|
||||||
|
do_i2c_scanning();
|
||||||
|
i2c_scanning = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fscheck_flag) {
|
||||||
|
String buf;
|
||||||
|
do_fscheck(buf);
|
||||||
|
jsonWriteStr(configLiveJson, "fscheck", buf);
|
||||||
|
fscheck_flag = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
String getURL(const String& urls) {
|
String getURL(const String& urls) {
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ void add_dev_in_list(String fileName, String id, String dev_name, String ip);
|
|||||||
|
|
||||||
#ifdef UDP_ENABLED
|
#ifdef UDP_ENABLED
|
||||||
void UDP_init() {
|
void UDP_init() {
|
||||||
removeFile("/dev.csv");
|
removeFile("dev.csv");
|
||||||
addFile("dev.csv", "device id;device name;ip address");
|
addFile("dev.csv", "device id;device name;ip address");
|
||||||
|
|
||||||
#ifdef ESP8266
|
#ifdef ESP8266
|
||||||
|
|||||||
Reference in New Issue
Block a user