Global change

This commit is contained in:
Dmitry Borisenko
2020-05-02 12:20:30 +02:00
parent ac5b7e5775
commit a31c303c23
32 changed files with 983 additions and 783 deletions

BIN
CH341SER_WIN_3.5.ZIP Normal file

Binary file not shown.

109
Cmd.ino
View File

@@ -18,9 +18,15 @@ void CMD_init() {
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);
sCmd.addCommand("bmp280T", bmp280T);
sCmd.addCommand("bmp280P", bmp280P);
sCmd.addCommand("bme280T", bme280T);
//sCmd.addCommand("bme280P", bme280P);
sCmd.addCommand("stepper", stepper); sCmd.addCommand("stepper", stepper);
sCmd.addCommand("stepperSet", stepperSet); sCmd.addCommand("stepperSet", stepperSet);
@@ -65,7 +71,7 @@ void button() {
String page_number = sCmd.next(); String page_number = sCmd.next();
jsonWriteStr(optionJson, "button_param" + button_number, button_param); jsonWriteStr(optionJson, "button_param" + button_number, button_param);
jsonWriteStr(configJson, "buttonSet" + button_number, start_state); jsonWriteStr(configJson, "button" + button_number, start_state);
if (isDigitStr (button_param)) { if (isDigitStr (button_param)) {
pinMode(button_param.toInt(), OUTPUT); pinMode(button_param.toInt(), OUTPUT);
@@ -91,7 +97,7 @@ void button() {
str = deleteBeforeDelimiter(str, ","); str = deleteBeforeDelimiter(str, ",");
} }
} }
createWidget (widget_name, page_name, page_number, "widgets/widget.toggle.json", "buttonSet" + button_number); createWidget (widget_name, page_name, page_number, "widgets/widget.toggle.json", "button" + button_number);
} }
void buttonSet() { void buttonSet() {
@@ -124,23 +130,23 @@ void buttonSet() {
} }
} }
eventGen ("buttonSet", button_number); eventGen ("button", button_number);
jsonWriteStr(configJson, "buttonSet" + button_number, button_state); jsonWriteStr(configJson, "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 = jsonRead(configJson, "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 + ",";
jsonWriteStr(configJson, "buttonSet" + button_number, current_state); jsonWriteStr(configJson, "button" + button_number, current_state);
sendSTATUS("buttonSet" + button_number, current_state); sendSTATUS("button" + button_number, current_state);
} }
void pinSet() { void pinSet() {
@@ -174,9 +180,9 @@ void pwm() {
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);
jsonWriteStr(configJson, "pwmSet" + pwm_number, start_state); jsonWriteStr(configJson, "pwm" + pwm_number, start_state);
createWidget (widget_name, page_name, page_number, "widgets/widget.range.json", "pwmSet" + pwm_number); createWidget (widget_name, page_name, page_number, "widgets/widget.range.json", "pwm" + pwm_number);
} }
void pwmSet() { void pwmSet() {
@@ -188,10 +194,10 @@ void pwmSet() {
int pin = jsonReadtoInt(optionJson, "pwm_pin" + pwm_number); int pin = jsonReadtoInt(optionJson, "pwm_pin" + pwm_number);
analogWrite(pin, pwm_state_int); analogWrite(pin, pwm_state_int);
eventGen ("pwmSet", pwm_number); eventGen ("pwm", pwm_number);
jsonWriteStr(configJson, "pwmSet" + pwm_number, pwm_state); jsonWriteStr(configJson, "pwm" + pwm_number, pwm_state);
sendSTATUS("pwmSet" + pwm_number, pwm_state); sendSTATUS("pwm" + pwm_number, pwm_state);
} }
//================================================================================================================== //==================================================================================================================
//==========================================Модуль физической кнопки================================================ //==========================================Модуль физической кнопки================================================
@@ -214,15 +220,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));
jsonWriteStr(configJson, "switchSet" + String(switch_number), "1"); jsonWriteStr(configJson, "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));
jsonWriteStr(configJson, "switchSet" + String(switch_number), "0"); jsonWriteStr(configJson, "switch" + String(switch_number), "0");
} }
} }
switch_number++; switch_number++;
@@ -240,14 +246,14 @@ void inputDigit() {
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();
jsonWriteStr(configJson, "digitSet" + number, start_state); jsonWriteStr(configJson, "digit" + number, start_state);
createWidget (widget_name, page_name, page_number, "widgets/widget.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();
jsonWriteStr(configJson, "digitSet" + number, value); jsonWriteStr(configJson, "digit" + number, value);
sendSTATUS("digitSet" + number, value); sendSTATUS("digit" + number, value);
} }
//===================================================================================================================================== //=====================================================================================================================================
//=========================================Добавление окна ввода времени=============================================================== //=========================================Добавление окна ввода времени===============================================================
@@ -260,14 +266,14 @@ void inputTime() {
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();
jsonWriteStr(configJson, "timeSet" + number, start_state); jsonWriteStr(configJson, "time" + number, start_state);
createWidget (widget_name, page_name, page_number, "widgets/widget.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();
jsonWriteStr(configJson, "timeSet" + number, value); jsonWriteStr(configJson, "time" + number, value);
sendSTATUS("timeSet" + number, value); sendSTATUS("time" + number, value);
} }
void handle_time_init() { void handle_time_init() {
@@ -276,8 +282,8 @@ void handle_time_init() {
String tmp = GetTime(); String tmp = GetTime();
jsonWriteStr(configJson, "time", tmp); jsonWriteStr(configJson, "time", tmp);
tmp.replace(":", "-"); tmp.replace(":", "-");
jsonWriteStr(configJson, "timenowSet", tmp); jsonWriteStr(configJson, "timenow", tmp);
eventGen ("timenowSet", ""); eventGen ("timenow", "");
}, nullptr, true); }, nullptr, true);
} }
@@ -291,7 +297,7 @@ void text() {
String page_name = sCmd.next(); String page_name = sCmd.next();
String page_number = sCmd.next(); String page_number = sCmd.next();
createWidget (widget_name, page_name, page_number, "widgets/widget.anyData.json", "textSet" + number); createWidget (widget_name, page_name, page_number, "widgets/widget.anyData.json", "text" + number);
} }
@@ -309,8 +315,8 @@ void textSet() {
text = text + " " + GetDataDigital() + " " + time; text = text + " " + GetDataDigital() + " " + time;
} }
jsonWriteStr(configJson, "textSet" + number, text); jsonWriteStr(configJson, "text" + number, text);
sendSTATUS("textSet" + number, text); sendSTATUS("text" + number, text);
} }
//===================================================================================================================================== //=====================================================================================================================================
@@ -418,9 +424,9 @@ void servo_() {
jsonWriteStr(optionJson, "s_min_deg" + servo_number, min_deg); jsonWriteStr(optionJson, "s_min_deg" + servo_number, min_deg);
jsonWriteStr(optionJson, "s_max_deg" + servo_number, max_deg); jsonWriteStr(optionJson, "s_max_deg" + servo_number, max_deg);
jsonWriteStr(configJson, "servoSet" + servo_number, start_state); jsonWriteStr(configJson, "servo" + servo_number, start_state);
createWidgetParam (widget_name, page_name, page_number, "widgets/widget.range.json", "servoSet" + servo_number, "min", min_value, "max", max_value, "k", "1"); createWidgetParam (widget_name, page_name, page_number, "widgets/widget.range.json", "servo" + servo_number, "min", min_value, "max", max_value, "k", "1");
} }
void servoSet() { void servoSet() {
@@ -456,10 +462,10 @@ void servoSet() {
//Serial.println(servo_state_int); //Serial.println(servo_state_int);
eventGen ("servoSet", servo_number); eventGen ("servo", servo_number);
jsonWriteStr(configJson, "servoSet" + servo_number, servo_state); jsonWriteStr(configJson, "servo" + servo_number, servo_state);
sendSTATUS("servoSet" + servo_number, servo_state); sendSTATUS("servo" + servo_number, servo_state);
} }
//==================================================================================================================================================== //====================================================================================================================================================
/* /*
@@ -471,14 +477,14 @@ void servoSet() {
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();
jsonWriteStr(configJson, "inputTextSet" + number, start_state); jsonWriteStr(configJson, "inputText" + number, start_state);
createWidget (widget_name, page_name, page_number, "widgets/widget.inputText.json", "inputTextSet" + number); createWidget (widget_name, page_name, page_number, "widgets/widget.inputText.json", "inputText" + number);
} }
void inputTextSet() { void inputTextSet() {
String number = sCmd.next(); String number = sCmd.next();
String value = sCmd.next(); String value = sCmd.next();
jsonWriteStr(configJson, "inputTextSet" + number, value); jsonWriteStr(configJson, "inputText" + number, value);
sendSTATUS("inputTextSet" + number, value); sendSTATUS("inputText" + number, value);
} }
void inputTime() { void inputTime() {
@@ -489,16 +495,16 @@ void servoSet() {
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();
jsonWriteStr(configJson, "inputTimeSet" + number, start_state); jsonWriteStr(configJson, "inputTime" + number, start_state);
createWidget (widget_name, page_name, page_number, "widgets/widget.inputTime.json", "inputTimeSet" + number); createWidget (widget_name, page_name, page_number, "widgets/widget.inputTime.json", "inputTime" + number);
} }
void inputTimeSet() { void inputTimeSet() {
String number = sCmd.next(); String number = sCmd.next();
String value = sCmd.next(); String value = sCmd.next();
value.replace(":", "."); value.replace(":", ".");
jsonWriteStr(configJson, "inputTimeSet" + number, value); jsonWriteStr(configJson, "inputTime" + number, value);
value.replace(".", ":"); value.replace(".", ":");
sendSTATUS("inputTimeSet" + number, value); sendSTATUS("inputTime" + number, value);
} }
@@ -510,14 +516,14 @@ void servoSet() {
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();
jsonWriteStr(configJson, "inputDateSet" + number, start_state); jsonWriteStr(configJson, "inputDate" + number, start_state);
createWidget (widget_name, page_name, page_number, "widgets/widget.inputDate.json", "inputDateSet" + number); createWidget (widget_name, page_name, page_number, "widgets/widget.inputDate.json", "inputDate" + number);
} }
void inputDateSet() { void inputDateSet() {
String number = sCmd.next(); String number = sCmd.next();
String value = sCmd.next(); String value = sCmd.next();
jsonWriteStr(configJson, "inputDateSet" + number, value); jsonWriteStr(configJson, "inputDate" + number, value);
sendSTATUS("inputDateSet" + number, value); sendSTATUS("inputDate" + number, value);
} }
*/ */
//=================================================Глобальные команды удаленного управления=========================================================== //=================================================Глобальные команды удаленного управления===========================================================
@@ -531,7 +537,7 @@ void mqttOrderSend() {
//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() {
@@ -587,6 +593,7 @@ void stringExecution(String str) {
String tmp = selectToMarker (str, "\n"); String tmp = selectToMarker (str, "\n");
sCmd.readStr(tmp); sCmd.readStr(tmp);
str = deleteBeforeDelimiter(str, "\n"); str = deleteBeforeDelimiter(str, "\n");
} }
} }

View File

@@ -5,26 +5,34 @@ void All_init() {
if (request->hasArg("arg")) { if (request->hasArg("arg")) {
value = request->getParam("arg")->value(); value = request->getParam("arg")->value();
} }
if (value == "0") { if (value == "0") { //выкл сценариев
jsonWriteStr(configSetup, "scenario", value); jsonWriteStr(configSetup, "scenario", value);
saveConfig(); saveConfig();
Scenario_init(); Scenario_init();
request->send(200, "text/text", "OK");
} }
if (value == "1") { if (value == "1") { //вкл сценариев
jsonWriteStr(configSetup, "scenario", value); jsonWriteStr(configSetup, "scenario", value);
saveConfig(); saveConfig();
Scenario_init(); Scenario_init();
request->send(200, "text/text", "OK");
} }
if (value == "2") { if (value == "2") { //инициализация
Device_init(); Device_init();
request->send(200, "text/text", "OK");
} }
if (value == "3") { if (value == "3") {
clean_log_date(); clean_log_date();
request->send(200, "text/text", "OK");
} }
if (value == "4") { if (value == "4") {
Scenario_init(); Scenario_init();
request->send(200, "text/text", "OK");
}
if (value == "5") {
i2c_scanning = true;
request->redirect("/?utilities");
} }
request->send(200, "text/text", "OK"); // отправляем ответ о выполнении
}); });
prsets_init(); prsets_init();
@@ -35,16 +43,33 @@ 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); analog_value_names_list = "";
ts.remove(DHTH); enter_to_analog_counter = 0; //ANALOG1 - 1;
ts.remove(DHTC);
ts.remove(DHTP); level_value_name = "";
ts.remove(DHTD);
ts.remove(STEPPER1); dhtT_value_name = "";
ts.remove(STEPPER2); dhtH_value_name = "";
bmp280T_value_name = "";
bmp280P_value_name = "";
bme280T_value_name = "";
for (int i = 0; i <= sensors_count; i++) {
sensors_reading_map[i] = 0;
}
for (int i = LOG1; i <= LOG5; i++) {
ts.remove(i);
}
// for (int i = LEVEL; i <= STEPPER2; i++) {
// ts.remove(i);
// }
#ifdef layout_in_ram #ifdef layout_in_ram
all_widgets = ""; all_widgets = "";
@@ -137,7 +162,7 @@ void prsets_init() {
writeFile("firmware.c.txt", readFile("configs/stepper.c.txt", 2048)); writeFile("firmware.c.txt", readFile("configs/stepper.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/stepper.s.txt", 2048)); writeFile("firmware.s.txt", readFile("configs/stepper.s.txt", 2048));
} }
if (value == "18") { if (value == "18") {
writeFile("firmware.c.txt", readFile("configs/servo.c.txt", 2048)); writeFile("firmware.c.txt", readFile("configs/servo.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/servo.s.txt", 2048)); writeFile("firmware.s.txt", readFile("configs/servo.s.txt", 2048));
} }
@@ -203,7 +228,7 @@ void statistics() {
//----------------------------------------------------------------- //-----------------------------------------------------------------
#ifdef ESP8266 #ifdef ESP8266
urls += ESP.getResetReason(); urls += ESP.getResetReason();
Serial.println(ESP.getResetReason()); //Serial.println(ESP.getResetReason());
#endif #endif
#ifdef ESP32 #ifdef ESP32
urls += "Power on"; urls += "Power on";

View File

@@ -1,72 +1,51 @@
//===============================================Логирование============================================================ //===============================================Логирование============================================================
//logging temp1 1 10 fast Температура Датчики 2
void logging() { void logging() {
String value_name = sCmd.next();
static boolean flag = true;
String sensor_name = sCmd.next();
String period_min = sCmd.next(); String period_min = sCmd.next();
String maxCount = sCmd.next(); String maxCount = sCmd.next();
String optimization = sCmd.next();
String widget_name = sCmd.next(); String widget_name = sCmd.next();
widget_name.replace("#", " "); widget_name.replace("#", " ");
String page_name = sCmd.next(); String page_name = sCmd.next();
String page_number = sCmd.next(); String page_number = sCmd.next();
logging_value_names_list += value_name + ",";
if (optimization == "fast") chart_data_in_solid_array = true; enter_to_logging_counter++; //считаем количество входов в эту функцию
if (optimization == "slow") chart_data_in_solid_array = false; jsonWriteStr(optionJson, 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 (sensor_name == "analog") jsonWriteStr(optionJson, "analog_logging_count", maxCount); if (enter_to_logging_counter == LOG1) {
if (sensor_name == "level") jsonWriteStr(optionJson, "level_logging_count", maxCount); ts.add(LOG1, period_min.toInt() * 1000 * 60, [&](void*) {
if (sensor_name == "dallas") jsonWriteStr(optionJson, "dallas_logging_count", maxCount); String tmp_buf_1 = selectFromMarkerToMarker(logging_value_names_list, ",", 0);
if (sensor_name == "dhtT") jsonWriteStr(optionJson, "dhtT_logging_count", maxCount); deleteOldDate("log." + tmp_buf_1 + ".txt", jsonReadtoInt(optionJson, tmp_buf_1 + "_c"), jsonRead(configJson, tmp_buf_1));
if (sensor_name == "dhtH") jsonWriteStr(optionJson, "dhtH_logging_count", maxCount); Serial.println("[i] LOGGING for sensor '" + tmp_buf_1 + "' done");
}, nullptr, false);
if (sensor_name == "analog") createChart (widget_name, page_name, page_number, "widgets/widget.chart.json", "loganalog", maxCount);
if (sensor_name == "level") createChart (widget_name, page_name, page_number, "widgets/widget.chart.json", "loglevel", maxCount);
if (sensor_name == "dallas") createChart (widget_name, page_name, page_number, "widgets/widget.chart.json", "logdallas", maxCount);
if (sensor_name == "dhtT") createChart (widget_name, page_name, page_number, "widgets/widget.chart.json", "logdhtT", maxCount);
if (sensor_name == "dhtH") createChart (widget_name, page_name, page_number, "widgets/widget.chart.json", "logdhtH", maxCount);
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"));
}, nullptr, true);
} }
if (enter_to_logging_counter == LOG2) {
if (sensor_name == "level") { ts.add(LOG2, period_min.toInt() * 1000 * 60, [&](void*) {
flagLoggingLevel = true; String tmp_buf_2 = selectFromMarkerToMarker(logging_value_names_list, ",", 1);
ts.remove(LEVEL_LOG); deleteOldDate("log." + tmp_buf_2 + ".txt", jsonReadtoInt(optionJson, tmp_buf_2 + "_c"), jsonRead(configJson, tmp_buf_2));
ts.add(LEVEL_LOG, period_min.toInt() * 1000 * 60, [&](void*) { Serial.println("[i] LOGGING for sensor '" + tmp_buf_2 + "' done");
deleteOldDate("log.level.txt", jsonReadtoInt(optionJson, "level_logging_count"), jsonRead(configJson, "level")); }, nullptr, false);
}, nullptr, true);
} }
if (enter_to_logging_counter == LOG3) {
if (sensor_name == "dallas") { ts.add(LOG3, period_min.toInt() * 1000 * 60, [&](void*) {
flagLoggingDallas = true; String tmp_buf_3 = selectFromMarkerToMarker(logging_value_names_list, ",", 2);
ts.remove(DALLAS_LOG); deleteOldDate("log." + tmp_buf_3 + ".txt", jsonReadtoInt(optionJson, tmp_buf_3 + "_c"), jsonRead(configJson, tmp_buf_3));
ts.add(DALLAS_LOG, period_min.toInt() * 1000 * 60, [&](void*) { Serial.println("[i] LOGGING for sensor '" + tmp_buf_3 + "' done");
deleteOldDate("log.dallas.txt", jsonReadtoInt(optionJson, "dallas_logging_count"), jsonRead(configJson, "dallas")); }, nullptr, false);
}, nullptr, true);
} }
if (enter_to_logging_counter == LOG4) {
if (sensor_name == "dhtT") { ts.add(LOG4, period_min.toInt() * 1000 * 60, [&](void*) {
flagLoggingdhtT = true; String tmp_buf_4 = selectFromMarkerToMarker(logging_value_names_list, ",", 3);
ts.remove(dhtT_LOG); deleteOldDate("log." + tmp_buf_4 + ".txt", jsonReadtoInt(optionJson, tmp_buf_4 + "_c"), jsonRead(configJson, tmp_buf_4));
ts.add(dhtT_LOG, period_min.toInt() * 1000 * 60, [&](void*) { Serial.println("[i] LOGGING for sensor '" + tmp_buf_4 + "' done");
deleteOldDate("log.dhtT.txt", jsonReadtoInt(optionJson, "dhtT_logging_count"), jsonRead(configJson, "dhtT")); }, nullptr, false);
}, nullptr, true);
} }
if (enter_to_logging_counter == LOG5) {
if (sensor_name == "dhtH") { ts.add(LOG5, period_min.toInt() * 1000 * 60, [&](void*) {
flagLoggingdhtH = true; String tmp_buf_5 = selectFromMarkerToMarker(logging_value_names_list, ",", 4);
ts.remove(dhtH_LOG); deleteOldDate("log." + tmp_buf_5 + ".txt", jsonReadtoInt(optionJson, tmp_buf_5 + "_c"), jsonRead(configJson, tmp_buf_5));
ts.add(dhtH_LOG, period_min.toInt() * 1000 * 60, [&](void*) { Serial.println("[i] LOGGING for sensor '" + tmp_buf_5 + "' done");
deleteOldDate("log.dhtH.txt", jsonReadtoInt(optionJson, "dhtH_logging_count"), jsonRead(configJson, "dhtH")); }, nullptr, false);
}, nullptr, true);
} }
} }
@@ -100,52 +79,51 @@ void deleteOldDate(String file, int seted_number_of_lines, String date_to_add) {
//=========================================Выбор какие данные отправлять================================================================== //=========================================Выбор какие данные отправлять==================================================================
void choose_log_date_and_send() { void choose_log_date_and_send() {
String all_line = logging_value_names_list;
if (flagLoggingAnalog) sendLogData("log.analog.txt", "loganalog", chart_data_in_solid_array); while (all_line.length() != 0) {
if (flagLoggingLevel) sendLogData("log.level.txt", "loglevel", chart_data_in_solid_array); String tmp = selectToMarker (all_line, ",");
if (flagLoggingDallas) sendLogData("log.dallas.txt", "logdallas", chart_data_in_solid_array); sendLogData("log." + tmp + ".txt", tmp + "_ch");
if (flagLoggingdhtT) sendLogData("log.dhtT.txt", "logdhtT", chart_data_in_solid_array); all_line = deleteBeforeDelimiter(all_line, ",");
if (flagLoggingdhtH) sendLogData("log.dhtH.txt", "logdhtH", chart_data_in_solid_array); }
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");
}
} }
//=========================================Отправка данных=================================================================================== /*
void sendLogData(String file, String topic, boolean type) { //----------------------------------------------
if (type) {
//----------------------------------------------
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");
}
//----------------------------------------------
} else {
//----------------------------------------------
File configFile = SPIFFS.open("/" + file, "r"); File configFile = SPIFFS.open("/" + file, "r");
if (!configFile) { if (!configFile) {
return; return;
@@ -160,14 +138,14 @@ void sendLogData(String file, String topic, boolean type) {
sendCHART(topic, final_line); sendCHART(topic, final_line);
} }
getMemoryLoad("[i] after send log date"); getMemoryLoad("[i] after send log date");
} */
//----------------------------------------------
}
//=========================================Очистка данных=================================================================================== //=========================================Очистка данных===================================================================================
void clean_log_date() { void clean_log_date() {
SPIFFS.remove("/log.analog.txt"); String all_line = logging_value_names_list;
SPIFFS.remove("/log.level.txt"); while (all_line.length() != 0) {
SPIFFS.remove("/log.dallas.txt"); String tmp = selectToMarker (all_line, ",");
SPIFFS.remove("/log.dhtT.txt"); SPIFFS.remove("/log." + tmp + ".txt");
SPIFFS.remove("/log.dhtH.txt"); all_line = deleteBeforeDelimiter(all_line, ",");
}
all_line = "";
} }

View File

@@ -17,10 +17,6 @@ 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
if (param_name.indexOf("timenow") != -1){
param_name = param_name + "Set";
}
String order = jsonRead(optionJson, "scenario_status"); //читаем весь файл событий String order = jsonRead(optionJson, "scenario_status"); //читаем весь файл событий
String param = selectToMarker (order, ","); //читаем первое событие из файла событий String param = selectToMarker (order, ","); //читаем первое событие из файла событий
if (param_name == param) { //если поступившее событие равно событию заданному buttonSet1 в файле начинаем его обработку if (param_name == param) { //если поступившее событие равно событию заданному buttonSet1 в файле начинаем его обработку
@@ -28,11 +24,11 @@ void handleScenario() {
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 = jsonRead(configJson, value);
} }
if (value.indexOf("time") != -1) { if (value.indexOf("time") != -1) {
value = add_set(value); // value = add_set(value);
value = jsonRead(configJson, value); value = jsonRead(configJson, value);
} }
boolean flag = false; //если одно из значений совпало то только тогда начинаем выполнять комнады boolean flag = false; //если одно из значений совпало то только тогда начинаем выполнять комнады

View File

@@ -1,6 +1,90 @@
//=============================================================================================================================== void sensors_init() {
//=========================================Модуль аналогового сенсора============================================================ ts.add(SENSORS, 1000, [&](void*) {
static int counter;
counter++;
if (sensors_reading_map[0] == 1) level_reading();
if (counter > 10) {
counter = 0;
if (sensors_reading_map[1] == 1) analog_reading1();
if (sensors_reading_map[2] == 1) analog_reading2();
if (sensors_reading_map[3] == 1) dallas_reading();
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();
if (sensors_reading_map[9] == 1) bmp280T_rading();
if (sensors_reading_map[10] == 1) bmp280P_reading();
if (sensors_reading_map[11] == 1) bme280T_reading();
}
}, nullptr, true);
}
//=========================================================================================================================================
//=========================================Модуль измерения уровня в баке==================================================================
//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(optionJson, "e_lev", empty_level);
jsonWriteStr(optionJson, "f_lev", full_level);
jsonWriteStr(optionJson, "trig", trig);
jsonWriteStr(optionJson, "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 = jsonReadtoInt(optionJson, "trig");
int echo = jsonReadtoInt(optionJson, "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,
jsonReadtoInt(optionJson, "e_lev"),
jsonReadtoInt(optionJson, "f_lev"), 0, 100);
jsonWriteInt(configJson, level_value_name, level);
eventGen (level_value_name, "");
sendSTATUS(level_value_name, String(level));
Serial.println("[i] sensor '" + level_value_name + "' data: " + String(level));
}
}
//=========================================================================================================================================
//=========================================Модуль аналогового сенсора======================================================================
//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 widget_name = sCmd.next(); String widget_name = sCmd.next();
String page_name = sCmd.next(); String page_name = sCmd.next();
@@ -10,90 +94,65 @@ 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();
jsonWriteStr(optionJson, "analog_start", analog_start); analog_value_names_list += value_name + ",";
jsonWriteStr(optionJson, "analog_end", analog_end); enter_to_analog_counter++;
jsonWriteStr(optionJson, "analog_start_out", analog_start_out); jsonWriteStr(optionJson, value_name + "_st", analog_start);
jsonWriteStr(optionJson, "analog_end_out", analog_end_out); jsonWriteStr(optionJson, value_name + "_end", analog_end);
choose_widget_and_create(widget_name, page_name, page_number, type, "analog"); jsonWriteStr(optionJson, value_name + "_st_out", analog_start_out);
ts.add(ANALOG_, analog_update_int, [&](void*) { jsonWriteStr(optionJson, 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
jsonWriteInt(configJson, "analog_in", analog_in); int analog = map(analog_in,
int analog = map(analog_in, jsonReadtoInt(optionJson, value_name + "_st") ,
jsonReadtoInt(optionJson, "analog_start") , jsonReadtoInt(optionJson, value_name + "_end"),
jsonReadtoInt(optionJson, "analog_end"), jsonReadtoInt(optionJson, value_name + "_st_out"),
jsonReadtoInt(optionJson, "analog_start_out"), jsonReadtoInt(optionJson, value_name + "_end_out"));
jsonReadtoInt(optionJson, "analog_end_out")); jsonWriteInt(configJson, value_name, analog);
jsonWriteInt(configJson, "analog", analog); eventGen (value_name, "");
// if (analog_old != analog) { sendSTATUS(value_name, String(analog));
eventGen ("analog", ""); Serial.println("[i] sensor '" + value_name + "' data: " + String(analog));
sendSTATUS("analog", 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 widget_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,
jsonWriteStr(optionJson, "empty_level", empty_level); jsonReadtoInt(optionJson, value_name + "_st") ,
jsonWriteStr(optionJson, "full_level", full_level); jsonReadtoInt(optionJson, value_name + "_end"),
pinMode(14, OUTPUT); jsonReadtoInt(optionJson, value_name + "_st_out"),
pinMode(12, INPUT); jsonReadtoInt(optionJson, value_name + "_end_out"));
choose_widget_and_create(widget_name, page_name, page_number, type, "level"); jsonWriteInt(configJson, 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;
jsonWriteInt(configJson, "level_in", distance_cm);
level = map(distance_cm,
jsonReadtoInt(optionJson, "empty_level"),
jsonReadtoInt(optionJson, "full_level"), 0, 100);
jsonWriteInt(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));
}
//}
level_old = level;
}
}, nullptr, true);
} }
//========================================================================================================================================== //=========================================================================================================================================
//=========================================Модуль температурного сенсора ds18b20============================================================ //=========================================Модуль температурного сенсора ds18b20===========================================================
void dallas() { void dallas() {
String value_name = sCmd.next();
String pin = sCmd.next(); String pin = sCmd.next();
String address = sCmd.next();
String widget_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();
@@ -103,125 +162,120 @@ void dallas() {
sensors.begin(); sensors.begin();
sensors.setResolution(12); sensors.setResolution(12);
choose_widget_and_create(widget_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;
float temp = 0;
static float temp_old;
sensors.requestTemperatures();
temp = sensors.getTempCByIndex(0);
jsonWriteStr(configJson, "dallas", String(temp));
//if (temp_old != temp) {
eventGen ("dallas", "");
sendSTATUS("dallas", String(temp));
if (client.connected()) {
Serial.println("[i] sensor 'dallas' send date " + String(temp));
}
//}
temp_old = temp;
}, nullptr, true);
} }
void dallas_reading() {
float temp = 0;
sensors.requestTemperatures();
temp = sensors.getTempCByIndex(0);
jsonWriteStr(configJson, "dallas", String(temp));
eventGen ("dallas", "");
sendSTATUS("dallas", String(temp));
Serial.println("[i] sensor 'dallas' send date " + String(temp));
}
//====================================================================================================================== //=========================================================================================================================================
//=========================================Модуль сенсоров DHT========================================================== //=========================================Модуль сенсоров DHT=============================================================================
//dhtT t 2 dht11 Температура#DHT,#t°C Датчики any-data 1
void dhtT() { void dhtT() {
String sensor_type = sCmd.next(); String value_name = sCmd.next();
String pin = sCmd.next(); String pin = sCmd.next();
String sensor_type = sCmd.next();
String widget_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 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_widget_and_create(widget_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;
float value = 0;
static float value_old;
static int counter;
if (dht.getStatus() != 0 && counter < 5) {
sendSTATUS("dhtT", String(dht.getStatusString()));
counter++;
} else {
counter = 0;
value = dht.getTemperature();
//if (value_old != value) {
if (String(value) != "nan") {
eventGen ("dhtT", "");
jsonWriteStr(configJson, "dhtT", String(value));
sendSTATUS("dhtT", String(value));
if (client.connected()) {
Serial.println("[i] sensor 'dhtT' send date " + String(value));
}
//}
}
value_old = value;
}
}, nullptr, true);
} }
void dhtT_reading() {
float value = 0;
static int counter;
if (dht.getStatus() != 0 && counter < 5) {
sendSTATUS(dhtT_value_name, String(dht.getStatusString()));
counter++;
} else {
counter = 0;
value = dht.getTemperature();
if (String(value) != "nan") {
eventGen (dhtT_value_name, "");
jsonWriteStr(configJson, dhtT_value_name, String(value));
sendSTATUS(dhtT_value_name, String(value));
Serial.println("[i] sensor '" + dhtT_value_name + "' data: " + String(value));
}
}
}
//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 sensor_type = sCmd.next();
String widget_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 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_widget_and_create(widget_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;
static int counter;
if (dht.getStatus() != 0 && counter < 5) {
sendSTATUS("dhtH", String(dht.getStatusString()));
counter++;
} else {
counter = 0;
value = dht.getHumidity();
if (String(value) != "nan" || value <= 100 || value >= 0) {
//if (value_old != value) {
eventGen ("dhtH", "");
jsonWriteStr(configJson, "dhtH", String(value));
sendSTATUS("dhtH", String(value));
if (client.connected()) {
Serial.println("[i] sensor 'dhtH' send date " + String(value));
}
//}
}
value_old = value;
}
}, nullptr, true);
} }
void dhtPerception() { void dhtH_reading() {
float value = 0;
static int counter;
if (dht.getStatus() != 0 && counter < 5) {
sendSTATUS(dhtH_value_name, String(dht.getStatusString()));
counter++;
} else {
counter = 0;
value = dht.getHumidity();
if (String(value) != "nan") {
eventGen (dhtH_value_name, "");
jsonWriteStr(configJson, dhtH_value_name, String(value));
sendSTATUS(dhtH_value_name, String(value));
Serial.println("[i] sensor '" + dhtH_value_name + "' data: " + String(value));
}
}
}
//dhtPerception Восприятие: Датчики 4
void dhtP() {
String widget_name = sCmd.next(); String widget_name = sCmd.next();
String page_name = sCmd.next(); String page_name = sCmd.next();
String page_number = sCmd.next(); String page_number = sCmd.next();
choose_widget_and_create(widget_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;
byte value; }
if (dht.getStatus() != 0) {
sendSTATUS("dhtPerception", String(dht.getStatusString())); void dhtP_reading() {
} else { byte value;
value = dht.computePerception(jsonRead(configJson, "dhtT").toFloat(), jsonRead(configJson, "dhtH").toFloat(), false); if (dht.getStatus() != 0) {
String final_line = perception(value); sendSTATUS("dhtPerception", String(dht.getStatusString()));
jsonWriteStr(configJson, "dhtPerception", final_line); } else {
eventGen ("dhtPerception", ""); value = dht.computePerception(jsonRead(configJson, dhtT_value_name).toFloat(), jsonRead(configJson, dhtH_value_name).toFloat(), false);
sendSTATUS("dhtPerception", final_line); String final_line = perception(value);
if (client.connected()) { jsonWriteStr(configJson, "dhtPerception", final_line);
Serial.println("[i] sensor 'dhtPerception' send date " + final_line); eventGen ("dhtPerception", "");
} sendSTATUS("dhtPerception", final_line);
if (client_mqtt.connected()) {
Serial.println("[i] sensor 'dhtPerception' data: " + final_line);
} }
}, nullptr, true); }
} }
String perception(byte value) { String perception(byte value) {
@@ -235,89 +289,183 @@ String perception(byte value) {
if (value == 7) return "Сильно неудобно, полный звиздец"; if (value == 7) return "Сильно неудобно, полный звиздец";
} }
void dhtComfort() { //dhtComfort Степень#комфорта: Датчики 3
void dhtC() {
String widget_name = sCmd.next(); String widget_name = sCmd.next();
String page_name = sCmd.next(); String page_name = sCmd.next();
String page_number = sCmd.next(); String page_number = sCmd.next();
choose_widget_and_create(widget_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;
float value;
ComfortState cf;
if (dht.getStatus() != 0) {
sendSTATUS("dhtComfort", String(dht.getStatusString()));
} else {
value = dht.getComfortRatio(cf, jsonRead(configJson, "dhtT").toFloat(), jsonRead(configJson, "dhtH").toFloat(), false);
String comfortStatus;
switch (cf) {
case Comfort_OK:
comfortStatus = "Отлично";
break;
case Comfort_TooHot:
comfortStatus = "Очень жарко";
break;
case Comfort_TooCold:
comfortStatus = "Очень холодно";
break;
case Comfort_TooDry:
comfortStatus = "Очень сухо";
break;
case Comfort_TooHumid:
comfortStatus = "Очень влажно";
break;
case Comfort_HotAndHumid:
comfortStatus = "Жарко и влажно";
break;
case Comfort_HotAndDry:
comfortStatus = "Жарко и сухо";
break;
case Comfort_ColdAndHumid:
comfortStatus = "Холодно и влажно";
break;
case Comfort_ColdAndDry:
comfortStatus = "Холодно и сухо";
break;
default:
comfortStatus = "Неизвестно";
break;
};
String final_line = comfortStatus;
jsonWriteStr(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() { void dhtC_reading() {
float value;
ComfortState cf;
if (dht.getStatus() != 0) {
sendSTATUS("dhtComfort", String(dht.getStatusString()));
} else {
value = dht.getComfortRatio(cf, jsonRead(configJson, dhtT_value_name).toFloat(), jsonRead(configJson, dhtH_value_name).toFloat(), false);
String final_line = get_comfort_status(cf);
jsonWriteStr(configJson, "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;
switch (cf) {
case Comfort_OK:
comfortStatus = "Отлично";
break;
case Comfort_TooHot:
comfortStatus = "Очень жарко";
break;
case Comfort_TooCold:
comfortStatus = "Очень холодно";
break;
case Comfort_TooDry:
comfortStatus = "Очень сухо";
break;
case Comfort_TooHumid:
comfortStatus = "Очень влажно";
break;
case Comfort_HotAndHumid:
comfortStatus = "Жарко и влажно";
break;
case Comfort_HotAndDry:
comfortStatus = "Жарко и сухо";
break;
case Comfort_ColdAndHumid:
comfortStatus = "Холодно и влажно";
break;
case Comfort_ColdAndDry:
comfortStatus = "Холодно и сухо";
break;
default:
comfortStatus = "Неизвестно";
break;
};
return comfortStatus;
}
//dhtDewpoint Точка#росы: Датчики 5
void dhtD() {
String widget_name = sCmd.next(); String widget_name = sCmd.next();
String page_name = sCmd.next(); String page_name = sCmd.next();
String page_number = sCmd.next(); String page_number = sCmd.next();
choose_widget_and_create(widget_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;
float value;
if (dht.getStatus() != 0) {
sendSTATUS("dhtDewpoint", String(dht.getStatusString()));
} else {
value = dht.computeDewPoint(jsonRead(configJson, "dhtT").toFloat(), jsonRead(configJson, "dhtH").toFloat(), false);
jsonWriteInt(configJson, "dhtDewpoint", value);
eventGen ("dhtDewpoint", "");
sendSTATUS("dhtDewpoint", String(value));
if (client.connected()) {
Serial.println("[i] sensor 'dhtDewpoint' send date " + String(value));
}
}
}, nullptr, true);
} }
void dhtD_reading() {
void choose_widget_and_create(String widget_name, String page_name, String page_number, String type, String topik) { float value;
if (dht.getStatus() != 0) {
if (type == "any-data") createWidget (widget_name, page_name, page_number, "widgets/widget.anyData.json", topik); sendSTATUS("dhtDewpoint", String(dht.getStatusString()));
if (type == "progress-line") createWidget (widget_name, page_name, page_number, "widgets/widget.progLine.json", topik); } else {
if (type == "progress-round") createWidget (widget_name, page_name, page_number, "widgets/widget.progRound.json", topik); value = dht.computeDewPoint(jsonRead(configJson, dhtT_value_name).toFloat(), jsonRead(configJson, dhtH_value_name).toFloat(), false);
if (type == "fill-gauge") createWidget (widget_name, page_name, page_number, "widgets/widget.fillGauge.json", topik); jsonWriteInt(configJson, "dhtDewpoint", value);
eventGen ("dhtDewpoint", "");
sendSTATUS("dhtDewpoint", String(value));
Serial.println("[i] sensor 'dhtDewpoint' data: " + String(value));
}
} }
//=========================================================================================================================================
//=========================================Модуль сенсоров bmp280==========================================================================
//bmp280T temp1 0x76 Температура#bmp280 Датчики any-data 1
void bmp280T() {
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();
bmp280T_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[9] = 1;
}
void bmp280T_rading() {
float value = 0;
sensors_event_t temp_event, pressure_event;
bmp_temp->getEvent(&temp_event);
value = temp_event.temperature;
jsonWriteStr(configJson, 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));
}
//bmp280P press1 0x76 Давление#bmp280 Датчики any-data 2
void bmp280P() {
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();
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 bmp280P_reading() {
float value = 0;
sensors_event_t temp_event, pressure_event;
bmp_pressure->getEvent(&pressure_event);
value = pressure_event.pressure;
value = value / 1.333224;
jsonWriteStr(configJson, bmp280P_value_name, String(value));
eventGen(bmp280P_value_name, "");
sendSTATUS(bmp280P_value_name, String(value));
Serial.println("[i] sensor '" + bmp280P_value_name + "' data: " + String(value));
}
//=========================================================================================================================================
//=============================================Модуль сенсоров bme280======================================================================
//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;
}
void bme280T_reading() {
float value = 0;
value = bme.readTemperature();
jsonWriteStr(configJson, bme280T_value_name, String(value));
eventGen(bme280T_value_name, "");
sendSTATUS(bme280T_value_name, String(value));
Serial.println("[i] sensor '" + bme280T_value_name + "' data: " + String(value));
}
//bme.readPressure() / 100.0F
//#define SEALEVELPRESSURE_HPA (1013.25)
//bme.readAltitude(SEALEVELPRESSURE_HPA)
//bme.readHumidity()

View File

@@ -1,24 +1,33 @@
void Time_Init() { void Time_Init() {
server.on("/timeZone", HTTP_GET, [](AsyncWebServerRequest * request) { server.on("/time", HTTP_GET, [](AsyncWebServerRequest * request) {
if (request->hasArg("timezone")) { if (request->hasArg("timezone")) {
jsonWriteStr(configSetup, "timezone", request->getParam("timezone")->value()); jsonWriteStr(configSetup, "timezone", request->getParam("timezone")->value());
} }
if (request->hasArg("ntp")) {
jsonWriteStr(configSetup, "ntp", request->getParam("ntp")->value());
}
saveConfig(); saveConfig();
reconfigTime(); reconfigTime();
request->send(200, "text/text", "OK"); // отправляем ответ о выполнении request->send(200, "text/text", "OK"); // отправляем ответ о выполнении
}); });
ts.add(TIME_SYNC, 30000, [&](void*) { ts.add(TIME_SYNC, 30000, [&](void*) {
if (GetTimeUnix() == "failed") { time_check();
Serial.println("[i] Time is not synchronized, start synchronization");
reconfigTime();
}
}, nullptr, true); }, nullptr, true);
} }
void time_check() {
if (GetTimeUnix() == "failed") {
Serial.println("[i] Time is not synchronized, start synchronization");
reconfigTime();
}
}
void reconfigTime() { void reconfigTime() {
if (WiFi.status() == WL_CONNECTED) { if (WiFi.status() == WL_CONNECTED) {
configTime(0, 0, ntpServer); String ntp = jsonRead(configSetup, "ntp");
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
@@ -126,7 +135,7 @@ String GetDataDigital() {
return out; return out;
} }
int timeToMin(String Time) { int timeToMin(String Time) {
//"00:00:00" время в секунды //"00:00:00" время в секунды
long min = selectToMarker(Time, ":").toInt() * 60; //общее количество секунд в полных часах long min = selectToMarker(Time, ":").toInt() * 60; //общее количество секунд в полных часах
Time = deleteBeforeDelimiter (Time, ":"); // Теперь здесь минуты секунды Time = deleteBeforeDelimiter (Time, ":"); // Теперь здесь минуты секунды

View File

@@ -1,80 +1,58 @@
//================================================================================================================ //================================================================================================================
//=========================================Таймера================================================================= //=========================================Таймеры=================================================================
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 = jsonRead(optionJson, "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(configJson, "timer" + String(number), "0");
jsonWriteStr(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 = jsonRead(configJson, 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);
jsonWriteStr(configJson, "timerSet" + number, "1"); jsonWriteStr(configJson, "timer" + number, "1");
} }
void addTimer(String number, String time) { void addTimer(String number, String time) {
String tmp = jsonRead(optionJson, "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 + ",";
} }
@@ -82,18 +60,14 @@ void addTimer(String number, String time) {
//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 = jsonRead(optionJson, "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, выделяем таймер который надо удалить
@@ -103,13 +77,9 @@ void delTimer (String number) {
} }
int readTimer(int number) { int readTimer(int number) {
String tmp = jsonRead(optionJson, "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 + ",";
}
jsonWriteStr(optionJson, "times", replace_line);
jsonWriteStr(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) {
jsonWriteStr(configJson, "timeSet" + time_number, "0");
eventGen ("timeSet", time_number);
}
seted_times = deleteBeforeDelimiter(seted_times, ",");
}
}, nullptr, true);
}
*/

View File

@@ -117,8 +117,9 @@ bool StartAPMode() {
Serial.println("->try find router"); Serial.println("->try find router");
if (RouterFind(jsonRead(configSetup, "ssid"))) { if (RouterFind(jsonRead(configSetup, "ssid"))) {
ts.remove(ROUTER_SEARCHING); ts.remove(ROUTER_SEARCHING);
WiFi.scanDelete();
ROUTER_Connecting(); ROUTER_Connecting();
MQTT_Connecting(); MQTT_init();
} }
}, nullptr, true); }, nullptr, true);
} }

View File

@@ -77,3 +77,12 @@ void createChart (String widget_name, String page_name, String page_number, Str
#endif #endif
widget = ""; 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
View 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(configJson, "i2c", tmp);
} else {
Serial.println(tmp);
jsonWriteStr(configJson, "i2c", tmp);
}
}
}
String i2c_scan() {
String out;
byte count = 0;
Wire.begin();
for (byte i = 8; i < 120; i++) {
Wire.beginTransmission(i);
if (Wire.endTransmission() == 0) {
count++;
out += String(count) + ". 0x" + String(i, HEX) + "; ";
delay(1);
}
}
if (count == 0) {
return "error";
} else {
return out;
}
}

View File

@@ -1,11 +1,12 @@
{ {
"name": "IoTmanager", "name": "IoTmanager",
"chipID": "", "chipID": "",
"ssidAP": "WiFi", "ssidAP": "WiFi2",
"passwordAP": "", "passwordAP": "",
"ssid": "rise", "ssid": "rise",
"password": "hostel3333", "password": "hostel3333",
"timezone": 2, "timezone": 2,
"ntp": "pool.ntp.org",
"mqttServer": "91.204.228.124", "mqttServer": "91.204.228.124",
"mqttPort": 1883, "mqttPort": 1883,
"mqttPrefix": "/rise", "mqttPrefix": "/rise",

View File

@@ -1,5 +1,5 @@
analog 0 Аналоговый#вход,#% Датчики progress-round 310 620 1 100 1 analog adc 0 Аналоговый#вход,#% Датчики progress-round 310 620 1 100 1
logging analog 5 100 fast Аналоговый#вход Датчики 2 logging adc 5 100 Аналоговый#вход Датчики 2
//если датчик углекислого газа выдает напряжение от 1 вольта до 2 вольт, то значит //если датчик углекислого газа выдает напряжение от 1 вольта до 2 вольт, то значит
//значение чтения аналогового входа будут примерно равным //значение чтения аналогового входа будут примерно равным

View File

@@ -1,10 +1,7 @@
dhtT DHT11 2 Температура#DHT,#t°C Датчики any-data 1 dhtT t 2 dht11 Температура#DHT,#t°C Датчики any-data 1
dhtH DHT11 2 Влажность#DHT,#% Датчики any-data 2 dhtH h 2 dht11 Влажность#DHT,#t°C Датчики any-data 2
dhtComfort Степень#комфорта: Датчики 3 dhtComfort Степень#комфорта: Датчики 3
dhtPerception Восприятие: Датчики 4 dhtPerception Восприятие: Датчики 4
dhtDewpoint Точка#росы: Датчики 5 dhtDewpoint Точка#росы: Датчики 5
logging dhtT 5 50 fast Температура Датчики 6 logging t 1 50 Температура Датчики 6
logging dhtH 5 50 fast Влажность Датчики 7 logging h 1 50 Влажность Датчики 7
//2 - номер пина датчика
//варианты отображения: any-data, progress-round, progress-line, fill-gauge

View File

@@ -1,10 +1,7 @@
dhtT DHT22 2 Температура#DHT,#t°C Датчики any-data 1 dhtT t 2 dht22 Температура#DHT,#t°C Датчики any-data 1
dhtH DHT22 2 Влажность#DHT,#% Датчики any-data 2 dhtH h 2 dht22 Влажность#DHT,#t°C Датчики any-data 2
dhtComfort Степень#комфорта: Датчики 3 dhtComfort Степень#комфорта: Датчики 3
dhtPerception Восприятие: Датчики 4 dhtPerception Восприятие: Датчики 4
dhtDewpoint Точка#росы: Датчики 5 dhtDewpoint Точка#росы: Датчики 5
logging dhtT 5 50 fast Температура Датчики 6 logging t 1 50 Температура Датчики 6
logging dhtH 5 50 fast Влажность Датчики 7 logging h 1 50 Влажность Датчики 7
//2 - номер пина датчика
//варианты отображения: any-data, progress-round, progress-line, fill-gauge

View File

@@ -3,12 +3,10 @@ button 2 13 Прихожая Реле 0 2
button 3 14 Кухня Реле 0 3 button 3 14 Кухня Реле 0 3
pwm 1 3 Яркость#коредор: Реле 1023 4 pwm 1 3 Яркость#коредор: Реле 1023 4
pwm 2 4 Яркость#ванная: Реле 510 5 pwm 2 4 Яркость#ванная: Реле 510 5
analog 0 Аналоговый#вход Датчики fill-gauge 1 1023 1 1023 6 analog adc 0 Аналоговый#вход Датчики fill-gauge 1 1023 1 1023 6
logging analog 1 100 fast Аналоговый#вход Датчики 7 logging adc 1 100 Аналоговый#вход Датчики 7
//Это демо конфигурация. В ней показано как связать кнопки c помощью сценариев //Это демо конфигурация. В ней показано как связать кнопки c помощью сценариев
//Кнопка номер 1 связана с кнопкой 2, 3 и с pwm 2 //Кнопка номер 1 связана с кнопкой 2, 3 и с pwm 2
//Так же продемонстрированна система логгирования данных строкой logging //Так же продемонстрированна система логгирования данных строкой logging
//1 - это интервал между точками в минутах, 100 это количество точек //1 - это интервал между точками в минутах, 100 это количество точек
//slow или fast это два варианта выгрузки графика, slow более экономичный режим
//больше подходит для esp8266

View File

@@ -7,4 +7,7 @@ button1 = 0
buttonSet 2 0 buttonSet 2 0
buttonSet 3 0 buttonSet 3 0
pwmSet 2 0 pwmSet 2 0
end
adc > 50
buttonSet 2 1
end end

View File

@@ -1,9 +1,9 @@
level Вода#в#баке,#% Датчики fill-gauge 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 level 1 100 fast Вода#в#баке Датчики 6 logging lev 1 100 Вода#в#баке Датчики 6
//125 - это расстояние от датчика до дна бака в сантиметрах //125 - это расстояние от датчика до дна бака в сантиметрах
//20 - это расстояние от датчика до поверхности воды когда бак полный в сантиметрах //20 - это расстояние от датчика до поверхности воды когда бак полный в сантиметрах

View File

@@ -1,6 +1,6 @@
level > digit1 lev > digit1
buttonSet 1 0 buttonSet 1 0
end end
level < digit2 lev < digit2
buttonSet 1 1 buttonSet 1 1
end end

View File

@@ -23,6 +23,10 @@
"type": "h4", "type": "h4",
"title": "Uptime: {{uptime}}" "title": "Uptime: {{uptime}}"
}, },
{
"type": "h4",
"title": "Time: {{time}}"
},
{ {
"type": "hr" "type": "hr"
}, },

View File

@@ -3,12 +3,10 @@ button 2 13 Прихожая Реле 0 2
button 3 14 Кухня Реле 0 3 button 3 14 Кухня Реле 0 3
pwm 1 3 Яркость#коредор: Реле 1023 4 pwm 1 3 Яркость#коредор: Реле 1023 4
pwm 2 4 Яркость#ванная: Реле 510 5 pwm 2 4 Яркость#ванная: Реле 510 5
analog 0 Аналоговый#вход Датчики fill-gauge 1 1023 1 1023 6 analog adc 0 Аналоговый#вход Датчики fill-gauge 1 1023 1 1023 6
logging analog 1 100 fast Аналоговый#вход Датчики 7 logging adc 1 100 Аналоговый#вход Датчики 7
//Это демо конфигурация. В ней показано как связать кнопки c помощью сценариев //Это демо конфигурация. В ней показано как связать кнопки c помощью сценариев
//Кнопка номер 1 связана с кнопкой 2, 3 и с pwm 2 //Кнопка номер 1 связана с кнопкой 2, 3 и с pwm 2
//Так же продемонстрированна система логгирования данных строкой logging //Так же продемонстрированна система логгирования данных строкой logging
//1 - это интервал между точками в минутах, 100 это количество точек //1 - это интервал между точками в минутах, 100 это количество точек
//slow или fast это два варианта выгрузки графика, slow более экономичный режим
//больше подходит для esp8266

View File

@@ -7,4 +7,7 @@ button1 = 0
buttonSet 2 0 buttonSet 2 0
buttonSet 3 0 buttonSet 3 0
pwmSet 2 0 pwmSet 2 0
end
adc > 50
buttonSet 2 1
end end

View File

@@ -71,6 +71,12 @@
"action": "/?pushingbox", "action": "/?pushingbox",
"class": "btn btn-block btn-success" "class": "btn btn-block btn-success"
}, },
{
"type": "link",
"title": "Утилиты",
"action": "/?utilities",
"class": "btn btn-block btn-success"
},
{ {
"type": "h3", "type": "h3",
"name": "my-block", "name": "my-block",

View File

@@ -12,7 +12,7 @@
{ {
"type": "text", "type": "text",
"class": "alert alert-warning", "class": "alert alert-warning",
"title": "Обратите внимание что поле prefix может состоять только из одного слова и одного разделителя: <b>/your_prefix</b>, вариант вида: <b>/your_prefix1/your_prefix2</b> работать не будет. После изменения поля prefix необходимо перезагрузить устройство" "title": "Обратите внимание что поле prefix может состоять только из одного слова и одного разделителя: <b>/prefix</b>, вариант вида: <b>/prefix1/prefix2</b> работать не будет. После изменения поля prefix необходимо перезагрузить устройство"
}, },
{ {
"type": "h4", "type": "h4",

View File

@@ -1,148 +1,162 @@
{ {
"configs": [ "configs": [
"/config.setup.json" "/config.setup.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": "{{name}}", "title": "{{name}}",
"class":"alert-warning" "class": "alert-warning"
}, },
{ {
"type": "link", "type": "link",
"title": "Главная", "title": "Главная",
"action": "/", "action": "/",
"class": "btn btn-block btn-danger" "class": "btn btn-block btn-danger"
}, },
{ {
"type": "hr" "type": "hr"
}, },
{ {
"type": "h2", "type": "h2",
"title": "Имя устройства" "title": "Имя устройства"
}, },
{ {
"type": "input", "type": "input",
"title": "Имя устройства", "title": "Имя устройства",
"name":"dev_name", "name": "dev_name",
"state": "{{name}}", "state": "{{name}}",
"pattern": "[A-Za-z0-9]{6,12}" "pattern": "[A-Za-z0-9]{6,12}"
}, },
{ {
"type": "button", "type": "button",
"title": "Сохранить", "title": "Сохранить",
"action": "name?arg=[[dev_name]]", "action": "name?arg=[[dev_name]]",
"class": "btn btn-block btn-success" "class": "btn btn-block btn-success"
}, },
{ {
"type": "hr" "type": "hr"
}, },
{ {
"type": "h2", "type": "h2",
"title": "Подключение к Wi-Fi роутеру" "title": "Подключение к Wi-Fi роутеру"
}, },
{ {
"type": "input", "type": "input",
"title":"Сеть", "title": "Сеть",
"name":"ssid", "name": "ssid",
"state": "{{ssid}}" "state": "{{ssid}}"
}, },
{ {
"type": "password", "type": "password",
"title": "Введите пароль", "title": "Введите пароль",
"name":"ssidPass", "name": "ssidPass",
"state": "{{password}}" "state": "{{password}}"
}, },
{ {
"type": "button", "type": "button",
"title": "Сохранить", "title": "Сохранить",
"class": "btn btn-block btn-success", "class": "btn btn-block btn-success",
"action": "ssid?ssid=[[ssid]]&password=[[ssidPass]]" "action": "ssid?ssid=[[ssid]]&password=[[ssidPass]]"
}, },
{ {
"type": "hr" "type": "hr"
}, },
{ {
"type": "h2", "type": "h2",
"title": "Точка доступа" "title": "Точка доступа"
}, },
{ {
"type": "input", "type": "input",
"title": "Имя WI-FI сети", "title": "Имя WI-FI сети",
"name":"ssidap", "name": "ssidap",
"state": "{{ssidAP}}", "state": "{{ssidAP}}",
"pattern": ".{1,20}" "pattern": ".{1,20}"
}, },
{ {
"type": "password", "type": "password",
"title": "Пароль", "title": "Пароль",
"name":"ssidApPass", "name": "ssidApPass",
"state": "{{passwordAP}}", "state": "{{passwordAP}}",
"pattern": ".{8,20}" "pattern": ".{8,20}"
}, },
{ {
"type": "button", "type": "button",
"title": "Сохранить", "title": "Сохранить",
"action": "ssidap?ssidAP=[[ssidap]]&passwordAP=[[ssidApPass]]", "action": "ssidap?ssidAP=[[ssidap]]&passwordAP=[[ssidApPass]]",
"class": "btn btn-block btn-success" "class": "btn btn-block btn-success"
}, },
{ {
"type": "hr" "type": "hr"
}, },
{ {
"type": "h2", "type": "h2",
"title": "Логин и пароль web interface" "title": "Логин и пароль web interface"
}, },
{ {
"type": "input", "type": "input",
"title": "Логин", "title": "Логин",
"name":"web-login", "name": "web-login",
"state": "{{web_login}}", "state": "{{web_login}}",
"pattern": ".{1,20}" "pattern": ".{1,20}"
}, },
{ {
"type": "password", "type": "password",
"title": "Пароль", "title": "Пароль",
"name":"web-pass", "name": "web-pass",
"state": "{{web_pass}}", "state": "{{web_pass}}",
"pattern": ".{1,20}" "pattern": ".{1,20}"
}, },
{ {
"type": "button", "type": "button",
"title": "Сохранить", "title": "Сохранить",
"action": "web?web_login=[[web-login]]&web_pass=[[web-pass]]", "action": "web?web_login=[[web-login]]&web_pass=[[web-pass]]",
"class": "btn btn-block btn-success" "class": "btn btn-block btn-success"
}, },
{ {
"type": "hr" "type": "hr"
}, },
{ {
"type": "h2", "type": "h2",
"title": "Временная зона" "title": "Временная зона"
}, },
{ {
"type": "input", "type": "input",
"title": "Логин", "title": "Временная зона",
"name":"time-zone", "name": "1",
"state": "{{timezone}}", "state": "{{timezone}}",
"pattern": ".{1,20}" "pattern": ".{1,20}"
}, },
{ {
"type": "button", "type": "input",
"title": "Сохранить", "title": "Название ntp сервера",
"action": "timeZone?timezone=[[time-zone]]", "name": "2",
"class": "btn btn-block btn-success" "state": "{{ntp}}"
}, },
{ {
"type": "hr" "type": "button",
}, "title": "Сохранить",
{ "action": "time?timezone=[[1]]&ntp=[[2]]",
"type": "link", "class": "btn btn-block btn-success"
"title": "Перезагрузить устройство", },
"action": "javascript:if(confirm(renameBlock(jsonResponse,'Перезагрузить?'))){send_request(this,'/restart?device=ok');}", {
"class": "btn btn-block btn-warning" "type": "hr"
} },
] {
} "type": "text",
"class": "alert alert-warning",
"title": "После изменения поля <b>'NTP сервер'</b> необходимо перезагрузить устройство"
},
{
"type": "hr"
},
{
"type": "link",
"title": "Перезагрузить устройство",
"action": "javascript:if(confirm(renameBlock(jsonResponse,'Перезагрузить?'))){send_request(this,'/restart?device=ok');}",
"class": "btn btn-block btn-warning"
}
]
}

41
data/utilities.json Normal file
View File

@@ -0,0 +1,41 @@
{
"configs": [
"/config.live.json",
"/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": "{{name}}",
"class": "alert-warning"
},
{
"type": "hr"
},
{
"type": "h3",
"title": "Сканирование адресов шины i2c"
},
{
"type": "h4",
"title": "{{i2c}}"
},
{
"type": "link",
"title": "Сканировать",
"action": "/init?arg=5",
"class": "btn btn-block btn-success"
},
{
"type": "hr"
},
{
"type": "link",
"title": "Главная",
"action": "/",
"class": "btn btn-block btn-danger"
}
]
}

View File

@@ -6,6 +6,7 @@
"ssid": "your_ssid", "ssid": "your_ssid",
"password": "your_password", "password": "your_password",
"timezone": 3, "timezone": 3,
"ntp": "pool.ntp.org",
"mqttServer": "", "mqttServer": "",
"mqttPort": 0, "mqttPort": 0,
"mqttPrefix": "/IoTmanager", "mqttPrefix": "/IoTmanager",
@@ -14,5 +15,6 @@
"scenario": "1", "scenario": "1",
"pushingbox_id": "", "pushingbox_id": "",
"web_login": "admin", "web_login": "admin",
"web_pass": "admin" "web_pass": "admin",
"udponoff": "1"
} }

View File

@@ -8,6 +8,9 @@ void setup() {
CMD_init(); CMD_init();
Serial.println("[V] CMD_init"); Serial.println("[V] CMD_init");
//-------------------------------------------------------------- //--------------------------------------------------------------
sensors_init();
Serial.println("[V] sensors_init");
//--------------------------------------------------------------
All_init(); All_init();
Serial.println("[V] All_init"); Serial.println("[V] All_init");
//-------------------------------------------------------------- //--------------------------------------------------------------
@@ -41,9 +44,6 @@ void setup() {
ts.add(TEST, 10000, [&](void*) { ts.add(TEST, 10000, [&](void*) {
getMemoryLoad("[i] periodic check of"); getMemoryLoad("[i] periodic check of");
//String json = "{}";
//jsonWriteStr(json, "test6", GetTime());
//ws.textAll(json); //ws.textAll(json);
}, nullptr, true); }, nullptr, true);
@@ -80,4 +80,5 @@ void not_async_actions() {
do_upgrade(); do_upgrade();
do_udp_data_parse(); do_udp_data_parse();
do_mqtt_send_settings_to_udp(); do_mqtt_send_settings_to_udp();
do_i2c_scanning();
} }

View File

@@ -322,9 +322,23 @@ void sendCONFIG(String topik, String widgetConfig, String key, String date) {
inner = inner + "}}"; inner = inner + "}}";
String t = outer + inner; String t = outer + inner;
//Serial.println(t); //Serial.println(t);
//client.publish(MQTT::Publish(topik, t).set_qos(1)); //client_mqtt.publish(MQTT::Publish(topik, t).set_qos(1));
yield(); yield();
} }
uint8_t hexStringToUint8(String hex) {
uint8_t tmp = strtol(hex.c_str(), NULL, 0);
if (tmp >= 0x00 && tmp <= 0xFF) {
return tmp;
}
}
uint16_t hexStringToUint16(String hex) {
uint16_t tmp = strtol(hex.c_str(), NULL, 0);
if (tmp >= 0x0000 && tmp <= 0xFFFF) {
return tmp;
}
}
//============================================================================================================= //=============================================================================================================
#ifdef led_status #ifdef led_status
void led_blink(int pin, int fq, String blink_satus) { void led_blink(int pin, int fq, String blink_satus) {

View File

@@ -4,9 +4,9 @@ void MQTT_init() {
ts.add(WIFI_MQTT_CONNECTION_CHECK, wifi_mqtt_reconnecting, [&](void*) { ts.add(WIFI_MQTT_CONNECTION_CHECK, wifi_mqtt_reconnecting, [&](void*) {
up_time(); up_time();
if (WiFi.status() == WL_CONNECTED) { if (WiFi.status() == WL_CONNECTED) {
Serial.println("[V] WiFi-ok"); Serial.println("[VV] WiFi-ok");
if (client.connected()) { if (client_mqtt.connected()) {
Serial.println("[V] MQTT-ok"); Serial.println("[VV] MQTT-ok");
} else { } else {
MQTT_Connecting(); MQTT_Connecting();
if (!just_load) mqtt_lost_error++; if (!just_load) mqtt_lost_error++;
@@ -50,7 +50,7 @@ void MQTT_init() {
request->send(200, "text/text", tmp); request->send(200, "text/text", tmp);
}); });
} }
void do_mqtt_send_settings_to_udp() { void do_mqtt_send_settings_to_udp() {
@@ -63,7 +63,7 @@ void do_mqtt_send_settings_to_udp() {
void do_mqtt_connection() { void do_mqtt_connection() {
if (mqtt_connection) { if (mqtt_connection) {
mqtt_connection = false; mqtt_connection = false;
client.disconnect(); client_mqtt.disconnect();
MQTT_Connecting(); MQTT_Connecting();
} }
} }
@@ -72,8 +72,8 @@ void do_mqtt_connection() {
void handleMQTT() { void handleMQTT() {
if (WiFi.status() == WL_CONNECTED) { if (WiFi.status() == WL_CONNECTED) {
if (client.connected()) { if (client_mqtt.connected()) {
client.loop(); client_mqtt.loop();
} }
} }
} }
@@ -83,16 +83,16 @@ boolean MQTT_Connecting() {
if ((mqtt_server != "")) { if ((mqtt_server != "")) {
Serial.println("[E] Lost MQTT connection, start reconnecting"); Serial.println("[E] Lost MQTT connection, start reconnecting");
//ssl//espClient.setCACert(local_root_ca1); //ssl//espClient.setCACert(local_root_ca1);
client.setServer(mqtt_server.c_str(), jsonReadtoInt(configSetup, "mqttPort")); client_mqtt.setServer(mqtt_server.c_str(), jsonReadtoInt(configSetup, "mqttPort"));
if (WiFi.status() == WL_CONNECTED) { if (WiFi.status() == WL_CONNECTED) {
if (!client.connected()) { if (!client_mqtt.connected()) {
Serial.println("[V] Connecting to MQTT server commenced"); Serial.println("[V] Connecting to MQTT server commenced");
if (client.connect(chipID.c_str(), jsonRead(configSetup, "mqttUser").c_str(), jsonRead(configSetup, "mqttPass").c_str())) { if (client_mqtt.connect(chipID.c_str(), jsonRead(configSetup, "mqttUser").c_str(), jsonRead(configSetup, "mqttPass").c_str())) {
Serial.println("[V] MQTT connected"); Serial.println("[VV] MQTT connected");
client.setCallback(callback); client_mqtt.setCallback(callback);
client.subscribe(jsonRead(configSetup, "mqttPrefix").c_str()); // Для приема получения HELLOW и подтверждения связи client_mqtt.subscribe(jsonRead(configSetup, "mqttPrefix").c_str()); // Для приема получения HELLOW и подтверждения связи
client.subscribe((jsonRead(configSetup, "mqttPrefix") + "/" + chipID + "/+/control").c_str()); // Подписываемся на топики control client_mqtt.subscribe((jsonRead(configSetup, "mqttPrefix") + "/" + chipID + "/+/control").c_str()); // Подписываемся на топики control
client.subscribe((jsonRead(configSetup, "mqttPrefix") + "/" + chipID + "/order").c_str()); // Подписываемся на топики order client_mqtt.subscribe((jsonRead(configSetup, "mqttPrefix") + "/" + chipID + "/order").c_str()); // Подписываемся на топики order
Serial.println("[V] Callback set, subscribe done"); Serial.println("[V] Callback set, subscribe done");
return true; return true;
} else { } else {
@@ -119,18 +119,18 @@ void callback(char* topic, byte * payload, unsigned int length) {
} }
Serial.println(" => " + str); Serial.println(" => " + str);
if (str == "HELLO") outcoming_date(); //превращает название топика в команду, а значение в параметр команды if (str == "HELLO") outcoming_date();
if (topic_str.indexOf("control") > 0) { //IoTmanager/800324-1458415/RelaySet1/control 1 //превращает название топика в команду, а значение в параметр команды
//Serial.println(topic_str); if (topic_str.indexOf("control") > 0) { //IoTmanager/800324-1458415/button1/control 1 //IoTmanager/800324-1458415/button99/control 1
String topic = selectFromMarkerToMarker(topic_str, "/", 3); //RelaySet1 String topic = selectFromMarkerToMarker(topic_str, "/", 3); //button1 //button99
String number = selectToMarkerLast(topic, "Set"); //1 topic = add_set(topic); //buttonSet1 //buttonSet99
topic.replace(number, ""); //RelaySet String number = selectToMarkerLast(topic, "Set"); //1 //99
String final_line = topic + " " + number + " " + str; //RelaySet 1 1 topic.replace(number, ""); //buttonSet //buttonSet
//Serial.println(final_line); String final_line = topic + " " + number + " " + str; //buttonSet 1 1 //buttonSet 99 1
order_loop += final_line + ","; order_loop += final_line + ",";
} }
if (topic_str.indexOf("order") > 0) { if (topic_str.indexOf("order") > 0) {
str.replace("_", " "); str.replace("_", " ");
//Serial.println(str); //Serial.println(str);
@@ -152,21 +152,21 @@ void outcoming_date() {
//======================================CONFIG================================================== //======================================CONFIG==================================================
boolean sendMQTT(String end_of_topik, String data) { boolean sendMQTT(String end_of_topik, String data) {
String topik = jsonRead(configSetup, "mqttPrefix") + "/" + chipID + "/" + end_of_topik; String topik = jsonRead(configSetup, "mqttPrefix") + "/" + chipID + "/" + end_of_topik;
boolean send_status = client.beginPublish(topik.c_str(), data.length(), false); boolean send_status = client_mqtt.beginPublish(topik.c_str(), data.length(), false);
client.print(data); client_mqtt.print(data);
client.endPublish(); client_mqtt.endPublish();
return send_status; return send_status;
} }
boolean sendCHART(String topik, String data) { boolean sendCHART(String topik, String data) {
topik = jsonRead(configSetup, "mqttPrefix") + "/" + chipID + "/" + topik + "/" + "status"; topik = jsonRead(configSetup, "mqttPrefix") + "/" + chipID + "/" + topik + "/" + "status";
boolean send_status = client.beginPublish(topik.c_str(), data.length(), false); boolean send_status = client_mqtt.beginPublish(topik.c_str(), data.length(), false);
client.print(data); client_mqtt.print(data);
client.endPublish(); client_mqtt.endPublish();
return send_status; return send_status;
} }
boolean sendCHART_test(String topik, String data) { boolean sendCHART_test(String topik, String data) {
topik = jsonRead(configSetup, "mqttPrefix") + "/" + chipID + "/" + topik + "/" + "status"; topik = jsonRead(configSetup, "mqttPrefix") + "/" + chipID + "/" + topik + "/" + "status";
boolean send_status = client.publish (topik.c_str(), data.c_str(), false); boolean send_status = client_mqtt.publish (topik.c_str(), data.c_str(), false);
return send_status; return send_status;
} }
//======================================STATUS================================================== //======================================STATUS==================================================
@@ -174,12 +174,12 @@ void sendSTATUS(String topik, String state) {
topik = jsonRead(configSetup, "mqttPrefix") + "/" + chipID + "/" + topik + "/" + "status"; topik = jsonRead(configSetup, "mqttPrefix") + "/" + chipID + "/" + topik + "/" + "status";
String json_ = "{}"; String json_ = "{}";
jsonWriteStr(json_, "status", state); jsonWriteStr(json_, "status", state);
int send_status = client.publish (topik.c_str(), json_.c_str(), false); int send_status = client_mqtt.publish (topik.c_str(), json_.c_str(), false);
} }
//======================================CONTROL================================================== //======================================CONTROL==================================================
void sendCONTROL(String id, String topik, String state) { void sendCONTROL(String id, String topik, String state) {
String all_line = jsonRead(configSetup, "mqttPrefix") + "/" + id + "/" + topik + "/control"; String all_line = jsonRead(configSetup, "mqttPrefix") + "/" + id + "/" + topik + "/control";
int send_status = client.publish (all_line.c_str(), state.c_str(), false); int send_status = client_mqtt.publish (all_line.c_str(), state.c_str(), false);
} }
//=====================================================ОТПРАВЛЯЕМ ВИДЖЕТЫ======================================================== //=====================================================ОТПРАВЛЯЕМ ВИДЖЕТЫ========================================================
@@ -208,7 +208,7 @@ void sendAllWigets() {
} }
#endif #endif
//прямое выкидывание данных из файла в файловой системе в mqtt, без загрузки оперативной памяти #ifndef layout_in_ram
void sendAllWigets() { void sendAllWigets() {
File configFile = SPIFFS.open("/layout.txt", "r"); File configFile = SPIFFS.open("/layout.txt", "r");
if (!configFile) { if (!configFile) {
@@ -221,6 +221,7 @@ void sendAllWigets() {
sendMQTT("config", widget_to_send); sendMQTT("config", widget_to_send);
} }
} }
#endif
//=====================================================ОТПРАВЛЯЕМ ДАННЫЕ В ВИДЖЕТЫ ПРИ ОБНОВЛЕНИИ СТРАНИЦЫ======================================================== //=====================================================ОТПРАВЛЯЕМ ДАННЫЕ В ВИДЖЕТЫ ПРИ ОБНОВЛЕНИИ СТРАНИЦЫ========================================================
void sendAllData() { //берет строку json и ключи превращает в топики а значения колючей в них посылает void sendAllData() { //берет строку json и ключи превращает в топики а значения колючей в них посылает
@@ -249,7 +250,7 @@ void sendAllData() { //берет строку json и ключи превра
String stateMQTT() { String stateMQTT() {
int state = client.state(); int state = client_mqtt.state();
switch (state) { switch (state) {
case -4: return "the server didn't respond within the keepalive time"; case -4: return "the server didn't respond within the keepalive time";
@@ -286,7 +287,7 @@ String stateMQTT() {
String line_ = selectToMarker (all_text, "\n"); String line_ = selectToMarker (all_text, "\n");
String id = selectFromMarkerToMarker(line_, " ", 4); String id = selectFromMarkerToMarker(line_, " ", 4);
if (id != "not found") { if (id != "not found") {
client.subscribe((jsonRead(configSetup, "mqttPrefix") + "/" + id + "/+/status").c_str(), 0); client_mqtt.subscribe((jsonRead(configSetup, "mqttPrefix") + "/" + id + "/+/status").c_str(), 0);
Serial.println("subscribed to device, id: " + id); Serial.println("subscribed to device, id: " + id);
} }
all_text = deleteBeforeDelimiter(all_text, "\n"); all_text = deleteBeforeDelimiter(all_text, "\n");
@@ -306,7 +307,7 @@ String stateMQTT() {
String id = selectFromMarkerToMarker(line_, " ", 4); String id = selectFromMarkerToMarker(line_, " ", 4);
if (id != "not found") { if (id != "not found") {
//Serial.println(); //Serial.println();
Serial.println(client.publish ((jsonRead(configSetup, "mqttPrefix") + "/" + id).c_str(), "CHECK", true)); Serial.println(client_mqtt.publish ((jsonRead(configSetup, "mqttPrefix") + "/" + id).c_str(), "CHECK", true));
} }
all_text = deleteBeforeDelimiter(all_text, "\n"); all_text = deleteBeforeDelimiter(all_text, "\n");

65
set.h
View File

@@ -5,16 +5,9 @@ boolean mb_4_of_memory = true;
//#define MDNS_enable //#define MDNS_enable
//#define WS_enable //#define WS_enable
//#define layout_in_ram //#define layout_in_ram
#define wifi_mqtt_reconnecting 20000 #define wifi_mqtt_reconnecting 30000
#define analog_update_int 5000
#define temp_update_int 5000
#define tank_level_shooting_interval 500 //интервал выстрела датчика #define tank_level_times_to_send 10 //после скольки выстрелов делать отправку данных
#define tank_level_times_to_send 20 //после скольки выстрелов делать отправку данных
#define dhtT_update_int 10000
#define dhtH_update_int 10000
#define dht_calculation_update_int 10000
#define statistics_update 1000 * 60 * 60 * 2 #define statistics_update 1000 * 60 * 60 * 2
//====================================================================== //======================================================================
@@ -50,7 +43,7 @@ Servo myServo2;
#include <analogWrite.h> #include <analogWrite.h>
#include "AsyncUDP.h" #include "AsyncUDP.h"
AsyncUDP udp; AsyncUDP udp;
#include <ESP32_Servo.h> #include <ESP32_Servo.h>
Servo myServo1; Servo myServo1;
Servo myServo2; Servo myServo2;
@@ -82,13 +75,14 @@ AsyncEventSource events("/events");
#include <time.h> #include <time.h>
#include <TickerScheduler.h> #include <TickerScheduler.h>
TickerScheduler ts(30); enum {ROUTER_SEARCHING, WIFI_MQTT_CONNECTION_CHECK, SENSORS, STEPPER1, STEPPER2, LOG1, LOG2, LOG3, LOG4, LOG5, TIMER_COUNTDOWN, TIME, TIME_SYNC, STATISTICS, UDP, UDP_DB, TEST };
enum {ROUTER_SEARCHING, WIFI_MQTT_CONNECTION_CHECK, LEVEL, ANALOG_, DALLAS, DHTT, DHTH, DHTC, DHTP, DHTD, STEPPER1, STEPPER2, ANALOG_LOG, LEVEL_LOG, DALLAS_LOG, dhtT_LOG, dhtH_LOG, CMD, TIMER_COUNTDOWN, TIMERS, TIME, TIME_SYNC, STATISTICS, UDP, UDP_DB, TEST}; TickerScheduler ts(TEST + 1);
//LEVEL, ANALOG1, ANALOG2, DALLAS, DHTT, DHTH, DHTC, DHTP, DHTD, BMP280T, BMP280P,
#include <PubSubClient.h> #include <PubSubClient.h>
WiFiClient espClient; WiFiClient espClient;
PubSubClient client_mqtt(espClient);
PubSubClient client(espClient);
#include <StringCommand.h> #include <StringCommand.h>
StringCommand sCmd; StringCommand sCmd;
@@ -110,12 +104,23 @@ DallasTemperature sensors;
DHTesp dht; DHTesp dht;
#include <Wire.h> #include <Wire.h>
#include <Adafruit_BMP280.h>
Adafruit_BMP280 bmp; // use I2C interface
Adafruit_Sensor *bmp_temp = bmp.getTemperatureSensor();
Adafruit_Sensor *bmp_pressure = bmp.getPressureSensor();
#include <Adafruit_BME280.h>
Adafruit_BME280 bme; // use I2C interface
Adafruit_Sensor *bme_temp = bme.getTemperatureSensor();
Adafruit_Sensor *bme_pressure = bme.getPressureSensor();
Adafruit_Sensor *bme_humidity = bme.getHumiditySensor();
//===============FIRMWARE VARS======================== //===============FIRMWARE VARS========================
boolean just_load = true; boolean just_load = true;
const char* hostName = "IoT Manager"; const char* hostName = "IoT Manager";
//JSON //JSON
String configSetup = "{}"; String configSetup = "{}";
String configJson = "{}"; String configJson = "{}";
String optionJson = "{}"; String optionJson = "{}";
//MQTT //MQTT
String chipID = ""; String chipID = "";
@@ -124,15 +129,21 @@ String all_widgets = "";
String scenario; String scenario;
String order_loop; String order_loop;
//SENSORS //SENSORS
boolean flagLoggingAnalog = false; String analog_value_names_list;
boolean flagLoggingLevel = false; int enter_to_analog_counter;
boolean flagLoggingDallas = false;
boolean flagLoggingdhtT = false; String level_value_name;
boolean flagLoggingdhtH = false; String dhtT_value_name;
//NTP String dhtH_value_name;
const char* ntpServer = "pool.ntp.org"; String bmp280T_value_name;
const long gmtOffset_sec = 3600; String bmp280P_value_name;
const int daylightOffset_sec = 3600; String bme280T_value_name;
int sensors_count = 11;
int sensors_reading_map [] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
//LOGGING
String logging_value_names_list;
int enter_to_logging_counter;
//NTP and TIME
String current_time; String current_time;
//SCENARIO //SCENARIO
int scenario_line_status [] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; int scenario_line_status [] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
@@ -146,9 +157,9 @@ boolean upgrade = false;
boolean mqtt_connection = false; boolean mqtt_connection = false;
boolean udp_data_parse = false; boolean udp_data_parse = false;
boolean mqtt_send_settings_to_udp = false; boolean mqtt_send_settings_to_udp = false;
boolean i2c_scanning = false;
//UDP //UDP
boolean udp_busy = false; boolean udp_busy = false;
boolean chart_data_in_solid_array;
unsigned int udp_port = 4210; unsigned int udp_port = 4210;
#ifdef ESP8266 #ifdef ESP8266
IPAddress udp_multicastIP (255, 255, 255, 255); IPAddress udp_multicastIP (255, 255, 255, 255);
@@ -159,3 +170,5 @@ IPAddress udp_multicastIP (239, 255, 255, 255);
String received_ip; String received_ip;
String received_udp_line; String received_udp_line;
int udp_period; int udp_period;
//i2c
String i2c_list;

View File

@@ -44,7 +44,7 @@ void UDP_init() {
handleUdp_esp32(); handleUdp_esp32();
randomSeed(micros()); randomSeed(micros());
udp_period = random(20000, 40000); udp_period = random(50000, 60000);
ts.add(UDP, udp_period, [&](void*) { ts.add(UDP, udp_period, [&](void*) {
if (jsonRead(configSetup, "udponoff") == "1") { if (jsonRead(configSetup, "udponoff") == "1") {