mirror of
https://github.com/IoTManagerProject/IoTManager.git
synced 2026-04-01 12:59:12 +03:00
Compare commits
44 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ad440eef94 | ||
|
|
5ab6d13ae6 | ||
|
|
970136bb75 | ||
|
|
0de1df8625 | ||
|
|
708eb5f67e | ||
|
|
83d1531267 | ||
|
|
be5bd3ede4 | ||
|
|
e79be004b9 | ||
|
|
03f0d563ee | ||
|
|
2bc3c44b64 | ||
|
|
44dec6aece | ||
|
|
3135e5658f | ||
|
|
48ddb1a505 | ||
|
|
01a419d987 | ||
|
|
61b0c4b6b8 | ||
|
|
a154f3cd15 | ||
|
|
cf182b2fe7 | ||
|
|
996af08d6e | ||
|
|
130a7fef0b | ||
|
|
99a17e4a0c | ||
|
|
0e074e68ca | ||
|
|
df5525bc7a | ||
|
|
70cb7164ce | ||
|
|
fc567c2f4a | ||
|
|
ec76321206 | ||
|
|
bf75e9f4b7 | ||
|
|
3ea2509b6d | ||
|
|
07f439b900 | ||
|
|
ae64d8f8ff | ||
|
|
58bbfec87f | ||
|
|
4442b46603 | ||
|
|
a31c303c23 | ||
|
|
ac5b7e5775 | ||
|
|
696c51b113 | ||
|
|
990bd6fb47 | ||
|
|
285a898ba9 | ||
|
|
ba30af5182 | ||
|
|
5250049e08 | ||
|
|
c7ba7fecbc | ||
|
|
abfc847793 | ||
|
|
7d1c0268f5 | ||
|
|
b6145695cc | ||
|
|
0cf60ab214 | ||
|
|
a038960a4c |
BIN
CH341SER_WIN_3.5.ZIP
Normal file
BIN
CH341SER_WIN_3.5.ZIP
Normal file
Binary file not shown.
517
Cmd.ino
517
Cmd.ino
@@ -4,8 +4,6 @@ void CMD_init() {
|
|||||||
sCmd.addCommand("buttonSet", buttonSet);
|
sCmd.addCommand("buttonSet", buttonSet);
|
||||||
sCmd.addCommand("buttonChange", buttonChange);
|
sCmd.addCommand("buttonChange", buttonChange);
|
||||||
|
|
||||||
//sCmd.addCommand("button_touch", button_touch);
|
|
||||||
|
|
||||||
sCmd.addCommand("pinSet", pinSet);
|
sCmd.addCommand("pinSet", pinSet);
|
||||||
sCmd.addCommand("pinChange", pinChange);
|
sCmd.addCommand("pinChange", pinChange);
|
||||||
|
|
||||||
@@ -14,20 +12,53 @@ void CMD_init() {
|
|||||||
|
|
||||||
sCmd.addCommand("switch", switch_);
|
sCmd.addCommand("switch", switch_);
|
||||||
|
|
||||||
|
#ifdef analog_enable
|
||||||
sCmd.addCommand("analog", analog);
|
sCmd.addCommand("analog", analog);
|
||||||
|
#endif
|
||||||
|
#ifdef level_enable
|
||||||
sCmd.addCommand("level", level);
|
sCmd.addCommand("level", level);
|
||||||
|
#endif
|
||||||
|
#ifdef dallas_enable
|
||||||
sCmd.addCommand("dallas", dallas);
|
sCmd.addCommand("dallas", dallas);
|
||||||
|
#endif
|
||||||
|
#ifdef dht_enable
|
||||||
sCmd.addCommand("dhtT", dhtT);
|
sCmd.addCommand("dhtT", dhtT);
|
||||||
sCmd.addCommand("dhtH", dhtH);
|
sCmd.addCommand("dhtH", dhtH);
|
||||||
sCmd.addCommand("dhtPerception", dhtPerception);
|
sCmd.addCommand("dhtPerception", dhtP);
|
||||||
sCmd.addCommand("dhtComfort", dhtComfort);
|
sCmd.addCommand("dhtComfort", dhtC);
|
||||||
sCmd.addCommand("dhtDewpoint", dhtDewpoint);
|
sCmd.addCommand("dhtDewpoint", dhtD);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef bmp_enable
|
||||||
|
sCmd.addCommand("bmp280T", bmp280T);
|
||||||
|
sCmd.addCommand("bmp280P", bmp280P);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef bme_enable
|
||||||
|
sCmd.addCommand("bme280T", bme280T);
|
||||||
|
sCmd.addCommand("bme280P", bme280P);
|
||||||
|
sCmd.addCommand("bme280H", bme280H);
|
||||||
|
sCmd.addCommand("bme280A", bme280A);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef stepper_enable
|
||||||
sCmd.addCommand("stepper", stepper);
|
sCmd.addCommand("stepper", stepper);
|
||||||
sCmd.addCommand("stepperSet", stepperSet);
|
sCmd.addCommand("stepperSet", stepperSet);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef servo_enable
|
||||||
|
sCmd.addCommand("servo", servo_);
|
||||||
|
sCmd.addCommand("servoSet", servoSet);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef serial_enable
|
||||||
|
sCmd.addCommand("serialBegin", serialBegin);
|
||||||
|
sCmd.addCommand("serialWrite", serialWrite);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef logging_enable
|
||||||
sCmd.addCommand("logging", logging);
|
sCmd.addCommand("logging", logging);
|
||||||
|
#endif
|
||||||
|
|
||||||
sCmd.addCommand("inputDigit", inputDigit);
|
sCmd.addCommand("inputDigit", inputDigit);
|
||||||
sCmd.addCommand("digitSet", digitSet);
|
sCmd.addCommand("digitSet", digitSet);
|
||||||
@@ -41,30 +72,18 @@ void CMD_init() {
|
|||||||
sCmd.addCommand("text", text);
|
sCmd.addCommand("text", text);
|
||||||
sCmd.addCommand("textSet", textSet);
|
sCmd.addCommand("textSet", textSet);
|
||||||
|
|
||||||
|
|
||||||
sCmd.addCommand("mqtt", mqttOrderSend);
|
sCmd.addCommand("mqtt", mqttOrderSend);
|
||||||
sCmd.addCommand("http", httpOrderSend);
|
sCmd.addCommand("http", httpOrderSend);
|
||||||
|
|
||||||
|
#ifdef push_enable
|
||||||
sCmd.addCommand("push", pushControl);
|
sCmd.addCommand("push", pushControl);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
sCmd.addCommand("update", update_firmware);
|
||||||
|
sCmd.addCommand("firmware", firmware);
|
||||||
|
|
||||||
|
|
||||||
handle_time_init();
|
handle_time_init();
|
||||||
|
|
||||||
//======новые виджеты ver2.0=======//
|
|
||||||
/*
|
|
||||||
sCmd.addCommand("inputText", inputText);
|
|
||||||
sCmd.addCommand("inputTextSet", inputTextSet);
|
|
||||||
|
|
||||||
sCmd.addCommand("inputTime", inputTime);
|
|
||||||
sCmd.addCommand("inputTimeSet", inputTimeSet);
|
|
||||||
|
|
||||||
sCmd.addCommand("inputDate", inputDate);
|
|
||||||
sCmd.addCommand("inputDateSet", inputDateSet);
|
|
||||||
|
|
||||||
sCmd.addCommand("inputDate", inputDate);
|
|
||||||
|
|
||||||
//sCmd.addCommand("inputDropdown", inputDropdown);
|
|
||||||
*/
|
|
||||||
//=================================//
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -75,21 +94,21 @@ void button() {
|
|||||||
|
|
||||||
String button_number = sCmd.next();
|
String button_number = sCmd.next();
|
||||||
String button_param = sCmd.next();
|
String button_param = sCmd.next();
|
||||||
String viget_name = sCmd.next();
|
String widget_name = sCmd.next();
|
||||||
String page_name = sCmd.next();
|
String page_name = sCmd.next();
|
||||||
String start_state = sCmd.next();
|
String start_state = sCmd.next();
|
||||||
String page_number = sCmd.next();
|
String page_number = sCmd.next();
|
||||||
|
|
||||||
jsonWrite(optionJson, "button_param" + button_number, button_param);
|
jsonWriteStr(configOptionJson, "button_param" + button_number, button_param);
|
||||||
jsonWrite(configJson, "buttonSet" + button_number, start_state);
|
jsonWriteStr(configLiveJson, "button" + button_number, start_state);
|
||||||
|
|
||||||
if (isDigitStr (button_param)) {
|
if (isDigitStr (button_param)) {
|
||||||
pinMode(button_param.toInt(), OUTPUT);
|
pinMode(button_param.toInt(), OUTPUT);
|
||||||
digitalWrite(button_param.toInt(), start_state.toInt());
|
digitalWrite(button_param.toInt(), start_state.toInt());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (button_param == "scenario") {
|
if (button_param == "scen") {
|
||||||
jsonWrite(configSetup, "scenario", start_state);
|
jsonWriteStr(configSetupJson, "scen", start_state);
|
||||||
Scenario_init();
|
Scenario_init();
|
||||||
saveConfig();
|
saveConfig();
|
||||||
}
|
}
|
||||||
@@ -107,21 +126,21 @@ void button() {
|
|||||||
str = deleteBeforeDelimiter(str, ",");
|
str = deleteBeforeDelimiter(str, ",");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
createViget (viget_name, page_name, page_number, "vigets/viget.toggle.json", "buttonSet" + button_number);
|
createWidget (widget_name, page_name, page_number, "widgets/widget.toggle.json", "button" + button_number);
|
||||||
}
|
}
|
||||||
|
|
||||||
void buttonSet() {
|
void buttonSet() {
|
||||||
|
|
||||||
String button_number = sCmd.next();
|
String button_number = sCmd.next();
|
||||||
String button_state = sCmd.next();
|
String button_state = sCmd.next();
|
||||||
String button_param = jsonRead(optionJson, "button_param" + button_number);
|
String button_param = jsonReadStr(configOptionJson, "button_param" + button_number);
|
||||||
|
|
||||||
if (button_param != "na" || button_param != "scenario" || button_param.indexOf("line") != -1) {
|
if (button_param != "na" || button_param != "scen" || button_param.indexOf("line") != -1) {
|
||||||
digitalWrite(button_param.toInt(), button_state.toInt());
|
digitalWrite(button_param.toInt(), button_state.toInt());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (button_param == "scenario") {
|
if (button_param == "scen") {
|
||||||
jsonWrite(configSetup, "scenario", button_state);
|
jsonWriteStr(configSetupJson, "scen", button_state);
|
||||||
Scenario_init();
|
Scenario_init();
|
||||||
saveConfig();
|
saveConfig();
|
||||||
}
|
}
|
||||||
@@ -140,23 +159,23 @@ void buttonSet() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
eventGen ("buttonSet", button_number);
|
eventGen ("button", button_number);
|
||||||
|
|
||||||
jsonWrite(configJson, "buttonSet" + button_number, button_state);
|
jsonWriteStr(configLiveJson, "button" + button_number, button_state);
|
||||||
sendSTATUS("buttonSet" + button_number, button_state);
|
sendSTATUS("button" + button_number, button_state);
|
||||||
}
|
}
|
||||||
|
|
||||||
void buttonChange() {
|
void buttonChange() {
|
||||||
String button_number = sCmd.next();
|
String button_number = sCmd.next();
|
||||||
String current_state = jsonRead(configJson, "buttonSet" + button_number);
|
String current_state = jsonReadStr(configLiveJson, "button" + button_number);
|
||||||
if (current_state == "1") {
|
if (current_state == "1") {
|
||||||
current_state = "0";
|
current_state = "0";
|
||||||
} else if (current_state == "0") {
|
} else if (current_state == "0") {
|
||||||
current_state = "1";
|
current_state = "1";
|
||||||
}
|
}
|
||||||
order_loop += "buttonSet " + button_number + " " + current_state + ",";
|
order_loop += "buttonSet " + button_number + " " + current_state + ",";
|
||||||
jsonWrite(configJson, "buttonSet" + button_number, current_state);
|
jsonWriteStr(configLiveJson, "button" + button_number, current_state);
|
||||||
sendSTATUS("buttonSet" + button_number, current_state);
|
sendSTATUS("button" + button_number, current_state);
|
||||||
}
|
}
|
||||||
|
|
||||||
void pinSet() {
|
void pinSet() {
|
||||||
@@ -178,21 +197,21 @@ void pwm() {
|
|||||||
static boolean flag = true;
|
static boolean flag = true;
|
||||||
String pwm_number = sCmd.next();
|
String pwm_number = sCmd.next();
|
||||||
String pwm_pin = sCmd.next();
|
String pwm_pin = sCmd.next();
|
||||||
String viget_name = sCmd.next();
|
String widget_name = sCmd.next();
|
||||||
viget_name.replace("#", " ");
|
widget_name.replace("#", " ");
|
||||||
String page_name = sCmd.next();
|
String page_name = sCmd.next();
|
||||||
String start_state = sCmd.next();
|
String start_state = sCmd.next();
|
||||||
String page_number = sCmd.next();
|
String page_number = sCmd.next();
|
||||||
|
|
||||||
|
|
||||||
uint8_t pwm_pin_int = pwm_pin.toInt();
|
uint8_t pwm_pin_int = pwm_pin.toInt();
|
||||||
jsonWrite(optionJson, "pwm_pin" + pwm_number, pwm_pin);
|
jsonWriteStr(configOptionJson, "pwm_pin" + pwm_number, pwm_pin);
|
||||||
pinMode(pwm_pin_int, INPUT);
|
pinMode(pwm_pin_int, INPUT);
|
||||||
analogWrite(pwm_pin_int, start_state.toInt());
|
analogWrite(pwm_pin_int, start_state.toInt());
|
||||||
//analogWriteFreq(32000);
|
//analogWriteFreq(32000);
|
||||||
jsonWrite(configJson, "pwmSet" + pwm_number, start_state);
|
jsonWriteStr(configLiveJson, "pwm" + pwm_number, start_state);
|
||||||
|
|
||||||
createViget (viget_name, page_name, page_number, "vigets/viget.range.json", "pwmSet" + pwm_number);
|
createWidget (widget_name, page_name, page_number, "widgets/widget.range.json", "pwm" + pwm_number);
|
||||||
}
|
}
|
||||||
|
|
||||||
void pwmSet() {
|
void pwmSet() {
|
||||||
@@ -201,13 +220,13 @@ void pwmSet() {
|
|||||||
String pwm_state = sCmd.next();
|
String pwm_state = sCmd.next();
|
||||||
int pwm_state_int = pwm_state.toInt();
|
int pwm_state_int = pwm_state.toInt();
|
||||||
|
|
||||||
int pin = jsonReadtoInt(optionJson, "pwm_pin" + pwm_number);
|
int pin = jsonReadInt(configOptionJson, "pwm_pin" + pwm_number);
|
||||||
analogWrite(pin, pwm_state_int);
|
analogWrite(pin, pwm_state_int);
|
||||||
|
|
||||||
eventGen ("pwmSet", pwm_number);
|
eventGen ("pwm", pwm_number);
|
||||||
|
|
||||||
jsonWrite(configJson, "pwmSet" + pwm_number, pwm_state);
|
jsonWriteStr(configLiveJson, "pwm" + pwm_number, pwm_state);
|
||||||
sendSTATUS("pwmSet" + pwm_number, pwm_state);
|
sendSTATUS("pwm" + pwm_number, pwm_state);
|
||||||
}
|
}
|
||||||
//==================================================================================================================
|
//==================================================================================================================
|
||||||
//==========================================Модуль физической кнопки================================================
|
//==========================================Модуль физической кнопки================================================
|
||||||
@@ -230,15 +249,15 @@ void handleButton() {
|
|||||||
buttons[switch_number].update();
|
buttons[switch_number].update();
|
||||||
if (buttons[switch_number].fell()) {
|
if (buttons[switch_number].fell()) {
|
||||||
|
|
||||||
eventGen ("switchSet", String(switch_number));
|
eventGen ("switch", String(switch_number));
|
||||||
|
|
||||||
jsonWrite(configJson, "switchSet" + String(switch_number), "1");
|
jsonWriteStr(configLiveJson, "switch" + String(switch_number), "1");
|
||||||
}
|
}
|
||||||
if (buttons[switch_number].rose()) {
|
if (buttons[switch_number].rose()) {
|
||||||
|
|
||||||
eventGen ("switchSet", String(switch_number));
|
eventGen ("switch", String(switch_number));
|
||||||
|
|
||||||
jsonWrite(configJson, "switchSet" + String(switch_number), "0");
|
jsonWriteStr(configLiveJson, "switch" + String(switch_number), "0");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
switch_number++;
|
switch_number++;
|
||||||
@@ -250,49 +269,50 @@ void handleButton() {
|
|||||||
void inputDigit() {
|
void inputDigit() {
|
||||||
String value_name = sCmd.next();
|
String value_name = sCmd.next();
|
||||||
String number = value_name.substring(5);
|
String number = value_name.substring(5);
|
||||||
String viget_name = sCmd.next();
|
String widget_name = sCmd.next();
|
||||||
viget_name.replace("#", " ");
|
widget_name.replace("#", " ");
|
||||||
String page_name = sCmd.next();
|
String page_name = sCmd.next();
|
||||||
page_name.replace("#", " ");
|
page_name.replace("#", " ");
|
||||||
String start_state = sCmd.next();
|
String start_state = sCmd.next();
|
||||||
String page_number = sCmd.next();
|
String page_number = sCmd.next();
|
||||||
jsonWrite(configJson, "digitSet" + number, start_state);
|
jsonWriteStr(configLiveJson, "digit" + number, start_state);
|
||||||
createViget (viget_name, page_name, page_number, "vigets/viget.inputNum.json", "digitSet" + number);
|
createWidget (widget_name, page_name, page_number, "widgets/widget.inputNum.json", "digit" + number);
|
||||||
}
|
}
|
||||||
void digitSet() {
|
void digitSet() {
|
||||||
String number = sCmd.next();
|
String number = sCmd.next();
|
||||||
String value = sCmd.next();
|
String value = sCmd.next();
|
||||||
jsonWrite(configJson, "digitSet" + number, value);
|
jsonWriteStr(configLiveJson, "digit" + number, value);
|
||||||
sendSTATUS("digitSet" + number, value);
|
sendSTATUS("digit" + number, value);
|
||||||
}
|
}
|
||||||
//=====================================================================================================================================
|
//=====================================================================================================================================
|
||||||
//=========================================Добавление окна ввода времени===============================================================
|
//=========================================Добавление окна ввода времени===============================================================
|
||||||
void inputTime() {
|
void inputTime() {
|
||||||
String value_name = sCmd.next();
|
String value_name = sCmd.next();
|
||||||
String number = value_name.substring(4);
|
String number = value_name.substring(4);
|
||||||
String viget_name = sCmd.next();
|
String widget_name = sCmd.next();
|
||||||
viget_name.replace("#", " ");
|
widget_name.replace("#", " ");
|
||||||
String page_name = sCmd.next();
|
String page_name = sCmd.next();
|
||||||
page_name.replace("#", " ");
|
page_name.replace("#", " ");
|
||||||
String start_state = sCmd.next();
|
String start_state = sCmd.next();
|
||||||
String page_number = sCmd.next();
|
String page_number = sCmd.next();
|
||||||
jsonWrite(configJson, "timeSet" + number, start_state);
|
jsonWriteStr(configLiveJson, "time" + number, start_state);
|
||||||
createViget (viget_name, page_name, page_number, "vigets/viget.inputTime.json", "timeSet" + number);
|
createWidget (widget_name, page_name, page_number, "widgets/widget.inputTime.json", "time" + number);
|
||||||
}
|
}
|
||||||
void timeSet() {
|
void timeSet() {
|
||||||
String number = sCmd.next();
|
String number = sCmd.next();
|
||||||
String value = sCmd.next();
|
String value = sCmd.next();
|
||||||
jsonWrite(configJson, "timeSet" + number, value);
|
jsonWriteStr(configLiveJson, "time" + number, value);
|
||||||
sendSTATUS("timeSet" + number, value);
|
sendSTATUS("time" + number, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
void handle_time_init() {
|
void handle_time_init() {
|
||||||
ts.add(TIME, 1000, [&](void*) {
|
ts.add(TIME, 1000, [&](void*) {
|
||||||
|
|
||||||
String tmp = GetTime();
|
String tmp = GetTime();
|
||||||
|
jsonWriteStr(configLiveJson, "time", tmp);
|
||||||
tmp.replace(":", "-");
|
tmp.replace(":", "-");
|
||||||
jsonWrite(configJson, "timenowSet", tmp);
|
jsonWriteStr(configLiveJson, "timenow", tmp);
|
||||||
eventGen ("timenowSet", "");
|
eventGen ("timenow", "");
|
||||||
|
|
||||||
}, nullptr, true);
|
}, nullptr, true);
|
||||||
}
|
}
|
||||||
@@ -302,11 +322,11 @@ void handle_time_init() {
|
|||||||
void text() {
|
void text() {
|
||||||
|
|
||||||
String number = sCmd.next();
|
String number = sCmd.next();
|
||||||
String viget_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();
|
||||||
|
|
||||||
createViget (viget_name, page_name, page_number, "vigets/viget.anydata.json", "textSet" + number);
|
createWidget (widget_name, page_name, page_number, "widgets/widget.anyData.json", "text" + number);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -324,20 +344,19 @@ void textSet() {
|
|||||||
text = text + " " + GetDataDigital() + " " + time;
|
text = text + " " + GetDataDigital() + " " + time;
|
||||||
}
|
}
|
||||||
|
|
||||||
jsonWrite(configJson, "textSet" + number, text);
|
jsonWriteStr(configLiveJson, "text" + number, text);
|
||||||
sendSTATUS("textSet" + number, text);
|
sendSTATUS("text" + number, text);
|
||||||
}
|
}
|
||||||
|
|
||||||
//=====================================================================================================================================
|
//=====================================================================================================================================
|
||||||
//=========================================Модуль шагового мотора======================================================================
|
//=========================================Модуль шагового мотора======================================================================
|
||||||
|
#ifdef stepper_enable
|
||||||
//stepper 1 12 13
|
//stepper 1 12 13
|
||||||
void stepper() {
|
void stepper() {
|
||||||
String stepper_number = sCmd.next();
|
String stepper_number = sCmd.next();
|
||||||
String pin_step = sCmd.next();
|
String pin_step = sCmd.next();
|
||||||
String pin_dir = sCmd.next();
|
String pin_dir = sCmd.next();
|
||||||
|
|
||||||
jsonWrite(optionJson, "stepper" + stepper_number, pin_step + " " + pin_dir);
|
jsonWriteStr(configOptionJson, "stepper" + stepper_number, pin_step + " " + pin_dir);
|
||||||
pinMode(pin_step.toInt(), OUTPUT);
|
pinMode(pin_step.toInt(), OUTPUT);
|
||||||
pinMode(pin_dir.toInt(), OUTPUT);
|
pinMode(pin_dir.toInt(), OUTPUT);
|
||||||
}
|
}
|
||||||
@@ -346,21 +365,22 @@ void stepper() {
|
|||||||
void stepperSet() {
|
void stepperSet() {
|
||||||
String stepper_number = sCmd.next();
|
String stepper_number = sCmd.next();
|
||||||
String steps = sCmd.next();
|
String steps = sCmd.next();
|
||||||
jsonWrite(optionJson, "steps" + stepper_number, steps);
|
jsonWriteStr(configOptionJson, "steps" + stepper_number, steps);
|
||||||
String stepper_speed = sCmd.next();
|
String stepper_speed = sCmd.next();
|
||||||
String pin_step = selectToMarker (jsonRead(optionJson, "stepper" + stepper_number), " ");
|
String pin_step = selectToMarker (jsonReadStr(configOptionJson, "stepper" + stepper_number), " ");
|
||||||
String pin_dir = deleteBeforeDelimiter (jsonRead(optionJson, "stepper" + stepper_number), " ");
|
String pin_dir = deleteBeforeDelimiter (jsonReadStr(configOptionJson, "stepper" + stepper_number), " ");
|
||||||
Serial.println(pin_step);
|
Serial.println(pin_step);
|
||||||
Serial.println(pin_dir);
|
Serial.println(pin_dir);
|
||||||
if (steps.toInt() > 0) digitalWrite(pin_dir.toInt(), HIGH);
|
if (steps.toInt() > 0) digitalWrite(pin_dir.toInt(), HIGH);
|
||||||
if (steps.toInt() < 0) digitalWrite(pin_dir.toInt(), LOW);
|
if (steps.toInt() < 0) digitalWrite(pin_dir.toInt(), LOW);
|
||||||
if (stepper_number == "1") {
|
if (stepper_number == "1") {
|
||||||
ts.add(STEPPER1, stepper_speed.toInt(), [&](void*) {
|
ts.add(STEPPER1, stepper_speed.toInt(), [&](void*) {
|
||||||
int steps_int = abs(jsonReadtoInt(optionJson, "steps1") * 2);
|
int steps_int = abs(jsonReadInt(configOptionJson, "steps1") * 2);
|
||||||
static int count;
|
static int count;
|
||||||
count++;
|
count++;
|
||||||
String pin_step = selectToMarker (jsonRead(optionJson, "stepper1"), " ");
|
String pin_step = selectToMarker (jsonReadStr(configOptionJson, "stepper1"), " ");
|
||||||
digitalWrite(pin_step.toInt(), !digitalRead(pin_step.toInt()));
|
digitalWrite(pin_step.toInt(), !digitalRead(pin_step.toInt()));
|
||||||
|
yield();
|
||||||
if (count > steps_int) {
|
if (count > steps_int) {
|
||||||
digitalWrite(pin_step.toInt(), LOW);
|
digitalWrite(pin_step.toInt(), LOW);
|
||||||
ts.remove(STEPPER1);
|
ts.remove(STEPPER1);
|
||||||
@@ -370,11 +390,12 @@ void stepperSet() {
|
|||||||
}
|
}
|
||||||
if (stepper_number == "2") {
|
if (stepper_number == "2") {
|
||||||
ts.add(STEPPER2, stepper_speed.toInt(), [&](void*) {
|
ts.add(STEPPER2, stepper_speed.toInt(), [&](void*) {
|
||||||
int steps_int = abs(jsonReadtoInt(optionJson, "steps2") * 2);
|
int steps_int = abs(jsonReadInt(configOptionJson, "steps2") * 2);
|
||||||
static int count;
|
static int count;
|
||||||
count++;
|
count++;
|
||||||
String pin_step = selectToMarker (jsonRead(optionJson, "stepper2"), " ");
|
String pin_step = selectToMarker (jsonReadStr(configOptionJson, "stepper2"), " ");
|
||||||
digitalWrite(pin_step.toInt(), !digitalRead(pin_step.toInt()));
|
digitalWrite(pin_step.toInt(), !digitalRead(pin_step.toInt()));
|
||||||
|
yield();
|
||||||
if (count > steps_int) {
|
if (count > steps_int) {
|
||||||
digitalWrite(pin_step.toInt(), LOW);
|
digitalWrite(pin_step.toInt(), LOW);
|
||||||
ts.remove(STEPPER2);
|
ts.remove(STEPPER2);
|
||||||
@@ -383,67 +404,118 @@ void stepperSet() {
|
|||||||
}, nullptr, true);
|
}, nullptr, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
//====================================================================================================================================================
|
//====================================================================================================================================================
|
||||||
/*
|
//=================================================================Сервоприводы=======================================================================
|
||||||
void inputText() {
|
#ifdef servo_enable
|
||||||
String number = sCmd.next();
|
//servo 1 13 50 Мой#сервопривод Сервоприводы 0 100 0 180 2
|
||||||
String viget_name = sCmd.next();
|
void servo_() {
|
||||||
viget_name.replace("#", " ");
|
String servo_number = sCmd.next();
|
||||||
String page_name = sCmd.next();
|
String servo_pin = sCmd.next();
|
||||||
page_name.replace("#", " ");
|
|
||||||
String start_state = sCmd.next();
|
String start_state = sCmd.next();
|
||||||
|
int start_state_int = start_state.toInt();
|
||||||
|
String widget_name = sCmd.next();
|
||||||
|
String page_name = sCmd.next();
|
||||||
|
|
||||||
|
String min_value = sCmd.next();
|
||||||
|
String max_value = sCmd.next();
|
||||||
|
|
||||||
|
String min_deg = sCmd.next();
|
||||||
|
String max_deg = sCmd.next();
|
||||||
|
|
||||||
String page_number = sCmd.next();
|
String page_number = sCmd.next();
|
||||||
jsonWrite(configJson, "inputTextSet" + number, start_state);
|
|
||||||
createViget (viget_name, page_name, page_number, "vigets/viget.inputText.json", "inputTextSet" + number);
|
jsonWriteStr(configOptionJson, "servo_pin" + servo_number, servo_pin);
|
||||||
}
|
start_state_int = map(start_state_int, min_value.toInt(), max_value.toInt(), min_deg.toInt(), max_deg.toInt());
|
||||||
void inputTextSet() {
|
|
||||||
String number = sCmd.next();
|
if (servo_number == "1") {
|
||||||
String value = sCmd.next();
|
#ifdef ESP8266
|
||||||
jsonWrite(configJson, "inputTextSet" + number, value);
|
myServo1.attach(servo_pin.toInt());
|
||||||
sendSTATUS("inputTextSet" + number, value);
|
myServo1.write(start_state_int);
|
||||||
|
#endif
|
||||||
|
#ifdef ESP32
|
||||||
|
myServo1.attach(servo_pin.toInt(), 500, 2400);
|
||||||
|
myServo1.write(start_state_int);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void inputTime() {
|
if (servo_number == "2") {
|
||||||
String number = sCmd.next();
|
#ifdef ESP8266
|
||||||
String viget_name = sCmd.next();
|
myServo2.attach(servo_pin.toInt());
|
||||||
viget_name.replace("#", " ");
|
myServo2.write(start_state_int);
|
||||||
String page_name = sCmd.next();
|
#endif
|
||||||
page_name.replace("#", " ");
|
#ifdef ESP32
|
||||||
String start_state = sCmd.next();
|
myServo2.attach(servo_pin.toInt(), 500, 2400);
|
||||||
String page_number = sCmd.next();
|
myServo2.write(start_state_int);
|
||||||
jsonWrite(configJson, "inputTimeSet" + number, start_state);
|
#endif
|
||||||
createViget (viget_name, page_name, page_number, "vigets/viget.inputTime.json", "inputTimeSet" + number);
|
|
||||||
}
|
|
||||||
void inputTimeSet() {
|
|
||||||
String number = sCmd.next();
|
|
||||||
String value = sCmd.next();
|
|
||||||
value.replace(":", ".");
|
|
||||||
jsonWrite(configJson, "inputTimeSet" + number, value);
|
|
||||||
value.replace(".", ":");
|
|
||||||
sendSTATUS("inputTimeSet" + number, value);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
jsonWriteStr(configOptionJson, "s_min_val" + servo_number, min_value);
|
||||||
|
jsonWriteStr(configOptionJson, "s_max_val" + servo_number, max_value);
|
||||||
|
jsonWriteStr(configOptionJson, "s_min_deg" + servo_number, min_deg);
|
||||||
|
jsonWriteStr(configOptionJson, "s_max_deg" + servo_number, max_deg);
|
||||||
|
|
||||||
void inputDate() {
|
jsonWriteStr(configLiveJson, "servo" + servo_number, start_state);
|
||||||
String number = sCmd.next();
|
|
||||||
String viget_name = sCmd.next();
|
createWidgetParam (widget_name, page_name, page_number, "widgets/widget.range.json", "servo" + servo_number, "min", min_value, "max", max_value, "k", "1");
|
||||||
viget_name.replace("#", " ");
|
|
||||||
String page_name = sCmd.next();
|
|
||||||
page_name.replace("#", " ");
|
|
||||||
String start_state = sCmd.next();
|
|
||||||
String page_number = sCmd.next();
|
|
||||||
jsonWrite(configJson, "inputDateSet" + number, start_state);
|
|
||||||
createViget (viget_name, page_name, page_number, "vigets/viget.inputDate.json", "inputDateSet" + number);
|
|
||||||
}
|
}
|
||||||
void inputDateSet() {
|
|
||||||
String number = sCmd.next();
|
void servoSet() {
|
||||||
String value = sCmd.next();
|
String servo_number = sCmd.next();
|
||||||
jsonWrite(configJson, "inputDateSet" + number, value);
|
String servo_state = sCmd.next();
|
||||||
sendSTATUS("inputDateSet" + number, value);
|
int servo_state_int = servo_state.toInt();
|
||||||
|
|
||||||
|
int pin = jsonReadInt(configOptionJson, "servo_pin" + servo_number);
|
||||||
|
|
||||||
|
servo_state_int = map(servo_state_int,
|
||||||
|
jsonReadInt(configOptionJson, "s_min_val" + servo_number),
|
||||||
|
jsonReadInt(configOptionJson, "s_max_val" + servo_number),
|
||||||
|
jsonReadInt(configOptionJson, "s_min_deg" + servo_number),
|
||||||
|
jsonReadInt(configOptionJson, "s_max_deg" + servo_number));
|
||||||
|
|
||||||
|
if (servo_number == "1") {
|
||||||
|
#ifdef ESP8266
|
||||||
|
myServo1.write(servo_state_int);
|
||||||
|
#endif
|
||||||
|
#ifdef ESP32
|
||||||
|
myServo1.write(servo_state_int);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
if (servo_number == "2") {
|
||||||
|
#ifdef ESP8266
|
||||||
|
myServo2.write(servo_state_int);
|
||||||
|
#endif
|
||||||
|
#ifdef ESP32
|
||||||
|
myServo2.write(servo_state_int);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
//Serial.println(servo_state_int);
|
||||||
|
|
||||||
|
eventGen ("servo", servo_number);
|
||||||
|
|
||||||
|
jsonWriteStr(configLiveJson, "servo" + servo_number, servo_state);
|
||||||
|
sendSTATUS("servo" + servo_number, servo_state);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
//====================================================================================================================================================
|
||||||
|
//===================================================================================serial===========================================================
|
||||||
|
#ifdef serial_enable
|
||||||
|
void serialBegin() {
|
||||||
|
//String s_speed = sCmd.next();
|
||||||
|
//String rxPin = sCmd.next();
|
||||||
|
//String txPin = sCmd.next();
|
||||||
|
//SoftwareSerial mySerial(rxPin.toInt(), txPin.toInt());
|
||||||
|
//mySerial.begin(s_speed.toInt());
|
||||||
|
}
|
||||||
|
|
||||||
|
void serialWrite() {
|
||||||
|
//String text = sCmd.next();
|
||||||
|
//mySerial.println(text);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
//====================================================================================================================================================
|
||||||
//=================================================Глобальные команды удаленного управления===========================================================
|
//=================================================Глобальные команды удаленного управления===========================================================
|
||||||
|
|
||||||
void mqttOrderSend() {
|
void mqttOrderSend() {
|
||||||
@@ -451,11 +523,11 @@ void mqttOrderSend() {
|
|||||||
String id = sCmd.next();
|
String id = sCmd.next();
|
||||||
String order = sCmd.next();
|
String order = sCmd.next();
|
||||||
|
|
||||||
String all_line = jsonRead(configSetup, "mqttPrefix") + "/" + id + "/order";
|
String all_line = jsonReadStr(configSetupJson, "mqttPrefix") + "/" + id + "/order";
|
||||||
//Serial.print(all_line);
|
//Serial.print(all_line);
|
||||||
//Serial.print("->");
|
//Serial.print("->");
|
||||||
//Serial.println(order);
|
//Serial.println(order);
|
||||||
int send_status = client.publish (all_line.c_str(), order.c_str(), false);
|
int send_status = client_mqtt.publish (all_line.c_str(), order.c_str(), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void httpOrderSend() {
|
void httpOrderSend() {
|
||||||
@@ -467,7 +539,17 @@ void httpOrderSend() {
|
|||||||
getURL(url);
|
getURL(url);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void update_firmware() {
|
||||||
|
upgrade = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void firmware() {
|
||||||
|
String widget_name = sCmd.next();
|
||||||
|
String page_name = sCmd.next();
|
||||||
|
String page_number = sCmd.next();
|
||||||
|
jsonWriteStr(configLiveJson, "firm1", firmware_version);
|
||||||
|
choose_widget_and_create(widget_name, page_name, page_number, "any-data", "firm1");
|
||||||
|
}
|
||||||
|
|
||||||
//==============================================================================================================================
|
//==============================================================================================================================
|
||||||
//============================выполнение команд (в лупе) по очереди из строки order=============================================
|
//============================выполнение команд (в лупе) по очереди из строки order=============================================
|
||||||
@@ -482,29 +564,11 @@ void handleCMD_loop() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//=============================выполнение команд (через период) по очереди из строки order=======================================
|
|
||||||
/*void handleCMD_ticker() {
|
|
||||||
|
|
||||||
ts.add(CMD, CMD_update_int, [&](void*) {
|
|
||||||
if (!busy) {
|
|
||||||
if (order_ticker != "") {
|
|
||||||
|
|
||||||
String tmp = selectToMarker(order_ticker, ","); //выделяем из страки order первую команду pus title body
|
|
||||||
if (tmp != "no_command") sCmd.readStr(tmp); //выполняем первую команду
|
|
||||||
Serial.println("order_ticker => " + order_ticker);
|
|
||||||
order_ticker = deleteBeforeDelimiter(order_ticker, ","); //осекаем выполненную команду
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, nullptr, true);
|
|
||||||
}*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//=======================================================================================================================================
|
//=======================================================================================================================================
|
||||||
//=======================================================================================================================================
|
//=======================================================================================================================================
|
||||||
void txtExecution(String file) {
|
void txtExecution(String file) {
|
||||||
|
|
||||||
String command_all = readFile(file, 2048) + "\r\n"; //2048
|
String command_all = readFile(file, 2048) + "\r\n";
|
||||||
|
|
||||||
command_all.replace("\r\n", "\n");
|
command_all.replace("\r\n", "\n");
|
||||||
command_all.replace("\r", "\n");
|
command_all.replace("\r", "\n");
|
||||||
@@ -512,153 +576,24 @@ void txtExecution(String file) {
|
|||||||
while (command_all.length() != 0) {
|
while (command_all.length() != 0) {
|
||||||
|
|
||||||
String tmp = selectToMarker (command_all, "\n");
|
String tmp = selectToMarker (command_all, "\n");
|
||||||
//if (tmp.indexOf("//") < 0)
|
|
||||||
sCmd.readStr(tmp);
|
sCmd.readStr(tmp);
|
||||||
command_all = deleteBeforeDelimiter(command_all, "\n");
|
command_all = deleteBeforeDelimiter(command_all, "\n");
|
||||||
}
|
}
|
||||||
|
command_all = "";
|
||||||
}
|
}
|
||||||
|
|
||||||
void stringExecution(String str) {
|
void stringExecution(String str) {
|
||||||
|
|
||||||
String command_all = str + "\r\n"; //"\r\n"
|
str = str + "\r\n";
|
||||||
|
|
||||||
command_all.replace("\r\n", "\n");
|
str.replace("\r\n", "\n");
|
||||||
command_all.replace("\r", "\n");
|
str.replace("\r", "\n");
|
||||||
|
|
||||||
while (command_all.length() != 0) {
|
while (str.length() != 0) {
|
||||||
|
|
||||||
String tmp = selectToMarker (command_all, "\n");
|
String tmp = selectToMarker (str, "\n");
|
||||||
//if (tmp.indexOf("//") < 0)
|
|
||||||
sCmd.readStr(tmp);
|
sCmd.readStr(tmp);
|
||||||
command_all = deleteBeforeDelimiter(command_all, "\n");
|
|
||||||
|
str = deleteBeforeDelimiter(str, "\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//======================================================================================================================
|
|
||||||
//===============================================Создание виджетов=======================================================
|
|
||||||
|
|
||||||
void createViget (String viget_name, String page_name, String page_number, String file, String topic) {
|
|
||||||
|
|
||||||
String viget;
|
|
||||||
viget = readFile(file, 1024);
|
|
||||||
|
|
||||||
if (viget == "Failed") return;
|
|
||||||
if (viget == "Large") return;
|
|
||||||
|
|
||||||
viget_name.replace("#", " ");
|
|
||||||
page_name.replace("#", " ");
|
|
||||||
|
|
||||||
jsonWrite(viget, "page", page_name);
|
|
||||||
jsonWrite(viget, "order", page_number);
|
|
||||||
jsonWrite(viget, "descr", viget_name);
|
|
||||||
jsonWrite(viget, "topic", prex + "/" + topic);
|
|
||||||
all_vigets += viget + "\r\n";
|
|
||||||
viget = "";
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
void createViget (String viget_name, String page_name, String page_number, String file, String topic, String key, String value) {
|
|
||||||
|
|
||||||
String viget;
|
|
||||||
viget = readFile(file, 1024);
|
|
||||||
|
|
||||||
if (viget == "Failed") return;
|
|
||||||
if (viget == "Large") return;
|
|
||||||
|
|
||||||
viget_name.replace("#", " ");
|
|
||||||
page_name.replace("#", " ");
|
|
||||||
|
|
||||||
value.replace("#", " ");
|
|
||||||
|
|
||||||
viget = vidgetConfigWrite(viget, key, value);
|
|
||||||
|
|
||||||
jsonWrite(viget, "page", page_name);
|
|
||||||
jsonWrite(viget, "pageId", page_number);
|
|
||||||
jsonWrite(viget, "descr", viget_name);
|
|
||||||
jsonWrite(viget, "topic", prex + "/" + topic);
|
|
||||||
|
|
||||||
all_vigets += viget + "\r\n";
|
|
||||||
viget = "";
|
|
||||||
}
|
|
||||||
|
|
||||||
void createViget (String viget_name, String page_name, String page_number, String file, String topic, String key, String value, String key2, String value2) {
|
|
||||||
|
|
||||||
String viget;
|
|
||||||
viget = readFile(file, 1024);
|
|
||||||
|
|
||||||
if (viget == "Failed") return;
|
|
||||||
if (viget == "Large") return;
|
|
||||||
|
|
||||||
viget_name.replace("#", " ");
|
|
||||||
page_name.replace("#", " ");
|
|
||||||
|
|
||||||
value.replace("#", " ");
|
|
||||||
|
|
||||||
viget = vidgetConfigWrite(viget, key, value);
|
|
||||||
viget = vidgetConfigWrite(viget, key2, value2);
|
|
||||||
|
|
||||||
jsonWrite(viget, "page", page_name);
|
|
||||||
jsonWrite(viget, "pageId", page_number);
|
|
||||||
jsonWrite(viget, "descr", viget_name);
|
|
||||||
jsonWrite(viget, "topic", prex + "/" + topic);
|
|
||||||
|
|
||||||
all_vigets += viget + "\r\n";
|
|
||||||
viget = "";
|
|
||||||
}
|
|
||||||
|
|
||||||
String vidgetConfigWrite(String viget, String key, String value) {
|
|
||||||
|
|
||||||
if (viget == "") return "";
|
|
||||||
if (viget == "{}") return "";
|
|
||||||
int psn1 = viget.indexOf("{");
|
|
||||||
if (psn1 != -1) {
|
|
||||||
psn1 = viget.indexOf("{", psn1 + 1);
|
|
||||||
if (psn1 != -1) {
|
|
||||||
int psn2 = viget.indexOf("}", psn1);
|
|
||||||
String WigetConfig = viget.substring(psn1, psn2) + "}";
|
|
||||||
jsonWrite(WigetConfig, key, value);
|
|
||||||
String part1 = viget.substring(0, psn1);
|
|
||||||
viget = part1 + WigetConfig + "}";
|
|
||||||
return viget;
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//============разное
|
|
||||||
|
|
||||||
/*
|
|
||||||
void delAlert() {
|
|
||||||
|
|
||||||
String alert_id = sCmd.next();
|
|
||||||
delViget(alert_id);
|
|
||||||
sendAllWigets();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void delViget(String text_in_viget) {
|
|
||||||
String viget = all_vigets;
|
|
||||||
while (viget.length() != 0) {
|
|
||||||
String tmp = selectToMarkerPlus (viget, "\r\n", 2);
|
|
||||||
if (tmp.indexOf(text_in_viget) > 0) {
|
|
||||||
|
|
||||||
all_vigets.replace(tmp, "");
|
|
||||||
//Serial.println(all_vigets);
|
|
||||||
|
|
||||||
viget = deleteBeforeDelimiter(viget, "\r\n");
|
|
||||||
} else {
|
|
||||||
viget = deleteBeforeDelimiter(viget, "\r\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|||||||
BIN
ESP32FS.7z
Normal file
BIN
ESP32FS.7z
Normal file
Binary file not shown.
BIN
ESP32FS.rar
BIN
ESP32FS.rar
Binary file not shown.
BIN
ESP8266FS.7z
Normal file
BIN
ESP8266FS.7z
Normal file
Binary file not shown.
BIN
ESP8266FS.rar
BIN
ESP8266FS.rar
Binary file not shown.
38
FS.ino
Normal file
38
FS.ino
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
void File_system_init() {
|
||||||
|
|
||||||
|
Serial.begin(115200);
|
||||||
|
//Serial.setDebugOutput(true);
|
||||||
|
Serial.println("--------------started----------------");
|
||||||
|
//--------------------------------------------------------------
|
||||||
|
SPIFFS.begin();
|
||||||
|
configSetupJson = readFile("config.json", 4096);
|
||||||
|
configSetupJson.replace(" ", "");
|
||||||
|
configSetupJson.replace("\r\n", "");
|
||||||
|
Serial.println(configSetupJson);
|
||||||
|
//jsonWriteStr(configLiveJson, "name", jsonReadStr(configSetupJson, "name"));
|
||||||
|
//jsonWriteStr(configLiveJson, "lang", jsonReadStr(configSetupJson, "lang"));
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef ESP32
|
||||||
|
uint32_t chipID_u = ESP.getEfuseMac();
|
||||||
|
chipID = String(chipID_u);
|
||||||
|
jsonWriteStr(configSetupJson, "chipID", chipID);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef ESP8266
|
||||||
|
chipID = String( ESP.getChipId() ) + "-" + String(ESP.getFlashChipId());
|
||||||
|
jsonWriteStr(configSetupJson, "chipID", chipID);
|
||||||
|
Serial.setDebugOutput(0);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
jsonWriteStr(configSetupJson, "firmware_version", firmware_version);
|
||||||
|
|
||||||
|
prex = jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipID;
|
||||||
|
Serial.println(chipID);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void get_esp_info() {
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
282
Init.ino
282
Init.ino
@@ -1,30 +1,4 @@
|
|||||||
void All_init() {
|
void All_init() {
|
||||||
|
|
||||||
server.on("/all_modules_init", HTTP_GET, [](AsyncWebServerRequest * request) {
|
|
||||||
Device_init();
|
|
||||||
request->send(200, "text/text", "OK"); // отправляем ответ о выполнении
|
|
||||||
});
|
|
||||||
|
|
||||||
server.on("/scenario", HTTP_GET, [](AsyncWebServerRequest * request) {
|
|
||||||
if (request->hasArg("status")) {
|
|
||||||
jsonWrite(configSetup, "scenario", request->getParam("status")->value());
|
|
||||||
}
|
|
||||||
saveConfig();
|
|
||||||
Scenario_init();
|
|
||||||
request->send(200, "text/text", "OK"); // отправляем ответ о выполнении
|
|
||||||
});
|
|
||||||
|
|
||||||
server.on("/cleanlog", HTTP_GET, [](AsyncWebServerRequest * request) {
|
|
||||||
SPIFFS.remove("/log.analog.txt");
|
|
||||||
SPIFFS.remove("/log.dallas.txt");
|
|
||||||
SPIFFS.remove("/log.level.txt");
|
|
||||||
SPIFFS.remove("/log.ph.txt");
|
|
||||||
SPIFFS.remove("/log.txt");
|
|
||||||
request->send(200, "text/text", "OK"); // отправляем ответ о выполнении
|
|
||||||
});
|
|
||||||
|
|
||||||
prsets_init();
|
|
||||||
|
|
||||||
Device_init();
|
Device_init();
|
||||||
Scenario_init();
|
Scenario_init();
|
||||||
Timer_countdown_init();
|
Timer_countdown_init();
|
||||||
@@ -32,219 +6,69 @@ void All_init() {
|
|||||||
|
|
||||||
void Device_init() {
|
void Device_init() {
|
||||||
|
|
||||||
ts.remove(ANALOG_);
|
logging_value_names_list = "";
|
||||||
ts.remove(LEVEL);
|
enter_to_logging_counter = LOG1 - 1;
|
||||||
ts.remove(DALLAS);
|
|
||||||
ts.remove(DHTT);
|
|
||||||
ts.remove(DHTH);
|
|
||||||
ts.remove(DHTC);
|
|
||||||
ts.remove(DHTP);
|
|
||||||
ts.remove(DHTD);
|
|
||||||
ts.remove(STEPPER1);
|
|
||||||
ts.remove(STEPPER2);
|
|
||||||
|
|
||||||
all_vigets = "";
|
analog_value_names_list = "";
|
||||||
txtExecution("firmware.config.txt");
|
enter_to_analog_counter = 0;
|
||||||
|
|
||||||
|
level_value_name = "";
|
||||||
|
|
||||||
|
dhtT_value_name = "";
|
||||||
|
dhtH_value_name = "";
|
||||||
|
|
||||||
|
bmp280T_value_name = "";
|
||||||
|
bmp280P_value_name = "";
|
||||||
|
|
||||||
|
bme280T_value_name = "";
|
||||||
|
bme280P_value_name = "";
|
||||||
|
bme280H_value_name = "";
|
||||||
|
bme280A_value_name = "";
|
||||||
|
|
||||||
|
int array_sz = sizeof(sensors_reading_map) / sizeof(sensors_reading_map[0]);
|
||||||
|
|
||||||
|
for (int i = 0; i <= array_sz; i++) {
|
||||||
|
sensors_reading_map[i] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = LOG1; i <= LOG5; i++) {
|
||||||
|
ts.remove(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef layout_in_ram
|
||||||
|
all_widgets = "";
|
||||||
|
#else
|
||||||
|
SPIFFS.remove("/layout.txt");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
txtExecution("firmware.c.txt");
|
||||||
//outcoming_date();
|
//outcoming_date();
|
||||||
}
|
}
|
||||||
//-------------------------------сценарии-----------------------------------------------------
|
//-------------------------------сценарии-----------------------------------------------------
|
||||||
|
|
||||||
void Scenario_init() {
|
void Scenario_init() {
|
||||||
if (jsonRead(configSetup, "scenario") == "1") {
|
if (jsonReadStr(configSetupJson, "scen") == "1") {
|
||||||
scenario = readFile("firmware.scenario.txt", 2048);
|
scenario = readFile("firmware.s.txt", 2048);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void prsets_init() {
|
void uptime_init() {
|
||||||
|
ts.add(UPTIME, 5000, [&](void*) {
|
||||||
//part 1===============================================================================
|
handle_uptime();
|
||||||
|
}, nullptr, true);
|
||||||
server.on("/relay", HTTP_GET, [](AsyncWebServerRequest * request) {
|
|
||||||
writeFile("firmware.config.txt", readFile("configs/relay.config.txt", 2048));
|
|
||||||
writeFile("firmware.scenario.txt", readFile("configs/relay.scenario.txt", 2048));
|
|
||||||
Device_init();
|
|
||||||
Scenario_init();
|
|
||||||
String tmp = "";
|
|
||||||
request->redirect("/page.htm?configuration");
|
|
||||||
});
|
|
||||||
|
|
||||||
server.on("/relay_timer", HTTP_GET, [](AsyncWebServerRequest * request) {
|
|
||||||
writeFile("firmware.config.txt", readFile("configs/relay_t.config.txt", 2048));
|
|
||||||
writeFile("firmware.scenario.txt", readFile("configs/relay_t.scenario.txt", 2048));
|
|
||||||
Device_init();
|
|
||||||
Scenario_init();
|
|
||||||
request->redirect("/page.htm?configuration");
|
|
||||||
});
|
|
||||||
|
|
||||||
server.on("/relay_countdown", HTTP_GET, [](AsyncWebServerRequest * request) {
|
|
||||||
writeFile("firmware.config.txt", readFile("configs/relay_c.config.txt", 2048));
|
|
||||||
writeFile("firmware.scenario.txt", readFile("configs/relay_c.scenario.txt", 2048));
|
|
||||||
Device_init();
|
|
||||||
Scenario_init();
|
|
||||||
request->redirect("/page.htm?configuration");
|
|
||||||
});
|
|
||||||
|
|
||||||
server.on("/relay_several", HTTP_GET, [](AsyncWebServerRequest * request) {
|
|
||||||
writeFile("firmware.config.txt", readFile("configs/relay_s.config.txt", 2048));
|
|
||||||
writeFile("firmware.scenario.txt", readFile("configs/relay_s.scenario.txt", 2048));
|
|
||||||
Device_init();
|
|
||||||
Scenario_init();
|
|
||||||
request->redirect("/page.htm?configuration");
|
|
||||||
});
|
|
||||||
|
|
||||||
server.on("/relay_switch", HTTP_GET, [](AsyncWebServerRequest * request) {
|
|
||||||
writeFile("firmware.config.txt", readFile("configs/relay_sw.config.txt", 2048));
|
|
||||||
writeFile("firmware.scenario.txt", readFile("configs/relay_sw.scenario.txt", 2048));
|
|
||||||
Device_init();
|
|
||||||
Scenario_init();
|
|
||||||
request->redirect("/page.htm?configuration");
|
|
||||||
});
|
|
||||||
|
|
||||||
server.on("/relay_button_remote", HTTP_GET, [](AsyncWebServerRequest * request) {
|
|
||||||
writeFile("firmware.config.txt", readFile("configs/relay_br.config.txt", 2048));
|
|
||||||
writeFile("firmware.scenario.txt", readFile("configs/relay_br.scenario.txt", 2048));
|
|
||||||
Device_init();
|
|
||||||
Scenario_init();
|
|
||||||
request->redirect("/page.htm?configuration");
|
|
||||||
});
|
|
||||||
|
|
||||||
server.on("/relay_switch_remote", HTTP_GET, [](AsyncWebServerRequest * request) {
|
|
||||||
writeFile("firmware.config.txt", readFile("configs/relay_sr.config.txt", 2048));
|
|
||||||
writeFile("firmware.scenario.txt", readFile("configs/relay_sr.scenario.txt", 2048));
|
|
||||||
Device_init();
|
|
||||||
Scenario_init();
|
|
||||||
request->redirect("/page.htm?configuration");
|
|
||||||
});
|
|
||||||
|
|
||||||
server.on("/pwm", HTTP_GET, [](AsyncWebServerRequest * request) {
|
|
||||||
writeFile("firmware.config.txt", readFile("configs/pwm.config.txt", 2048));
|
|
||||||
writeFile("firmware.scenario.txt", readFile("configs/pwm.scenario.txt", 2048));
|
|
||||||
Device_init();
|
|
||||||
Scenario_init();
|
|
||||||
request->redirect("/page.htm?configuration");
|
|
||||||
});
|
|
||||||
|
|
||||||
//part 2===============================================================================
|
|
||||||
|
|
||||||
server.on("/dht11", HTTP_GET, [](AsyncWebServerRequest * request) {
|
|
||||||
writeFile("firmware.config.txt", readFile("configs/dht11.config.txt", 2048));
|
|
||||||
writeFile("firmware.scenario.txt", readFile("configs/dht11.scenario.txt", 2048));
|
|
||||||
Device_init();
|
|
||||||
Scenario_init();
|
|
||||||
request->redirect("/page.htm?configuration");
|
|
||||||
});
|
|
||||||
|
|
||||||
server.on("/dht22", HTTP_GET, [](AsyncWebServerRequest * request) {
|
|
||||||
writeFile("firmware.config.txt", readFile("configs/dht22.config.txt", 2048));
|
|
||||||
writeFile("firmware.scenario.txt", readFile("configs/dht22.scenario.txt", 2048));
|
|
||||||
Device_init();
|
|
||||||
Scenario_init();
|
|
||||||
request->redirect("/page.htm?configuration");
|
|
||||||
});
|
|
||||||
|
|
||||||
server.on("/analog", HTTP_GET, [](AsyncWebServerRequest * request) {
|
|
||||||
writeFile("firmware.config.txt", readFile("configs/analog.config.txt", 2048));
|
|
||||||
writeFile("firmware.scenario.txt", readFile("configs/analog.scenario.txt", 2048));
|
|
||||||
Device_init();
|
|
||||||
Scenario_init();
|
|
||||||
request->redirect("/page.htm?configuration");
|
|
||||||
});
|
|
||||||
|
|
||||||
server.on("/dallas", HTTP_GET, [](AsyncWebServerRequest * request) {
|
|
||||||
writeFile("firmware.config.txt", readFile("configs/dallas.config.txt", 2048));
|
|
||||||
writeFile("firmware.scenario.txt", readFile("configs/dallas.scenario.txt", 2048));
|
|
||||||
Device_init();
|
|
||||||
Scenario_init();
|
|
||||||
request->redirect("/page.htm?configuration");
|
|
||||||
});
|
|
||||||
|
|
||||||
server.on("/termostat", HTTP_GET, [](AsyncWebServerRequest * request) {
|
|
||||||
writeFile("firmware.config.txt", readFile("configs/termostat.config.txt", 2048));
|
|
||||||
writeFile("firmware.scenario.txt", readFile("configs/termostat.scenario.txt", 2048));
|
|
||||||
Device_init();
|
|
||||||
Scenario_init();
|
|
||||||
request->redirect("/page.htm?configuration");
|
|
||||||
});
|
|
||||||
|
|
||||||
server.on("/level", HTTP_GET, [](AsyncWebServerRequest * request) {
|
|
||||||
writeFile("firmware.config.txt", readFile("configs/level.config.txt", 2048));
|
|
||||||
writeFile("firmware.scenario.txt", readFile("configs/level.scenario.txt", 2048));
|
|
||||||
Device_init();
|
|
||||||
Scenario_init();
|
|
||||||
request->redirect("/page.htm?configuration");
|
|
||||||
});
|
|
||||||
|
|
||||||
server.on("/moution_relay", HTTP_GET, [](AsyncWebServerRequest * request) {
|
|
||||||
writeFile("firmware.config.txt", readFile("configs/moution_r.config.txt", 2048));
|
|
||||||
writeFile("firmware.scenario.txt", readFile("configs/moution_r.scenario.txt", 2048));
|
|
||||||
Device_init();
|
|
||||||
Scenario_init();
|
|
||||||
request->redirect("/page.htm?configuration");
|
|
||||||
});
|
|
||||||
|
|
||||||
server.on("/moution_security", HTTP_GET, [](AsyncWebServerRequest * request) {
|
|
||||||
writeFile("firmware.config.txt", readFile("configs/moution_s.config.txt", 2048));
|
|
||||||
writeFile("firmware.scenario.txt", readFile("configs/moution_s.scenario.txt", 2048));
|
|
||||||
Device_init();
|
|
||||||
Scenario_init();
|
|
||||||
request->redirect("/page.htm?configuration");
|
|
||||||
});
|
|
||||||
|
|
||||||
server.on("/stepper", HTTP_GET, [](AsyncWebServerRequest * request) {
|
|
||||||
writeFile("firmware.config.txt", readFile("configs/stepper.config.txt", 2048));
|
|
||||||
writeFile("firmware.scenario.txt", readFile("configs/stepper.scenario.txt", 2048));
|
|
||||||
Device_init();
|
|
||||||
Scenario_init();
|
|
||||||
request->redirect("/page.htm?configuration");
|
|
||||||
});
|
|
||||||
|
|
||||||
//default===============================================================================
|
|
||||||
|
|
||||||
server.on("/default", HTTP_GET, [](AsyncWebServerRequest * request) {
|
|
||||||
writeFile("firmware.config.txt", readFile("configs/firmware.config.txt", 2048));
|
|
||||||
writeFile("firmware.scenario.txt", readFile("configs/firmware.scenario.txt", 2048));
|
|
||||||
Device_init();
|
|
||||||
Scenario_init();
|
|
||||||
request->redirect("/page.htm?configuration");
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
void up_time() {
|
|
||||||
uint32_t ss = millis() / 1000;
|
|
||||||
uint32_t mm = ss / 60;
|
|
||||||
uint32_t hh = mm / 60;
|
|
||||||
uint32_t dd = hh / 24;
|
|
||||||
|
|
||||||
String out = "";
|
|
||||||
|
|
||||||
if (ss != 0) {
|
|
||||||
out = "[i] uptime = " + String(ss) + " sec";
|
|
||||||
jsonWrite(configJson, "uptime", String(ss) + " sec");
|
|
||||||
}
|
|
||||||
if (mm != 0) {
|
|
||||||
out = "[i] uptime = " + String(mm) + " min";
|
|
||||||
jsonWrite(configJson, "uptime", String(mm) + " min");
|
|
||||||
}
|
|
||||||
if (hh != 0) {
|
|
||||||
out = "[i] uptime = " + String(hh) + " hours";
|
|
||||||
jsonWrite(configJson, "uptime", String(hh) + " hours");
|
|
||||||
}
|
|
||||||
if (dd != 0) {
|
|
||||||
out = "[i] uptime = " + String(dd) + " days";
|
|
||||||
jsonWrite(configJson, "uptime", String(dd) + " days");
|
|
||||||
}
|
|
||||||
Serial.println(out + ", mqtt_lost_error: " + String(mqtt_lost_error) + ", wifi_lost_error: " + String(wifi_lost_error));
|
|
||||||
}
|
|
||||||
|
|
||||||
void statistics_init() {
|
|
||||||
ts.add(STATISTICS, statistics_update, [&](void*) {
|
ts.add(STATISTICS, statistics_update, [&](void*) {
|
||||||
|
handle_statistics();
|
||||||
statistics();
|
|
||||||
|
|
||||||
}, nullptr, true);
|
}, nullptr, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void statistics() {
|
void handle_uptime() {
|
||||||
|
if (myUpTime.check()) {
|
||||||
|
jsonWriteStr(configSetupJson, "uptime", uptime_as_string());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void handle_statistics() {
|
||||||
|
if (WiFi.status() == WL_CONNECTED) {
|
||||||
String urls = "http://backup.privet.lv/visitors/?";
|
String urls = "http://backup.privet.lv/visitors/?";
|
||||||
//-----------------------------------------------------------------
|
//-----------------------------------------------------------------
|
||||||
urls += WiFi.macAddress().c_str();
|
urls += WiFi.macAddress().c_str();
|
||||||
@@ -260,14 +84,16 @@ void statistics() {
|
|||||||
//-----------------------------------------------------------------
|
//-----------------------------------------------------------------
|
||||||
#ifdef ESP8266
|
#ifdef ESP8266
|
||||||
urls += ESP.getResetReason();
|
urls += ESP.getResetReason();
|
||||||
|
//Serial.println(ESP.getResetReason());
|
||||||
#endif
|
#endif
|
||||||
#ifdef ESP32
|
#ifdef ESP32
|
||||||
urls += "Unknown";
|
urls += "Power on";
|
||||||
#endif
|
#endif
|
||||||
urls += "&";
|
urls += "&";
|
||||||
//-----------------------------------------------------------------
|
//-----------------------------------------------------------------
|
||||||
urls += "firm version: " + firmware_version + " " + DATE_COMPILING + " " + TIME_COMPILING;
|
urls += "ver: " + firmware_version;
|
||||||
//-----------------------------------------------------------------
|
//-----------------------------------------------------------------
|
||||||
String stat = getURL(urls);
|
String stat = getURL(urls);
|
||||||
//Serial.println(stat);
|
//Serial.println(stat);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|||||||
153
Logging.ino
Normal file
153
Logging.ino
Normal file
@@ -0,0 +1,153 @@
|
|||||||
|
#ifdef logging_enable
|
||||||
|
//===============================================Логирование============================================================
|
||||||
|
//logging temp1 1 10 Температура Датчики 2
|
||||||
|
void logging() {
|
||||||
|
String value_name = sCmd.next();
|
||||||
|
String period_min = sCmd.next();
|
||||||
|
String maxCount = sCmd.next();
|
||||||
|
String widget_name = sCmd.next();
|
||||||
|
widget_name.replace("#", " ");
|
||||||
|
String page_name = sCmd.next();
|
||||||
|
String page_number = sCmd.next();
|
||||||
|
logging_value_names_list += value_name + ",";
|
||||||
|
enter_to_logging_counter++; //считаем количество входов в эту функцию
|
||||||
|
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
|
||||||
|
if (enter_to_logging_counter == LOG1) {
|
||||||
|
ts.add(LOG1, period_min.toInt() * 1000 * 60, [&](void*) {
|
||||||
|
String tmp_buf_1 = selectFromMarkerToMarker(logging_value_names_list, ",", 0);
|
||||||
|
deleteOldDate("log." + tmp_buf_1 + ".txt", jsonReadInt(configOptionJson, tmp_buf_1 + "_c"), jsonReadStr(configLiveJson, tmp_buf_1));
|
||||||
|
Serial.println("[i] LOGGING for sensor '" + tmp_buf_1 + "' done");
|
||||||
|
}, nullptr, false);
|
||||||
|
}
|
||||||
|
if (enter_to_logging_counter == LOG2) {
|
||||||
|
ts.add(LOG2, period_min.toInt() * 1000 * 60, [&](void*) {
|
||||||
|
String tmp_buf_2 = selectFromMarkerToMarker(logging_value_names_list, ",", 1);
|
||||||
|
deleteOldDate("log." + tmp_buf_2 + ".txt", jsonReadInt(configOptionJson, tmp_buf_2 + "_c"), jsonReadStr(configLiveJson, tmp_buf_2));
|
||||||
|
Serial.println("[i] LOGGING for sensor '" + tmp_buf_2 + "' done");
|
||||||
|
}, nullptr, false);
|
||||||
|
}
|
||||||
|
if (enter_to_logging_counter == LOG3) {
|
||||||
|
ts.add(LOG3, period_min.toInt() * 1000 * 60, [&](void*) {
|
||||||
|
String tmp_buf_3 = selectFromMarkerToMarker(logging_value_names_list, ",", 2);
|
||||||
|
deleteOldDate("log." + tmp_buf_3 + ".txt", jsonReadInt(configOptionJson, tmp_buf_3 + "_c"), jsonReadStr(configLiveJson, tmp_buf_3));
|
||||||
|
Serial.println("[i] LOGGING for sensor '" + tmp_buf_3 + "' done");
|
||||||
|
}, nullptr, false);
|
||||||
|
}
|
||||||
|
if (enter_to_logging_counter == LOG4) {
|
||||||
|
ts.add(LOG4, period_min.toInt() * 1000 * 60, [&](void*) {
|
||||||
|
String tmp_buf_4 = selectFromMarkerToMarker(logging_value_names_list, ",", 3);
|
||||||
|
deleteOldDate("log." + tmp_buf_4 + ".txt", jsonReadInt(configOptionJson, tmp_buf_4 + "_c"), jsonReadStr(configLiveJson, tmp_buf_4));
|
||||||
|
Serial.println("[i] LOGGING for sensor '" + tmp_buf_4 + "' done");
|
||||||
|
}, nullptr, false);
|
||||||
|
}
|
||||||
|
if (enter_to_logging_counter == LOG5) {
|
||||||
|
ts.add(LOG5, period_min.toInt() * 1000 * 60, [&](void*) {
|
||||||
|
String tmp_buf_5 = selectFromMarkerToMarker(logging_value_names_list, ",", 4);
|
||||||
|
deleteOldDate("log." + tmp_buf_5 + ".txt", jsonReadInt(configOptionJson, tmp_buf_5 + "_c"), jsonReadStr(configLiveJson, tmp_buf_5));
|
||||||
|
Serial.println("[i] LOGGING for sensor '" + tmp_buf_5 + "' done");
|
||||||
|
}, nullptr, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//=========================================Удаление стрых данных и запись новых==================================================================
|
||||||
|
void deleteOldDate(String file, int seted_number_of_lines, String date_to_add) {
|
||||||
|
String log_date = readFile(file, 5000);
|
||||||
|
int current_number_of_lines = count(log_date, "\r\n");
|
||||||
|
Serial.println("=====> [i] in log file " + file + " " + current_number_of_lines + " lines");
|
||||||
|
|
||||||
|
if (current_number_of_lines > seted_number_of_lines + 1) {
|
||||||
|
SPIFFS.remove("/" + file);
|
||||||
|
current_number_of_lines = 0;
|
||||||
|
}
|
||||||
|
if (current_number_of_lines == 0) {
|
||||||
|
SPIFFS.remove("/" + file);
|
||||||
|
current_number_of_lines = 0;
|
||||||
|
}
|
||||||
|
if (current_number_of_lines > seted_number_of_lines) {
|
||||||
|
log_date = deleteBeforeDelimiter(log_date, "\r\n");
|
||||||
|
if (GetTimeUnix() != "failed") {
|
||||||
|
log_date += GetTimeUnix() + " " + date_to_add + "\r\n";
|
||||||
|
writeFile(file, log_date);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (GetTimeUnix() != "failed") {
|
||||||
|
addFile(file, GetTimeUnix() + " " + date_to_add);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
log_date = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
//=========================================Выбор какие данные отправлять==================================================================
|
||||||
|
void choose_log_date_and_send() {
|
||||||
|
String all_line = logging_value_names_list;
|
||||||
|
while (all_line.length() != 0) {
|
||||||
|
String tmp = selectToMarker (all_line, ",");
|
||||||
|
sendLogData("log." + tmp + ".txt", tmp + "_ch");
|
||||||
|
all_line = deleteBeforeDelimiter(all_line, ",");
|
||||||
|
}
|
||||||
|
all_line = "";
|
||||||
|
}
|
||||||
|
//=========================================Отправка данных===================================================================================
|
||||||
|
void sendLogData(String file, String topic) {
|
||||||
|
String log_date = readFile(file, 5000);
|
||||||
|
if (log_date != "Failed") {
|
||||||
|
log_date.replace("\r\n", "\n");
|
||||||
|
log_date.replace("\r", "\n");
|
||||||
|
String buf = "{}";
|
||||||
|
String json_array;
|
||||||
|
String unix_time;
|
||||||
|
String value;
|
||||||
|
while (log_date.length() != 0) {
|
||||||
|
String tmp = selectToMarker (log_date, "\n");
|
||||||
|
log_date = deleteBeforeDelimiter(log_date, "\n");
|
||||||
|
unix_time = selectToMarker (tmp, " ");
|
||||||
|
jsonWriteInt(buf, "x", unix_time.toInt());
|
||||||
|
value = deleteBeforeDelimiter(tmp, " ");
|
||||||
|
jsonWriteFloat(buf, "y1", value.toFloat());
|
||||||
|
if (log_date.length() < 3) {
|
||||||
|
json_array += buf;
|
||||||
|
} else {
|
||||||
|
json_array += buf + ",";
|
||||||
|
}
|
||||||
|
buf = "{}";
|
||||||
|
}
|
||||||
|
unix_time = "";
|
||||||
|
value = "";
|
||||||
|
log_date = "";
|
||||||
|
json_array = "{\"status\":[" + json_array + "]}";
|
||||||
|
Serial.println(json_array);
|
||||||
|
sendCHART(topic, json_array);
|
||||||
|
json_array = "";
|
||||||
|
getMemoryLoad("[i] after send log date");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
//----------------------------------------------
|
||||||
|
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() {
|
||||||
|
String all_line = logging_value_names_list;
|
||||||
|
while (all_line.length() != 0) {
|
||||||
|
String tmp = selectToMarker (all_line, ",");
|
||||||
|
SPIFFS.remove("/log." + tmp + ".txt");
|
||||||
|
all_line = deleteBeforeDelimiter(all_line, ",");
|
||||||
|
}
|
||||||
|
all_line = "";
|
||||||
|
}
|
||||||
|
#endif
|
||||||
37
README.md
Normal file
37
README.md
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
# esp32-esp8266_iot-manager_modules_firmware
|
||||||
|
|
||||||
|
It is based on esp8266 and esp32 automation system. Each module has a web interface for its initial configuration. The modules are managed using the "iot manager" application. This application is released for both android and ios platform. The application connects to a MQTT broker, you can add several brokers and switch between them. All modules also connect to same broker. All esp8266 esp32 are combined and appear in the application as widgets.
|
||||||
|
|
||||||
|
There are two configuration options in the web interface of the modules:
|
||||||
|
|
||||||
|
1. Select a ready-made preset.
|
||||||
|
|
||||||
|
The following presets are available:
|
||||||
|
|
||||||
|
- On off relay
|
||||||
|
- On off relay according to the schedule specified in the application
|
||||||
|
- On off the relay after a period of time specified in the application
|
||||||
|
- On off relay groups on different devices with one button in the application
|
||||||
|
- Light switch module
|
||||||
|
- PWM controlled by the slider in the application
|
||||||
|
- Reading and logging analog input into graph with scaling function
|
||||||
|
- Reading and logging in the graph of the following sensors:
|
||||||
|
|
||||||
|
DHT22, DHT33, DHT44, AM2302, RHT03
|
||||||
|
DS18B20
|
||||||
|
JSN-SR04T, HC-SR04, HY-SRF05
|
||||||
|
BME280 BMP280 and other i2c sensors
|
||||||
|
|
||||||
|
-ds18b20 termostat controlled from application with graph (you can use any sensor for termostat any other supported).
|
||||||
|
|
||||||
|
2. Configure with special scripts. A simple programming language was invented which can very flexibly configure the module.
|
||||||
|
|
||||||
|
People who do not know how to program can use ready-made presets (option 1), and people who want to play with the system can use scripts (option 2).
|
||||||
|
|
||||||
|
Scenarios:
|
||||||
|
|
||||||
|
The web interface has the ability to configure Scenarios. An event occurs on one esp, and a reaction to this event can setup to occurs on another.
|
||||||
|
|
||||||
|
Logging of sensors data in this project made with out any server. All data for graf storring in esp flash. You can look any time your sensor history for 2 - 3 days or week in mobile app in graf. And for this option needed only esp.
|
||||||
|
|
||||||
|
|
||||||
40
SSDP.ino
40
SSDP.ino
@@ -1,40 +0,0 @@
|
|||||||
/*
|
|
||||||
void SSDP_init() {
|
|
||||||
|
|
||||||
// --------------------Получаем ssdp со страницы
|
|
||||||
server.on("/ssdp", HTTP_GET, [](AsyncWebServerRequest * request) {
|
|
||||||
if (request->hasArg("ssdp")) {
|
|
||||||
jsonWrite(configSetup, "SSDP", request->getParam("ssdp")->value());
|
|
||||||
jsonWrite(configJson, "SSDP", request->getParam("ssdp")->value());
|
|
||||||
SSDP.setName(jsonRead(configSetup, "SSDP"));
|
|
||||||
}
|
|
||||||
saveConfig();
|
|
||||||
request->send(200, "text/text", "OK");
|
|
||||||
});
|
|
||||||
|
|
||||||
// SSDP дескриптор
|
|
||||||
server.on("/description.xml", [](AsyncWebServerRequest * request) {
|
|
||||||
//SSDP.schema(http.client());
|
|
||||||
request->send(200, "text/text", "OK");
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
if (WiFi.status() == WL_CONNECTED) {
|
|
||||||
//Если версия 2.0.0 закаментируйте следующую строчку
|
|
||||||
SSDP.setDeviceType("upnp:rootdevice");
|
|
||||||
SSDP.setSchemaURL("description.xml");
|
|
||||||
SSDP.setHTTPPort(80);
|
|
||||||
SSDP.setName(jsonRead(configSetup, "SSDP"));
|
|
||||||
SSDP.setSerialNumber(chipID);
|
|
||||||
SSDP.setURL("/");
|
|
||||||
SSDP.setModelName("tech");
|
|
||||||
SSDP.setModelNumber(chipID + "/" + jsonRead(configSetup, "SSDP"));
|
|
||||||
|
|
||||||
|
|
||||||
SSDP.setModelURL("https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware");
|
|
||||||
SSDP.setManufacturer("Borisenko Dmitry");
|
|
||||||
SSDP.setManufacturerURL("https://www.instagram.com/rriissee3");
|
|
||||||
SSDP.begin();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
40
Scenario.ino
40
Scenario.ino
@@ -1,7 +1,7 @@
|
|||||||
void handleScenario() {
|
void handleScenario() {
|
||||||
|
|
||||||
if (jsonRead(configSetup, "scenario") == "1") {
|
if (jsonReadStr(configSetupJson, "scen") == "1") {
|
||||||
if ((jsonRead(optionJson, "scenario_status") != "")) {
|
if ((jsonReadStr(configOptionJson, "scenario_status") != "")) {
|
||||||
int i = 0;
|
int i = 0;
|
||||||
String str = scenario; //читаем переменную с сценариями (то что из файла на странице)
|
String str = scenario; //читаем переменную с сценариями (то что из файла на странице)
|
||||||
str += "\n";
|
str += "\n";
|
||||||
@@ -17,42 +17,38 @@ void handleScenario() {
|
|||||||
//Serial.println(i);
|
//Serial.println(i);
|
||||||
String condition = selectToMarker (tmp, "\n"); //выделяем первую строку самого сценария button1 = 1 (условие)
|
String condition = selectToMarker (tmp, "\n"); //выделяем первую строку самого сценария button1 = 1 (условие)
|
||||||
String param_name = selectFromMarkerToMarker(condition, " " , 0);
|
String param_name = selectFromMarkerToMarker(condition, " " , 0);
|
||||||
param_name = add_set(param_name); //из первой страки берем имя параметра button1 и вставляем в него Set и получаем buttonSet1
|
String order = jsonReadStr(configOptionJson, "scenario_status"); //читаем весь файл событий
|
||||||
if (param_name.indexOf("timenow") != -1){
|
|
||||||
param_name = param_name + "Set";
|
|
||||||
}
|
|
||||||
String order = jsonRead(optionJson, "scenario_status"); //читаем весь файл событий
|
|
||||||
String param = selectToMarker (order, ","); //читаем первое событие из файла событий
|
String param = selectToMarker (order, ","); //читаем первое событие из файла событий
|
||||||
if (param_name == param) { //если поступившее событие равно событию заданному buttonSet1 в файле начинаем его обработку
|
if (param_name == param) { //если поступившее событие равно событию заданному buttonSet1 в файле начинаем его обработку
|
||||||
|
|
||||||
String sign = selectFromMarkerToMarker(condition, " " , 1); //читаем знак (=)
|
String sign = selectFromMarkerToMarker(condition, " " , 1); //читаем знак (=)
|
||||||
String value = selectFromMarkerToMarker(condition, " " , 2); //читаем значение (1)
|
String value = selectFromMarkerToMarker(condition, " " , 2); //читаем значение (1)
|
||||||
if (value.indexOf("digit") != -1) {
|
if (value.indexOf("digit") != -1) {
|
||||||
value = add_set(value);
|
// value = add_set(value);
|
||||||
value = jsonRead(configJson, value);
|
value = jsonReadStr(configLiveJson, value);
|
||||||
}
|
}
|
||||||
if (value.indexOf("time") != -1) {
|
if (value.indexOf("time") != -1) {
|
||||||
value = add_set(value);
|
// value = add_set(value);
|
||||||
value = jsonRead(configJson, value);
|
value = jsonReadStr(configLiveJson, value);
|
||||||
}
|
}
|
||||||
boolean flag = false; //если одно из значений совпало то только тогда начинаем выполнять комнады
|
boolean flag = false; //если одно из значений совпало то только тогда начинаем выполнять комнады
|
||||||
if (sign == "=") {
|
if (sign == "=") {
|
||||||
if (jsonRead(configJson, param_name) == value) flag = true;
|
if (jsonReadStr(configLiveJson, param_name) == value) flag = true;
|
||||||
}
|
}
|
||||||
if (sign == "!=") {
|
if (sign == "!=") {
|
||||||
if (jsonRead(configJson, param_name) != value) flag = true;
|
if (jsonReadStr(configLiveJson, param_name) != value) flag = true;
|
||||||
}
|
}
|
||||||
if (sign == "<") {
|
if (sign == "<") {
|
||||||
if (jsonRead(configJson, param_name).toInt() < value.toInt()) flag = true;
|
if (jsonReadStr(configLiveJson, param_name).toInt() < value.toInt()) flag = true;
|
||||||
}
|
}
|
||||||
if (sign == ">") {
|
if (sign == ">") {
|
||||||
if (jsonRead(configJson, param_name).toInt() > value.toInt()) flag = true;
|
if (jsonReadStr(configLiveJson, param_name).toInt() > value.toInt()) flag = true;
|
||||||
}
|
}
|
||||||
if (sign == ">=") {
|
if (sign == ">=") {
|
||||||
if (jsonRead(configJson, param_name).toInt() >= value.toInt()) flag = true;
|
if (jsonReadStr(configLiveJson, param_name).toInt() >= value.toInt()) flag = true;
|
||||||
}
|
}
|
||||||
if (sign == "<=") {
|
if (sign == "<=") {
|
||||||
if (jsonRead(configJson, param_name).toInt() <= value.toInt()) flag = true;
|
if (jsonReadStr(configLiveJson, param_name).toInt() <= value.toInt()) flag = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (flag) {
|
if (flag) {
|
||||||
@@ -67,9 +63,9 @@ void handleScenario() {
|
|||||||
str = deleteBeforeDelimiter(str, "end\n"); //удаляем первый сценарий
|
str = deleteBeforeDelimiter(str, "end\n"); //удаляем первый сценарий
|
||||||
//-----------------------------------------------------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------------------------------------------------
|
||||||
}
|
}
|
||||||
String tmp2 = jsonRead(optionJson, "scenario_status"); //читаем файл событий
|
String tmp2 = jsonReadStr(configOptionJson, "scenario_status"); //читаем файл событий
|
||||||
tmp2 = deleteBeforeDelimiter(tmp2, ","); //удаляем выполненное событие
|
tmp2 = deleteBeforeDelimiter(tmp2, ","); //удаляем выполненное событие
|
||||||
jsonWrite(optionJson, "scenario_status", tmp2); //записываем обновленный файл событий
|
jsonWriteStr(configOptionJson, "scenario_status", tmp2); //записываем обновленный файл событий
|
||||||
i = 0;
|
i = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -77,10 +73,10 @@ void handleScenario() {
|
|||||||
|
|
||||||
void eventGen (String event_name, String number) { //событие выглядит как имя плюс set плюс номер: button+Set+1
|
void eventGen (String event_name, String number) { //событие выглядит как имя плюс set плюс номер: button+Set+1
|
||||||
|
|
||||||
if (jsonRead(configSetup, "scenario") == "1") {
|
if (jsonReadStr(configSetupJson, "scen") == "1") {
|
||||||
String tmp = jsonRead(optionJson, "scenario_status") ; //генерирование события
|
String tmp = jsonReadStr(configOptionJson, "scenario_status") ; //генерирование события
|
||||||
//Serial.println(event_name);
|
//Serial.println(event_name);
|
||||||
jsonWrite(optionJson, "scenario_status", tmp + event_name + number + ",");
|
jsonWriteStr(configOptionJson, "scenario_status", tmp + event_name + number + ",");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
640
Sensors.ino
640
Sensors.ino
@@ -1,8 +1,108 @@
|
|||||||
//===============================================================================================================================
|
void sensors_init() {
|
||||||
//=========================================Модуль аналогового сенсора============================================================
|
ts.add(SENSORS, 1000, [&](void*) {
|
||||||
|
static int counter;
|
||||||
|
counter++;
|
||||||
|
|
||||||
|
#ifdef level_enable
|
||||||
|
if (sensors_reading_map[0] == 1) level_reading();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (counter > 10) {
|
||||||
|
counter = 0;
|
||||||
|
|
||||||
|
#ifdef analog_enable
|
||||||
|
if (sensors_reading_map[1] == 1) analog_reading1();
|
||||||
|
if (sensors_reading_map[2] == 1) analog_reading2();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef dallas_enable
|
||||||
|
if (sensors_reading_map[3] == 1) dallas_reading();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef dht_enable
|
||||||
|
if (sensors_reading_map[4] == 1) dhtT_reading();
|
||||||
|
if (sensors_reading_map[5] == 1) dhtH_reading();
|
||||||
|
if (sensors_reading_map[6] == 1) dhtP_reading();
|
||||||
|
if (sensors_reading_map[7] == 1) dhtC_reading();
|
||||||
|
if (sensors_reading_map[8] == 1) dhtD_reading();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef bmp_enable
|
||||||
|
if (sensors_reading_map[9] == 1) bmp280T_rading();
|
||||||
|
if (sensors_reading_map[10] == 1) bmp280P_reading();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef bme_enable
|
||||||
|
if (sensors_reading_map[11] == 1) bme280T_reading();
|
||||||
|
if (sensors_reading_map[12] == 1) bme280P_reading();
|
||||||
|
if (sensors_reading_map[13] == 1) bme280H_reading();
|
||||||
|
if (sensors_reading_map[14] == 1) bme280A_reading();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}, nullptr, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
//=========================================================================================================================================
|
||||||
|
//=========================================Модуль измерения уровня в баке==================================================================
|
||||||
|
#ifdef level_enable
|
||||||
|
//level L 14 12 Вода#в#баке,#% Датчики fill-gauge 125 20 1
|
||||||
|
void level() {
|
||||||
|
String value_name = sCmd.next();
|
||||||
|
String trig = sCmd.next();
|
||||||
|
String echo = sCmd.next();
|
||||||
|
String widget_name = sCmd.next();
|
||||||
|
String page_name = sCmd.next();
|
||||||
|
String type = sCmd.next();
|
||||||
|
String empty_level = sCmd.next();
|
||||||
|
String full_level = sCmd.next();
|
||||||
|
String page_number = sCmd.next();
|
||||||
|
level_value_name = value_name;
|
||||||
|
jsonWriteStr(configOptionJson, "e_lev", empty_level);
|
||||||
|
jsonWriteStr(configOptionJson, "f_lev", full_level);
|
||||||
|
jsonWriteStr(configOptionJson, "trig", trig);
|
||||||
|
jsonWriteStr(configOptionJson, "echo", echo);
|
||||||
|
pinMode(trig.toInt(), OUTPUT);
|
||||||
|
pinMode(echo.toInt(), INPUT);
|
||||||
|
choose_widget_and_create(widget_name, page_name, page_number, type, value_name);
|
||||||
|
sensors_reading_map[0] = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void level_reading() {
|
||||||
|
long duration_;
|
||||||
|
int distance_cm;
|
||||||
|
int level;
|
||||||
|
static int counter;
|
||||||
|
int trig = jsonReadInt(configOptionJson, "trig");
|
||||||
|
int echo = jsonReadInt(configOptionJson, "echo");
|
||||||
|
digitalWrite(trig, LOW);
|
||||||
|
delayMicroseconds(2);
|
||||||
|
digitalWrite(trig, HIGH);
|
||||||
|
delayMicroseconds(10);
|
||||||
|
digitalWrite(trig, LOW);
|
||||||
|
duration_ = pulseIn(echo, HIGH, 30000); // 3000 µs = 50cm // 30000 µs = 5 m
|
||||||
|
distance_cm = duration_ / 29 / 2;
|
||||||
|
distance_cm = medianFilter.filtered(distance_cm);//отсечение промахов медианным фильтром
|
||||||
|
counter++;
|
||||||
|
if (counter > tank_level_times_to_send) {
|
||||||
|
counter = 0;
|
||||||
|
level = map(distance_cm,
|
||||||
|
jsonReadInt(configOptionJson, "e_lev"),
|
||||||
|
jsonReadInt(configOptionJson, "f_lev"), 0, 100);
|
||||||
|
jsonWriteInt(configLiveJson, level_value_name, level);
|
||||||
|
eventGen (level_value_name, "");
|
||||||
|
sendSTATUS(level_value_name, String(level));
|
||||||
|
Serial.println("[i] sensor '" + level_value_name + "' data: " + String(level));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
//=========================================================================================================================================
|
||||||
|
//=========================================Модуль аналогового сенсора======================================================================
|
||||||
|
#ifdef analog_enable
|
||||||
|
//analog adc 0 Аналоговый#вход,#% Датчики any-data 1 1023 1 100 1
|
||||||
void analog() {
|
void analog() {
|
||||||
|
String value_name = sCmd.next();
|
||||||
String pin = sCmd.next();
|
String pin = sCmd.next();
|
||||||
String viget_name = sCmd.next();
|
String widget_name = sCmd.next();
|
||||||
String page_name = sCmd.next();
|
String page_name = sCmd.next();
|
||||||
String type = sCmd.next();
|
String type = sCmd.next();
|
||||||
String analog_start = sCmd.next();
|
String analog_start = sCmd.next();
|
||||||
@@ -10,91 +110,67 @@ void analog() {
|
|||||||
String analog_start_out = sCmd.next();
|
String analog_start_out = sCmd.next();
|
||||||
String analog_end_out = sCmd.next();
|
String analog_end_out = sCmd.next();
|
||||||
String page_number = sCmd.next();
|
String page_number = sCmd.next();
|
||||||
jsonWrite(optionJson, "analog_start", analog_start);
|
analog_value_names_list += value_name + ",";
|
||||||
jsonWrite(optionJson, "analog_end", analog_end);
|
enter_to_analog_counter++;
|
||||||
jsonWrite(optionJson, "analog_start_out", analog_start_out);
|
jsonWriteStr(configOptionJson, value_name + "_st", analog_start);
|
||||||
jsonWrite(optionJson, "analog_end_out", analog_end_out);
|
jsonWriteStr(configOptionJson, value_name + "_end", analog_end);
|
||||||
choose_viget_and_create(viget_name, page_name, page_number, type, "analog");
|
jsonWriteStr(configOptionJson, value_name + "_st_out", analog_start_out);
|
||||||
ts.add(ANALOG_, analog_update_int, [&](void*) {
|
jsonWriteStr(configOptionJson, value_name + "_end_out", analog_end_out);
|
||||||
static int analog_old;
|
choose_widget_and_create(widget_name, page_name, page_number, type, value_name);
|
||||||
|
if (enter_to_analog_counter == 1) {
|
||||||
|
sensors_reading_map[1] = 1;
|
||||||
|
}
|
||||||
|
if (enter_to_analog_counter == 2) {
|
||||||
|
sensors_reading_map[2] = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void analog_reading1() {
|
||||||
|
String value_name = selectFromMarkerToMarker(analog_value_names_list, ",", 0);
|
||||||
#ifdef ESP32
|
#ifdef ESP32
|
||||||
//int pin_int = pin.toInt();
|
|
||||||
int analog_in = analogRead(34);
|
int analog_in = analogRead(34);
|
||||||
#endif
|
#endif
|
||||||
#ifdef ESP8266
|
#ifdef ESP8266
|
||||||
int analog_in = analogRead(A0);
|
int analog_in = analogRead(A0);
|
||||||
#endif
|
#endif
|
||||||
jsonWrite(configJson, "analog_in", analog_in);
|
|
||||||
int analog = map(analog_in,
|
int analog = map(analog_in,
|
||||||
jsonReadtoInt(optionJson, "analog_start") ,
|
jsonReadInt(configOptionJson, value_name + "_st") ,
|
||||||
jsonReadtoInt(optionJson, "analog_end"),
|
jsonReadInt(configOptionJson, value_name + "_end"),
|
||||||
jsonReadtoInt(optionJson, "analog_start_out"),
|
jsonReadInt(configOptionJson, value_name + "_st_out"),
|
||||||
jsonReadtoInt(optionJson, "analog_end_out"));
|
jsonReadInt(configOptionJson, value_name + "_end_out"));
|
||||||
jsonWrite(configJson, "analog", analog);
|
jsonWriteInt(configLiveJson, value_name, analog);
|
||||||
// if (analog_old != analog) {
|
eventGen (value_name, "");
|
||||||
eventGen ("analog", "");
|
sendSTATUS(value_name, String(analog));
|
||||||
sendSTATUS("analog", String(analog));
|
Serial.println("[i] sensor '" + value_name + "' data: " + String(analog));
|
||||||
if (client.connected()) {
|
|
||||||
Serial.println("[i] sensor 'analog' send date " + String(analog));
|
|
||||||
}
|
|
||||||
// }
|
|
||||||
analog_old = analog;
|
|
||||||
}, nullptr, true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//===================================================================================================================================
|
void analog_reading2() {
|
||||||
//=========================================Модуль измерения уровня в баке============================================================
|
String value_name = selectFromMarkerToMarker(analog_value_names_list, ",", 1);
|
||||||
void level() {
|
#ifdef ESP32
|
||||||
String viget_name = sCmd.next();
|
int analog_in = analogRead(35);
|
||||||
String page_name = sCmd.next();
|
#endif
|
||||||
String type = sCmd.next();
|
#ifdef ESP8266
|
||||||
String empty_level = sCmd.next();
|
int analog_in = analogRead(A0);
|
||||||
String full_level = sCmd.next();
|
#endif
|
||||||
String page_number = sCmd.next();
|
int analog = map(analog_in,
|
||||||
jsonWrite(optionJson, "empty_level", empty_level);
|
jsonReadInt(configOptionJson, value_name + "_st") ,
|
||||||
jsonWrite(optionJson, "full_level", full_level);
|
jsonReadInt(configOptionJson, value_name + "_end"),
|
||||||
pinMode(14, OUTPUT);
|
jsonReadInt(configOptionJson, value_name + "_st_out"),
|
||||||
pinMode(12, INPUT);
|
jsonReadInt(configOptionJson, value_name + "_end_out"));
|
||||||
choose_viget_and_create(viget_name, page_name, page_number, type, "level");
|
jsonWriteInt(configLiveJson, value_name, analog);
|
||||||
ts.add(LEVEL, tank_level_shooting_interval, [&](void*) {
|
eventGen (value_name, "");
|
||||||
long duration_;
|
sendSTATUS(value_name, String(analog));
|
||||||
int distance_cm;
|
Serial.println("[i] sensor '" + value_name + "' data: " + String(analog));
|
||||||
int level;
|
|
||||||
static int level_old; //переменная static сохраняет свое значение между вызовами функции
|
|
||||||
static int counter;
|
|
||||||
digitalWrite(14, LOW);
|
|
||||||
delayMicroseconds(2);
|
|
||||||
digitalWrite(14, HIGH);
|
|
||||||
delayMicroseconds(10);
|
|
||||||
digitalWrite(14, LOW);
|
|
||||||
duration_ = pulseIn(12, HIGH, 30000); // 3000 µs = 50cm // 30000 µs = 5 m
|
|
||||||
distance_cm = duration_ / 29 / 2;
|
|
||||||
distance_cm = medianFilter.filtered(distance_cm);//отсечение промахов медианным фильтром
|
|
||||||
counter++;
|
|
||||||
if (counter > tank_level_times_to_send) {
|
|
||||||
counter = 0;
|
|
||||||
jsonWrite(configJson, "level_in", distance_cm);
|
|
||||||
level = map(distance_cm,
|
|
||||||
jsonReadtoInt(optionJson, "empty_level"),
|
|
||||||
jsonReadtoInt(optionJson, "full_level"), 0, 100);
|
|
||||||
jsonWrite(configJson, "level", level);
|
|
||||||
//if (level_old != level) {
|
|
||||||
eventGen ("level", "");
|
|
||||||
sendSTATUS("level", String(level));
|
|
||||||
if (client.connected()) {
|
|
||||||
Serial.println("[i] sensor tank 'level' send date " + String(level));
|
|
||||||
}
|
}
|
||||||
//}
|
#endif
|
||||||
level_old = level;
|
//=========================================================================================================================================
|
||||||
}
|
//=========================================Модуль температурного сенсора ds18b20===========================================================
|
||||||
}, nullptr, true);
|
#ifdef dallas_enable
|
||||||
}
|
|
||||||
|
|
||||||
//==========================================================================================================================================
|
|
||||||
//=========================================Модуль температурного сенсора ds18b20============================================================
|
|
||||||
void dallas() {
|
void dallas() {
|
||||||
|
String value_name = sCmd.next();
|
||||||
String pin = sCmd.next();
|
String pin = sCmd.next();
|
||||||
String viget_name = sCmd.next();
|
String address = sCmd.next();
|
||||||
|
String widget_name = sCmd.next();
|
||||||
String page_name = sCmd.next();
|
String page_name = sCmd.next();
|
||||||
String type = sCmd.next();
|
String type = sCmd.next();
|
||||||
String page_number = sCmd.next();
|
String page_number = sCmd.next();
|
||||||
@@ -102,122 +178,122 @@ void dallas() {
|
|||||||
sensors.setOneWire(oneWire);
|
sensors.setOneWire(oneWire);
|
||||||
sensors.begin();
|
sensors.begin();
|
||||||
sensors.setResolution(12);
|
sensors.setResolution(12);
|
||||||
choose_viget_and_create(viget_name, page_name, page_number, type, "dallas");
|
choose_widget_and_create(widget_name, page_name, page_number, type, "dallas");
|
||||||
ts.add(DALLAS, temp_update_int, [&](void*) {
|
sensors_reading_map[3] = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void dallas_reading() {
|
||||||
float temp = 0;
|
float temp = 0;
|
||||||
static float temp_old;
|
|
||||||
sensors.requestTemperatures();
|
sensors.requestTemperatures();
|
||||||
temp = sensors.getTempCByIndex(0);
|
temp = sensors.getTempCByIndex(0);
|
||||||
jsonWrite(configJson, "dallas", String(temp));
|
jsonWriteStr(configLiveJson, "dallas", String(temp));
|
||||||
//if (temp_old != temp) {
|
|
||||||
eventGen ("dallas", "");
|
eventGen ("dallas", "");
|
||||||
sendSTATUS("dallas", String(temp));
|
sendSTATUS("dallas", String(temp));
|
||||||
if (client.connected()) {
|
|
||||||
Serial.println("[i] sensor 'dallas' send date " + String(temp));
|
Serial.println("[i] sensor 'dallas' send date " + String(temp));
|
||||||
}
|
}
|
||||||
//}
|
#endif
|
||||||
temp_old = temp;
|
//=========================================================================================================================================
|
||||||
}, nullptr, true);
|
//=========================================Модуль сенсоров DHT=============================================================================
|
||||||
}
|
#ifdef dht_enable
|
||||||
|
//dhtT t 2 dht11 Температура#DHT,#t°C Датчики any-data 1
|
||||||
|
|
||||||
//======================================================================================================================
|
|
||||||
//=========================================Модуль сенсоров DHT==========================================================
|
|
||||||
void dhtT() {
|
void dhtT() {
|
||||||
String sensor_type = sCmd.next();
|
String value_name = sCmd.next();
|
||||||
String pin = sCmd.next();
|
String pin = sCmd.next();
|
||||||
String viget_name = sCmd.next();
|
String sensor_type = sCmd.next();
|
||||||
|
String widget_name = sCmd.next();
|
||||||
String page_name = sCmd.next();
|
String page_name = sCmd.next();
|
||||||
String type = sCmd.next();
|
String type = sCmd.next();
|
||||||
String page_number = sCmd.next();
|
String page_number = sCmd.next();
|
||||||
if (sensor_type == "DHT11") {
|
dhtT_value_name = value_name;
|
||||||
|
if (sensor_type == "dht11") {
|
||||||
dht.setup(pin.toInt(), DHTesp::DHT11);
|
dht.setup(pin.toInt(), DHTesp::DHT11);
|
||||||
}
|
}
|
||||||
if (sensor_type == "DHT22") {
|
if (sensor_type == "dht22") {
|
||||||
dht.setup(pin.toInt(), DHTesp::DHT22);
|
dht.setup(pin.toInt(), DHTesp::DHT22);
|
||||||
}
|
}
|
||||||
choose_viget_and_create(viget_name, page_name, page_number, type, "dhtT");
|
choose_widget_and_create(widget_name, page_name, page_number, type, value_name);
|
||||||
ts.add(DHTT, dhtT_update_int, [&](void*) { //dht.getMinimumSamplingPeriod()
|
sensors_reading_map[4] = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void dhtT_reading() {
|
||||||
float value = 0;
|
float value = 0;
|
||||||
static float value_old;
|
|
||||||
static int counter;
|
static int counter;
|
||||||
if (dht.getStatus() != 0 && counter < 5) {
|
if (dht.getStatus() != 0 && counter < 5) {
|
||||||
sendSTATUS("dhtT", String(dht.getStatusString()));
|
sendSTATUS(dhtT_value_name, String(dht.getStatusString()));
|
||||||
counter++;
|
counter++;
|
||||||
} else {
|
} else {
|
||||||
counter = 0;
|
counter = 0;
|
||||||
value = dht.getTemperature();
|
value = dht.getTemperature();
|
||||||
jsonWrite(configJson, "dhtT", String(value));
|
if (String(value) != "nan") {
|
||||||
//if (value_old != value) {
|
eventGen (dhtT_value_name, "");
|
||||||
eventGen ("dhtT", "");
|
jsonWriteStr(configLiveJson, dhtT_value_name, String(value));
|
||||||
sendSTATUS("dhtT", String(value));
|
sendSTATUS(dhtT_value_name, String(value));
|
||||||
if (client.connected()) {
|
Serial.println("[i] sensor '" + dhtT_value_name + "' data: " + String(value));
|
||||||
Serial.println("[i] sensor 'dhtT' send date " + String(value));
|
|
||||||
}
|
}
|
||||||
//}
|
|
||||||
value_old = value;
|
|
||||||
}
|
}
|
||||||
}, nullptr, true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//dhtH h 2 dht11 Влажность#DHT,#t°C Датчики any-data 1
|
||||||
void dhtH() {
|
void dhtH() {
|
||||||
String sensor_type = sCmd.next();
|
String value_name = sCmd.next();
|
||||||
String pin = sCmd.next();
|
String pin = sCmd.next();
|
||||||
String viget_name = sCmd.next();
|
String sensor_type = sCmd.next();
|
||||||
|
String widget_name = sCmd.next();
|
||||||
String page_name = sCmd.next();
|
String page_name = sCmd.next();
|
||||||
String type = sCmd.next();
|
String type = sCmd.next();
|
||||||
String page_number = sCmd.next();
|
String page_number = sCmd.next();
|
||||||
if (sensor_type == "DHT11") {
|
dhtH_value_name = value_name;
|
||||||
|
if (sensor_type == "dht11") {
|
||||||
dht.setup(pin.toInt(), DHTesp::DHT11);
|
dht.setup(pin.toInt(), DHTesp::DHT11);
|
||||||
}
|
}
|
||||||
if (sensor_type == "DHT22") {
|
if (sensor_type == "dht22") {
|
||||||
dht.setup(pin.toInt(), DHTesp::DHT22);
|
dht.setup(pin.toInt(), DHTesp::DHT22);
|
||||||
}
|
}
|
||||||
choose_viget_and_create(viget_name, page_name, page_number, type, "dhtH");
|
choose_widget_and_create(widget_name, page_name, page_number, type, value_name);
|
||||||
ts.add(DHTH, dhtH_update_int , [&](void*) { //dht.getMinimumSamplingPeriod()
|
sensors_reading_map[5] = 1;
|
||||||
int value = 0;
|
}
|
||||||
static int value_old;
|
|
||||||
|
void dhtH_reading() {
|
||||||
|
float value = 0;
|
||||||
static int counter;
|
static int counter;
|
||||||
if (dht.getStatus() != 0 && counter < 5) {
|
if (dht.getStatus() != 0 && counter < 5) {
|
||||||
sendSTATUS("dhtH", String(dht.getStatusString()));
|
sendSTATUS(dhtH_value_name, String(dht.getStatusString()));
|
||||||
counter++;
|
counter++;
|
||||||
} else {
|
} else {
|
||||||
counter = 0;
|
counter = 0;
|
||||||
value = dht.getHumidity();
|
value = dht.getHumidity();
|
||||||
jsonWrite(configJson, "dhtH", String(value));
|
if (String(value) != "nan") {
|
||||||
//if (value_old != value) {
|
eventGen (dhtH_value_name, "");
|
||||||
eventGen ("dhtH", "");
|
jsonWriteStr(configLiveJson, dhtH_value_name, String(value));
|
||||||
sendSTATUS("dhtH", String(value));
|
sendSTATUS(dhtH_value_name, String(value));
|
||||||
if (client.connected()) {
|
Serial.println("[i] sensor '" + dhtH_value_name + "' data: " + String(value));
|
||||||
Serial.println("[i] sensor 'dhtH' send date " + String(value));
|
|
||||||
}
|
}
|
||||||
//}
|
|
||||||
value_old = value;
|
|
||||||
}
|
}
|
||||||
}, nullptr, true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void dhtPerception() {
|
//dhtPerception Восприятие: Датчики 4
|
||||||
String viget_name = sCmd.next();
|
void dhtP() {
|
||||||
|
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();
|
||||||
choose_viget_and_create(viget_name, page_name, page_number, "any-data", "dhtPerception");
|
choose_widget_and_create(widget_name, page_name, page_number, "any-data", "dhtPerception");
|
||||||
ts.add(DHTP, dht_calculation_update_int, [&](void*) {
|
sensors_reading_map[6] = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void dhtP_reading() {
|
||||||
byte value;
|
byte value;
|
||||||
if (dht.getStatus() != 0) {
|
if (dht.getStatus() != 0) {
|
||||||
sendSTATUS("dhtPerception", String(dht.getStatusString()));
|
sendSTATUS("dhtPerception", String(dht.getStatusString()));
|
||||||
} else {
|
} else {
|
||||||
value = dht.computePerception(jsonRead(configJson, "dhtT").toFloat(), jsonRead(configJson, "dhtH").toFloat(), false);
|
value = dht.computePerception(jsonReadStr(configLiveJson, dhtT_value_name).toFloat(), jsonReadStr(configLiveJson, dhtH_value_name).toFloat(), false);
|
||||||
String final_line = perception(value);
|
String final_line = perception(value);
|
||||||
jsonWrite(configJson, "dhtPerception", final_line);
|
jsonWriteStr(configLiveJson, "dhtPerception", final_line);
|
||||||
eventGen ("dhtPerception", "");
|
eventGen ("dhtPerception", "");
|
||||||
sendSTATUS("dhtPerception", final_line);
|
sendSTATUS("dhtPerception", final_line);
|
||||||
if (client.connected()) {
|
if (client_mqtt.connected()) {
|
||||||
Serial.println("[i] sensor 'dhtPerception' send date " + final_line);
|
Serial.println("[i] sensor 'dhtPerception' data: " + final_line);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, nullptr, true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
String perception(byte value) {
|
String perception(byte value) {
|
||||||
@@ -231,18 +307,31 @@ String perception(byte value) {
|
|||||||
if (value == 7) return "Сильно неудобно, полный звиздец";
|
if (value == 7) return "Сильно неудобно, полный звиздец";
|
||||||
}
|
}
|
||||||
|
|
||||||
void dhtComfort() {
|
//dhtComfort Степень#комфорта: Датчики 3
|
||||||
String viget_name = sCmd.next();
|
void dhtC() {
|
||||||
|
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();
|
||||||
choose_viget_and_create(viget_name, page_name, page_number, "any-data", "dhtComfort");
|
choose_widget_and_create(widget_name, page_name, page_number, "any-data", "dhtComfort");
|
||||||
ts.add(DHTC, dht_calculation_update_int, [&](void*) {
|
sensors_reading_map[7] = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void dhtC_reading() {
|
||||||
float value;
|
float value;
|
||||||
ComfortState cf;
|
ComfortState cf;
|
||||||
if (dht.getStatus() != 0) {
|
if (dht.getStatus() != 0) {
|
||||||
sendSTATUS("dhtComfort", String(dht.getStatusString()));
|
sendSTATUS("dhtComfort", String(dht.getStatusString()));
|
||||||
} else {
|
} else {
|
||||||
value = dht.getComfortRatio(cf, jsonRead(configJson, "dhtT").toFloat(), jsonRead(configJson, "dhtH").toFloat(), false);
|
value = dht.getComfortRatio(cf, jsonReadStr(configLiveJson, dhtT_value_name).toFloat(), jsonReadStr(configLiveJson, dhtH_value_name).toFloat(), false);
|
||||||
|
String final_line = get_comfort_status(cf);
|
||||||
|
jsonWriteStr(configLiveJson, "dhtComfort", final_line);
|
||||||
|
eventGen ("dhtComfort", "");
|
||||||
|
sendSTATUS("dhtComfort", final_line);
|
||||||
|
Serial.println("[i] sensor 'dhtComfort' send date " + final_line);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String get_comfort_status(ComfortState cf) {
|
||||||
String comfortStatus;
|
String comfortStatus;
|
||||||
switch (cf) {
|
switch (cf) {
|
||||||
case Comfort_OK:
|
case Comfort_OK:
|
||||||
@@ -276,139 +365,192 @@ void dhtComfort() {
|
|||||||
comfortStatus = "Неизвестно";
|
comfortStatus = "Неизвестно";
|
||||||
break;
|
break;
|
||||||
};
|
};
|
||||||
String final_line = comfortStatus;
|
return comfortStatus;
|
||||||
jsonWrite(configJson, "dhtComfort", final_line);
|
|
||||||
eventGen ("dhtComfort", "");
|
|
||||||
sendSTATUS("dhtComfort", final_line);
|
|
||||||
if (client.connected()) {
|
|
||||||
Serial.println("[i] sensor 'dhtComfort' send date " + final_line);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, nullptr, true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void dhtDewpoint() {
|
|
||||||
String viget_name = sCmd.next();
|
//dhtDewpoint Точка#росы: Датчики 5
|
||||||
|
void dhtD() {
|
||||||
|
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();
|
||||||
choose_viget_and_create(viget_name, page_name, page_number, "any-data", "dhtDewpoint");
|
choose_widget_and_create(widget_name, page_name, page_number, "any-data", "dhtDewpoint");
|
||||||
ts.add(DHTD, dht_calculation_update_int, [&](void*) {
|
sensors_reading_map[8] = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void dhtD_reading() {
|
||||||
float value;
|
float value;
|
||||||
if (dht.getStatus() != 0) {
|
if (dht.getStatus() != 0) {
|
||||||
sendSTATUS("dhtDewpoint", String(dht.getStatusString()));
|
sendSTATUS("dhtDewpoint", String(dht.getStatusString()));
|
||||||
} else {
|
} else {
|
||||||
value = dht.computeDewPoint(jsonRead(configJson, "dhtT").toFloat(), jsonRead(configJson, "dhtH").toFloat(), false);
|
value = dht.computeDewPoint(jsonReadStr(configLiveJson, dhtT_value_name).toFloat(), jsonReadStr(configLiveJson, dhtH_value_name).toFloat(), false);
|
||||||
jsonWrite(configJson, "dhtDewpoint", value);
|
jsonWriteInt(configLiveJson, "dhtDewpoint", value);
|
||||||
eventGen ("dhtDewpoint", "");
|
eventGen ("dhtDewpoint", "");
|
||||||
sendSTATUS("dhtDewpoint", String(value));
|
sendSTATUS("dhtDewpoint", String(value));
|
||||||
if (client.connected()) {
|
Serial.println("[i] sensor 'dhtDewpoint' data: " + String(value));
|
||||||
Serial.println("[i] sensor 'dhtDewpoint' send date " + String(value));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, nullptr, true);
|
#endif
|
||||||
}
|
//=========================================i2c bus esp8266 scl-4 sda-5 ====================================================================
|
||||||
|
//=========================================================================================================================================
|
||||||
|
//=========================================Модуль сенсоров bmp280==========================================================================
|
||||||
void choose_viget_and_create(String viget_name, String page_name, String page_number, String type, String topik) {
|
#ifdef bmp_enable
|
||||||
|
//bmp280T temp1 0x76 Температура#bmp280 Датчики any-data 1
|
||||||
if (type == "any-data") createViget (viget_name, page_name, page_number, "vigets/viget.anydata.json", topik);
|
void bmp280T() {
|
||||||
if (type == "progress-line") createViget (viget_name, page_name, page_number, "vigets/viget.progressL.json", topik);
|
String value_name = sCmd.next();
|
||||||
if (type == "progress-round") createViget (viget_name, page_name, page_number, "vigets/viget.progressR.json", topik);
|
String address = sCmd.next();
|
||||||
|
String widget_name = sCmd.next();
|
||||||
|
|
||||||
}
|
|
||||||
//======================================================================================================================
|
|
||||||
//===============================================Логирование============================================================
|
|
||||||
|
|
||||||
void logging() {
|
|
||||||
|
|
||||||
static boolean flag = true;
|
|
||||||
|
|
||||||
String sensor_name = sCmd.next();
|
|
||||||
String period_min = sCmd.next();
|
|
||||||
String maxCount = sCmd.next();
|
|
||||||
String viget_name = sCmd.next();
|
|
||||||
viget_name.replace("#", " ");
|
|
||||||
String page_name = sCmd.next();
|
String page_name = sCmd.next();
|
||||||
|
String type = sCmd.next();
|
||||||
String page_number = sCmd.next();
|
String page_number = sCmd.next();
|
||||||
|
bmp280T_value_name = value_name;
|
||||||
if (sensor_name == "analog") jsonWrite(optionJson, "analog_logging_count", maxCount);
|
choose_widget_and_create(widget_name, page_name, page_number, type, value_name);
|
||||||
if (sensor_name == "level") jsonWrite(optionJson, "level_logging_count", maxCount);
|
bmp.begin(hexStringToUint8(address));
|
||||||
if (sensor_name == "dallas") jsonWrite(optionJson, "dallas_logging_count", maxCount);
|
bmp.setSampling(Adafruit_BMP280::MODE_NORMAL, /* Operating Mode. */
|
||||||
if (sensor_name == "ph") jsonWrite(optionJson, "ph_logging_count", maxCount);
|
Adafruit_BMP280::SAMPLING_X2, /* Temp. oversampling */
|
||||||
/*
|
Adafruit_BMP280::SAMPLING_X16, /* Pressure oversampling */
|
||||||
if (sensor_name == "analog") createViget (viget_name, page_name, page_number, "vigets/viget.chart.json", "loganalog", "maxCount", maxCount);
|
Adafruit_BMP280::FILTER_X16, /* Filtering. */
|
||||||
if (sensor_name == "level") createViget (viget_name, page_name, page_number, "vigets/viget.chart.json", "loglevel", "maxCount", maxCount);
|
Adafruit_BMP280::STANDBY_MS_500); /* Standby time. */
|
||||||
if (sensor_name == "dallas") createViget (viget_name, page_name, page_number, "vigets/viget.chart.json", "logdallas", "maxCount", maxCount);
|
//bmp_temp->printSensorDetails();
|
||||||
if (sensor_name == "ph") createViget (viget_name, page_name, page_number, "vigets/viget.chart.json", "logph", "maxCount", maxCount);
|
sensors_reading_map[9] = 1;
|
||||||
*/
|
|
||||||
if (sensor_name == "analog") {
|
|
||||||
flagLoggingAnalog = true;
|
|
||||||
ts.remove(ANALOG_LOG);
|
|
||||||
ts.add(ANALOG_LOG, period_min.toInt() * 1000 * 60, [&](void*) {
|
|
||||||
deleteOldDate("log.analog.txt", jsonReadtoInt(optionJson, "analog_logging_count"), jsonRead(configJson, "analog"), false);
|
|
||||||
}, nullptr, true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sensor_name == "level") {
|
void bmp280T_rading() {
|
||||||
flagLoggingLevel = true;
|
float value = 0;
|
||||||
ts.remove(LEVEL_LOG);
|
sensors_event_t temp_event, pressure_event;
|
||||||
ts.add(LEVEL_LOG, period_min.toInt() * 1000 * 60, [&](void*) {
|
bmp_temp->getEvent(&temp_event);
|
||||||
deleteOldDate("log.level.txt", jsonReadtoInt(optionJson, "level_logging_count"), jsonRead(configJson, "level"), false);
|
value = temp_event.temperature;
|
||||||
}, nullptr, true);
|
jsonWriteStr(configLiveJson, bmp280T_value_name, String(value));
|
||||||
|
eventGen(bmp280T_value_name, "");
|
||||||
|
sendSTATUS(bmp280T_value_name, String(value));
|
||||||
|
Serial.println("[i] sensor '" + bmp280T_value_name + "' data: " + String(value));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sensor_name == "dallas") {
|
//bmp280P press1 0x76 Давление#bmp280 Датчики any-data 2
|
||||||
flagLoggingDallas = true;
|
void bmp280P() {
|
||||||
ts.remove(DALLAS_LOG);
|
String value_name = sCmd.next();
|
||||||
ts.add(DALLAS_LOG, period_min.toInt() * 1000 * 60, [&](void*) {
|
String address = sCmd.next();
|
||||||
deleteOldDate("log.dallas.txt", jsonReadtoInt(optionJson, "dallas_logging_count"), jsonRead(configJson, "dallas"), false);
|
String widget_name = sCmd.next();
|
||||||
}, nullptr, true);
|
String page_name = sCmd.next();
|
||||||
}
|
String type = sCmd.next();
|
||||||
|
String page_number = sCmd.next();
|
||||||
|
bmp280P_value_name = value_name;
|
||||||
|
choose_widget_and_create(widget_name, page_name, page_number, type, value_name);
|
||||||
|
bmp.begin(hexStringToUint8(address));
|
||||||
|
bmp.setSampling(Adafruit_BMP280::MODE_NORMAL, /* Operating Mode. */
|
||||||
|
Adafruit_BMP280::SAMPLING_X2, /* Temp. oversampling */
|
||||||
|
Adafruit_BMP280::SAMPLING_X16, /* Pressure oversampling */
|
||||||
|
Adafruit_BMP280::FILTER_X16, /* Filtering. */
|
||||||
|
Adafruit_BMP280::STANDBY_MS_500); /* Standby time. */
|
||||||
|
//bmp_temp->printSensorDetails();
|
||||||
|
sensors_reading_map[10] = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void deleteOldDate(String file, int seted_number_of_lines, String date_to_add, boolean date_time) {
|
void bmp280P_reading() {
|
||||||
|
float value = 0;
|
||||||
String current_time;
|
sensors_event_t temp_event, pressure_event;
|
||||||
|
bmp_pressure->getEvent(&pressure_event);
|
||||||
if (date_time) {
|
value = pressure_event.pressure;
|
||||||
current_time = GetDataDigital() + " " + GetTimeWOsec();
|
value = value / 1.333224;
|
||||||
current_time.replace(".", "");
|
jsonWriteStr(configLiveJson, bmp280P_value_name, String(value));
|
||||||
current_time.replace(":", "");
|
eventGen(bmp280P_value_name, "");
|
||||||
} else {
|
sendSTATUS(bmp280P_value_name, String(value));
|
||||||
current_time = "";
|
Serial.println("[i] sensor '" + bmp280P_value_name + "' data: " + String(value));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
//=========================================================================================================================================
|
||||||
|
//=============================================Модуль сенсоров bme280======================================================================
|
||||||
|
#ifdef bme_enable
|
||||||
|
//bme280T temp1 0x76 Температура#bmp280 Датчики any-data 1
|
||||||
|
void bme280T() {
|
||||||
|
String value_name = sCmd.next();
|
||||||
|
String address = sCmd.next();
|
||||||
|
String widget_name = sCmd.next();
|
||||||
|
String page_name = sCmd.next();
|
||||||
|
String type = sCmd.next();
|
||||||
|
String page_number = sCmd.next();
|
||||||
|
bme280T_value_name = value_name;
|
||||||
|
choose_widget_and_create(widget_name, page_name, page_number, type, value_name);
|
||||||
|
bme.begin(hexStringToUint8(address));
|
||||||
|
sensors_reading_map[11] = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
String log_date = readFile(file, 5000);
|
void bme280T_reading() {
|
||||||
getMemoryLoad("[i] after logging procedure");
|
float value = 0;
|
||||||
|
value = bme.readTemperature();
|
||||||
//предел количества строк 255
|
jsonWriteStr(configLiveJson, bme280T_value_name, String(value));
|
||||||
|
eventGen(bme280T_value_name, "");
|
||||||
log_date.replace("\r\n", "\n");
|
sendSTATUS(bme280T_value_name, String(value));
|
||||||
log_date.replace("\r", "\n");
|
Serial.println("[i] sensor '" + bme280T_value_name + "' data: " + String(value));
|
||||||
|
|
||||||
int current_number_of_lines = count(log_date, "\n");
|
|
||||||
Serial.println("[i] in log file " + file + " " + current_number_of_lines + " lines");
|
|
||||||
|
|
||||||
|
|
||||||
if (current_number_of_lines > seted_number_of_lines + 1) {
|
|
||||||
SPIFFS.remove("/" + file);
|
|
||||||
current_number_of_lines = 0;
|
|
||||||
}
|
}
|
||||||
if (current_number_of_lines == 0) {
|
|
||||||
SPIFFS.remove("/" + file);
|
|
||||||
current_number_of_lines = 0;
|
|
||||||
}
|
|
||||||
if (current_number_of_lines > seted_number_of_lines) {
|
|
||||||
log_date = deleteBeforeDelimiter(log_date, "\n");
|
|
||||||
log_date += current_time + " " + date_to_add + "\n";
|
|
||||||
writeFile(file, log_date);
|
|
||||||
|
|
||||||
} else {
|
//bme280P pres1 0x76 Давление#bmp280 Датчики any-data 1
|
||||||
if (date_time) {
|
void bme280P() {
|
||||||
addFile(file, current_time + " " + date_to_add);
|
String value_name = sCmd.next();
|
||||||
} else {
|
String address = sCmd.next();
|
||||||
addFile(file, date_to_add);
|
String widget_name = sCmd.next();
|
||||||
|
String page_name = sCmd.next();
|
||||||
|
String type = sCmd.next();
|
||||||
|
String page_number = sCmd.next();
|
||||||
|
bme280P_value_name = value_name;
|
||||||
|
choose_widget_and_create(widget_name, page_name, page_number, type, value_name);
|
||||||
|
bme.begin(hexStringToUint8(address));
|
||||||
|
sensors_reading_map[12] = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void bme280P_reading() {
|
||||||
|
float value = 0;
|
||||||
|
value = bme.readPressure();
|
||||||
|
value = value / 1.333224;
|
||||||
|
jsonWriteStr(configLiveJson, bme280P_value_name, String(value));
|
||||||
|
eventGen(bme280P_value_name, "");
|
||||||
|
sendSTATUS(bme280P_value_name, String(value));
|
||||||
|
Serial.println("[i] sensor '" + bme280P_value_name + "' data: " + String(value));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//bme280H hum1 0x76 Влажность#bmp280 Датчики any-data 1
|
||||||
|
void bme280H() {
|
||||||
|
String value_name = sCmd.next();
|
||||||
|
String address = sCmd.next();
|
||||||
|
String widget_name = sCmd.next();
|
||||||
|
String page_name = sCmd.next();
|
||||||
|
String type = sCmd.next();
|
||||||
|
String page_number = sCmd.next();
|
||||||
|
bme280H_value_name = value_name;
|
||||||
|
choose_widget_and_create(widget_name, page_name, page_number, type, value_name);
|
||||||
|
bme.begin(hexStringToUint8(address));
|
||||||
|
sensors_reading_map[13] = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void bme280H_reading() {
|
||||||
|
float value = 0;
|
||||||
|
value = bme.readHumidity();
|
||||||
|
jsonWriteStr(configLiveJson, bme280H_value_name, String(value));
|
||||||
|
eventGen(bme280H_value_name, "");
|
||||||
|
sendSTATUS(bme280H_value_name, String(value));
|
||||||
|
Serial.println("[i] sensor '" + bme280H_value_name + "' data: " + String(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
//bme280A altit1 0x76 Высота#bmp280 Датчики any-data 1
|
||||||
|
void bme280A() {
|
||||||
|
String value_name = sCmd.next();
|
||||||
|
String address = sCmd.next();
|
||||||
|
String widget_name = sCmd.next();
|
||||||
|
String page_name = sCmd.next();
|
||||||
|
String type = sCmd.next();
|
||||||
|
String page_number = sCmd.next();
|
||||||
|
bme280A_value_name = value_name;
|
||||||
|
choose_widget_and_create(widget_name, page_name, page_number, type, value_name);
|
||||||
|
bme.begin(hexStringToUint8(address));
|
||||||
|
sensors_reading_map[14] = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void bme280A_reading() {
|
||||||
|
float value = 0;
|
||||||
|
value = bme.readAltitude(1013.25);
|
||||||
|
jsonWriteStr(configLiveJson, bme280A_value_name, String(value));
|
||||||
|
eventGen(bme280A_value_name, "");
|
||||||
|
sendSTATUS(bme280A_value_name, String(value));
|
||||||
|
Serial.println("[i] sensor '" + bme280A_value_name + "' data: " + String(value));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|||||||
53
Time.ino
53
Time.ino
@@ -1,23 +1,22 @@
|
|||||||
void Time_Init() {
|
void Time_Init() {
|
||||||
server.on("/timeZone", HTTP_GET, [](AsyncWebServerRequest * request) {
|
ts.add(TIME_SYNC, 30000, [&](void*) {
|
||||||
if (request->hasArg("timezone")) {
|
time_check();
|
||||||
jsonWrite(configSetup, "timezone", request->getParam("timezone")->value());
|
}, nullptr, true);
|
||||||
}
|
}
|
||||||
saveConfig();
|
|
||||||
reconfigTime();
|
void time_check() {
|
||||||
request->send(200, "text/text", "OK"); // отправляем ответ о выполнении
|
if (GetTimeUnix() == "failed") {
|
||||||
});
|
Serial.println("[i] Time is not synchronized, start synchronization");
|
||||||
reconfigTime();
|
reconfigTime();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void reconfigTime() {
|
void reconfigTime() {
|
||||||
if (WiFi.status() == WL_CONNECTED) {
|
if (WiFi.status() == WL_CONNECTED) {
|
||||||
|
String ntp = jsonReadStr(configSetupJson, "ntp");
|
||||||
configTime(jsonRead(configSetup, "timezone").toInt() * 3600, 0, ntpServer);
|
configTime(0, 0, ntp.c_str());
|
||||||
|
|
||||||
int i = 0;
|
int i = 0;
|
||||||
Serial.println("[i] Awaiting for time ");
|
Serial.println("[i] Awaiting for time ");
|
||||||
|
|
||||||
#ifdef ESP32
|
#ifdef ESP32
|
||||||
struct tm timeinfo;
|
struct tm timeinfo;
|
||||||
while (!getLocalTime(&timeinfo) && i <= 4) {
|
while (!getLocalTime(&timeinfo) && i <= 4) {
|
||||||
@@ -26,7 +25,6 @@ void reconfigTime() {
|
|||||||
delay(1000);
|
delay(1000);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef ESP8266
|
#ifdef ESP8266
|
||||||
//while (!time(nullptr) && i < 4) {
|
//while (!time(nullptr) && i < 4) {
|
||||||
// Serial.print(".");
|
// Serial.print(".");
|
||||||
@@ -34,20 +32,33 @@ void reconfigTime() {
|
|||||||
delay(2000);
|
delay(2000);
|
||||||
//}
|
//}
|
||||||
#endif
|
#endif
|
||||||
|
if (GetTimeUnix() != "failed") {
|
||||||
Serial.print("[i] Time = ");
|
Serial.print("[V] Time synchronized = ");
|
||||||
Serial.print(GetDataDigital());
|
Serial.print(GetDataDigital());
|
||||||
Serial.print(" ");
|
Serial.print(" ");
|
||||||
Serial.println(GetTime());
|
Serial.println(GetTime());
|
||||||
|
} else {
|
||||||
|
Serial.println("[E] Time server or internet connection error, will try again in 30 sec");
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
Serial.println("[E] Get time impossible, no wifi connection");
|
Serial.println("[E] Get time impossible, no wifi connection");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Получаем время в формате linux gmt
|
||||||
|
String GetTimeUnix() {
|
||||||
|
time_t now = time(nullptr);
|
||||||
|
if (now < 30000) {
|
||||||
|
return "failed";
|
||||||
|
} else {
|
||||||
|
return String(now);
|
||||||
|
}
|
||||||
|
}
|
||||||
// Получение текущего времени
|
// Получение текущего времени
|
||||||
String GetTime() {
|
String GetTime() {
|
||||||
time_t now = time(nullptr); // получаем время с помощью библиотеки time.h
|
time_t now = time(nullptr); // получаем время с помощью библиотеки time.h
|
||||||
|
int zone = 3600 * jsonReadStr(configSetupJson, "timezone").toInt();
|
||||||
|
now = now + zone;
|
||||||
String Time = ""; // Строка для результатов времени
|
String Time = ""; // Строка для результатов времени
|
||||||
Time += ctime(&now); // Преобразуем время в строку формата Thu Jan 19 00:55:35 2017
|
Time += ctime(&now); // Преобразуем время в строку формата Thu Jan 19 00:55:35 2017
|
||||||
int i = Time.indexOf(":"); //Ишем позицию первого символа :
|
int i = Time.indexOf(":"); //Ишем позицию первого символа :
|
||||||
@@ -57,6 +68,8 @@ String GetTime() {
|
|||||||
|
|
||||||
String GetTimeWOsec() {
|
String GetTimeWOsec() {
|
||||||
time_t now = time(nullptr); // получаем время с помощью библиотеки time.h
|
time_t now = time(nullptr); // получаем время с помощью библиотеки time.h
|
||||||
|
int zone = 3600 * jsonReadStr(configSetupJson, "timezone").toInt();
|
||||||
|
now = now + zone;
|
||||||
String Time = ""; // Строка для результатов времени
|
String Time = ""; // Строка для результатов времени
|
||||||
Time += ctime(&now); // Преобразуем время в строку формата Thu Jan 19 00:55:35 2017
|
Time += ctime(&now); // Преобразуем время в строку формата Thu Jan 19 00:55:35 2017
|
||||||
int i = Time.indexOf(":"); //Ишем позицию первого символа :
|
int i = Time.indexOf(":"); //Ишем позицию первого символа :
|
||||||
@@ -67,6 +80,8 @@ String GetTimeWOsec() {
|
|||||||
// Получение даты
|
// Получение даты
|
||||||
String GetDate() {
|
String GetDate() {
|
||||||
time_t now = time(nullptr); // получаем время с помощью библиотеки time.h
|
time_t now = time(nullptr); // получаем время с помощью библиотеки time.h
|
||||||
|
int zone = 3600 * jsonReadStr(configSetupJson, "timezone").toInt();
|
||||||
|
now = now + zone;
|
||||||
String Data = ""; // Строка для результатов времени
|
String Data = ""; // Строка для результатов времени
|
||||||
Data += ctime(&now); // Преобразуем время в строку формата Thu Jan 19 00:55:35 2017
|
Data += ctime(&now); // Преобразуем время в строку формата Thu Jan 19 00:55:35 2017
|
||||||
Data.replace("\n", "");
|
Data.replace("\n", "");
|
||||||
@@ -106,3 +121,11 @@ String GetDataDigital() {
|
|||||||
|
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int timeToMin(String Time) {
|
||||||
|
//"00:00:00" время в секунды
|
||||||
|
long min = selectToMarker(Time, ":").toInt() * 60; //общее количество секунд в полных часах
|
||||||
|
Time = deleteBeforeDelimiter (Time, ":"); // Теперь здесь минуты секунды
|
||||||
|
min += selectToMarker(Time, ":").toInt(); // Добавим секунды из полных минут
|
||||||
|
return min;
|
||||||
|
}
|
||||||
|
|||||||
131
Timers.ino
131
Timers.ino
@@ -1,115 +1,85 @@
|
|||||||
//================================================================================================================
|
//================================================================================================================
|
||||||
//=========================================Таймера=================================================================
|
//=========================================Таймеры=================================================================
|
||||||
void Timer_countdown_init() {
|
void Timer_countdown_init() {
|
||||||
|
|
||||||
ts.add(TIMER_COUNTDOWN, 1000, [&](void*) {
|
ts.add(TIMER_COUNTDOWN, 1000, [&](void*) {
|
||||||
|
|
||||||
String old_line = jsonRead(optionJson, "timers");
|
String old_line = jsonReadStr(configOptionJson, "timers");
|
||||||
|
|
||||||
|
|
||||||
if (old_line != "") {
|
if (old_line != "") {
|
||||||
|
//Serial.println(old_line);
|
||||||
Serial.println(old_line);
|
|
||||||
|
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
|
|
||||||
String timer = selectFromMarkerToMarker(old_line, "," , i);
|
String timer = selectFromMarkerToMarker(old_line, "," , i);
|
||||||
// Serial.print("timer no " + String (i) + ": ");
|
Serial.print("timer no " + String (i) + ": ");
|
||||||
// Serial.println(timer);
|
Serial.println(timer);
|
||||||
if (timer == "not found" || timer == "") return;
|
if (timer == "not found" || timer == "") return;
|
||||||
int number = selectToMarker (timer, ":").toInt();
|
int number = selectToMarker (timer, ":").toInt();
|
||||||
int time = readTimer(number);
|
int time = readTimer(number);
|
||||||
if (time == 0) {
|
if (time == 0) {
|
||||||
|
|
||||||
delTimer (String (number));
|
delTimer (String (number));
|
||||||
|
jsonWriteStr(configLiveJson, "timer" + String(number), "0");
|
||||||
jsonWrite(configJson, "timerSet" + String(number), "0");
|
eventGen ("timer", String(number));
|
||||||
|
|
||||||
eventGen ("timerSet", String(number));
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
time--;
|
time--;
|
||||||
addTimer(String (number), String (time));
|
addTimer(String (number), String (time));
|
||||||
}
|
}
|
||||||
i++;
|
i++;
|
||||||
} while (i <= 9);
|
} while (i <= 9);
|
||||||
|
|
||||||
}
|
}
|
||||||
}, nullptr, true);
|
}, nullptr, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void timerStart() {
|
void timerStart() {
|
||||||
|
|
||||||
String number = sCmd.next();
|
String number = sCmd.next();
|
||||||
String period_of_time = sCmd.next();
|
String period_of_time = sCmd.next();
|
||||||
String type = sCmd.next();
|
String type = sCmd.next();
|
||||||
|
|
||||||
if (period_of_time.indexOf("digit") != -1) {
|
if (period_of_time.indexOf("digit") != -1) {
|
||||||
period_of_time = add_set(period_of_time);
|
//period_of_time = add_set(period_of_time);
|
||||||
period_of_time = jsonRead(configJson, period_of_time);
|
period_of_time = jsonReadStr(configLiveJson, period_of_time);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (type == "sec") period_of_time = period_of_time;
|
if (type == "sec") period_of_time = period_of_time;
|
||||||
if (type == "min") period_of_time = String(period_of_time.toInt() * 60);
|
if (type == "min") period_of_time = String(period_of_time.toInt() * 60);
|
||||||
if (type == "hours") period_of_time = String(period_of_time.toInt() * 60 * 60);
|
if (type == "hours") period_of_time = String(period_of_time.toInt() * 60 * 60);
|
||||||
|
|
||||||
addTimer(number, period_of_time);
|
addTimer(number, period_of_time);
|
||||||
jsonWrite(configJson, "timerSet" + number, "1");
|
jsonWriteStr(configLiveJson, "timer" + number, "1");
|
||||||
}
|
}
|
||||||
void addTimer(String number, String time) {
|
void addTimer(String number, String time) {
|
||||||
|
String tmp = jsonReadStr(configOptionJson, "timers"); //1:60,2:120,
|
||||||
String tmp = jsonRead(optionJson, "timers"); //1:60,2:120,
|
|
||||||
String new_timer = number + ":" + time;
|
String new_timer = number + ":" + time;
|
||||||
int psn1 = tmp.indexOf(number + ":"); //0 ищем позицию таймера который надо заменить
|
int psn1 = tmp.indexOf(number + ":"); //0 ищем позицию таймера который надо заменить
|
||||||
|
|
||||||
if (psn1 != -1) { //если он есть
|
if (psn1 != -1) { //если он есть
|
||||||
|
|
||||||
int psn2 = tmp.indexOf(",", psn1); //4 от этой позиции находим позицию запятой
|
int psn2 = tmp.indexOf(",", psn1); //4 от этой позиции находим позицию запятой
|
||||||
|
|
||||||
String timer = tmp.substring(psn1, psn2); //1:60 выделяем таймер который надо заменить
|
String timer = tmp.substring(psn1, psn2); //1:60 выделяем таймер который надо заменить
|
||||||
///tmp.replace(timer, new_timer); //заменяем таймер на новый (во всей стороке)
|
///tmp.replace(timer, new_timer); //заменяем таймер на новый (во всей стороке)
|
||||||
tmp.replace(timer + ",", "");
|
tmp.replace(timer + ",", "");
|
||||||
tmp += new_timer + ",";
|
tmp += new_timer + ",";
|
||||||
|
|
||||||
} else { //если его нет
|
} else { //если его нет
|
||||||
tmp += new_timer + ",";
|
tmp += new_timer + ",";
|
||||||
}
|
}
|
||||||
jsonWrite(optionJson, "timers", tmp);
|
jsonWriteStr(configOptionJson, "timers", tmp);
|
||||||
//Serial.println("ura");
|
//Serial.println("ura");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void timerStop() {
|
void timerStop() {
|
||||||
|
|
||||||
String number = sCmd.next();
|
String number = sCmd.next();
|
||||||
delTimer(number);
|
delTimer(number);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void delTimer (String number) {
|
void delTimer (String number) {
|
||||||
|
String tmp = jsonReadStr(configOptionJson, "timers"); //1:60,2:120,
|
||||||
String tmp = jsonRead(optionJson, "timers"); //1:60,2:120,
|
|
||||||
int psn1 = tmp.indexOf(number + ":"); //0 ищем позицию таймера который надо удалить
|
int psn1 = tmp.indexOf(number + ":"); //0 ищем позицию таймера который надо удалить
|
||||||
|
|
||||||
if (psn1 != -1) { //если он есть
|
if (psn1 != -1) { //если он есть
|
||||||
int psn2 = tmp.indexOf(",", psn1); //4 от этой позиции находим позицию запятой
|
int psn2 = tmp.indexOf(",", psn1); //4 от этой позиции находим позицию запятой
|
||||||
String timer = tmp.substring(psn1, psn2) + ","; //1:60, выделяем таймер который надо удалить
|
String timer = tmp.substring(psn1, psn2) + ","; //1:60, выделяем таймер который надо удалить
|
||||||
tmp.replace(timer, ""); //удаляем таймер
|
tmp.replace(timer, ""); //удаляем таймер
|
||||||
jsonWrite(optionJson, "timers", tmp);
|
jsonWriteStr(configOptionJson, "timers", tmp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int readTimer(int number) {
|
int readTimer(int number) {
|
||||||
|
String tmp = jsonReadStr(configOptionJson, "timers"); //1:60,2:120,
|
||||||
String tmp = jsonRead(optionJson, "timers"); //1:60,2:120,
|
|
||||||
|
|
||||||
int psn1 = tmp.indexOf(String(number) + ":"); //0 ищем позицию таймера который надо прочитать
|
int psn1 = tmp.indexOf(String(number) + ":"); //0 ищем позицию таймера который надо прочитать
|
||||||
|
|
||||||
String timer;
|
String timer;
|
||||||
|
|
||||||
if (psn1 != -1) { //если он есть
|
if (psn1 != -1) { //если он есть
|
||||||
int psn2 = tmp.indexOf(",", psn1); //4 от этой позиции находим позицию запятой
|
int psn2 = tmp.indexOf(",", psn1); //4 от этой позиции находим позицию запятой
|
||||||
timer = tmp.substring(psn1, psn2); //1:60 выделяем таймер который надо прочитать
|
timer = tmp.substring(psn1, psn2); //1:60 выделяем таймер который надо прочитать
|
||||||
@@ -117,72 +87,3 @@ int readTimer(int number) {
|
|||||||
}
|
}
|
||||||
return timer.toInt();
|
return timer.toInt();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*void timer() {
|
|
||||||
|
|
||||||
String seted_time = sCmd.next();
|
|
||||||
String order = sCmd.next();
|
|
||||||
order.replace("_", " ");
|
|
||||||
if (seted_time == current_time) {
|
|
||||||
|
|
||||||
order_loop += order + ",";
|
|
||||||
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
|
|
||||||
//------------------------------таймеры------------------------------------------------------
|
|
||||||
|
|
||||||
/*
|
|
||||||
void time() {
|
|
||||||
|
|
||||||
String time_number = sCmd.next();
|
|
||||||
String time = sCmd.next();
|
|
||||||
|
|
||||||
String time_to_add = time_number + "-" + time;
|
|
||||||
|
|
||||||
String replace_line = jsonRead(optionJson, "times") ;
|
|
||||||
int psn1 = replace_line.indexOf(time_number + "-") ; //ищем позицию времени которое надо заменить
|
|
||||||
|
|
||||||
if (psn1 != -1) { //если оно есть
|
|
||||||
|
|
||||||
int psn2 = replace_line.indexOf(",", psn1); //от этой позиции находим позицию запятой
|
|
||||||
|
|
||||||
String timer = replace_line.substring(psn1, psn2); //выделяем таймер который надо заменить
|
|
||||||
///tmp.replace(timer, new_timer); //заменяем таймер на новый (во всей стороке)
|
|
||||||
replace_line.replace(timer + ",", "");
|
|
||||||
replace_line += time_to_add + ",";
|
|
||||||
|
|
||||||
} else { //если его нет
|
|
||||||
replace_line += time_to_add + ",";
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
jsonWrite(optionJson, "times", replace_line);
|
|
||||||
|
|
||||||
jsonWrite(configJson, "timeSet" + time_number, "1");
|
|
||||||
|
|
||||||
ts.add(TIMERS, 1000, [&](void*) {
|
|
||||||
|
|
||||||
current_time = GetTime();
|
|
||||||
Serial.println(current_time);
|
|
||||||
|
|
||||||
String seted_times = jsonRead(optionJson, "times");
|
|
||||||
|
|
||||||
while (seted_times.length() != 0) {
|
|
||||||
String tmp = selectToMarker (seted_times, ",");
|
|
||||||
|
|
||||||
String time_number = selectToMarker(tmp, "-");
|
|
||||||
String seted_time = deleteBeforeDelimiter(tmp, "-");
|
|
||||||
|
|
||||||
Serial.println(seted_time);
|
|
||||||
|
|
||||||
if (current_time == seted_time) {
|
|
||||||
jsonWrite(configJson, "timeSet" + time_number, "0");
|
|
||||||
eventGen ("timeSet", time_number);
|
|
||||||
}
|
|
||||||
|
|
||||||
seted_times = deleteBeforeDelimiter(seted_times, ",");
|
|
||||||
}
|
|
||||||
}, nullptr, true);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|||||||
82
Upgrade.ino
82
Upgrade.ino
@@ -1,48 +1,25 @@
|
|||||||
void initUpgrade() {
|
void initUpgrade() {
|
||||||
server.on("/upgrade", HTTP_GET, [](AsyncWebServerRequest * request) {
|
#ifdef ESP8266
|
||||||
|
if (WiFi.status() == WL_CONNECTED) last_version = getURL("http://91.204.228.124:1100/update/esp8266/version.txt");
|
||||||
start_check_version = true;
|
#endif
|
||||||
|
#ifdef ESP32
|
||||||
|
if (WiFi.status() == WL_CONNECTED) last_version = getURL("http://91.204.228.124:1100/update/esp32/version.txt");
|
||||||
|
#endif
|
||||||
|
jsonWriteStr(configSetupJson, "last_version", last_version);
|
||||||
Serial.print("[i] Last firmware version: ");
|
Serial.print("[i] Last firmware version: ");
|
||||||
Serial.println(last_version);
|
Serial.println(last_version);
|
||||||
|
|
||||||
String tmp = "{}";
|
|
||||||
if (!flash_1mb) {
|
|
||||||
if (last_version != "") {
|
|
||||||
if (last_version != "error") {
|
|
||||||
if (last_version == firmware_version) {
|
|
||||||
jsonWrite(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>Последняя версия прошивки уже установлена.");
|
|
||||||
jsonWrite(tmp, "class", "pop-up");
|
|
||||||
} else {
|
|
||||||
upgrade_flag = true;
|
|
||||||
jsonWrite(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>Идет обновление прошивки... После завершения устройство перезагрузится. Подождите одну минуту!!!");
|
|
||||||
jsonWrite(tmp, "class", "pop-up");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
jsonWrite(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>Ошибка... Cервер не найден. Попробуйте позже...");
|
|
||||||
jsonWrite(tmp, "class", "pop-up");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
jsonWrite(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>Нажмите на кнопку \"обновить прошивку\" повторно...");
|
|
||||||
jsonWrite(tmp, "class", "pop-up");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
jsonWrite(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>Обновление по воздуху не поддерживается, модуль имеет меньше 4 мб памяти...");
|
|
||||||
jsonWrite(tmp, "class", "pop-up");
|
|
||||||
}
|
|
||||||
request->send(200, "text/text", tmp);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void handle_get_url() {
|
void do_upgrade_url() {
|
||||||
if (start_check_version) {
|
if (upgrade_url) {
|
||||||
start_check_version = false;
|
upgrade_url = false;
|
||||||
#ifdef ESP32
|
#ifdef ESP32
|
||||||
last_version = getURL("http://91.204.228.124:1100/update/esp32/version.txt");
|
last_version = getURL("http://91.204.228.124:1100/update/esp32/version.txt");
|
||||||
#endif
|
#endif
|
||||||
#ifdef ESP8266
|
#ifdef ESP8266
|
||||||
last_version = getURL("http://91.204.228.124:1100/update/esp8266/version.txt");
|
last_version = getURL("http://91.204.228.124:1100/update/esp8266/version.txt");
|
||||||
#endif
|
#endif
|
||||||
|
jsonWriteStr(configSetupJson, "last_version", last_version);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -51,9 +28,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("firmware.scenario.txt", 3072);
|
scenario_for_update = readFile("firmware.s.txt", 4000);
|
||||||
config_for_update = readFile("firmware.config.txt", 3072);
|
config_for_update = readFile("firmware.c.txt", 4000);
|
||||||
configSetup_for_update = configSetup;
|
configSetup_for_update = configSetupJson;
|
||||||
|
|
||||||
Serial.println("Start upgrade SPIFFS, please wait...");
|
Serial.println("Start upgrade SPIFFS, please wait...");
|
||||||
|
|
||||||
@@ -70,8 +47,8 @@ void upgrade_firmware() {
|
|||||||
|
|
||||||
if (ret == HTTP_UPDATE_OK) {
|
if (ret == HTTP_UPDATE_OK) {
|
||||||
|
|
||||||
writeFile("firmware.scenario.txt", scenario_for_update);
|
writeFile("firmware.s.txt", scenario_for_update);
|
||||||
writeFile("firmware.config.txt", config_for_update);
|
writeFile("firmware.c.txt", config_for_update);
|
||||||
writeFile("config.json", configSetup_for_update);
|
writeFile("config.json", configSetup_for_update);
|
||||||
saveConfig();
|
saveConfig();
|
||||||
|
|
||||||
@@ -88,16 +65,21 @@ void upgrade_firmware() {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (ret == HTTP_UPDATE_OK) {
|
if (ret == HTTP_UPDATE_OK) {
|
||||||
|
|
||||||
Serial.println("BUILD upgrade done!");
|
Serial.println("BUILD upgrade done!");
|
||||||
Serial.println("Restart ESP....");
|
Serial.println("Restart ESP....");
|
||||||
ESP.restart();
|
ESP.restart();
|
||||||
|
} else {
|
||||||
|
Serial.println("!!!!BUILD upgrade ERROR");
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
Serial.println("!!!!SPIFFS upgrade ERROR");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void handle_upgrade() {
|
void do_upgrade() {
|
||||||
if (upgrade_flag) {
|
if (upgrade) {
|
||||||
upgrade_flag = false;
|
upgrade = false;
|
||||||
upgrade_firmware();
|
upgrade_firmware();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -189,12 +171,12 @@ void handle_upgrade() {
|
|||||||
String config_for_update;
|
String config_for_update;
|
||||||
String configSetup_for_update;
|
String configSetup_for_update;
|
||||||
Serial.println(spiffsData);
|
Serial.println(spiffsData);
|
||||||
scenario_for_update = readFile("firmware.scenario.txt", 2048);
|
scenario_for_update = readFile("firmware.s.txt", 2048);
|
||||||
config_for_update = readFile("config.all.txt", 2048);
|
config_for_update = readFile("config.all.txt", 2048);
|
||||||
configSetup_for_update = configSetup;
|
configSetup_for_update = configSetup;
|
||||||
ESPhttpUpdate.rebootOnUpdate(false); // Отключим перезагрузку после обновления
|
ESPhttpUpdate.rebootOnUpdate(false); // Отключим перезагрузку после обновления
|
||||||
updateHTTP(spiffsData, true);
|
updateHTTP(spiffsData, true);
|
||||||
writeFile("firmware.scenario.txt", scenario_for_update);
|
writeFile("firmware.s.txt", scenario_for_update);
|
||||||
writeFile("config.all.txt", config_for_update);
|
writeFile("config.all.txt", config_for_update);
|
||||||
writeFile("config.json", configSetup_for_update);
|
writeFile("config.json", configSetup_for_update);
|
||||||
saveConfig();
|
saveConfig();
|
||||||
@@ -227,24 +209,24 @@ void handle_upgrade() {
|
|||||||
case HTTP_UPDATE_FAILED:
|
case HTTP_UPDATE_FAILED:
|
||||||
Serial.println(mode + "_FAILED");
|
Serial.println(mode + "_FAILED");
|
||||||
var = "{}";
|
var = "{}";
|
||||||
jsonWrite(var, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>_FAILED");
|
jsonWriteStr(var, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>_FAILED");
|
||||||
jsonWrite(var, "class", "pop-up");
|
jsonWriteStr(var, "class", "pop-up");
|
||||||
//request->send(200, "text/text", var);
|
//request->send(200, "text/text", var);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HTTP_UPDATE_NO_UPDATES:
|
case HTTP_UPDATE_NO_UPDATES:
|
||||||
Serial.println(mode + "_NO_UPDATES");
|
Serial.println(mode + "_NO_UPDATES");
|
||||||
var = "{}";
|
var = "{}";
|
||||||
jsonWrite(var, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>_NO_UPDATES");
|
jsonWriteStr(var, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>_NO_UPDATES");
|
||||||
jsonWrite(var, "class", "pop-up");
|
jsonWriteStr(var, "class", "pop-up");
|
||||||
//request->send(200, "text/text", var);
|
//request->send(200, "text/text", var);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HTTP_UPDATE_OK:
|
case HTTP_UPDATE_OK:
|
||||||
Serial.println(mode + "_UPDATE_OK");
|
Serial.println(mode + "_UPDATE_OK");
|
||||||
var = "{}";
|
var = "{}";
|
||||||
jsonWrite(var, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>_UPDATE_OK");
|
jsonWriteStr(var, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>_UPDATE_OK");
|
||||||
jsonWrite(var, "class", "pop-up");
|
jsonWriteStr(var, "class", "pop-up");
|
||||||
//request->send(200, "text/text", var);
|
//request->send(200, "text/text", var);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
352
Web.ino
Normal file
352
Web.ino
Normal file
@@ -0,0 +1,352 @@
|
|||||||
|
void web_init() {
|
||||||
|
server.on("/set", HTTP_GET, [](AsyncWebServerRequest * request) {
|
||||||
|
String value;
|
||||||
|
//============================device settings=====================================
|
||||||
|
if (request->hasArg("preset")) {
|
||||||
|
//--------------------------------------------------------------------------------
|
||||||
|
String value;
|
||||||
|
value = request->getParam("preset")->value();
|
||||||
|
if (value == "1") {
|
||||||
|
writeFile("firmware.c.txt", readFile("configs/1-relay.c.txt", 2048));
|
||||||
|
writeFile("firmware.s.txt", readFile("configs/1-relay.s.txt", 2048));
|
||||||
|
}
|
||||||
|
if (value == "2") {
|
||||||
|
writeFile("firmware.c.txt", readFile("configs/2-relay.c.txt", 2048));
|
||||||
|
writeFile("firmware.s.txt", readFile("configs/2-relay.s.txt", 2048));
|
||||||
|
}
|
||||||
|
if (value == "3") {
|
||||||
|
writeFile("firmware.c.txt", readFile("configs/3-relay.c.txt", 2048));
|
||||||
|
writeFile("firmware.s.txt", readFile("configs/3-relay.s.txt", 2048));
|
||||||
|
}
|
||||||
|
if (value == "4") {
|
||||||
|
writeFile("firmware.c.txt", readFile("configs/4-relay.c.txt", 2048));
|
||||||
|
writeFile("firmware.s.txt", readFile("configs/4-relay.s.txt", 2048));
|
||||||
|
}
|
||||||
|
if (value == "5") {
|
||||||
|
writeFile("firmware.c.txt", readFile("configs/5-relay.c.txt", 2048));
|
||||||
|
writeFile("firmware.s.txt", readFile("configs/5-relay.s.txt", 2048));
|
||||||
|
}
|
||||||
|
if (value == "6") {
|
||||||
|
writeFile("firmware.c.txt", readFile("configs/6-relay.c.txt", 2048));
|
||||||
|
writeFile("firmware.s.txt", readFile("configs/6-relay.s.txt", 2048));
|
||||||
|
}
|
||||||
|
if (value == "7") {
|
||||||
|
writeFile("firmware.c.txt", readFile("configs/7-relay.c.txt", 2048));
|
||||||
|
writeFile("firmware.s.txt", readFile("configs/7-relay.s.txt", 2048));
|
||||||
|
}
|
||||||
|
if (value == "8") {
|
||||||
|
writeFile("firmware.c.txt", readFile("configs/8-pwm.c.txt", 2048));
|
||||||
|
writeFile("firmware.s.txt", readFile("configs/8-pwm.s.txt", 2048));
|
||||||
|
}
|
||||||
|
if (value == "9") {
|
||||||
|
writeFile("firmware.c.txt", readFile("configs/9-dht11.c.txt", 2048));
|
||||||
|
writeFile("firmware.s.txt", readFile("configs/9-dht11.s.txt", 2048));
|
||||||
|
}
|
||||||
|
if (value == "10") {
|
||||||
|
writeFile("firmware.c.txt", readFile("configs/10-dht22.c.txt", 2048));
|
||||||
|
writeFile("firmware.s.txt", readFile("configs/10-dht22.s.txt", 2048));
|
||||||
|
}
|
||||||
|
if (value == "11") {
|
||||||
|
writeFile("firmware.c.txt", readFile("configs/11-analog.c.txt", 2048));
|
||||||
|
writeFile("firmware.s.txt", readFile("configs/11-analog.s.txt", 2048));
|
||||||
|
}
|
||||||
|
if (value == "12") {
|
||||||
|
writeFile("firmware.c.txt", readFile("configs/12-bmp280.c.txt", 2048));
|
||||||
|
writeFile("firmware.s.txt", readFile("configs/12-bmp280.s.txt", 2048));
|
||||||
|
}
|
||||||
|
if (value == "13") {
|
||||||
|
writeFile("firmware.c.txt", readFile("configs/13-bme280.c.txt", 2048));
|
||||||
|
writeFile("firmware.s.txt", readFile("configs/13-bme280.s.txt", 2048));
|
||||||
|
}
|
||||||
|
if (value == "14") {
|
||||||
|
writeFile("firmware.c.txt", readFile("configs/14-dallas.c.txt", 2048));
|
||||||
|
writeFile("firmware.s.txt", readFile("configs/14-dallas.s.txt", 2048));
|
||||||
|
}
|
||||||
|
if (value == "15") {
|
||||||
|
writeFile("firmware.c.txt", readFile("configs/15-termostat.c.txt", 2048));
|
||||||
|
writeFile("firmware.s.txt", readFile("configs/15-termostat.s.txt", 2048));
|
||||||
|
}
|
||||||
|
if (value == "16") {
|
||||||
|
writeFile("firmware.c.txt", readFile("configs/16-level.c.txt", 2048));
|
||||||
|
writeFile("firmware.s.txt", readFile("configs/16-level.s.txt", 2048));
|
||||||
|
}
|
||||||
|
if (value == "17") {
|
||||||
|
writeFile("firmware.c.txt", readFile("configs/17-moution.c.txt", 2048));
|
||||||
|
writeFile("firmware.s.txt", readFile("configs/17-moution.s.txt", 2048));
|
||||||
|
}
|
||||||
|
if (value == "18") {
|
||||||
|
writeFile("firmware.c.txt", readFile("configs/18-moution.c.txt", 2048));
|
||||||
|
writeFile("firmware.s.txt", readFile("configs/18-moution.s.txt", 2048));
|
||||||
|
}
|
||||||
|
if (value == "19") {
|
||||||
|
writeFile("firmware.c.txt", readFile("configs/19-stepper.c.txt", 2048));
|
||||||
|
writeFile("firmware.s.txt", readFile("configs/19-stepper.s.txt", 2048));
|
||||||
|
}
|
||||||
|
if (value == "20") {
|
||||||
|
writeFile("firmware.c.txt", readFile("configs/20-servo.c.txt", 2048));
|
||||||
|
writeFile("firmware.s.txt", readFile("configs/20-servo.s.txt", 2048));
|
||||||
|
}
|
||||||
|
if (value == "21") {
|
||||||
|
writeFile("firmware.c.txt", readFile("configs/firmware.c.txt", 2048));
|
||||||
|
writeFile("firmware.s.txt", readFile("configs/firmware.s.txt", 2048));
|
||||||
|
}
|
||||||
|
Device_init();
|
||||||
|
Scenario_init();
|
||||||
|
request->redirect("/?set.device");
|
||||||
|
}
|
||||||
|
//--------------------------------------------------------------------------------
|
||||||
|
if (request->hasArg("devinit")) {
|
||||||
|
Device_init();
|
||||||
|
request->send(200, "text/text", "OK");
|
||||||
|
}
|
||||||
|
//--------------------------------------------------------------------------------
|
||||||
|
if (request->hasArg("scen")) {
|
||||||
|
value = request->getParam("scen")->value();
|
||||||
|
if (value == "0") {
|
||||||
|
jsonWriteStr(configSetupJson, "scen", value);
|
||||||
|
saveConfig();
|
||||||
|
Scenario_init();
|
||||||
|
}
|
||||||
|
if (value == "1") {
|
||||||
|
jsonWriteStr(configSetupJson, "scen", value);
|
||||||
|
saveConfig();
|
||||||
|
Scenario_init();
|
||||||
|
}
|
||||||
|
request->send(200, "text/text", "OK");
|
||||||
|
}
|
||||||
|
//--------------------------------------------------------------------------------
|
||||||
|
if (request->hasArg("sceninit")) {
|
||||||
|
Scenario_init();
|
||||||
|
request->send(200, "text/text", "OK");
|
||||||
|
}
|
||||||
|
//--------------------------------------------------------------------------------
|
||||||
|
#ifdef logging_enable
|
||||||
|
if (request->hasArg("cleanlog")) {
|
||||||
|
clean_log_date();
|
||||||
|
request->send(200, "text/text", "OK");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
//==============================udp settings=============================================
|
||||||
|
if (request->hasArg("udponoff")) {
|
||||||
|
value = request->getParam("udponoff")->value();
|
||||||
|
if (value == "0") {
|
||||||
|
jsonWriteStr(configSetupJson, "udponoff", value);
|
||||||
|
saveConfig();
|
||||||
|
Scenario_init();
|
||||||
|
}
|
||||||
|
if (value == "1") {
|
||||||
|
jsonWriteStr(configSetupJson, "udponoff", value);
|
||||||
|
saveConfig();
|
||||||
|
Scenario_init();
|
||||||
|
}
|
||||||
|
request->send(200, "text/text", "OK");
|
||||||
|
}
|
||||||
|
//--------------------------------------------------------------------------------
|
||||||
|
if (request->hasArg("updatelist")) {
|
||||||
|
SPIFFS.remove("/dev.csv");
|
||||||
|
addFile("dev.csv", "device id;device name;ip address");
|
||||||
|
request->redirect("/?set.udp");
|
||||||
|
}
|
||||||
|
//--------------------------------------------------------------------------------
|
||||||
|
if (request->hasArg("updatepage")) {
|
||||||
|
request->redirect("/?set.udp");
|
||||||
|
}
|
||||||
|
//--------------------------------------------------------------------------------
|
||||||
|
if (request->hasArg("devname")) {
|
||||||
|
jsonWriteStr(configSetupJson, "name", request->getParam("devname")->value());
|
||||||
|
saveConfig();
|
||||||
|
request->send(200, "text/text", "OK");
|
||||||
|
}
|
||||||
|
//==============================wifi settings=============================================
|
||||||
|
if (request->hasArg("routerssid")) {
|
||||||
|
jsonWriteStr(configSetupJson, "routerssid", request->getParam("routerssid")->value());
|
||||||
|
saveConfig();
|
||||||
|
request->send(200, "text/text", "OK");
|
||||||
|
}
|
||||||
|
if (request->hasArg("routerpass")) {
|
||||||
|
jsonWriteStr(configSetupJson, "routerpass", request->getParam("routerpass")->value());
|
||||||
|
saveConfig();
|
||||||
|
request->send(200, "text/text", "OK");
|
||||||
|
}
|
||||||
|
//--------------------------------------------------------------------------------
|
||||||
|
if (request->hasArg("apssid")) {
|
||||||
|
jsonWriteStr(configSetupJson, "apssid", request->getParam("apssid")->value());
|
||||||
|
saveConfig();
|
||||||
|
request->send(200, "text/text", "OK");
|
||||||
|
}
|
||||||
|
if (request->hasArg("appass")) {
|
||||||
|
jsonWriteStr(configSetupJson, "appass", request->getParam("appass")->value());
|
||||||
|
saveConfig();
|
||||||
|
request->send(200, "text/text", "OK");
|
||||||
|
}
|
||||||
|
//--------------------------------------------------------------------------------
|
||||||
|
if (request->hasArg("weblogin")) {
|
||||||
|
jsonWriteStr(configSetupJson, "weblogin", request->getParam("weblogin")->value());
|
||||||
|
saveConfig();
|
||||||
|
request->send(200, "text/text", "OK");
|
||||||
|
}
|
||||||
|
if (request->hasArg("webpass")) {
|
||||||
|
jsonWriteStr(configSetupJson, "webpass", request->getParam("webpass")->value());
|
||||||
|
saveConfig();
|
||||||
|
request->send(200, "text/text", "OK");
|
||||||
|
}
|
||||||
|
//--------------------------------------------------------------------------------
|
||||||
|
if (request->hasArg("timezone")) {
|
||||||
|
jsonWriteStr(configSetupJson, "timezone", request->getParam("timezone")->value());
|
||||||
|
saveConfig();
|
||||||
|
reconfigTime();
|
||||||
|
request->send(200, "text/text", "OK");
|
||||||
|
}
|
||||||
|
if (request->hasArg("ntp")) {
|
||||||
|
jsonWriteStr(configSetupJson, "ntp", request->getParam("ntp")->value());
|
||||||
|
saveConfig();
|
||||||
|
reconfigTime();
|
||||||
|
request->send(200, "text/text", "OK");
|
||||||
|
}
|
||||||
|
//--------------------------------------------------------------------------------
|
||||||
|
if (request->hasArg("device")) {
|
||||||
|
if (request->getParam("device")->value() == "ok") ESP.restart();
|
||||||
|
request->send(200, "text/text", "OK");
|
||||||
|
}
|
||||||
|
//--------------------------------------------------------------------------------
|
||||||
|
if (request->hasArg("blink")) {
|
||||||
|
value = request->getParam("blink")->value();
|
||||||
|
if (value == "0") {
|
||||||
|
jsonWriteStr(configSetupJson, "blink", value);
|
||||||
|
saveConfig();
|
||||||
|
}
|
||||||
|
if (value == "1") {
|
||||||
|
jsonWriteStr(configSetupJson, "blink", value);
|
||||||
|
saveConfig();
|
||||||
|
}
|
||||||
|
request->send(200, "text/text", "OK");
|
||||||
|
}
|
||||||
|
//==============================mqtt settings=============================================
|
||||||
|
if (request->hasArg("mqttServer")) {
|
||||||
|
jsonWriteStr(configSetupJson, "mqttServer", request->getParam("mqttServer")->value());
|
||||||
|
saveConfig();
|
||||||
|
mqtt_connection = true;
|
||||||
|
request->send(200, "text/text", "ok");
|
||||||
|
}
|
||||||
|
if (request->hasArg("mqttPort")) {
|
||||||
|
int port = (request->getParam("mqttPort")->value()).toInt();
|
||||||
|
jsonWriteInt(configSetupJson, "mqttPort", port);
|
||||||
|
saveConfig();
|
||||||
|
mqtt_connection = true;
|
||||||
|
request->send(200, "text/text", "ok");
|
||||||
|
}
|
||||||
|
if (request->hasArg("mqttPrefix")) {
|
||||||
|
jsonWriteStr(configSetupJson, "mqttPrefix", request->getParam("mqttPrefix")->value());
|
||||||
|
saveConfig();
|
||||||
|
mqtt_connection = true;
|
||||||
|
request->send(200, "text/text", "ok");
|
||||||
|
}
|
||||||
|
if (request->hasArg("mqttUser")) {
|
||||||
|
jsonWriteStr(configSetupJson, "mqttUser", request->getParam("mqttUser")->value());
|
||||||
|
saveConfig();
|
||||||
|
mqtt_connection = true;
|
||||||
|
request->send(200, "text/text", "ok");
|
||||||
|
}
|
||||||
|
if (request->hasArg("mqttPass")) {
|
||||||
|
jsonWriteStr(configSetupJson, "mqttPass", request->getParam("mqttPass")->value());
|
||||||
|
saveConfig();
|
||||||
|
mqtt_connection = true;
|
||||||
|
request->send(200, "text/text", "ok");
|
||||||
|
}
|
||||||
|
//--------------------------------------------------------------------------------
|
||||||
|
if (request->hasArg("mqttsend")) {
|
||||||
|
mqtt_send_settings_to_udp = true;
|
||||||
|
request->send(200, "text/text", "ok");
|
||||||
|
}
|
||||||
|
//--------------------------------------------------------------------------------
|
||||||
|
if (request->hasArg("mqttcheck")) {
|
||||||
|
String tmp = "{}";
|
||||||
|
jsonWriteStr(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>" + stateMQTT());
|
||||||
|
jsonWriteStr(tmp, "class", "pop-up");
|
||||||
|
request->send(200, "text/text", tmp);
|
||||||
|
}
|
||||||
|
//==============================push settings=============================================
|
||||||
|
#ifdef push_enable
|
||||||
|
if (request->hasArg("pushingboxid")) {
|
||||||
|
jsonWriteStr(configSetupJson, "pushingboxid", request->getParam("pushingboxid")->value());
|
||||||
|
saveConfig();
|
||||||
|
request->send(200, "text/text", "ok");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
//==============================utilities settings=============================================
|
||||||
|
if (request->hasArg("itoc")) {
|
||||||
|
i2c_scanning = true;
|
||||||
|
request->redirect("/?set.utilities");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
//==============================upgrade settings=============================================
|
||||||
|
server.on("/check", HTTP_GET, [](AsyncWebServerRequest * request) {
|
||||||
|
upgrade_url = true;
|
||||||
|
Serial.print("[i] Last firmware version: ");
|
||||||
|
Serial.println(last_version);
|
||||||
|
String tmp = "{}";
|
||||||
|
int case_of_update;
|
||||||
|
|
||||||
|
if (WiFi.status() != WL_CONNECTED) last_version = "nowifi";
|
||||||
|
if (!mb_4_of_memory) last_version = "less";
|
||||||
|
|
||||||
|
if (last_version == firmware_version) case_of_update = 1;
|
||||||
|
if (last_version != firmware_version) case_of_update = 2;
|
||||||
|
if (last_version == "error") case_of_update = 3;
|
||||||
|
if (last_version == "") case_of_update = 4;
|
||||||
|
if (last_version == "less") case_of_update = 5;
|
||||||
|
if (last_version == "nowifi") case_of_update = 6;
|
||||||
|
if (last_version == "notsupported") case_of_update = 7;
|
||||||
|
|
||||||
|
switch (case_of_update) {
|
||||||
|
case 1: {
|
||||||
|
jsonWriteStr(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>Последняя версия прошивки уже установлена.");
|
||||||
|
jsonWriteStr(tmp, "class", "pop-up");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2: {
|
||||||
|
jsonWriteStr(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>Имеется новая версия прошивки<a href=\"#\" class=\"btn btn-block btn-danger\" onclick=\"send_request(this, '/upgrade');setTimeout(function(){ location.href='/'; }, 120000);html('my-block','<span class=loader></span>Идет обновление прошивки, после обновления страница перезагрузится автоматически...')\">Установить</a>");
|
||||||
|
jsonWriteStr(tmp, "class", "pop-up");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 3: {
|
||||||
|
jsonWriteStr(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>Ошибка... Cервер не найден. Попробуйте позже...");
|
||||||
|
jsonWriteStr(tmp, "class", "pop-up");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 4: {
|
||||||
|
jsonWriteStr(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>Нажмите на кнопку \"обновить прошивку\" повторно...");
|
||||||
|
jsonWriteStr(tmp, "class", "pop-up");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 5: {
|
||||||
|
jsonWriteStr(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>Обновление по воздуху не поддерживается, модуль имеет меньше 4 мб памяти...");
|
||||||
|
jsonWriteStr(tmp, "class", "pop-up");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 6: {
|
||||||
|
jsonWriteStr(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>Устройство не подключено к роутеру...");
|
||||||
|
jsonWriteStr(tmp, "class", "pop-up");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 7: {
|
||||||
|
jsonWriteStr(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>Обновление на новую версию возможно только через usb...");
|
||||||
|
jsonWriteStr(tmp, "class", "pop-up");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
request->send(200, "text/text", tmp);
|
||||||
|
});
|
||||||
|
|
||||||
|
server.on("/upgrade", HTTP_GET, [](AsyncWebServerRequest * request) {
|
||||||
|
upgrade = true;
|
||||||
|
String tmp = "{}";
|
||||||
|
request->send(200, "text/text", "ok");
|
||||||
|
});
|
||||||
|
}
|
||||||
@@ -1,22 +1,19 @@
|
|||||||
void Web_server_init() {
|
void Web_server_init() {
|
||||||
|
/*********************************************************************************
|
||||||
//========================================OTA============================================
|
***************************************OTA****************************************
|
||||||
|
*********************************************************************************/
|
||||||
#ifdef OTA_enable
|
#ifdef OTA_enable
|
||||||
//Send OTA events to the browser
|
|
||||||
ArduinoOTA.onStart([]() {
|
ArduinoOTA.onStart([]() {
|
||||||
events.send("Update Start", "ota");
|
events.send("Update Start", "ota");
|
||||||
});
|
});
|
||||||
|
|
||||||
ArduinoOTA.onEnd([]() {
|
ArduinoOTA.onEnd([]() {
|
||||||
events.send("Update End", "ota");
|
events.send("Update End", "ota");
|
||||||
});
|
});
|
||||||
|
|
||||||
ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
|
ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
|
||||||
char p[32];
|
char p[32];
|
||||||
sprintf(p, "Progress: %u%%\n", (progress / (total / 100)));
|
sprintf(p, "Progress: %u%%\n", (progress / (total / 100)));
|
||||||
events.send(p, "ota");
|
events.send(p, "ota");
|
||||||
});
|
});
|
||||||
|
|
||||||
ArduinoOTA.onError([](ota_error_t error) {
|
ArduinoOTA.onError([](ota_error_t error) {
|
||||||
if (error == OTA_AUTH_ERROR) events.send("Auth Failed", "ota");
|
if (error == OTA_AUTH_ERROR) events.send("Auth Failed", "ota");
|
||||||
else if (error == OTA_BEGIN_ERROR) events.send("Begin Failed", "ota");
|
else if (error == OTA_BEGIN_ERROR) events.send("Begin Failed", "ota");
|
||||||
@@ -25,17 +22,18 @@ void Web_server_init() {
|
|||||||
else if (error == OTA_END_ERROR) events.send("End Failed", "ota");
|
else if (error == OTA_END_ERROR) events.send("End Failed", "ota");
|
||||||
});
|
});
|
||||||
ArduinoOTA.setHostname(hostName);
|
ArduinoOTA.setHostname(hostName);
|
||||||
|
|
||||||
ArduinoOTA.begin();
|
ArduinoOTA.begin();
|
||||||
#endif
|
#endif
|
||||||
//========================================MDNS============================================
|
/*********************************************************************************
|
||||||
|
**************************************MDNS****************************************
|
||||||
|
*********************************************************************************/
|
||||||
#ifdef MDNS_enable
|
#ifdef MDNS_enable
|
||||||
MDNS.addService("http", "tcp", 80);
|
MDNS.addService("http", "tcp", 80);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//SPIFFS.begin();
|
//SPIFFS.begin();
|
||||||
|
/*********************************************************************************
|
||||||
//========================================WS============================================
|
**************************************WS******************************************
|
||||||
|
*********************************************************************************/
|
||||||
#ifdef WS_enable
|
#ifdef WS_enable
|
||||||
ws.onEvent(onWsEvent);
|
ws.onEvent(onWsEvent);
|
||||||
server.addHandler(&ws);
|
server.addHandler(&ws);
|
||||||
@@ -46,26 +44,26 @@ void Web_server_init() {
|
|||||||
|
|
||||||
server.addHandler(&events);
|
server.addHandler(&events);
|
||||||
#endif
|
#endif
|
||||||
//======================================================================================
|
/*********************************************************************************
|
||||||
|
**************************************WEB****************************************
|
||||||
|
*********************************************************************************/
|
||||||
#ifdef ESP32
|
#ifdef ESP32
|
||||||
server.addHandler(new SPIFFSEditor(SPIFFS, jsonRead(configSetup, "web_login").c_str(), jsonRead(configSetup, "web_pass").c_str()));
|
server.addHandler(new SPIFFSEditor(SPIFFS, jsonReadStr(configSetupJson, "web_login").c_str(), jsonReadStr(configSetupJson, "web_pass").c_str()));
|
||||||
#elif defined(ESP8266)
|
#elif defined(ESP8266)
|
||||||
server.addHandler(new SPIFFSEditor(jsonRead(configSetup, "web_login").c_str(), jsonRead(configSetup, "web_pass").c_str()));
|
server.addHandler(new SPIFFSEditor(jsonReadStr(configSetupJson, "web_login").c_str(), jsonReadStr(configSetupJson, "web_pass").c_str()));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
server.on("/heap", HTTP_GET, [](AsyncWebServerRequest * request) {
|
/* server.on("/heap", HTTP_GET, [](AsyncWebServerRequest * request) {
|
||||||
request->send(200, "text/plain", String(ESP.getFreeHeap()));
|
request->send(200, "text/plain", String(ESP.getFreeHeap()));
|
||||||
});
|
});*/
|
||||||
|
|
||||||
|
|
||||||
server.serveStatic("/css/", SPIFFS, "/css/").setCacheControl("max-age=31536000");
|
server.serveStatic("/css/", SPIFFS, "/css/").setCacheControl("max-age=31536000");
|
||||||
server.serveStatic("/js/", SPIFFS, "/js/").setCacheControl("max-age=31536000");
|
server.serveStatic("/js/", SPIFFS, "/js/").setCacheControl("max-age=31536000");
|
||||||
server.serveStatic("/", SPIFFS, "/favicon.ico").setCacheControl("max-age=31536000");
|
server.serveStatic("/favicon.ico", SPIFFS, "/favicon.ico").setCacheControl("max-age=31536000");
|
||||||
|
server.serveStatic("/icon.jpeg", SPIFFS, "/icon.jpeg").setCacheControl("max-age=31536000");
|
||||||
|
|
||||||
server.serveStatic("/", SPIFFS, "/").setDefaultFile("index.htm")
|
server.serveStatic("/", SPIFFS, "/").setDefaultFile("index.htm")
|
||||||
.setAuthentication(jsonRead(configSetup, "web_login").c_str(), jsonRead(configSetup, "web_pass").c_str());
|
.setAuthentication(jsonReadStr(configSetupJson, "web_login").c_str(), jsonReadStr(configSetupJson, "web_pass").c_str());
|
||||||
|
|
||||||
|
|
||||||
server.onNotFound([](AsyncWebServerRequest * request) {
|
server.onNotFound([](AsyncWebServerRequest * request) {
|
||||||
Serial.printf("NOT_FOUND: ");
|
Serial.printf("NOT_FOUND: ");
|
||||||
@@ -113,6 +111,8 @@ void Web_server_init() {
|
|||||||
|
|
||||||
request->send(404);
|
request->send(404);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
server.onFileUpload([](AsyncWebServerRequest * request, const String & filename, size_t index, uint8_t *data, size_t len, bool final) {
|
server.onFileUpload([](AsyncWebServerRequest * request, const String & filename, size_t index, uint8_t *data, size_t len, bool final) {
|
||||||
if (!index)
|
if (!index)
|
||||||
Serial.printf("UploadStart: %s\n", filename.c_str());
|
Serial.printf("UploadStart: %s\n", filename.c_str());
|
||||||
@@ -120,6 +120,8 @@ void Web_server_init() {
|
|||||||
if (final)
|
if (final)
|
||||||
Serial.printf("UploadEnd: %s (%u)\n", filename.c_str(), index + len);
|
Serial.printf("UploadEnd: %s (%u)\n", filename.c_str(), index + len);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
server.onRequestBody([](AsyncWebServerRequest * request, uint8_t *data, size_t len, size_t index, size_t total) {
|
server.onRequestBody([](AsyncWebServerRequest * request, uint8_t *data, size_t len, size_t index, size_t total) {
|
||||||
if (!index)
|
if (!index)
|
||||||
Serial.printf("BodyStart: %u\n", total);
|
Serial.printf("BodyStart: %u\n", total);
|
||||||
@@ -130,30 +132,31 @@ void Web_server_init() {
|
|||||||
|
|
||||||
server.begin();
|
server.begin();
|
||||||
|
|
||||||
//=============================Устанавливаем реакции на запросы к серверу============================
|
|
||||||
|
|
||||||
// --------------------Выдаем данные configJson //config.live.json - динамические данные
|
// --------------------Выдаем данные configJson //config.live.json - динамические данные
|
||||||
server.on("/config.live.json", HTTP_GET, [](AsyncWebServerRequest * request) {
|
server.on("/config.live.json", HTTP_GET, [](AsyncWebServerRequest * request) {
|
||||||
request->send(200, "application/json", configJson);
|
request->send(200, "application/json", configLiveJson);
|
||||||
});
|
});
|
||||||
// --------------------Выдаем данные optionJson //config.option.json - данные не являющиеся событиями
|
// --------------------Выдаем данные optionJson //config.option.json - данные не являющиеся событиями
|
||||||
server.on("/config.option.json", HTTP_GET, [](AsyncWebServerRequest * request) {
|
server.on("/config.option.json", HTTP_GET, [](AsyncWebServerRequest * request) {
|
||||||
request->send(200, "application/json", optionJson);
|
request->send(200, "application/json", configOptionJson);
|
||||||
});
|
});
|
||||||
// -------------------Выдаем данные configSetup //config.setup.json - для хранения постоянных данных
|
// -------------------Выдаем данные configSetup //config.setup.json - для хранения постоянных данных
|
||||||
server.on("/config.setup.json", HTTP_GET, [](AsyncWebServerRequest * request) {
|
server.on("/config.setup.json", HTTP_GET, [](AsyncWebServerRequest * request) {
|
||||||
request->send(200, "application/json", configSetup);
|
request->send(200, "application/json", configSetupJson);
|
||||||
});
|
});
|
||||||
|
|
||||||
// ------------------Выполнение команды из запроса
|
// ------------------Выполнение команды из запроса
|
||||||
server.on("/cmd", HTTP_GET, [](AsyncWebServerRequest * request) { //http://192.168.88.45/cmd?command=rel%201%201
|
//http://192.168.88.45/cmd?command=rel%201%201
|
||||||
|
server.on("/cmd", HTTP_GET, [](AsyncWebServerRequest * request) {
|
||||||
String com = request->getParam("command")->value();
|
String com = request->getParam("command")->value();
|
||||||
Serial.println(com);
|
Serial.println(com);
|
||||||
order_loop += com + ",";
|
order_loop += com + ",";
|
||||||
request->send(200, "text/text", "OK"); // отправляем ответ о выполнении
|
request->send(200, "text/text", "OK"); // отправляем ответ о выполнении
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
//========================================WS=========================================================================================
|
/*********************************************************************************************************************************
|
||||||
|
*********************************************************WS**********************************************************************
|
||||||
|
********************************************************************************************************************************/
|
||||||
#ifdef WS_enable
|
#ifdef WS_enable
|
||||||
void onWsEvent(AsyncWebSocket * server, AsyncWebSocketClient * client, AwsEventType type, void * arg, uint8_t *data, size_t len) {
|
void onWsEvent(AsyncWebSocket * server, AsyncWebSocketClient * client, AwsEventType type, void * arg, uint8_t *data, size_t len) {
|
||||||
if (type == WS_EVT_CONNECT) {
|
if (type == WS_EVT_CONNECT) {
|
||||||
|
|||||||
98
WiFi.ino
98
WiFi.ino
@@ -1,57 +1,12 @@
|
|||||||
void WIFI_init() {
|
void ROUTER_Connecting() {
|
||||||
|
|
||||||
// --------------------Получаем ssid password со страницы
|
led_blink("slow");
|
||||||
server.on("/ssid", HTTP_GET, [](AsyncWebServerRequest * request) {
|
|
||||||
if (request->hasArg("ssid")) {
|
|
||||||
jsonWrite(configSetup, "ssid", request->getParam("ssid")->value());
|
|
||||||
}
|
|
||||||
if (request->hasArg("password")) {
|
|
||||||
jsonWrite(configSetup, "password", request->getParam("password")->value());
|
|
||||||
}
|
|
||||||
saveConfig(); // Функция сохранения данных во Flash
|
|
||||||
request->send(200, "text/text", "OK"); // отправляем ответ о выполнении
|
|
||||||
});
|
|
||||||
// --------------------Получаем ssidAP passwordAP со страницы
|
|
||||||
server.on("/ssidap", HTTP_GET, [](AsyncWebServerRequest * request) {
|
|
||||||
if (request->hasArg("ssidAP")) {
|
|
||||||
jsonWrite(configSetup, "ssidAP", request->getParam("ssidAP")->value());
|
|
||||||
}
|
|
||||||
if (request->hasArg("passwordAP")) {
|
|
||||||
jsonWrite(configSetup, "passwordAP", request->getParam("passwordAP")->value());
|
|
||||||
}
|
|
||||||
saveConfig(); // Функция сохранения данных во Flash
|
|
||||||
request->send(200, "text/text", "OK"); // отправляем ответ о выполнении
|
|
||||||
});
|
|
||||||
|
|
||||||
// --------------------Получаем логин и пароль для web со страницы
|
|
||||||
server.on("/web", HTTP_GET, [](AsyncWebServerRequest * request) {
|
|
||||||
if (request->hasArg("web_login")) {
|
|
||||||
jsonWrite(configSetup, "web_login", request->getParam("web_login")->value());
|
|
||||||
}
|
|
||||||
if (request->hasArg("web_pass")) {
|
|
||||||
jsonWrite(configSetup, "web_pass", request->getParam("web_pass")->value());
|
|
||||||
}
|
|
||||||
saveConfig(); // Функция сохранения данных во Flash
|
|
||||||
//Web_server_init();
|
|
||||||
request->send(200, "text/text", "OK"); // отправляем ответ о выполнении
|
|
||||||
});
|
|
||||||
|
|
||||||
server.on("/restart", HTTP_GET, [](AsyncWebServerRequest * request) {
|
|
||||||
if (request->hasArg("device")) {
|
|
||||||
if (request->getParam("device")->value() == "ok") ESP.restart();
|
|
||||||
}
|
|
||||||
request->send(200, "text/text", "OK"); // отправляем ответ о выполнении
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
// Попытка подключения к точке доступа
|
|
||||||
|
|
||||||
WiFi.mode(WIFI_STA);
|
WiFi.mode(WIFI_STA);
|
||||||
// WiFi.mode(WIFI_NONE_SLEEP);
|
|
||||||
|
|
||||||
byte tries = 20;
|
byte tries = 20;
|
||||||
String _ssid = jsonRead(configSetup, "ssid");
|
String _ssid = jsonReadStr(configSetupJson, "routerssid");
|
||||||
String _password = jsonRead(configSetup, "password");
|
String _password = jsonReadStr(configSetupJson, "routerpass");
|
||||||
//WiFi.persistent(false);
|
//WiFi.persistent(false);
|
||||||
|
|
||||||
if (_ssid == "" && _password == "") {
|
if (_ssid == "" && _password == "") {
|
||||||
@@ -64,12 +19,11 @@ void WIFI_init() {
|
|||||||
}
|
}
|
||||||
// Делаем проверку подключения до тех пор пока счетчик tries
|
// Делаем проверку подключения до тех пор пока счетчик tries
|
||||||
// не станет равен нулю или не получим подключение
|
// не станет равен нулю или не получим подключение
|
||||||
while (--tries && WiFi.status() != WL_CONNECTED)
|
while (--tries && WiFi.status() != WL_CONNECTED) {
|
||||||
{
|
|
||||||
if (WiFi.status() == WL_CONNECT_FAILED) {
|
if (WiFi.status() == WL_CONNECT_FAILED) {
|
||||||
Serial.println("[E] password is not correct");
|
Serial.println("[E] password is not correct");
|
||||||
tries = 1;
|
tries = 1;
|
||||||
jsonWrite(optionJson, "pass_status", 1);
|
jsonWriteInt(configOptionJson, "pass_status", 1);
|
||||||
}
|
}
|
||||||
Serial.print(".");
|
Serial.print(".");
|
||||||
delay(1000);
|
delay(1000);
|
||||||
@@ -88,11 +42,13 @@ void WIFI_init() {
|
|||||||
// о подключении и выводим адрес IP
|
// о подключении и выводим адрес IP
|
||||||
Serial.println("");
|
Serial.println("");
|
||||||
Serial.println("[V] WiFi connected");
|
Serial.println("[V] WiFi connected");
|
||||||
Serial.print("[V] IP address: ");
|
Serial.print("[V] IP address: http://");
|
||||||
Serial.print(WiFi.localIP());
|
Serial.print(WiFi.localIP());
|
||||||
Serial.println("");
|
Serial.println("");
|
||||||
jsonWrite(configJson, "ip", WiFi.localIP().toString());
|
jsonWriteStr(configSetupJson, "ip", WiFi.localIP().toString());
|
||||||
|
led_blink("off");
|
||||||
|
//add_dev_in_list("dev.txt", chipID, WiFi.localIP().toString());
|
||||||
|
MQTT_init();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -102,24 +58,25 @@ bool StartAPMode() {
|
|||||||
|
|
||||||
WiFi.mode(WIFI_AP);
|
WiFi.mode(WIFI_AP);
|
||||||
|
|
||||||
String _ssidAP = jsonRead(configSetup, "ssidAP");
|
String _ssidAP = jsonReadStr(configSetupJson, "apssid");
|
||||||
String _passwordAP = jsonRead(configSetup, "passwordAP");
|
String _passwordAP = jsonReadStr(configSetupJson, "appass");
|
||||||
WiFi.softAP(_ssidAP.c_str(), _passwordAP.c_str());
|
WiFi.softAP(_ssidAP.c_str(), _passwordAP.c_str());
|
||||||
IPAddress myIP = WiFi.softAPIP();
|
IPAddress myIP = WiFi.softAPIP();
|
||||||
|
led_blink("on");
|
||||||
Serial.print("AP IP address: ");
|
Serial.print("AP IP address: ");
|
||||||
Serial.println(myIP);
|
Serial.println(myIP);
|
||||||
jsonWrite(configJson, "ip", myIP.toString());
|
jsonWriteStr(configSetupJson, "ip", myIP.toString());
|
||||||
|
|
||||||
if (jsonReadtoInt(optionJson, "pass_status") != 1) {
|
//if (jsonReadInt(configOptionJson, "pass_status") != 1) {
|
||||||
ts.add(ROUTER_SEARCHING, 10 * 1000, [&](void*) {
|
ts.add(ROUTER_SEARCHING, 10 * 1000, [&](void*) {
|
||||||
Serial.println("->try find router");
|
Serial.println("->try find router");
|
||||||
if (RouterFind(jsonRead(configSetup, "ssid"))) {
|
if (RouterFind(jsonReadStr(configSetupJson, "routerssid"))) {
|
||||||
ts.remove(ROUTER_SEARCHING);
|
ts.remove(ROUTER_SEARCHING);
|
||||||
WIFI_init();
|
WiFi.scanDelete();
|
||||||
MQTT_init();
|
ROUTER_Connecting();
|
||||||
}
|
}
|
||||||
}, nullptr, true);
|
}, nullptr, true);
|
||||||
}
|
//}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -136,7 +93,7 @@ boolean RouterFind(String ssid) {
|
|||||||
Serial.println("[WIFI][i] scanning still in progress");
|
Serial.println("[WIFI][i] scanning still in progress");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (n == 0) { //Сканирование все еще выполняется
|
if (n == 0) { //ни одна сеть не найдена
|
||||||
Serial.println("[WIFI][i] no any wifi sations, starting scanning");
|
Serial.println("[WIFI][i] no any wifi sations, starting scanning");
|
||||||
WiFi.scanNetworks (true, false);
|
WiFi.scanNetworks (true, false);
|
||||||
return false;
|
return false;
|
||||||
@@ -164,6 +121,7 @@ boolean RouterFind(String ssid) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
String scanWIFI() {
|
String scanWIFI() {
|
||||||
uint8_t n = WiFi.scanNetworks();
|
uint8_t n = WiFi.scanNetworks();
|
||||||
@@ -173,12 +131,12 @@ String scanWIFI() {
|
|||||||
for (uint8_t i = 0; i < n; i++) {
|
for (uint8_t i = 0; i < n; i++) {
|
||||||
JsonObject& data = networks.createNestedObject();
|
JsonObject& data = networks.createNestedObject();
|
||||||
String ssidMy = WiFi.SSID(i);
|
String ssidMy = WiFi.SSID(i);
|
||||||
data["ssid"] = ssidMy;
|
data["routerssid"] = ssidMy;
|
||||||
data["pass"] = (WiFi.encryptionType(i) == ENC_TYPE_NONE) ? "" : "*";
|
data["pass"] = (WiFi.encryptionType(i) == ENC_TYPE_NONE) ? "" : "*";
|
||||||
int8_t dbm = WiFi.RSSI(i);
|
int8_t dbm = WiFi.RSSI(i);
|
||||||
data["dbm"] = dbm;
|
data["dbm"] = dbm;
|
||||||
if (ssidMy == jsonRead(configSetup, "ssid")) {
|
if (ssidMy == jsonReadStr(configSetupJson, "routerssid")) {
|
||||||
jsonWrite(configJson, "dbm", dbm);
|
jsonWriteStr(configLiveJson, "dbm", dbm);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
String root;
|
String root;
|
||||||
@@ -190,14 +148,14 @@ String scanWIFI() {
|
|||||||
{
|
{
|
||||||
"type":"wifi",
|
"type":"wifi",
|
||||||
"title":"{{LangWiFi1}}",
|
"title":"{{LangWiFi1}}",
|
||||||
"name":"ssid",
|
"name":"routerssid",
|
||||||
"state":"{{ssid}}",
|
"state":"{{ssid}}",
|
||||||
"pattern":".{1,}"
|
"pattern":".{1,}"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type":"password",
|
"type":"routerpass",
|
||||||
"title":"{{LangPass}}",
|
"title":"{{LangPass}}",
|
||||||
"name":"ssidPass",
|
"name":"routerpass",
|
||||||
"state":"{{ssidPass}}",
|
"state":"{{ssidPass}}",
|
||||||
"pattern":".{8,}"
|
"pattern":".{8,}"
|
||||||
},
|
},
|
||||||
|
|||||||
88
Widgets.ino
Normal file
88
Widgets.ino
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
//======================================================================================================================
|
||||||
|
//===============================================Создание виджетов=======================================================
|
||||||
|
void createWidget (String widget_name, String page_name, String page_number, String file, String topic) {
|
||||||
|
|
||||||
|
String widget;
|
||||||
|
widget = readFile(file, 1024);
|
||||||
|
|
||||||
|
if (widget == "Failed") return;
|
||||||
|
if (widget == "Large") return;
|
||||||
|
|
||||||
|
widget_name.replace("#", " ");
|
||||||
|
page_name.replace("#", " ");
|
||||||
|
|
||||||
|
jsonWriteStr(widget, "page", page_name);
|
||||||
|
jsonWriteStr(widget, "order", page_number);
|
||||||
|
jsonWriteStr(widget, "descr", widget_name);
|
||||||
|
jsonWriteStr(widget, "topic", prex + "/" + topic);
|
||||||
|
|
||||||
|
#ifdef layout_in_ram
|
||||||
|
all_widgets += widget + "\r\n";
|
||||||
|
#else
|
||||||
|
addFile("layout.txt", widget);
|
||||||
|
#endif
|
||||||
|
widget = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
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) {
|
||||||
|
|
||||||
|
String widget;
|
||||||
|
widget = readFile(file, 1024);
|
||||||
|
|
||||||
|
if (widget == "Failed") return;
|
||||||
|
if (widget == "Large") return;
|
||||||
|
|
||||||
|
widget_name.replace("#", " ");
|
||||||
|
page_name.replace("#", " ");
|
||||||
|
|
||||||
|
jsonWriteStr(widget, "page", page_name);
|
||||||
|
jsonWriteStr(widget, "order", page_number);
|
||||||
|
jsonWriteStr(widget, "descr", widget_name);
|
||||||
|
jsonWriteStr(widget, "topic", prex + "/" + topic);
|
||||||
|
|
||||||
|
if (name1 != "") jsonWriteStr(widget, name1, param1);
|
||||||
|
if (name2 != "") jsonWriteStr(widget, name2, param2);
|
||||||
|
if (name3 != "") jsonWriteStr(widget, name3, param3);
|
||||||
|
|
||||||
|
#ifdef layout_in_ram
|
||||||
|
all_widgets += widget + "\r\n";
|
||||||
|
#else
|
||||||
|
addFile("layout.txt", widget);
|
||||||
|
#endif
|
||||||
|
widget = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
void createChart (String widget_name, String page_name, String page_number, String file, String topic, String maxCount) {
|
||||||
|
|
||||||
|
String widget;
|
||||||
|
widget = readFile(file, 1024);
|
||||||
|
|
||||||
|
if (widget == "Failed") return;
|
||||||
|
if (widget == "Large") return;
|
||||||
|
|
||||||
|
widget_name.replace("#", " ");
|
||||||
|
page_name.replace("#", " ");
|
||||||
|
|
||||||
|
jsonWriteStr(widget, "page", page_name);
|
||||||
|
jsonWriteStr(widget, "order", page_number);
|
||||||
|
//jsonWriteStr(widget, "descr", widget_name);
|
||||||
|
jsonWriteStr(widget, "series", widget_name);
|
||||||
|
jsonWriteStr(widget, "maxCount", maxCount);
|
||||||
|
jsonWriteStr(widget, "topic", prex + "/" + topic);
|
||||||
|
|
||||||
|
#ifdef layout_in_ram
|
||||||
|
all_widgets += widget + "\r\n";
|
||||||
|
#else
|
||||||
|
addFile("layout.txt", widget);
|
||||||
|
#endif
|
||||||
|
widget = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
void choose_widget_and_create(String widget_name, String page_name, String page_number, String type, String topik) {
|
||||||
|
|
||||||
|
if (type == "any-data") createWidget (widget_name, page_name, page_number, "widgets/widget.anyData.json", topik);
|
||||||
|
if (type == "progress-line") createWidget (widget_name, page_name, page_number, "widgets/widget.progLine.json", topik);
|
||||||
|
if (type == "progress-round") createWidget (widget_name, page_name, page_number, "widgets/widget.progRound.json", topik);
|
||||||
|
if (type == "fill-gauge") createWidget (widget_name, page_name, page_number, "widgets/widget.fillGauge.json", topik);
|
||||||
|
|
||||||
|
}
|
||||||
33
bus.ino
Normal file
33
bus.ino
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,72 +0,0 @@
|
|||||||
/*
|
|
||||||
const char* local_root_ca1 = \
|
|
||||||
"-----BEGIN CERTIFICATE-----\n" \
|
|
||||||
"MIIFdDCCBFygAwIBAgIQJ2buVutJ846r13Ci/ITeIjANBgkqhkiG9w0BAQwFADBv\n" \
|
|
||||||
"MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFk\n" \
|
|
||||||
"ZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBF\n" \
|
|
||||||
"eHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFow\n" \
|
|
||||||
"gYUxCzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO\n" \
|
|
||||||
"BgNVBAcTB1NhbGZvcmQxGjAYBgNVBAoTEUNPTU9ETyBDQSBMaW1pdGVkMSswKQYD\n" \
|
|
||||||
"VQQDEyJDT01PRE8gUlNBIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkq\n" \
|
|
||||||
"hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAkehUktIKVrGsDSTdxc9EZ3SZKzejfSNw\n" \
|
|
||||||
"AHG8U9/E+ioSj0t/EFa9n3Byt2F/yUsPF6c947AEYe7/EZfH9IY+Cvo+XPmT5jR6\n" \
|
|
||||||
"2RRr55yzhaCCenavcZDX7P0N+pxs+t+wgvQUfvm+xKYvT3+Zf7X8Z0NyvQwA1onr\n" \
|
|
||||||
"ayzT7Y+YHBSrfuXjbvzYqOSSJNpDa2K4Vf3qwbxstovzDo2a5JtsaZn4eEgwRdWt\n" \
|
|
||||||
"4Q08RWD8MpZRJ7xnw8outmvqRsfHIKCxH2XeSAi6pE6p8oNGN4Tr6MyBSENnTnIq\n" \
|
|
||||||
"m1y9TBsoilwie7SrmNnu4FGDwwlGTm0+mfqVF9p8M1dBPI1R7Qu2XK8sYxrfV8g/\n" \
|
|
||||||
"vOldxJuvRZnio1oktLqpVj3Pb6r/SVi+8Kj/9Lit6Tf7urj0Czr56ENCHonYhMsT\n" \
|
|
||||||
"8dm74YlguIwoVqwUHZwK53Hrzw7dPamWoUi9PPevtQ0iTMARgexWO/bTouJbt7IE\n" \
|
|
||||||
"IlKVgJNp6I5MZfGRAy1wdALqi2cVKWlSArvX31BqVUa/oKMoYX9w0MOiqiwhqkfO\n" \
|
|
||||||
"KJwGRXa/ghgntNWutMtQ5mv0TIZxMOmm3xaG4Nj/QN370EKIf6MzOi5cHkERgWPO\n" \
|
|
||||||
"GHFrK+ymircxXDpqR+DDeVnWIBqv8mqYqnK8V0rSS527EPywTEHl7R09XiidnMy/\n" \
|
|
||||||
"s1Hap0flhFMCAwEAAaOB9DCB8TAfBgNVHSMEGDAWgBStvZh6NLQm9/rEJlTvA73g\n" \
|
|
||||||
"JMtUGjAdBgNVHQ4EFgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQD\n" \
|
|
||||||
"AgGGMA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0gBAowCDAGBgRVHSAAMEQGA1UdHwQ9\n" \
|
|
||||||
"MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9BZGRUcnVzdEV4dGVy\n" \
|
|
||||||
"bmFsQ0FSb290LmNybDA1BggrBgEFBQcBAQQpMCcwJQYIKwYBBQUHMAGGGWh0dHA6\n" \
|
|
||||||
"Ly9vY3NwLnVzZXJ0cnVzdC5jb20wDQYJKoZIhvcNAQEMBQADggEBAGS/g/FfmoXQ\n" \
|
|
||||||
"zbihKVcN6Fr30ek+8nYEbvFScLsePP9NDXRqzIGCJdPDoCpdTPW6i6FtxFQJdcfj\n" \
|
|
||||||
"Jw5dhHk3QBN39bSsHNA7qxcS1u80GH4r6XnTq1dFDK8o+tDb5VCViLvfhVdpfZLY\n" \
|
|
||||||
"Uspzgb8c8+a4bmYRBbMelC1/kZWSWfFMzqORcUx8Rww7Cxn2obFshj5cqsQugsv5\n" \
|
|
||||||
"B5a6SE2Q8pTIqXOi6wZ7I53eovNNVZ96YUWYGGjHXkBrI/V5eu+MtWuLt29G9Hvx\n" \
|
|
||||||
"PUsE2JOAWVrgQSQdso8VYFhH2+9uRv0V9dlfmrPb2LjkQLPNlzmuhbsdjrzch5vR\n" \
|
|
||||||
"pu/xO28QOG8=\n" \
|
|
||||||
"-----END CERTIFICATE-----\n";
|
|
||||||
|
|
||||||
const char* local_root_ca2 = \
|
|
||||||
"-----BEGIN CERTIFICATE-----\n" \
|
|
||||||
"MIIGCDCCA/CgAwIBAgIQKy5u6tl1NmwUim7bo3yMBzANBgkqhkiG9w0BAQwFADCB\n" \
|
|
||||||
"hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G\n" \
|
|
||||||
"A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV\n" \
|
|
||||||
"BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTQwMjEy\n" \
|
|
||||||
"MDAwMDAwWhcNMjkwMjExMjM1OTU5WjCBkDELMAkGA1UEBhMCR0IxGzAZBgNVBAgT\n" \
|
|
||||||
"EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR\n" \
|
|
||||||
"Q09NT0RPIENBIExpbWl0ZWQxNjA0BgNVBAMTLUNPTU9ETyBSU0EgRG9tYWluIFZh\n" \
|
|
||||||
"bGlkYXRpb24gU2VjdXJlIFNlcnZlciBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP\n" \
|
|
||||||
"ADCCAQoCggEBAI7CAhnhoFmk6zg1jSz9AdDTScBkxwtiBUUWOqigwAwCfx3M28Sh\n" \
|
|
||||||
"bXcDow+G+eMGnD4LgYqbSRutA776S9uMIO3Vzl5ljj4Nr0zCsLdFXlIvNN5IJGS0\n" \
|
|
||||||
"Qa4Al/e+Z96e0HqnU4A7fK31llVvl0cKfIWLIpeNs4TgllfQcBhglo/uLQeTnaG6\n" \
|
|
||||||
"ytHNe+nEKpooIZFNb5JPJaXyejXdJtxGpdCsWTWM/06RQ1A/WZMebFEh7lgUq/51\n" \
|
|
||||||
"UHg+TLAchhP6a5i84DuUHoVS3AOTJBhuyydRReZw3iVDpA3hSqXttn7IzW3uLh0n\n" \
|
|
||||||
"c13cRTCAquOyQQuvvUSH2rnlG51/ruWFgqUCAwEAAaOCAWUwggFhMB8GA1UdIwQY\n" \
|
|
||||||
"MBaAFLuvfgI9+qbxPISOre44mOzZMjLUMB0GA1UdDgQWBBSQr2o6lFoL2JDqElZz\n" \
|
|
||||||
"30O0Oija5zAOBgNVHQ8BAf8EBAMCAYYwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNV\n" \
|
|
||||||
"HSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwGwYDVR0gBBQwEjAGBgRVHSAAMAgG\n" \
|
|
||||||
"BmeBDAECATBMBgNVHR8ERTBDMEGgP6A9hjtodHRwOi8vY3JsLmNvbW9kb2NhLmNv\n" \
|
|
||||||
"bS9DT01PRE9SU0FDZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDBxBggrBgEFBQcB\n" \
|
|
||||||
"AQRlMGMwOwYIKwYBBQUHMAKGL2h0dHA6Ly9jcnQuY29tb2RvY2EuY29tL0NPTU9E\n" \
|
|
||||||
"T1JTQUFkZFRydXN0Q0EuY3J0MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5jb21v\n" \
|
|
||||||
"ZG9jYS5jb20wDQYJKoZIhvcNAQEMBQADggIBAE4rdk+SHGI2ibp3wScF9BzWRJ2p\n" \
|
|
||||||
"mj6q1WZmAT7qSeaiNbz69t2Vjpk1mA42GHWx3d1Qcnyu3HeIzg/3kCDKo2cuH1Z/\n" \
|
|
||||||
"e+FE6kKVxF0NAVBGFfKBiVlsit2M8RKhjTpCipj4SzR7JzsItG8kO3KdY3RYPBps\n" \
|
|
||||||
"P0/HEZrIqPW1N+8QRcZs2eBelSaz662jue5/DJpmNXMyYE7l3YphLG5SEXdoltMY\n" \
|
|
||||||
"dVEVABt0iN3hxzgEQyjpFv3ZBdRdRydg1vs4O2xyopT4Qhrf7W8GjEXCBgCq5Ojc\n" \
|
|
||||||
"2bXhc3js9iPc0d1sjhqPpepUfJa3w/5Vjo1JXvxku88+vZbrac2/4EjxYoIQ5QxG\n" \
|
|
||||||
"V/Iz2tDIY+3GH5QFlkoakdH368+PUq4NCNk+qKBR6cGHdNXJ93SrLlP7u3r7l+L4\n" \
|
|
||||||
"HyaPs9Kg4DdbKDsx5Q5XLVq4rXmsXiBmGqW5prU5wfWYQ//u+aen/e7KJD2AFsQX\n" \
|
|
||||||
"j4rBYKEMrltDR5FL1ZoXX/nUh8HCjLfn4g8wGTeGrODcQgPmlKidrv0PJFGUzpII\n" \
|
|
||||||
"0fxQ8ANAe4hZ7Q7drNJ3gjTcBpUC2JD5Leo31Rpg0Gcg19hCC0Wvgmje3WYkN5Ap\n" \
|
|
||||||
"lBlGGSW4gNfL1IYoakRwJiNiqZ+Gb7+6kHDSVneFeO/qJakXzlByjAA6quPbYzSf\n" \
|
|
||||||
"+AZxAeKCINT+b72x\n" \
|
|
||||||
"-----END CERTIFICATE-----\n";
|
|
||||||
*/
|
|
||||||
@@ -1,18 +1,21 @@
|
|||||||
{
|
{
|
||||||
"SSDP": "MODULES",
|
"name": "IoTmanager",
|
||||||
"chipID": "",
|
"chipID": "",
|
||||||
"ssidAP": "WiFi",
|
"apssid": "IoTmanager",
|
||||||
"passwordAP": "",
|
"appass": "",
|
||||||
"ssid": "your_ssid",
|
"routerssid": "rise",
|
||||||
"password": "your_password",
|
"routerpass": "hostel3333",
|
||||||
"timezone": 3,
|
"timezone": 2,
|
||||||
"mqttServer": "",
|
"ntp": "pool.ntp.org",
|
||||||
"mqttPort": 0,
|
"mqttServer": "91.204.228.124",
|
||||||
"mqttPrefix": "/IoTmanager",
|
"mqttPort": 1883,
|
||||||
"mqttUser": "",
|
"mqttPrefix": "/rise",
|
||||||
"mqttPass": "",
|
"mqttUser": "test",
|
||||||
"scenario": "1",
|
"mqttPass": "test",
|
||||||
"pushingbox_id": "",
|
"scen": "1",
|
||||||
"web_login": "admin",
|
"pushingboxid": "v7C133E426B0C69E",
|
||||||
"web_pass": "admin"
|
"weblogin": "admin",
|
||||||
|
"webpass": "admin",
|
||||||
|
"udponoff": "1",
|
||||||
|
"blink":"1"
|
||||||
}
|
}
|
||||||
7
data/configs/10-dht22.c.txt
Normal file
7
data/configs/10-dht22.c.txt
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
dhtT t 2 dht22 Температура#DHT,#t°C Датчики any-data 1
|
||||||
|
dhtH h 2 dht22 Влажность#DHT,#t°C Датчики any-data 2
|
||||||
|
dhtComfort Степень#комфорта: Датчики 3
|
||||||
|
dhtPerception Восприятие: Датчики 4
|
||||||
|
dhtDewpoint Точка#росы: Датчики 5
|
||||||
|
logging t 1 50 Температура Датчики 6
|
||||||
|
logging h 1 50 Влажность Датчики 7
|
||||||
@@ -1,7 +1,8 @@
|
|||||||
analog 0 Аналоговый#вход,#% Датчики progress-round 310 620 1 100 1
|
analog adc 0 Аналоговый#вход,#% Датчики progress-round 310 620 1 100 1
|
||||||
|
logging adc 5 100 Аналоговый#вход Датчики 2
|
||||||
|
|
||||||
//если датчик углекислого газа выдает напряжение от 1 вольта до 2 вольт, то значит
|
//если датчик углекислого газа выдает напряжение от 1 вольта до 2 вольт, то значит
|
||||||
//значение чтения аналогового входа будут примерно равным
|
//значение чтения аналогового входа будут примерно равным
|
||||||
//при 1 вольте - 310, а при 2 вольтах - 620 (считаем по пропорции)
|
//при 1 вольте - 310, а при 2 вольтах - 620 (считаем по пропорции)
|
||||||
//данная строка переведет диапазон 310-620 в диапазон 1-100 и отобразит в приложении
|
//данная строка переведет диапазон 310-620 в диапазон 1-100 и отобразит в приложении
|
||||||
//варианты отображения: any-data, progress-round, progress-line
|
//варианты отображения: any-data, progress-round, progress-line, fill-gauge
|
||||||
6
data/configs/12-bmp280.c.txt
Normal file
6
data/configs/12-bmp280.c.txt
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
bmp280T temp1 0x76 Температура#bmp280 Датчики any-data 1
|
||||||
|
bmp280P press1 0x76 Давление#bmp280 Датчики any-data 2
|
||||||
|
logging temp1 1 100 Температура Датчики 3
|
||||||
|
logging press1 1 100 Давление Датчики 4
|
||||||
|
|
||||||
|
//Чтение и логгирование датчика bmp280. Датчик подключается к шине i2c (esp8266 - gpio 5, 4)
|
||||||
9
data/configs/13-bme280.c.txt
Normal file
9
data/configs/13-bme280.c.txt
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
bme280T temp1 0x76 Температура#bmp280 Датчики any-data 1
|
||||||
|
bme280P pres1 0x76 Давление#bmp280 Датчики any-data 2
|
||||||
|
bme280H hum1 0x76 Влажность#bmp280 Датчики any-data 3
|
||||||
|
bme280A altit1 0x76 Высота#bmp280 Датчики any-data 4
|
||||||
|
logging temp1 1 100 Температура Датчики 5
|
||||||
|
logging press1 1 100 Давление Датчики 6
|
||||||
|
logging hum1 1 100 Влажность Датчики 7
|
||||||
|
|
||||||
|
//Чтение и логгирование датчика bme280. Датчик подключается к шине i2c (esp8266 - gpio 5, 4)
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
dallas 2 Водонагреватель,#t°C Датчики any-data 1
|
dallas 2 Водонагреватель,#t°C Датчики any-data 1
|
||||||
|
logging dallas 1 100 Температура Датчики 2
|
||||||
|
|
||||||
//2 - номер пина датчика
|
//2 - номер пина датчика
|
||||||
//варианты отображения: any-data, progress-round, progress-line
|
//варианты отображения: any-data, progress-round, progress-line, fill-gauge
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
dallas 2 Водонагреватель,#t°C Термостат any-data 1
|
dallas 2 Водонагреватель,#t°C Термостат any-data 1
|
||||||
inputDigit digit1 При#скольки#выключить? Термостат 40 2
|
logging dallas 5 100 Температура Термостат 2
|
||||||
inputDigit digit2 При#скольки#включить? Термостат 20 3
|
inputDigit digit1 При#скольки#выключить? Термостат 40 3
|
||||||
button 1 5 Нагреватель Термостат 0 4
|
inputDigit digit2 При#скольки#включить? Термостат 20 4
|
||||||
button 2 line1,line2, Автоматический#режим Термостат 1 5
|
button 1 5 Нагреватель Термостат 0 5
|
||||||
|
button 2 line1,line2, Автоматический#режим Термостат 1 6
|
||||||
|
|
||||||
//2 - номер пина датчика
|
//2 - номер пина датчика
|
||||||
//5 - номер пина реле
|
//5 - номер пина реле
|
||||||
@@ -1,10 +1,11 @@
|
|||||||
level Вода#в#баке,#% Датчики any-data 125 20 1
|
level lev 14 12 Вода#в#баке,#% Датчики fill-gauge 125 20 1
|
||||||
inputDigit digit1 При#скольки#выключить? Датчики 95 2
|
inputDigit digit1 При#скольки#выключить? Датчики 95 2
|
||||||
inputDigit digit2 При#скольки#включить? Датчики 10 3
|
inputDigit digit2 При#скольки#включить? Датчики 10 3
|
||||||
button 1 5 Насос Датчики 0 4
|
button 1 5 Насос Датчики 0 4
|
||||||
button 2 line1,line2, Автоматический#режим Датчики 1 5
|
button 2 line1,line2, Автоматический#режим Датчики 1 5
|
||||||
|
logging lev 1 100 Вода#в#баке Датчики 6
|
||||||
|
|
||||||
//125 - это расстояние от датчика до дна бака в сантиметрах
|
//125 - это расстояние от датчика до дна бака в сантиметрах
|
||||||
//20 - это расстояние от датчика до поверхности воды когда бак полный в сантиметрах
|
//20 - это расстояние от датчика до поверхности воды когда бак полный в сантиметрах
|
||||||
//вывод данных будет в процентах заполнения бака
|
//вывод данных будет в процентах заполнения бака
|
||||||
//варианты отображения: any-data, progress-round, progress-line
|
//варианты отображения: any-data, progress-round, progress-line, fill-gauge
|
||||||
6
data/configs/16-level.s.txt
Normal file
6
data/configs/16-level.s.txt
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
lev > digit1
|
||||||
|
buttonSet 1 0
|
||||||
|
end
|
||||||
|
lev < digit2
|
||||||
|
buttonSet 1 1
|
||||||
|
end
|
||||||
@@ -2,9 +2,11 @@ switch 1 0 20
|
|||||||
text 1 Вход: Охрана 1
|
text 1 Вход: Охрана 1
|
||||||
textSet 1 не#обнаружено-time
|
textSet 1 не#обнаружено-time
|
||||||
button 1 na Сбросить Охрана 0 2
|
button 1 na Сбросить Охрана 0 2
|
||||||
|
button 2 line3, Включить#push Охрана 1 3
|
||||||
|
|
||||||
//0 - номер пина датчика
|
//0 - номер пина датчика
|
||||||
//при срабатывании датчика движения устройство пошлет пуш и в приложении будет
|
//при срабатывании датчика движения устройство пошлет пуш и в приложении будет
|
||||||
//написано в текстовом поле, что движение было обнаружено, так же будет зафиксирован
|
//написано в текстовом поле, что движение было обнаружено
|
||||||
//момент времени срабатывания датчика
|
//так же будет зафиксирован момент времени срабатывания датчика
|
||||||
|
//в приложении можно отключать отправку пуш сообщений на тот случай если дома хозяин
|
||||||
//перевести датчик снова в режим ожидания движения можно нажав кнопку сброса в приложении
|
//перевести датчик снова в режим ожидания движения можно нажав кнопку сброса в приложении
|
||||||
@@ -1,8 +1,10 @@
|
|||||||
switch1 = 1
|
switch1 = 1
|
||||||
textSet 1 обнаружено#движение-time
|
textSet 1 обнаружено#движение-time
|
||||||
push Внимание обнаружено#движение!
|
|
||||||
end
|
end
|
||||||
button1 = 1
|
button1 = 1
|
||||||
textSet 1 не#обнаружено-time
|
textSet 1 не#обнаружено-time
|
||||||
buttonSet 1 0
|
buttonSet 1 0
|
||||||
end
|
end
|
||||||
|
switch1 = 1
|
||||||
|
push Внимание обнаружено#движение!
|
||||||
|
end
|
||||||
17
data/configs/20-servo.c.txt
Normal file
17
data/configs/20-servo.c.txt
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
servo 1 12 50 Мой#сервопривод Сервоприводы 0 100 0 180 1
|
||||||
|
servo 2 13 50 Мой#сервопривод Сервоприводы 0 100 0 180 2
|
||||||
|
button 1 na Открыть1 Сервоприводы 0 3
|
||||||
|
button 2 na Открыть2 Сервоприводы 0 4
|
||||||
|
|
||||||
|
//Можно создавать не более двух сервоприводов на одном устройстве.
|
||||||
|
//1 - номер привода
|
||||||
|
//12 - номер пина
|
||||||
|
//50 - начальное значение в процентах
|
||||||
|
|
||||||
|
//0 - 100 диапазон ползунка
|
||||||
|
//0 - 180 диапазон угла
|
||||||
|
|
||||||
|
//Представим ситуацию когда есть некая заслонка и при угле в 30 градусов она закрыта,
|
||||||
|
//а при угле в 90 градусов открыта. В этом случае необходимо написать
|
||||||
|
//0 100 30 90 и тогда поставив ползунок в 0 % серва встанет в положение 30 градусов,
|
||||||
|
//а если поставить ползунок в 100 % серва встанет в положение 90 градусов.
|
||||||
12
data/configs/20-servo.s.txt
Normal file
12
data/configs/20-servo.s.txt
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
button1 = 1
|
||||||
|
servoSet 1 100
|
||||||
|
end
|
||||||
|
button1 = 0
|
||||||
|
servoSet 1 0
|
||||||
|
end
|
||||||
|
button2 = 1
|
||||||
|
servoSet 2 100
|
||||||
|
end
|
||||||
|
button2 = 0
|
||||||
|
servoSet 2 0
|
||||||
|
end
|
||||||
1
data/configs/8-pwm.s.txt
Normal file
1
data/configs/8-pwm.s.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
|
||||||
7
data/configs/9-dht11.c.txt
Normal file
7
data/configs/9-dht11.c.txt
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
dhtT t 2 dht11 Температура#DHT,#t°C Датчики any-data 1
|
||||||
|
dhtH h 2 dht11 Влажность#DHT,#t°C Датчики any-data 2
|
||||||
|
dhtComfort Степень#комфорта: Датчики 3
|
||||||
|
dhtPerception Восприятие: Датчики 4
|
||||||
|
dhtDewpoint Точка#росы: Датчики 5
|
||||||
|
logging t 1 50 Температура Датчики 6
|
||||||
|
logging h 1 50 Влажность Датчики 7
|
||||||
1
data/configs/9-dht11.s.txt
Normal file
1
data/configs/9-dht11.s.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
dhtT DHT11 2 Температура#DHT,#t°C Датчики any-data 1
|
|
||||||
dhtH DHT11 2 Влажность#DHT,#% Датчики any-data 2
|
|
||||||
dhtComfort Степень#комфорта: Датчики 3
|
|
||||||
dhtPerception Восприятие: Датчики 4
|
|
||||||
dhtDewpoint Точка#росы: Датчики 5
|
|
||||||
|
|
||||||
//2 - номер пина датчика
|
|
||||||
//варианты отображения: any-data, progress-round, progress-line
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
dhtT DHT22 2 Температура#DHT,#t°C Датчики any-data 1
|
|
||||||
dhtH DHT22 2 Влажность#DHT,#% Датчики any-data 2
|
|
||||||
dhtComfort Степень#комфорта: Датчики 3
|
|
||||||
dhtPerception Восприятие: Датчики 4
|
|
||||||
dhtDewpoint Точка#росы: Датчики 5
|
|
||||||
|
|
||||||
//2 - номер пина датчика
|
|
||||||
//варианты отображения: any-data, progress-round, progress-line
|
|
||||||
12
data/configs/firmware.c.txt
Normal file
12
data/configs/firmware.c.txt
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
button 1 na Включить#все Реле 0 1
|
||||||
|
button 2 13 Прихожая Реле 0 2
|
||||||
|
button 3 14 Кухня Реле 0 3
|
||||||
|
pwm 1 3 Яркость#коредор: Реле 1023 4
|
||||||
|
pwm 2 4 Яркость#ванная: Реле 510 5
|
||||||
|
analog adc 0 Аналоговый#вход Датчики fill-gauge 1 1023 1 1023 6
|
||||||
|
logging adc 1 100 Аналоговый#вход Датчики 7
|
||||||
|
|
||||||
|
//Это демо конфигурация. В ней показано как связать кнопки c помощью сценариев
|
||||||
|
//Кнопка номер 1 связана с кнопкой 2, 3 и с pwm 2
|
||||||
|
//Так же продемонстрированна система логгирования данных строкой logging
|
||||||
|
//1 - это интервал между точками в минутах, 100 это количество точек
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
button 1 na Включить#все Реле 0 1
|
|
||||||
button 2 13 Прихожая Реле 0 2
|
|
||||||
button 3 14 Кухня Реле 0 3
|
|
||||||
pwm 1 3 Яркость#коредор: Реле 1023 4
|
|
||||||
pwm 2 4 Яркость#ванная: Реле 510 5
|
|
||||||
analog 0 Аналоговый#вход,#% Датчики progress-round 1 1024 1 1024 6
|
|
||||||
@@ -8,3 +8,6 @@ buttonSet 2 0
|
|||||||
buttonSet 3 0
|
buttonSet 3 0
|
||||||
pwmSet 2 0
|
pwmSet 2 0
|
||||||
end
|
end
|
||||||
|
adc > 50
|
||||||
|
buttonSet 2 1
|
||||||
|
end
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
level > digit1
|
|
||||||
buttonSet 1 0
|
|
||||||
end
|
|
||||||
level < digit2
|
|
||||||
buttonSet 1 1
|
|
||||||
end
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
switch 1 0 10
|
|
||||||
|
|
||||||
//физическая кнопка номер 1 подключенная к пину 0, задержка от дребезга 10 мс
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
switch1 = 1
|
|
||||||
mqtt 3233662-1589489 buttonChange_1
|
|
||||||
end
|
|
||||||
@@ -1,113 +0,0 @@
|
|||||||
{
|
|
||||||
"configs": [
|
|
||||||
"/config.live.json",
|
|
||||||
"/config.setup.json",
|
|
||||||
"/config.option.json"
|
|
||||||
],
|
|
||||||
"class": "col-sm-offset-1 col-sm-10",
|
|
||||||
"content": [
|
|
||||||
{
|
|
||||||
"type": "h5",
|
|
||||||
"title": "{{SSDP}}",
|
|
||||||
"class": "alert-warning"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "h4",
|
|
||||||
"title": "Device ID: {{chipID}}"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "h4",
|
|
||||||
"title": "IP address: {{ip}}"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "h4",
|
|
||||||
"title": "Uptime: {{uptime}}"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "hr"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "dropdown",
|
|
||||||
"name": "help-url",
|
|
||||||
"class": "btn btn-warning btn-lg",
|
|
||||||
"style": "display:inline",
|
|
||||||
"title": {
|
|
||||||
"#": "Выбирите то, во что Вы хотите превратить ESP <span class=\"caret\"></span>",
|
|
||||||
"/relay": "1.Вкл. выкл. локального реле",
|
|
||||||
"/relay_timer": "2.Вкл. выкл. локального реле в определенное время",
|
|
||||||
"/relay_countdown": "3.Вкл. выкл. локального реле на определенный период времени",
|
|
||||||
"/relay_several": "4.Вкл. выкл. нескольких локальных реле кнопкой в приложении",
|
|
||||||
"/relay_switch": "5.Вкл. выкл. локального реле физической кнопкой (кнопка так же дублируется в приложении)",
|
|
||||||
"/relay_button_remote": "6.Вкл. выкл. нескольких удаленных реле кнопкой в приложении (нужно указать Device ID)",
|
|
||||||
"/relay_switch_remote": "7.Вкл. выкл. нескольких удаленных реле физической кнопкой (нужно указать Device ID)",
|
|
||||||
"/pwm": "8.Широтно импульсная модуляция",
|
|
||||||
"/dht11": "9.Сенсор DHT11",
|
|
||||||
"/dht22": "10.Сенсор DHT22, DHT33, DHT44, AM2302, RHT03",
|
|
||||||
"/analog": "11.Аналоговый сенсор",
|
|
||||||
"/dallas": "12.Сенсор DS18B20",
|
|
||||||
"/termostat": "13.Термостат на DS18B20 с переключением в ручной режим",
|
|
||||||
"/level": "14.Контроль уровня в баке на сенсорах: JSN-SR04T, HC-SR04, HY-SRF05 (управление насосом)",
|
|
||||||
"/moution_relay": "15.Датчик движения включающий свет",
|
|
||||||
"/moution_security": "16.Охранный датчик движения",
|
|
||||||
"/stepper": "17.Система управления шаговыми двигателями на основе драйвера A4988 (открытие закрытие штор)",
|
|
||||||
"/default": "Настройки по умолчанию"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "h2",
|
|
||||||
"title": "Конфигурация устройства"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "file",
|
|
||||||
"state": "firmware.config.txt",
|
|
||||||
"style": "width:100%;height:400px",
|
|
||||||
"title": "Сохранить",
|
|
||||||
"action": "/all_modules_init",
|
|
||||||
"class": "btn btn-block btn-success"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "link",
|
|
||||||
"title": "Подробная инструкция",
|
|
||||||
"action": "https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/wiki/Instruction",
|
|
||||||
"class": "btn btn-block btn-primary"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "h2",
|
|
||||||
"title": "Сценарии"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "checkbox",
|
|
||||||
"name": "scenario",
|
|
||||||
"title": "Включить сценарии",
|
|
||||||
"action": "/scenario?status=[[scenario]]",
|
|
||||||
"state": "{{scenario}}"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "h6",
|
|
||||||
"title": ""
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "file",
|
|
||||||
"state": "firmware.scenario.txt",
|
|
||||||
"style": "width:100%;height:400px",
|
|
||||||
"title": "Сохранить и включить",
|
|
||||||
"action": "/scenario?status=1",
|
|
||||||
"class": "btn btn-block btn-success"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "hr"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "link",
|
|
||||||
"title": "Очистить все логи",
|
|
||||||
"action": "/cleanlog",
|
|
||||||
"class": "btn btn-block btn-success"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "link",
|
|
||||||
"title": "Главная",
|
|
||||||
"action": "/page.htm?index",
|
|
||||||
"class": "btn btn-block btn-danger btn-sm"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
Binary file not shown.
BIN
data/favicon.ico
BIN
data/favicon.ico
Binary file not shown.
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
12
data/firmware.c.txt
Normal file
12
data/firmware.c.txt
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
button 1 na Включить#все Реле 0 1
|
||||||
|
button 2 13 Прихожая Реле 0 2
|
||||||
|
button 3 14 Кухня Реле 0 3
|
||||||
|
pwm 1 3 Яркость#коредор: Реле 1023 4
|
||||||
|
pwm 2 4 Яркость#ванная: Реле 510 5
|
||||||
|
analog adc 0 Аналоговый#вход Датчики fill-gauge 1 1023 1 1023 6
|
||||||
|
logging adc 1 100 Аналоговый#вход Датчики 7
|
||||||
|
|
||||||
|
//Это демо конфигурация. В ней показано как связать кнопки c помощью сценариев
|
||||||
|
//Кнопка номер 1 связана с кнопкой 2, 3 и с pwm 2
|
||||||
|
//Так же продемонстрированна система логгирования данных строкой logging
|
||||||
|
//1 - это интервал между точками в минутах, 100 это количество точек
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
button 1 na Включить#все Реле 0 1
|
|
||||||
button 2 13 Прихожая Реле 0 2
|
|
||||||
button 3 14 Кухня Реле 0 3
|
|
||||||
pwm 1 3 Яркость#коредор: Реле 1023 4
|
|
||||||
pwm 2 4 Яркость#ванная: Реле 510 5
|
|
||||||
analog 0 Аналоговый#вход,#% Датчики progress-round 1 1024 1 1024 6
|
|
||||||
@@ -8,3 +8,6 @@ buttonSet 2 0
|
|||||||
buttonSet 3 0
|
buttonSet 3 0
|
||||||
pwmSet 2 0
|
pwmSet 2 0
|
||||||
end
|
end
|
||||||
|
adc > 50
|
||||||
|
buttonSet 2 1
|
||||||
|
end
|
||||||
BIN
data/icon.jpeg
Normal file
BIN
data/icon.jpeg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 15 KiB |
Binary file not shown.
@@ -1,96 +1,69 @@
|
|||||||
{
|
{
|
||||||
"configs": [
|
"configs": [
|
||||||
"/config.live.json",
|
"/config.live.json",
|
||||||
"/config.setup.json"
|
"/config.setup.json",
|
||||||
|
"/lang/lang.ru.json"
|
||||||
],
|
],
|
||||||
"title": "Главная",
|
"title": "Главная",
|
||||||
"class": "col-sm-offset-1 col-sm-10 col-md-offset-2 col-md-8 col-lg-offset-3 col-lg-6",
|
"class": "col-sm-offset-1 col-sm-10 col-md-offset-2 col-md-8 col-lg-offset-3 col-lg-6",
|
||||||
"content": [
|
"content": [
|
||||||
{
|
{
|
||||||
"type": "h5",
|
"type": "h5",
|
||||||
"title": "{{SSDP}}",
|
"title": "{{name}}",
|
||||||
"class": "alert-warning"
|
"class": "alert-default"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "h4",
|
"type": "text",
|
||||||
"title": "Device ID: {{chipID}}"
|
"class": "alert alert-light",
|
||||||
},
|
"title": "<center><img src='/icon.jpeg' alt='IoT Manager'></center>"
|
||||||
{
|
|
||||||
"type": "h4",
|
|
||||||
"title": "IP address: {{ip}}"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "h4",
|
|
||||||
"title": "Uptime: {{uptime}}"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "h4",
|
|
||||||
"title": "Build version: {{firmware_version}}"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "h4",
|
|
||||||
"title": "SPIFFS version: 2.3.1"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "hr"
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "link",
|
"type": "link",
|
||||||
"title": "Конфигурация устройства",
|
"title": "Конфигурация устройства",
|
||||||
"action": "/page.htm?configuration",
|
"action": "/?set.device",
|
||||||
"class": "btn btn-block btn-primary"
|
"class": "btn btn-block btn-default"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "hr"
|
"type": "link",
|
||||||
|
"title": "Список других устройств в сети",
|
||||||
|
"action": "/?set.udp",
|
||||||
|
"class": "btn btn-block btn-default"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "link",
|
"type": "link",
|
||||||
"title": "Конфигурация WIFI",
|
"title": "Конфигурация WIFI",
|
||||||
"action": "/page.htm?setup",
|
"action": "/?set.wifi",
|
||||||
"class": "btn btn-block btn-success"
|
"class": "btn btn-block btn-default"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "link",
|
"type": "link",
|
||||||
"title": "Конфигурация MQTT",
|
"title": "Конфигурация MQTT",
|
||||||
"action": "/page.htm?mqtt",
|
"action": "/?set.mqtt",
|
||||||
"class": "btn btn-block btn-success"
|
"class": "btn btn-block btn-default"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "link",
|
"type": "link",
|
||||||
"title": "Конфигурация push",
|
"title": "Конфигурация push",
|
||||||
"action": "/page.htm?pushingbox",
|
"action": "/?set.push",
|
||||||
"class": "btn btn-block btn-success"
|
"class": "btn btn-block btn-default"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "hr"
|
"type": "link",
|
||||||
},
|
"title": "Утилиты",
|
||||||
{
|
"action": "/?set.utilities",
|
||||||
"type": "h3",
|
"class": "btn btn-block btn-default"
|
||||||
"name": "my-block",
|
|
||||||
"style": "position:fixed;top:50%;left:50%;width:400px;margin-left:-200px;text-align:center;",
|
|
||||||
"class": "hidden"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "button",
|
|
||||||
"title": "Обновить прошивку",
|
|
||||||
"action": "/upgrade",
|
|
||||||
"response": "[[my-block]]",
|
|
||||||
"class": "btn btn-block btn-success"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "hr"
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "link",
|
"type": "link",
|
||||||
"title": "Скачать приложение IoT Manager для android",
|
"title": "Скачать приложение IoT Manager для android",
|
||||||
"action": "https://play.google.com/store/apps/details?id=ru.esp8266.iotmanager",
|
"action": "https://play.google.com/store/apps/details?id=ru.esp8266.iotmanager",
|
||||||
"class": "btn btn-block btn-warning"
|
"class": "btn btn-block btn-default"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "link",
|
"type": "link",
|
||||||
"title": "Скачать приложение IoT Manager для iphone",
|
"title": "Скачать приложение IoT Manager для iphone",
|
||||||
"action": "https://apps.apple.com/ru/app/iot-manager/id1155934877",
|
"action": "https://apps.apple.com/ru/app/iot-manager/id1155934877",
|
||||||
"class": "btn btn-block btn-warning"
|
"class": "btn btn-block btn-default"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
39
data/lang/lang.ru.json
Normal file
39
data/lang/lang.ru.json
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
{
|
||||||
|
"SetDevConf": "Конфигурация устройства",
|
||||||
|
"SetDevPreset": "Выберите из списка подходящий пресет кофигурации",
|
||||||
|
|
||||||
|
"ButSave":"Сохранить",
|
||||||
|
"ButMainPage":"Главная",
|
||||||
|
|
||||||
|
|
||||||
|
"SetUDPList": "Список других устройств в сети:",
|
||||||
|
"SetUDPWarn1": "После нажатия на кнопку <b>переформировать список устройств</b> ждите примерно минуту, а затем обновите страницу и список появится вновь",
|
||||||
|
|
||||||
|
"SetUDPUpdateList":"Переформировать список устройств",
|
||||||
|
"SetUDPUpdatePage":"Обновить страницу",
|
||||||
|
"SetUDPNameOfDev":"Имя этого устройства:",
|
||||||
|
"SetUDPDateExchange":"Включить обмен данными между устройствами",
|
||||||
|
"SetUDPWarn2":"Если обмен данными включен, то устройства будут обмениваться широковещательными пакетами udp для формирования списка устройств и для осуществления посылки настроек mqtt. Данный обмен создает дополнительную нагрузку на wifi сеть.",
|
||||||
|
|
||||||
|
"SetWiFiNameOfDev":"Имя устройства:",
|
||||||
|
"SetWiFiRouterConnect":"Подключение к WiFi роутеру:",
|
||||||
|
"SetWiFiAccessPoint":"Точка доступа:",
|
||||||
|
"SetWiFiWeb":"Логин и пароль web interface:",
|
||||||
|
"SetWiFiTimeZone":"Временная зона:",
|
||||||
|
"SetWiFiNTP":"Сервер NTP:",
|
||||||
|
"SetWiFiWarn1":"Имя устройства должно состоять из английских букв и иметь длинну от 6 до 12 символов",
|
||||||
|
"SetWiFiWarn2":"После того как вы введете логин пароль от вашего wifi роутера необходимо нажать кнопку сохранить, а затем обязательно нажать кнопку <b>перезагрузить устройство</b> внизу этой страницы",
|
||||||
|
"SetWiFiWarn3":"Устройство постоянно сканирует сеть на наличие wifi. Если роутер отключен, то устройство автоматически перейдет в режим точки доступа. Когда wifi появится устройство автоматически подключится к роутеру снова, и выключит точку доступа",
|
||||||
|
"SetWiFiWarn4":"После изменения поля <b>NTP сервер</b> необходимо перезагрузить устройство",
|
||||||
|
"SetWiFiWarn5":"Светодиод статуса подключения показывает четыре состояния подключения: <br><b>1. мигает редко</b> - идет подключение к wifi <br><b>2. мигает часто</b> - идет подключение к серверу mqtt <br><b>3. горит постоянно</b> - модуль в режиме точки доступа, <br><b>4. не горит</b> - модуль подключен к wifi и к mqtt. <br>Светодиод подключен к gpio2. Если галочка стоит - то использовать этот пин нельзя",
|
||||||
|
|
||||||
|
"SetMQTTServerName":"Имя сервера:",
|
||||||
|
"SetMQTTPort":"Номер порта:",
|
||||||
|
"SetMQTTPrefix":"Префикс:",
|
||||||
|
"SetMQTTUserName":"Имя пользователя:",
|
||||||
|
"SetMQTTPassword":"Пароль:",
|
||||||
|
|
||||||
|
"SetMQTTSendSettings":"Отправить настройки MQTT с этого устройства на все остальные",
|
||||||
|
"SetMQTTWarn1":"Обратите внимание что поле префикс может состоять только из одного слова и одного разделителя: <b>/prefix</b>, вариант вида: <b>/prefix1/prefix2</b> работать не будет. После изменения поля prefix необходимо перезагрузить устройство",
|
||||||
|
"SetMQTTWarn2":"Прежде чем нажимать на кнопку <b>Отправить настройки MQTT</b> сохрание их, если Вы их меняли. Настройки получат и перезапишут все устройства в локальной сети"
|
||||||
|
}
|
||||||
@@ -1,96 +0,0 @@
|
|||||||
{
|
|
||||||
"configs": [
|
|
||||||
"/config.setup.json"
|
|
||||||
],
|
|
||||||
"class":"col-sm-offset-1 col-sm-10 col-md-offset-2 col-md-8 col-lg-offset-3 col-lg-6",
|
|
||||||
"content": [
|
|
||||||
{
|
|
||||||
"type": "h5",
|
|
||||||
"title": "{{SSDP}}",
|
|
||||||
"class":"alert-warning"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "h4",
|
|
||||||
"title": "Server name:"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "input",
|
|
||||||
"title": "",
|
|
||||||
"name":"1",
|
|
||||||
"state": "{{mqttServer}}"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "h4",
|
|
||||||
"title": "Port:"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "input",
|
|
||||||
"title": "",
|
|
||||||
"name":"2",
|
|
||||||
"state": "{{mqttPort}}"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "h4",
|
|
||||||
"title": "Prefix:"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "input",
|
|
||||||
"title": "",
|
|
||||||
"name":"3",
|
|
||||||
"state": "{{mqttPrefix}}"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "h4",
|
|
||||||
"title": "User name:"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "input",
|
|
||||||
"title": "",
|
|
||||||
"name":"4",
|
|
||||||
"state": "{{mqttUser}}"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "h4",
|
|
||||||
"title": "Password:"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "input",
|
|
||||||
"title": "",
|
|
||||||
"name":"5",
|
|
||||||
"state": "{{mqttPass}}"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type":"h3",
|
|
||||||
"name":"my-block",
|
|
||||||
"style":"position:fixed;top:30%;left:50%;width:400px;margin-left:-200px;text-align:center;",
|
|
||||||
"class":"hidden"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "button",
|
|
||||||
"title":"Сохранить",
|
|
||||||
"action": "mqttSave?mqttServer=[[1]]&mqttPort=[[2]]&mqttPrefix=[[3]]&mqttUser=[[4]]&mqttPass=[[5]]",
|
|
||||||
"class": "btn btn-block btn-success",
|
|
||||||
"style": "width:100%;display:inline"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "button",
|
|
||||||
"title":"Проверить соединение с MQTT",
|
|
||||||
"action": "mqttCheck",
|
|
||||||
"response":"[[my-block]]",
|
|
||||||
"class": "btn btn-block btn-success",
|
|
||||||
"style": "width:100%;display:inline"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "link",
|
|
||||||
"title": "Перезагрузить устройство",
|
|
||||||
"action": "javascript:if(confirm(renameBlock(jsonResponse,'Перезагрузить?'))){send_request(this,'/restart?device=ok');}",
|
|
||||||
"class": "btn btn-block btn-warning"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "link",
|
|
||||||
"title": "Главная",
|
|
||||||
"action": "/page.htm?index",
|
|
||||||
"class": "btn btn-block btn-danger btn-sm"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
{
|
|
||||||
"configs": [
|
|
||||||
"/config.setup.json"
|
|
||||||
],
|
|
||||||
"class":"col-sm-offset-1 col-sm-10 col-md-offset-2 col-md-8 col-lg-offset-3 col-lg-6",
|
|
||||||
"content": [
|
|
||||||
{
|
|
||||||
"type": "h5",
|
|
||||||
"title": "{{SSDP}}",
|
|
||||||
"class":"alert-warning"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "h4",
|
|
||||||
"title": "Device id:"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "input",
|
|
||||||
"title": "",
|
|
||||||
"name":"1",
|
|
||||||
"state": "{{pushingbox_id}}"
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
|
||||||
"type": "button",
|
|
||||||
"title":"Сохранить",
|
|
||||||
"action": "pushingboxDate?pushingbox_id=[[1]]",
|
|
||||||
"class": "btn btn-block btn-success",
|
|
||||||
"style": "width:100%;display:inline"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "hr"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "link",
|
|
||||||
"title": "Перезагрузить устройство",
|
|
||||||
"action": "javascript:if(confirm(renameBlock(jsonResponse,'Перезагрузить?'))){send_request(this,'/restart?device=ok');}",
|
|
||||||
"class": "btn btn-block btn-warning"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "link",
|
|
||||||
"title": "Главная",
|
|
||||||
"action": "/page.htm?index",
|
|
||||||
"class": "btn btn-block btn-danger btn-sm"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
143
data/set.device.json
Normal file
143
data/set.device.json
Normal file
@@ -0,0 +1,143 @@
|
|||||||
|
{
|
||||||
|
"configs": [
|
||||||
|
"/config.setup.json",
|
||||||
|
"/config.option.json",
|
||||||
|
"/config.live.json",
|
||||||
|
"/lang/lang.ru.json"
|
||||||
|
],
|
||||||
|
"class": "col-sm-offset-1 col-sm-10",
|
||||||
|
"content": [
|
||||||
|
{
|
||||||
|
"type": "h5",
|
||||||
|
"title": "{{name}}",
|
||||||
|
"class": "alert-default"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "link",
|
||||||
|
"title": "{{ButMainPage}}",
|
||||||
|
"action": "/",
|
||||||
|
"class": "btn btn-block btn-default"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "hr"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "h4",
|
||||||
|
"title": "Device ID: {{chipID}}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "h4",
|
||||||
|
"title": "IP address: {{ip}}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "h4",
|
||||||
|
"title": "Time: {{time}}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "h4",
|
||||||
|
"title": "Uptime: {{uptime}}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "h4",
|
||||||
|
"title": "Build version: {{firmware_version}}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "h4",
|
||||||
|
"title": "SPIFFS version: 2.3.3"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "hr"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "dropdown",
|
||||||
|
"name": "help-url",
|
||||||
|
"class": "btn btn-default",
|
||||||
|
"style": "display:inline",
|
||||||
|
"title": {
|
||||||
|
"#": "{{SetDevPreset}}<span class=\"caret\"></span>",
|
||||||
|
"/set?preset=1": "1.Вкл. выкл. локального реле",
|
||||||
|
"/set?preset=2": "2.Вкл. выкл. локального реле в определенное время",
|
||||||
|
"/set?preset=3": "3.Вкл. выкл. локального реле на определенный период времени",
|
||||||
|
"/set?preset=4": "4.Вкл. выкл. нескольких локальных реле кнопкой в приложении",
|
||||||
|
"/set?preset=5": "5.Вкл. выкл. локального реле физической кнопкой и кнопкой в приложении параллельно (для выключателя света)",
|
||||||
|
"/set?preset=6": "6.Вкл. выкл. нескольких удаленных реле кнопкой в приложении (нужно указать Device ID)",
|
||||||
|
"/set?preset=7": "7.Вкл. выкл. нескольких удаленных реле физической кнопкой (нужно указать Device ID)",
|
||||||
|
"/set?preset=8": "8.Широтно импульсная модуляция",
|
||||||
|
"/set?preset=9": "9.Сенсор DHT11 (темп, влажность) и логгирование",
|
||||||
|
"/set?preset=10": "10.Сенсор DHT22, DHT33, DHT44, AM2302, RHT03 (темп, влажность) и логгирование",
|
||||||
|
"/set?preset=11": "11.Аналоговый сенсор и логгирование",
|
||||||
|
"/set?preset=12": "12.Cенсор bmp280 (темп, давление) и логгирование",
|
||||||
|
"/set?preset=13": "13.Cенсор bme280 (темп, давление, влажность, высота) и логгирование",
|
||||||
|
"/set?preset=14": "12.Сенсор DS18B20 (темп) и логгирование",
|
||||||
|
"/set?preset=15": "13.Термостат на DS18B20 с переключением в ручной режим и логгированием",
|
||||||
|
"/set?preset=16": "14.Котроль уровня в баке (датчик расстояния) на сенсорах: JSN-SR04T, HC-SR04, HY-SRF05 и логгирование",
|
||||||
|
"/set?preset=17": "15.Датчик движения включающий свет",
|
||||||
|
"/set?preset=18": "16.Охранный датчик движения",
|
||||||
|
"/set?preset=19": "17.Система управления шаговыми двигателями на основе драйвера A4988 (открытие закрытие штор)",
|
||||||
|
"/set?preset=20": "18.Система управления сервоприводами",
|
||||||
|
"/set?preset=21": "Настройки по умолчанию"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "h2",
|
||||||
|
"title": "{{SetDevConf}}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "file",
|
||||||
|
"state": "firmware.c.txt",
|
||||||
|
"style": "width:100%;height:350px",
|
||||||
|
"title": "Сохранить",
|
||||||
|
"action": "/set?devinit",
|
||||||
|
"class": "btn btn-block btn-default"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "h2",
|
||||||
|
"title": "Сценарии"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "checkbox",
|
||||||
|
"name": "scen",
|
||||||
|
"title": "Включить сценарии",
|
||||||
|
"action": "/set?scen=[[scen]]",
|
||||||
|
"state": "{{scen}}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "file",
|
||||||
|
"state": "firmware.s.txt",
|
||||||
|
"style": "width:100%;height:350px",
|
||||||
|
"title": "Сохранить",
|
||||||
|
"action": "/set?sceninit",
|
||||||
|
"class": "btn btn-block btn-default"
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"type": "link",
|
||||||
|
"title": "Инструкция к системе автоматизации",
|
||||||
|
"action": "https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/wiki/Instruction",
|
||||||
|
"class": "btn btn-block btn-default"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "link",
|
||||||
|
"title": "Очистить логи сенсоров",
|
||||||
|
"action": "/set?cleanlog",
|
||||||
|
"class": "btn btn-block btn-default"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "hr"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "h3",
|
||||||
|
"name": "my-block",
|
||||||
|
"style": "position:fixed;top:50%;left:50%;width:400px;margin-left:-200px;text-align:center;",
|
||||||
|
"class": "hidden"
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"type": "button",
|
||||||
|
"title": "Обновить прошивку устройства",
|
||||||
|
"action": "/check",
|
||||||
|
"response": "[[my-block]]",
|
||||||
|
"class": "btn btn-block btn-default"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
133
data/set.mqtt.json
Normal file
133
data/set.mqtt.json
Normal file
@@ -0,0 +1,133 @@
|
|||||||
|
{
|
||||||
|
"configs": [
|
||||||
|
"/config.setup.json",
|
||||||
|
"/lang/lang.ru.json"
|
||||||
|
],
|
||||||
|
"class": "col-sm-offset-1 col-sm-10 col-md-offset-2 col-md-8 col-lg-offset-3 col-lg-6",
|
||||||
|
"content": [
|
||||||
|
{
|
||||||
|
"type": "h5",
|
||||||
|
"title": "{{name}}",
|
||||||
|
"class": "alert-default"
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "link",
|
||||||
|
"title": "{{ButMainPage}}",
|
||||||
|
"action": "/",
|
||||||
|
"class": "btn btn-block btn-default"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "hr"
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"type": "h4",
|
||||||
|
"title": "{{SetMQTTServerName}}",
|
||||||
|
"style": "width:60%;float:left;"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "input",
|
||||||
|
"title": "",
|
||||||
|
"name": "mqttServer-arg",
|
||||||
|
"state": "{{mqttServer}}",
|
||||||
|
"style": "width:40%;float:right"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "h4",
|
||||||
|
"title": "{{SetMQTTPort}}",
|
||||||
|
"style": "width:60%;float:left;"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "input",
|
||||||
|
"title": "",
|
||||||
|
"name": "mqttPort-arg",
|
||||||
|
"state": "{{mqttPort}}",
|
||||||
|
"style": "width:40%;float:right"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "h4",
|
||||||
|
"title": "{{SetMQTTPrefix}}",
|
||||||
|
"style": "width:60%;float:left;"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "input",
|
||||||
|
"title": "",
|
||||||
|
"name": "mqttPrefix-arg",
|
||||||
|
"state": "{{mqttPrefix}}",
|
||||||
|
"style": "width:40%;float:right"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "h4",
|
||||||
|
"title": "{{SetMQTTUserName}}",
|
||||||
|
"style": "width:60%;float:left;"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "input",
|
||||||
|
"title": "",
|
||||||
|
"name": "mqttUser-arg",
|
||||||
|
"state": "{{mqttUser}}",
|
||||||
|
"style": "width:40%;float:right"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "h4",
|
||||||
|
"title": "{{SetMQTTPassword}}",
|
||||||
|
"style": "width:60%;float:left;"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "input",
|
||||||
|
"title": "",
|
||||||
|
"name": "mqttPass-arg",
|
||||||
|
"state": "{{mqttPass}}",
|
||||||
|
"style": "width:40%;float:right"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "h3",
|
||||||
|
"name": "my-block",
|
||||||
|
"style": "position:fixed;top:30%;left:50%;width:400px;margin-left:-200px;text-align:center;",
|
||||||
|
"class": "hidden"
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"type": "button",
|
||||||
|
"title": "{{ButSave}}",
|
||||||
|
"style": "width:100%;float:left;",
|
||||||
|
"action": "set?mqttServer=[[mqttServer-arg]]&mqttPort=[[mqttPort-arg]]&mqttPrefix=[[mqttPrefix-arg]]&mqttUser=[[mqttUser-arg]]&mqttPass=[[mqttPass-arg]]",
|
||||||
|
"class": "btn btn-block btn-default"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "button",
|
||||||
|
"style": "width:100%;float:left;",
|
||||||
|
"title": "{{SetMQTTSendSettings}}",
|
||||||
|
"action": "set?mqttsend",
|
||||||
|
"class": "btn btn-block btn-default"
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"type": "button",
|
||||||
|
"style": "width:100%;float:left;",
|
||||||
|
"title": "Проверить соединение с MQTT",
|
||||||
|
"action": "set?mqttcheck",
|
||||||
|
"response": "[[my-block]]",
|
||||||
|
"class": "btn btn-block btn-default"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "text",
|
||||||
|
"style": "width:100%;float:left;",
|
||||||
|
"title": "<div style='margin-top:10px;margin-bottom:10px;'><font color='black'><p style='border: 1px solid #DCDCDC; border-radius: 3px; background-color: #F5F5F5; padding: 10px;'>{{SetMQTTWarn1}}</p></font></div>"
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "text",
|
||||||
|
"style": "width:100%;float:left;",
|
||||||
|
"title": "<div style='margin-top:10px;margin-bottom:10px;'><font color='black'><p style='border: 1px solid #DCDCDC; border-radius: 3px; background-color: #F5F5F5; padding: 10px;'>{{SetMQTTWarn2}}</p></font></div>"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "link",
|
||||||
|
"style": "width:100%;float:left;",
|
||||||
|
"title": "Перезагрузить устройство",
|
||||||
|
"action": "javascript:if(confirm(renameBlock(jsonResponse,'Перезагрузить?'))){send_request(this,'/restart?device=ok');}",
|
||||||
|
"class": "btn btn-block btn-danger"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
51
data/set.push.json
Normal file
51
data/set.push.json
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
{
|
||||||
|
"configs": [
|
||||||
|
"/config.setup.json",
|
||||||
|
"/lang/lang.ru.json"
|
||||||
|
],
|
||||||
|
"class": "col-sm-offset-1 col-sm-10 col-md-offset-2 col-md-8 col-lg-offset-3 col-lg-6",
|
||||||
|
"content": [
|
||||||
|
{
|
||||||
|
"type": "h5",
|
||||||
|
"title": "{{name}}",
|
||||||
|
"class": "alert-default"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "link",
|
||||||
|
"title": "{{ButMainPage}}",
|
||||||
|
"action": "/",
|
||||||
|
"class": "btn btn-block btn-default"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "hr"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "h4",
|
||||||
|
"style": "width:60%;float:left;",
|
||||||
|
"title": "Device id:"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "input",
|
||||||
|
"title": "",
|
||||||
|
"name": "push-arg",
|
||||||
|
"style": "width:40%;float:right",
|
||||||
|
"state": "{{pushingboxid}}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "button",
|
||||||
|
"title": "{{ButSave}}",
|
||||||
|
"action": "set?pushingboxid=[[push-arg]]",
|
||||||
|
"class": "btn btn-block btn-default",
|
||||||
|
"style": "width:100%;display:inline"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "hr"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "link",
|
||||||
|
"title": "Перезагрузить устройство",
|
||||||
|
"action": "javascript:if(confirm(renameBlock(jsonResponse,'Перезагрузить?'))){send_request(this,'/restart?device=ok');}",
|
||||||
|
"class": "btn btn-block btn-danger"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
96
data/set.udp.json
Normal file
96
data/set.udp.json
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
{
|
||||||
|
"configs": [
|
||||||
|
"/config.setup.json",
|
||||||
|
"/lang/lang.ru.json"
|
||||||
|
],
|
||||||
|
"title": "Главная",
|
||||||
|
"class": "col-sm-offset-1 col-sm-10 col-md-offset-2 col-md-8 col-lg-offset-3 col-lg-6",
|
||||||
|
"content": [
|
||||||
|
{
|
||||||
|
"type": "h5",
|
||||||
|
"title": "{{name}}",
|
||||||
|
"class": "alert-default"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "link",
|
||||||
|
"title": "{{ButMainPage}}",
|
||||||
|
"action": "/",
|
||||||
|
"class": "btn btn-block btn-default"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "hr"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "h3",
|
||||||
|
"title": "{{SetUDPList}}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "hr"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "csv",
|
||||||
|
"title": [
|
||||||
|
"html",
|
||||||
|
"html",
|
||||||
|
"html"
|
||||||
|
],
|
||||||
|
"state": "dev.csv",
|
||||||
|
"style": "width:100%;",
|
||||||
|
"class": "nan"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "hr"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "link",
|
||||||
|
"title": "{{SetUDPUpdateList}}",
|
||||||
|
"action": "/set?updatelist",
|
||||||
|
"class": "btn btn-block btn-default"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "link",
|
||||||
|
"title": "{{SetUDPUpdatePage}}",
|
||||||
|
"action": "/set?updatepage",
|
||||||
|
"class": "btn btn-block btn-default"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "hr"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "text",
|
||||||
|
"title": "<div style='margin-top:10px;margin-bottom:10px;'><font color='black'><p style='border: 1px solid #DCDCDC; border-radius: 3px; background-color: #F5F5F5; padding: 10px;'>{{SetUDPWarn1}}</p></font></div>",
|
||||||
|
"style": "width:100%;float:left;"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "h3",
|
||||||
|
"title": "{{SetUDPNameOfDev}}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "input",
|
||||||
|
"title": "{{SetUDPNameOfDev}}",
|
||||||
|
"name": "devname-arg",
|
||||||
|
"state": "{{name}}",
|
||||||
|
"pattern": "[A-Za-z0-9]{6,12}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "button",
|
||||||
|
"title": "{{ButSave}}",
|
||||||
|
"action": "/set?devname=[[devname-arg]]",
|
||||||
|
"class": "btn btn-block btn-default"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "hr"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "checkbox",
|
||||||
|
"name": "udponoff",
|
||||||
|
"title": "{{SetUDPDateExchange}}",
|
||||||
|
"action": "/set?udponoff=[[udponoff]]",
|
||||||
|
"state": "{{udponoff}}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "text",
|
||||||
|
"title": "<div style='margin-top:10px;margin-bottom:10px;'><font color='black'><p style='border: 1px solid #DCDCDC; border-radius: 3px; background-color: #F5F5F5; padding: 10px;'>{{SetUDPWarn2}}</p></font></div>"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
39
data/set.utilities.json
Normal file
39
data/set.utilities.json
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
{
|
||||||
|
"configs": [
|
||||||
|
"/config.live.json",
|
||||||
|
"/config.setup.json",
|
||||||
|
"/lang/lang.ru.json"
|
||||||
|
],
|
||||||
|
"title": "Главная",
|
||||||
|
"class": "col-sm-offset-1 col-sm-10 col-md-offset-2 col-md-8 col-lg-offset-3 col-lg-6",
|
||||||
|
"content": [
|
||||||
|
{
|
||||||
|
"type": "h5",
|
||||||
|
"title": "{{name}}",
|
||||||
|
"class": "alert-default"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "link",
|
||||||
|
"title": "{{ButMainPage}}",
|
||||||
|
"action": "/",
|
||||||
|
"class": "btn btn-block btn-default"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "hr"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "h3",
|
||||||
|
"title": "Сканирование адресов шины i2c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "h4",
|
||||||
|
"title": "{{i2c}}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "link",
|
||||||
|
"title": "Сканировать",
|
||||||
|
"action": "/set?itoc",
|
||||||
|
"class": "btn btn-block btn-default"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
185
data/set.wifi.json
Normal file
185
data/set.wifi.json
Normal file
@@ -0,0 +1,185 @@
|
|||||||
|
{
|
||||||
|
"configs": [
|
||||||
|
"/config.setup.json",
|
||||||
|
"/lang/lang.ru.json"
|
||||||
|
],
|
||||||
|
"title": "Конфигурация",
|
||||||
|
"class": "col-sm-offset-1 col-sm-10 col-md-offset-2 col-md-8 col-lg-offset-3 col-lg-6",
|
||||||
|
"content": [
|
||||||
|
{
|
||||||
|
"type": "h5",
|
||||||
|
"title": "{{name}}",
|
||||||
|
"class": "alert-default"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "link",
|
||||||
|
"title": "{{ButMainPage}}",
|
||||||
|
"action": "/",
|
||||||
|
"class": "btn btn-block btn-default"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "hr"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "h3",
|
||||||
|
"title": "{{SetWiFiNameOfDev}}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "input",
|
||||||
|
"title": "{{SetWiFiNameOfDev}}",
|
||||||
|
"name": "devname-arg",
|
||||||
|
"state": "{{name}}",
|
||||||
|
"pattern": "[A-Za-z0-9]{6,12}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "button",
|
||||||
|
"title": "{{ButSave}}",
|
||||||
|
"action": "set?devname=[[devname-arg]]",
|
||||||
|
"class": "btn btn-block btn-default"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "text",
|
||||||
|
"title": "<div style='margin-top:10px;margin-bottom:10px;'><font color='black'><p style='border: 1px solid #DCDCDC; border-radius: 3px; background-color: #F5F5F5; padding: 10px;'>{{SetWiFiWarn1}}</p></font></div>"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "hr"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "h3",
|
||||||
|
"title": "{{SetWiFiRouterConnect}}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "input",
|
||||||
|
"title": "",
|
||||||
|
"name": "routerssid-arg",
|
||||||
|
"state": "{{routerssid}}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "password",
|
||||||
|
"title": "",
|
||||||
|
"name": "routerpass-arg",
|
||||||
|
"state": "{{routerpass}}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "button",
|
||||||
|
"title": "{{ButSave}}",
|
||||||
|
"class": "btn btn-block btn-default",
|
||||||
|
"action": "set?routerssid=[[routerssid-arg]]&routerpass=[[routerpass-arg]]"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "text",
|
||||||
|
"title": "<div style='margin-top:10px;margin-bottom:10px;'><font color='black'><p style='border: 1px solid #DCDCDC; border-radius: 3px; background-color: #F5F5F5; padding: 10px;'>{{SetWiFiWarn2}}</p></font></div>"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "hr"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "checkbox",
|
||||||
|
"name": "blink",
|
||||||
|
"title": "Включить светодиод статуса подключения",
|
||||||
|
"action": "/set?blink=[[blink]]",
|
||||||
|
"state": "{{blink}}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "text",
|
||||||
|
"title": "<div style='margin-top:10px;margin-bottom:10px;'><font color='black'><p style='border: 1px solid #DCDCDC; border-radius: 3px; background-color: #F5F5F5; padding: 10px;'>{{SetWiFiWarn5}}</p></font></div>"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "hr"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "h3",
|
||||||
|
"title": "{{SetWiFiAccessPoint}}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "input",
|
||||||
|
"title": "",
|
||||||
|
"name": "apssid-arg",
|
||||||
|
"state": "{{apssid}}",
|
||||||
|
"pattern": ".{1,20}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "password",
|
||||||
|
"title": "",
|
||||||
|
"name": "appass-arg",
|
||||||
|
"state": "{{appass}}",
|
||||||
|
"pattern": ".{8,20}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "button",
|
||||||
|
"title": "{{ButSave}}",
|
||||||
|
"action": "set?apssid=[[apssid-arg]]&appass=[[appass-arg]]",
|
||||||
|
"class": "btn btn-block btn-default"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "text",
|
||||||
|
"title": "<div style='margin-top:10px;margin-bottom:10px;'><font color='black'><p style='border: 1px solid #DCDCDC; border-radius: 3px; background-color: #F5F5F5; padding: 10px;'>{{SetWiFiWarn3}}</p></font></div>"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "hr"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "h3",
|
||||||
|
"title": "{{SetWiFiWeb}}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "input",
|
||||||
|
"title": "Логин",
|
||||||
|
"name": "weblogin-arg",
|
||||||
|
"state": "{{weblogin}}",
|
||||||
|
"pattern": ".{1,20}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "password",
|
||||||
|
"title": "Пароль",
|
||||||
|
"name": "webpass-arg",
|
||||||
|
"state": "{{webpass}}",
|
||||||
|
"pattern": ".{1,20}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "button",
|
||||||
|
"title": "{{ButSave}}",
|
||||||
|
"action": "set?weblogin=[[weblogin-arg]]&webpass=[[webpass-arg]]",
|
||||||
|
"class": "btn btn-block btn-default"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "hr"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "h3",
|
||||||
|
"title": "{{SetWiFiTimeZone}}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "input",
|
||||||
|
"title": "",
|
||||||
|
"name": "timezone-arg",
|
||||||
|
"state": "{{timezone}}",
|
||||||
|
"pattern": ".{1,20}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "input",
|
||||||
|
"title": "",
|
||||||
|
"name": "ntp-arg",
|
||||||
|
"state": "{{ntp}}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "button",
|
||||||
|
"title": "{{ButSave}}",
|
||||||
|
"action": "set?timezone=[[timezone-arg]]&ntp=[[ntp-arg]]",
|
||||||
|
"class": "btn btn-block btn-default"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "text",
|
||||||
|
"title": "<div style='margin-top:10px;margin-bottom:10px;'><font color='black'><p style='border: 1px solid #DCDCDC; border-radius: 3px; background-color: #F5F5F5; padding: 10px;'>{{SetWiFiWarn4}}</p></font></div>"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "hr"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "link",
|
||||||
|
"title": "Перезагрузить устройство",
|
||||||
|
"action": "javascript:if(confirm(renameBlock(jsonResponse,'Перезагрузить?'))){send_request(this,'/set?device=ok');}",
|
||||||
|
"class": "btn btn-block btn-danger"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
148
data/setup.json
148
data/setup.json
@@ -1,148 +0,0 @@
|
|||||||
{
|
|
||||||
"configs": [
|
|
||||||
"/config.setup.json"
|
|
||||||
],
|
|
||||||
"title": "Конфигурация",
|
|
||||||
"class":"col-sm-offset-1 col-sm-10 col-md-offset-2 col-md-8 col-lg-offset-3 col-lg-6",
|
|
||||||
"content": [
|
|
||||||
{
|
|
||||||
"type": "h5",
|
|
||||||
"title": "{{SSDP}}",
|
|
||||||
"class":"alert-warning"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "link",
|
|
||||||
"title": "Главная",
|
|
||||||
"action": "/",
|
|
||||||
"class": "btn btn-block btn-danger"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "hr"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "h2",
|
|
||||||
"title": "Имя устройства"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "input",
|
|
||||||
"title": "Имя устройства",
|
|
||||||
"name":"ssdp",
|
|
||||||
"state": "{{SSDP}}",
|
|
||||||
"pattern": "[0-9a-zA-Zа-яА-Я.\\- ]{1,20}"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "button",
|
|
||||||
"title": "Сохранить",
|
|
||||||
"action": "ssdp?ssdp=[[ssdp]]",
|
|
||||||
"class": "btn btn-block btn-success"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "hr"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "h2",
|
|
||||||
"title": "Подключение к Wi-Fi роутеру"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "input",
|
|
||||||
"title":"Сеть",
|
|
||||||
"name":"ssid",
|
|
||||||
"state": "{{ssid}}"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "password",
|
|
||||||
"title": "Введите пароль",
|
|
||||||
"name":"ssidPass",
|
|
||||||
"state": "{{password}}"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "button",
|
|
||||||
"title": "Сохранить",
|
|
||||||
"class": "btn btn-block btn-success",
|
|
||||||
"action": "ssid?ssid=[[ssid]]&password=[[ssidPass]]"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "hr"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "h2",
|
|
||||||
"title": "Точка доступа"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "input",
|
|
||||||
"title": "Имя WI-FI сети",
|
|
||||||
"name":"ssidap",
|
|
||||||
"state": "{{ssidAP}}",
|
|
||||||
"pattern": ".{1,20}"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "password",
|
|
||||||
"title": "Пароль",
|
|
||||||
"name":"ssidApPass",
|
|
||||||
"state": "{{passwordAP}}",
|
|
||||||
"pattern": ".{8,20}"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "button",
|
|
||||||
"title": "Сохранить",
|
|
||||||
"action": "ssidap?ssidAP=[[ssidap]]&passwordAP=[[ssidApPass]]",
|
|
||||||
"class": "btn btn-block btn-success"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "hr"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "h2",
|
|
||||||
"title": "Логин и пароль web interface"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "input",
|
|
||||||
"title": "Логин",
|
|
||||||
"name":"web-login",
|
|
||||||
"state": "{{web_login}}",
|
|
||||||
"pattern": ".{1,20}"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "password",
|
|
||||||
"title": "Пароль",
|
|
||||||
"name":"web-pass",
|
|
||||||
"state": "{{web_pass}}",
|
|
||||||
"pattern": ".{1,20}"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "button",
|
|
||||||
"title": "Сохранить",
|
|
||||||
"action": "web?web_login=[[web-login]]&web_pass=[[web-pass]]",
|
|
||||||
"class": "btn btn-block btn-success"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "hr"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "h2",
|
|
||||||
"title": "Временная зона"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "input",
|
|
||||||
"title": "Логин",
|
|
||||||
"name":"time-zone",
|
|
||||||
"state": "{{timezone}}",
|
|
||||||
"pattern": ".{1,20}"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "button",
|
|
||||||
"title": "Сохранить",
|
|
||||||
"action": "timeZone?timezone=[[time-zone]]",
|
|
||||||
"class": "btn btn-block btn-success"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "hr"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "link",
|
|
||||||
"title": "Перезагрузить устройство",
|
|
||||||
"action": "javascript:if(confirm(renameBlock(jsonResponse,'Перезагрузить?'))){send_request(this,'/restart?device=ok');}",
|
|
||||||
"class": "btn btn-block btn-warning"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
BIN
data/sync.ffs_db
Normal file
BIN
data/sync.ffs_db
Normal file
Binary file not shown.
5
data/widgets/widget.chart.json
Normal file
5
data/widgets/widget.chart.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"widget": "chart",
|
||||||
|
"series": "Temperature, °C",
|
||||||
|
"dateFormat": "HH:mm"
|
||||||
|
}
|
||||||
7
data/widgets/widget.fillGauge.json
Normal file
7
data/widgets/widget.fillGauge.json
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"widget": "fillgauge",
|
||||||
|
"circleColor": "#00FFFF",
|
||||||
|
"textColor": "#FFFFFF",
|
||||||
|
"waveTextColor": "#000000",
|
||||||
|
"waveColor": "#00FFFF"
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user