This commit is contained in:
Yuri Trikoz
2020-06-25 05:09:11 +03:00
parent 3daa517c7e
commit b50e1c9791
73 changed files with 260 additions and 296 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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 помощью сценариев

View File

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

View File

@@ -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 помощью сценариев

View File

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

View File

@@ -41,7 +41,7 @@ enum LedStatus_t {
}; };
enum ConfigType_t { enum ConfigType_t {
CT_MACRO, CT_CONFIG,
CT_SCENARIO CT_SCENARIO
}; };

View File

@@ -9,6 +9,10 @@
#define MQTT_RECONNECT_INTERVAL 20000 #define MQTT_RECONNECT_INTERVAL 20000
// 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

View File

@@ -107,6 +107,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 +144,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();
@@ -245,9 +242,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();

View File

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

View File

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

7
include/Utils/i2c_bus.h Normal file
View File

@@ -0,0 +1,7 @@
#pragma once
#include <Arduino.h>
void do_i2c_scanning();
const String i2c_scan();

View File

@@ -6,7 +6,7 @@ static const char* MODULE = "Clock";
void startTimeSync() { void startTimeSync() {
if (!hasTimeSynced()) { if (!hasTimeSynced()) {
pm.info("Start syncing"); pm.info("Start sync");
reconfigTime(); reconfigTime();
} }
} }
@@ -42,7 +42,7 @@ void reconfigTime() {
while (!hasTimeSynced() && i < 4) { while (!hasTimeSynced() && i < 4) {
Serial.print("."); Serial.print(".");
i++; i++;
delay(300); delay(30);
} }
#endif #endif

View File

@@ -120,13 +120,13 @@ void button() {
if (button_param == "scen") { if (button_param == "scen") {
jsonWriteStr(configSetupJson, "scen", start_state); jsonWriteStr(configSetupJson, "scen", start_state);
Scenario_init(); loadScenario();
saveConfig(); saveConfig();
} }
if (button_param.indexOf("line") != -1) { if (button_param.indexOf("line") != -1) {
String str = button_param; String str = button_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,
@@ -137,7 +137,7 @@ void button() {
str = deleteBeforeDelimiter(str, ","); str = deleteBeforeDelimiter(str, ",");
} }
} }
createWidget(widget_name, page_name, page_number, "widgets/widget.toggle.json", "button" + button_number); createWidget(widget_name, page_name, page_number, "toggle", "button" + button_number);
} }
void buttonSet() { void buttonSet() {
@@ -151,7 +151,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 +187,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 +222,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 +291,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 +313,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 +343,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 +476,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() {
@@ -580,7 +581,7 @@ void firmwareVersion() {
String page_name = sCmd.next(); String page_name = sCmd.next();
String page_number = sCmd.next(); String page_number = sCmd.next();
jsonWriteStr(configLiveJson, "firmver", FIRMWARE_VERSION); jsonWriteStr(configLiveJson, "firmver", FIRMWARE_VERSION);
createWidgetByType(widget_name, page_name, page_number, "any-data", "firmver"); createWidgetByType(widget_name, page_name, page_number, "anydata", "firmver");
} }
void addCommandLoop(const String &cmdStr) { void addCommandLoop(const String &cmdStr) {
@@ -599,30 +600,28 @@ void loopCmd() {
} }
} }
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");
} }
} }

View File

@@ -17,8 +17,6 @@ AsyncWebServer server(80);
DallasTemperature sensors; DallasTemperature sensors;
/* /*
* Global vars * Global vars
*/ */
@@ -73,3 +71,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;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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,37 @@ 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"); auto file = LittleFS.open(filepath(filename), "r");
if (!file) { if (!file) {
return "Failed"; return "failed";
} }
size_t size = file.size(); size_t size = file.size();
file.close(); file.close();

View File

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

View File

@@ -28,7 +28,7 @@ time_t getSystemTime() {
} }
bool hasTimeSynced() { bool hasTimeSynced() {
time_t now = time(nullptr); unsigned long now = time(nullptr);
return now > millis(); return now > millis();
} }

30
src/Utils/i2c_bus.cpp Normal file
View 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;
}
}

View File

@@ -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");
} }
@@ -222,6 +220,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) {

View File

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

View File

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

View File

@@ -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);
@@ -73,7 +77,7 @@ void setup() {
} }
void saveConfig() { void saveConfig() {
writeFile("config.json", configSetupJson); writeFile(String("config.json"), configSetupJson);
} }
void loop() { void loop() {
@@ -114,7 +118,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) {