6 Commits
2.1.1 ... 2.2

Author SHA1 Message Date
Dmitry Borisenko
f8a50e09b7 add air firmware upgrade support 2020-03-04 00:27:35 +03:00
Dmitry Borisenko
a6117db46e some fix 2020-03-01 20:41:16 +03:00
Dmitry Borisenko
ec187af09d some fix 2020-02-22 03:34:44 +03:00
Dmitry Borisenko
7bc5be8db5 dht fixed, presets support 2020-02-19 03:14:21 +03:00
Dmitry Borisenko
a29a8b246c presets support 2020-02-18 16:22:17 +03:00
Dmitry Borisenko
8d16ae9188 some fix 2020-02-16 19:36:58 +03:00
62 changed files with 990 additions and 370 deletions

50
Cmd.ino
View File

@@ -2,7 +2,10 @@ void CMD_init() {
sCmd.addCommand("button", button);
sCmd.addCommand("buttonSet", buttonSet);
sCmd.addCommand("buttonChange", buttonChange);
sCmd.addCommand("pinSet", pinSet);
sCmd.addCommand("pinChange", pinChange);
sCmd.addCommand("pwm", pwm);
sCmd.addCommand("pwmSet", pwmSet);
@@ -17,6 +20,7 @@ void CMD_init() {
sCmd.addCommand("dhtH", dhtH);
sCmd.addCommand("dhtPerception", dhtPerception);
sCmd.addCommand("dhtComfort", dhtComfort);
sCmd.addCommand("dhtDewpoint", dhtDewpoint);
sCmd.addCommand("logging", logging);
@@ -137,13 +141,30 @@ void buttonSet() {
sendSTATUS("buttonSet" + button_number, button_state);
}
void pinSet() {
void buttonChange() {
String button_number = sCmd.next();
String current_state = jsonRead(configJson, "buttonSet" + button_number);
if (current_state == "1") {
current_state = "0";
} else if (current_state == "0") {
current_state = "1";
}
order_loop += "buttonSet " + button_number + " " + current_state + ",";
jsonWrite(configJson, "buttonSet" + button_number, current_state);
sendSTATUS("buttonSet" + button_number, current_state);
}
void pinSet() {
String pin_number = sCmd.next();
String pin_state = sCmd.next();
pinMode(pin_number.toInt(), OUTPUT);
digitalWrite(pin_number.toInt(), pin_state.toInt());
}
void pinChange() {
String pin_number = sCmd.next();
pinMode(pin_number.toInt(), OUTPUT);
digitalWrite(pin_number.toInt(), !digitalRead(pin_number.toInt()));
}
//==================================================================================================================
//==========================================Модуль управления ШИМ===================================================
@@ -249,20 +270,27 @@ void inputTime() {
page_name.replace("#", " ");
String start_state = sCmd.next();
String page_number = sCmd.next();
start_state.replace(":", ".");
jsonWrite(configJson, "timeSet" + number, start_state);
start_state.replace(".", ":");
createViget (viget_name, page_name, page_number, "vigets/viget.inputTime.json", "timeSet" + number);
}
void timeSet() {
String number = sCmd.next();
String value = sCmd.next();
value.replace(":", ".");
jsonWrite(configJson, "timeSet" + number, value);
value.replace(".", ":");
sendSTATUS("timeSet" + number, value);
}
void handle_time_init() {
ts.add(TIME, 1000, [&](void*) {
String tmp = GetTime();
tmp.replace(":", "-");
jsonWrite(configJson, "timenowSet", tmp);
eventGen ("timenowSet", "");
}, nullptr, true);
}
//=====================================================================================================================================
//=========================================Добавление текстового виджета============================================================
void text() {
@@ -284,25 +312,17 @@ void textSet() {
if (text.indexOf("-time") >= 0) {
text.replace("-time", "");
text.replace("#", " ");
String time = GetTime();
time.replace(":", ".");
text = GetDataDigital() + " " + time + " " + text;
text = text + " " + GetDataDigital() + " " + time;
}
jsonWrite(configJson, "textSet" + number, text);
sendSTATUS("textSet" + number, text);
}
void handle_time_init() {
ts.add(TIME, 1000, [&](void*) {
String tmp = GetTimeWOsec();
tmp.replace(":", ".");
jsonWrite(configJson, "timenowSet", tmp);
eventGen ("timenowSet", "");
}, nullptr, true);
}
//====================================================================================================================================================
/*
void inputText() {

189
Init.ino
View File

@@ -5,7 +5,6 @@ void All_init() {
request->send(200, "text/text", "OK"); // отправляем ответ о выполнении
});
server.on("/scenario", HTTP_GET, [](AsyncWebServerRequest * request) {
if (request->hasArg("status")) {
jsonWrite(configSetup, "scenario", request->getParam("status")->value());
@@ -24,6 +23,8 @@ void All_init() {
request->send(200, "text/text", "OK"); // отправляем ответ о выполнении
});
prsets_init();
Device_init();
Scenario_init();
Timer_countdown_init();
@@ -51,22 +52,202 @@ void Scenario_init() {
}
}
void prsets_init() {
//part 1===============================================================================
server.on("/relay", HTTP_GET, [](AsyncWebServerRequest * request) {
writeFile("firmware.config.txt", readFile("configs/relay.config.txt", 2048));
writeFile("firmware.scenario.txt", readFile("configs/relay.scenario.txt", 2048));
Device_init();
Scenario_init();
String tmp = "";
request->redirect("/page.htm?configuration");
});
server.on("/relay_timer", HTTP_GET, [](AsyncWebServerRequest * request) {
writeFile("firmware.config.txt", readFile("configs/relay_t.config.txt", 2048));
writeFile("firmware.scenario.txt", readFile("configs/relay_t.scenario.txt", 2048));
Device_init();
Scenario_init();
request->redirect("/page.htm?configuration");
});
server.on("/relay_countdown", HTTP_GET, [](AsyncWebServerRequest * request) {
writeFile("firmware.config.txt", readFile("configs/relay_c.config.txt", 2048));
writeFile("firmware.scenario.txt", readFile("configs/relay_c.scenario.txt", 2048));
Device_init();
Scenario_init();
request->redirect("/page.htm?configuration");
});
server.on("/relay_several", HTTP_GET, [](AsyncWebServerRequest * request) {
writeFile("firmware.config.txt", readFile("configs/relay_s.config.txt", 2048));
writeFile("firmware.scenario.txt", readFile("configs/relay_s.scenario.txt", 2048));
Device_init();
Scenario_init();
request->redirect("/page.htm?configuration");
});
server.on("/relay_switch", HTTP_GET, [](AsyncWebServerRequest * request) {
writeFile("firmware.config.txt", readFile("configs/relay_sw.config.txt", 2048));
writeFile("firmware.scenario.txt", readFile("configs/relay_sw.scenario.txt", 2048));
Device_init();
Scenario_init();
request->redirect("/page.htm?configuration");
});
server.on("/relay_button_remote", HTTP_GET, [](AsyncWebServerRequest * request) {
writeFile("firmware.config.txt", readFile("configs/relay_br.config.txt", 2048));
writeFile("firmware.scenario.txt", readFile("configs/relay_br.scenario.txt", 2048));
Device_init();
Scenario_init();
request->redirect("/page.htm?configuration");
});
server.on("/relay_switch_remote", HTTP_GET, [](AsyncWebServerRequest * request) {
writeFile("firmware.config.txt", readFile("configs/relay_sr.config.txt", 2048));
writeFile("firmware.scenario.txt", readFile("configs/relay_sr.scenario.txt", 2048));
Device_init();
Scenario_init();
request->redirect("/page.htm?configuration");
});
server.on("/pwm", HTTP_GET, [](AsyncWebServerRequest * request) {
writeFile("firmware.config.txt", readFile("configs/pwm.config.txt", 2048));
writeFile("firmware.scenario.txt", readFile("configs/pwm.scenario.txt", 2048));
Device_init();
Scenario_init();
request->redirect("/page.htm?configuration");
});
//part 2===============================================================================
server.on("/dht11", HTTP_GET, [](AsyncWebServerRequest * request) {
writeFile("firmware.config.txt", readFile("configs/dht11.config.txt", 2048));
writeFile("firmware.scenario.txt", readFile("configs/dht11.scenario.txt", 2048));
Device_init();
Scenario_init();
request->redirect("/page.htm?configuration");
});
server.on("/dht22", HTTP_GET, [](AsyncWebServerRequest * request) {
writeFile("firmware.config.txt", readFile("configs/dht22.config.txt", 2048));
writeFile("firmware.scenario.txt", readFile("configs/dht22.scenario.txt", 2048));
Device_init();
Scenario_init();
request->redirect("/page.htm?configuration");
});
server.on("/analog", HTTP_GET, [](AsyncWebServerRequest * request) {
writeFile("firmware.config.txt", readFile("configs/analog.config.txt", 2048));
writeFile("firmware.scenario.txt", readFile("configs/analog.scenario.txt", 2048));
Device_init();
Scenario_init();
request->redirect("/page.htm?configuration");
});
server.on("/dallas", HTTP_GET, [](AsyncWebServerRequest * request) {
writeFile("firmware.config.txt", readFile("configs/dallas.config.txt", 2048));
writeFile("firmware.scenario.txt", readFile("configs/dallas.scenario.txt", 2048));
Device_init();
Scenario_init();
request->redirect("/page.htm?configuration");
});
server.on("/termostat", HTTP_GET, [](AsyncWebServerRequest * request) {
writeFile("firmware.config.txt", readFile("configs/termostat.config.txt", 2048));
writeFile("firmware.scenario.txt", readFile("configs/termostat.scenario.txt", 2048));
Device_init();
Scenario_init();
request->redirect("/page.htm?configuration");
});
server.on("/level", HTTP_GET, [](AsyncWebServerRequest * request) {
writeFile("firmware.config.txt", readFile("configs/level.config.txt", 2048));
writeFile("firmware.scenario.txt", readFile("configs/level.scenario.txt", 2048));
Device_init();
Scenario_init();
request->redirect("/page.htm?configuration");
});
server.on("/moution_relay", HTTP_GET, [](AsyncWebServerRequest * request) {
writeFile("firmware.config.txt", readFile("configs/moution_r.config.txt", 2048));
writeFile("firmware.scenario.txt", readFile("configs/moution_r.scenario.txt", 2048));
Device_init();
Scenario_init();
request->redirect("/page.htm?configuration");
});
server.on("/moution_security", HTTP_GET, [](AsyncWebServerRequest * request) {
writeFile("firmware.config.txt", readFile("configs/moution_s.config.txt", 2048));
writeFile("firmware.scenario.txt", readFile("configs/moution_s.scenario.txt", 2048));
Device_init();
Scenario_init();
request->redirect("/page.htm?configuration");
});
//default===============================================================================
server.on("/default", HTTP_GET, [](AsyncWebServerRequest * request) {
writeFile("firmware.config.txt", readFile("configs/firmware.config.txt", 2048));
writeFile("firmware.scenario.txt", readFile("configs/firmware.scenario.txt", 2048));
Device_init();
Scenario_init();
request->redirect("/page.htm?configuration");
});
}
void up_time() {
uint32_t ss = millis() / 1000;
uint32_t mm = ss / 60;
uint32_t hh = mm / 60;
uint32_t dd = hh / 24;
String out = "";
if (ss != 0) {
out = "[i] uptime = " + String(ss) + " sec";
jsonWrite(configJson, "uptime", String(ss) + " sec");
}
if (mm != 0) {
Serial.println(String(mm) + " min");
out = "[i] uptime = " + String(mm) + " min";
jsonWrite(configJson, "uptime", String(mm) + " min");
}
if (hh != 0) {
Serial.println(String(hh) + " hours");
out = "[i] uptime = " + String(hh) + " hours";
jsonWrite(configJson, "uptime", String(hh) + " hours");
}
if (dd != 0) {
Serial.println(String(dd) + " days");
out = "[i] uptime = " + String(dd) + " days";
jsonWrite(configJson, "uptime", String(dd) + " days");
}
Serial.println(out + ", mqtt_lost_error: " + String(mqtt_lost_error) + ", wifi_lost_error: " + String(wifi_lost_error));
}
void statistics() {
String urls = "http://backup.privet.lv/visitors/?";
urls += WiFi.macAddress().c_str();
urls += "&";
#ifdef ESP8266
urls += "iot-manager_esp8266";
#endif
#ifdef ESP32
urls += "iot-manager_esp32";
#endif
urls += "&";
#ifdef ESP8266
urls += ESP.getResetReason();
#endif
#ifdef ESP32
urls += "unknow";
#endif
urls += "&";
urls += DATE_COMPILING;
String stat = getURL(urls);
}

View File

@@ -35,7 +35,7 @@ void analog() {
eventGen ("analog", "");
sendSTATUS("analog", String(analog));
if (client.connected()) {
Serial.println("[i] sensor analog send date " + String(analog));
Serial.println("[i] sensor 'analog' send date " + String(analog));
}
// }
analog_old = analog;
@@ -77,12 +77,12 @@ void level() {
level = map(distance_cm,
jsonReadtoInt(optionJson, "empty_level"),
jsonReadtoInt(optionJson, "full_level"), 0, 100);
//jsonWrite(configJson, "level", level);
jsonWrite(configJson, "level", level);
//if (level_old != level) {
eventGen ("level", "");
sendSTATUS("level", String(level));
if (client.connected()) {
Serial.println("[i] sensor tank level send date " + String(level));
Serial.println("[i] sensor tank 'level' send date " + String(level));
}
//}
level_old = level;
@@ -113,7 +113,7 @@ void dallas() {
eventGen ("dallas", "");
sendSTATUS("dallas", String(temp));
if (client.connected()) {
Serial.println("[i] sensor dallas send date " + String(temp));
Serial.println("[i] sensor 'dallas' send date " + String(temp));
}
//}
temp_old = temp;
@@ -137,19 +137,26 @@ void dhtT() {
dht.setup(pin.toInt(), DHTesp::DHT22);
}
choose_viget_and_create(viget_name, page_name, page_number, type, "dhtT");
ts.add(DHTT, dhtT_update_int + dht.getMinimumSamplingPeriod(), [&](void*) {
ts.add(DHTT, dhtT_update_int, [&](void*) { //dht.getMinimumSamplingPeriod()
float value = 0;
static float value_old;
value = dht.getTemperature();
jsonWrite(configJson, "dhtT", String(value));
//if (value_old != value) {
eventGen ("dhtT", "");
sendSTATUS("dhtT", String(value));
if (client.connected()) {
Serial.println("[i] sensor dhtT send date " + String(value));
static int counter;
if (dht.getStatus() != 0 && counter < 5) {
sendSTATUS("dhtT", String(dht.getStatusString()));
counter++;
} else {
counter = 0;
value = dht.getTemperature();
jsonWrite(configJson, "dhtT", String(value));
//if (value_old != value) {
eventGen ("dhtT", "");
sendSTATUS("dhtT", String(value));
if (client.connected()) {
Serial.println("[i] sensor 'dhtT' send date " + String(value));
}
//}
value_old = value;
}
//}
value_old = value;
}, nullptr, true);
}
@@ -168,19 +175,26 @@ void dhtH() {
dht.setup(pin.toInt(), DHTesp::DHT22);
}
choose_viget_and_create(viget_name, page_name, page_number, type, "dhtH");
ts.add(DHTH, dhtH_update_int + dht.getMinimumSamplingPeriod(), [&](void*) {
ts.add(DHTH, dhtH_update_int , [&](void*) { //dht.getMinimumSamplingPeriod()
int value = 0;
static int value_old;
value = dht.getHumidity();
jsonWrite(configJson, "dhtH", String(value));
//if (value_old != value) {
eventGen ("dhtH", "");
sendSTATUS("dhtH", String(value));
if (client.connected()) {
Serial.println("[i] sensor dhtH send date " + String(value));
static int counter;
if (dht.getStatus() != 0 && counter < 5) {
sendSTATUS("dhtH", String(dht.getStatusString()));
counter++;
} else {
counter = 0;
value = dht.getHumidity();
jsonWrite(configJson, "dhtH", String(value));
//if (value_old != value) {
eventGen ("dhtH", "");
sendSTATUS("dhtH", String(value));
if (client.connected()) {
Serial.println("[i] sensor 'dhtH' send date " + String(value));
}
//}
value_old = value;
}
//}
value_old = value;
}, nullptr, true);
}
@@ -189,16 +203,19 @@ void dhtPerception() {
String page_name = sCmd.next();
String page_number = sCmd.next();
choose_viget_and_create(viget_name, page_name, page_number, "any-data", "dhtPerception");
ts.add(DHTP, dhtPerception_update_int, [&](void*) {
ts.add(DHTP, dht_calculation_update_int, [&](void*) {
byte value;
ComfortState cf;
value = dht.computePerception(jsonRead(configJson, "dhtT").toFloat(), jsonRead(configJson, "dhtH").toInt(), false);
String final_line = perception(value);
jsonWrite(configJson, "dhtPerception", final_line);
eventGen ("dhtPerception", "");
sendSTATUS("dhtPerception", final_line);
if (client.connected()) {
Serial.println("[i] sensor dhtPerception send date " + final_line);
if (dht.getStatus() != 0) {
sendSTATUS("dhtPerception", String(dht.getStatusString()));
} else {
value = dht.computePerception(jsonRead(configJson, "dhtT").toFloat(), jsonRead(configJson, "dhtH").toFloat(), false);
String final_line = perception(value);
jsonWrite(configJson, "dhtPerception", final_line);
eventGen ("dhtPerception", "");
sendSTATUS("dhtPerception", final_line);
if (client.connected()) {
Serial.println("[i] sensor 'dhtPerception' send date " + final_line);
}
}
}, nullptr, true);
}
@@ -214,74 +231,79 @@ String perception(byte value) {
if (value == 7) return "Сильно неудобно, полный звиздец";
}
void dhtComfort() {
String viget_name = sCmd.next();
String page_name = sCmd.next();
String page_number = sCmd.next();
choose_viget_and_create(viget_name, page_name, page_number, "any-data", "dhtComfort");
ts.add(DHTC, dhtComfort_update_int, [&](void*) {
ts.add(DHTC, dht_calculation_update_int, [&](void*) {
float value;
ComfortState cf;
value = dht.getComfortRatio(cf, jsonRead(configJson, "dhtT").toFloat(), jsonRead(configJson, "dhtH").toInt(), 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;
jsonWrite(configJson, "dhtComfort", final_line);
eventGen ("dhtComfort", "");
sendSTATUS("dhtComfort", final_line);
if (client.connected()) {
Serial.println("[i] sensor dhtComfort send date " + final_line);
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;
jsonWrite(configJson, "dhtComfort", final_line);
eventGen ("dhtComfort", "");
sendSTATUS("dhtComfort", final_line);
if (client.connected()) {
Serial.println("[i] sensor 'dhtComfort' send date " + final_line);
}
}
}, nullptr, true);
}
void dhtDewPoint() {
void dhtDewpoint() {
String viget_name = sCmd.next();
String page_name = sCmd.next();
String page_number = sCmd.next();
choose_viget_and_create(viget_name, page_name, page_number, "any-data", "dhtPerception");
ts.add(DHTP, dhtPerception_update_int, [&](void*) {
byte value;
ComfortState cf;
value = dht.computePerception(jsonRead(configJson, "dhtT").toFloat(), jsonRead(configJson, "dhtH").toInt(), false);
String final_line = perception(value);
jsonWrite(configJson, "dhtPerception", final_line);
eventGen ("dhtPerception", "");
sendSTATUS("dhtPerception", final_line);
if (client.connected()) {
Serial.println("[i] sensor dhtPerception send date " + final_line);
choose_viget_and_create(viget_name, page_name, page_number, "any-data", "dhtDewpoint");
ts.add(DHTD, dht_calculation_update_int, [&](void*) {
float value;
if (dht.getStatus() != 0) {
sendSTATUS("dhtDewpoint", String(dht.getStatusString()));
} else {
value = dht.computeDewPoint(jsonRead(configJson, "dhtT").toFloat(), jsonRead(configJson, "dhtH").toFloat(), false);
jsonWrite(configJson, "dhtDewpoint", value);
eventGen ("dhtDewpoint", "");
sendSTATUS("dhtDewpoint", String(value));
if (client.connected()) {
Serial.println("[i] sensor 'dhtDewpoint' send date " + String(value));
}
}
}, nullptr, true);
}

View File

@@ -16,7 +16,7 @@ void reconfigTime() {
configTime(jsonRead(configSetup, "timezone").toInt() * 3600, 0, ntpServer);
int i = 0;
Serial.println("[i]Awaiting for time ");
Serial.println("[i] Awaiting for time ");
#ifdef ESP32
struct tm timeinfo;
@@ -35,7 +35,7 @@ void reconfigTime() {
// }
#endif
Serial.print("Time = ");
Serial.print("[i] Time = ");
Serial.print(GetDataDigital());
Serial.print(" ");
Serial.println(GetTime());

View File

@@ -131,6 +131,8 @@ int readTimer(int number) {
}*/
//------------------------------таймеры------------------------------------------------------
/*
void time() {
String time_number = sCmd.next();
@@ -183,3 +185,4 @@ void time() {
}
}, nullptr, true);
}
*/

235
Upgrade.ino Normal file
View File

@@ -0,0 +1,235 @@
void initUpgrade() {
server.on("/upgrade", HTTP_GET, [](AsyncWebServerRequest * request) {
#ifdef ESP32
new_version = getURL("http://91.204.228.124:1100/update/esp32/version.txt");
#endif
#ifdef ESP8266
new_version = getURL("http://91.204.228.124:1100/update/esp8266/version.txt");
#endif
Serial.println(new_version);
String tmp = "{}";
if (new_version != "error") {
if (new_version == firmware_version) {
jsonWrite(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>Последняя версия прошивки уже установлена.");
jsonWrite(tmp, "class", "pop-up");
} else {
upgrade_flag = true;
jsonWrite(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>Идет обновление прошивки... После завершения устройство перезагрузится.");
jsonWrite(tmp, "class", "pop-up");
}
} else {
jsonWrite(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>Ошибка... Cервер не найден. Попробуйте позже...");
jsonWrite(tmp, "class", "pop-up");
}
request->send(200, "text/text", tmp);
});
}
void upgrade_firmware() {
String scenario_for_update;
String config_for_update;
String configSetup_for_update;
scenario_for_update = readFile("firmware.scenario.txt", 2048);
config_for_update = readFile("firmware.config.txt", 2048);
configSetup_for_update = configSetup;
Serial.println("Start upgrade SPIFFS, please wait...");
WiFiClient client_for_upgrade;
#ifdef ESP32
httpUpdate.rebootOnUpdate(false);
t_httpUpdate_return ret = httpUpdate.updateSpiffs(client_for_upgrade, "http://91.204.228.124:1100/update/esp32/esp32-esp8266_iot-manager_modules_firmware.spiffs.bin");
#endif
#ifdef ESP8266
ESPhttpUpdate.rebootOnUpdate(false);
t_httpUpdate_return ret = ESPhttpUpdate.updateSpiffs(client_for_upgrade, "http://91.204.228.124:1100/update/esp8266/esp32-esp8266_iot-manager_modules_firmware.spiffs.bin");
#endif
if (ret == HTTP_UPDATE_OK) {
writeFile("firmware.scenario.txt", scenario_for_update);
writeFile("firmware.config.txt", config_for_update);
writeFile("config.json", configSetup_for_update);
saveConfig();
Serial.println("SPIFFS upgrade done!");
Serial.println("Start upgrade BUILD, please wait...");
#ifdef ESP32
httpUpdate.rebootOnUpdate(true);
t_httpUpdate_return ret = httpUpdate.update(client_for_upgrade, "http://91.204.228.124:1100/update/esp32/esp32-esp8266_iot-manager_modules_firmware.ino.bin");
#endif
#ifdef ESP8266
ESPhttpUpdate.rebootOnUpdate(true);
t_httpUpdate_return ret = ESPhttpUpdate.update(client_for_upgrade, "http://91.204.228.124:1100/update/esp8266/esp32-esp8266_iot-manager_modules_firmware.ino.bin");
#endif
Serial.println("BUILD upgrade done!");
Serial.println("Restart ESP....");
} else {
//upgrade_status(t_httpUpdate_return ret);
}
}
void handle_upgrade() {
if (upgrade_flag) {
upgrade_flag = false;
upgrade_firmware();
}
}
/*
void upgrade_status(t_httpUpdate_return set) {
switch (set) {
case HTTP_UPDATE_FAILED:
Serial.printf("UPDATE_FAILED Error (%d): %s", httpUpdate.getLastError(), httpUpdate.getLastErrorString().c_str());
break;
case HTTP_UPDATE_NO_UPDATES:
Serial.println("NO_UPDATES");
break;
case HTTP_UPDATE_OK:
Serial.println("HTTP_UPDATE_OK");
break;
}
}
*/
/*
// ----------------------- Обновление с сайта
void webUpgrade() {
#ifdef ESP8266
String spiffsData = "http://91.204.228.124:1100/update/esp8266/esp32-esp8266_iot-manager_modules_firmware.spiffs.bin";
String buildData = "http://91.204.228.124:1100/update/esp8266/esp32-esp8266_iot-manager_modules_firmware.ino.bin";
#endif
#ifdef ESP32
String spiffsData = "http://91.204.228.124:1100/update/esp32/esp32-esp8266_iot-manager_modules_firmware.spiffs.bin";
String buildData = "http://91.204.228.124:1100/update/esp32/esp32-esp8266_iot-manager_modules_firmware.ino.bin";
#endif
if (spiffsData != "") { // Если нужно прошить FS
String scenario_for_update;
String config_for_update;
String configSetup_for_update;
Serial.println(spiffsData);
scenario_for_update = readFile("firmware.scenario.txt", 2048);
config_for_update = readFile("config.all.txt", 2048);
configSetup_for_update = configSetup;
ESPhttpUpdate.rebootOnUpdate(false); // Отключим перезагрузку после обновления
updateHTTP(spiffsData, true);
writeFile("firmware.scenario.txt", scenario_for_update);
writeFile("config.all.txt", config_for_update);
writeFile("config.json", configSetup_for_update);
saveConfig();
}
if (buildData != "") { // Если нужно прошить build
Serial.println(buildData);
ESPhttpUpdate.rebootOnUpdate(true); // Включим перезагрузку после обновления
updateHTTP(buildData, false);
}
}
// ------------------ Обновление по url
void updateHTTP(String url, boolean mode) {
if (url == "") return;
ESPhttpUpdate.setLedPin(LED_BUILTIN, LOW);
if (mode) {
Serial.println("Update Spiffs...");
t_httpUpdate_return ret = ESPhttpUpdate.updateSpiffs(url);
UpdateStatus(ret , "Spiffs");
} else {
Serial.println("Update Build...");
t_httpUpdate_return ret = ESPhttpUpdate.update(url);
UpdateStatus(ret , "build");
}
}
void UpdateStatus(t_httpUpdate_return set, String mode) {
switch (set) {
case HTTP_UPDATE_FAILED:
Serial.println(mode + "_FAILED");
var = "{}";
jsonWrite(var, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>_FAILED");
jsonWrite(var, "class", "pop-up");
//request->send(200, "text/text", var);
break;
case HTTP_UPDATE_NO_UPDATES:
Serial.println(mode + "_NO_UPDATES");
var = "{}";
jsonWrite(var, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>_NO_UPDATES");
jsonWrite(var, "class", "pop-up");
//request->send(200, "text/text", var);
break;
case HTTP_UPDATE_OK:
Serial.println(mode + "_UPDATE_OK");
var = "{}";
jsonWrite(var, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>_UPDATE_OK");
jsonWrite(var, "class", "pop-up");
//request->send(200, "text/text", var);
break;
}
}
*/

View File

@@ -58,6 +58,8 @@ void WIFI_init() {
}
else {
WiFi.begin(_ssid.c_str(), _password.c_str());
Serial.print("ssid: ");
Serial.println(_ssid);
}
// Делаем проверку подключения до тех пор пока счетчик tries
// не станет равен нулю или не получим подключение

BIN
data/ace.js.gz Normal file

Binary file not shown.

1
data/config-all.json Normal file
View File

@@ -0,0 +1 @@
{"SSDP":"MODULES","chipID":"905542-1458415","ssidAP":"WiFi","passwordAP":"","ssid":"your_ssid","password":"your_pass","timezone":3,"mqttServer":"","mqttPort":0,"mqttUser":"","mqttPass":"","scenario":"1","timers":"0","pushingbox_id":"","web_login":"admin","web_pass":"admin"}

View File

@@ -1 +0,0 @@
{"SSDP":"MODULES","chipID":"905542-1458415","ssidAP":"WiFi","passwordAP":"","ssid":"rise","password":"hostel3333","timezone":3,"mqttServer":"m12.cloudmqtt.com","mqttPort":14053,"mqttUser":"lbscvzuj","mqttPass":"bLxlveOgaF8F","scenario":"1","timers":"0","pushingbox_id":"v7C133E426B0C69E","web_login":"admin","web_pass":"admin"}

View File

@@ -1 +1 @@
{"SSDP":"MODULES","chipID":"905542-1458415","ssidAP":"WiFi","passwordAP":"","ssid":"your_ssid","password":"your_pass","timezone":3,"mqttServer":"","mqttPort":0,"mqttUser":"","mqttPass":"","scenario":"1","timers":"0","pushingbox_id":"","web_login":"admin","web_pass":"admin"}
{"SSDP":"MODULES","chipID":"905542-1458415","ssidAP":"WiFi","passwordAP":"","ssid":"rise","password":"hostel3333","timezone":3,"mqttServer":"m12.cloudmqtt.com","mqttPort":14053,"mqttUser":"lbscvzuj","mqttPass":"bLxlveOgaF8F","scenario":"1","timers":"0","pushingbox_id":"v7C133E426B0C69E","web_login":"admin","web_pass":"admin"}

View File

@@ -0,0 +1,7 @@
analog 0 Аналоговый#вход,#% Датчики progress-round 310 620 1 100 1
//если датчик углекислого газа выдает напряжение от 1 вольта до 2 вольт, то значит
//значение чтения аналогового входа будут примерно равным
//при 1 вольте - 310, а при 2 вольтах - 620 (считаем по пропорции)
//данная строка переведет диапазон 310-620 в диапазон 1-100 и отобразит в приложении
//варианты отображения: any-data, progress-round, progress-line

View File

@@ -0,0 +1 @@

View File

@@ -0,0 +1,4 @@
dallas 2 Водонагреватель,#t°C Датчики any-data 1
//2 - номер пина датчика
//варианты отображения: any-data, progress-round, progress-line

View File

@@ -0,0 +1 @@

View File

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

View File

@@ -0,0 +1 @@

View File

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

View File

@@ -0,0 +1 @@

View File

@@ -0,0 +1,24 @@
button 1 na Включить#все Реле 0 1
button 2 13 Прихожая Реле 0 2
button 3 14 Кухня Реле 0 3
pwm 1 3 Яркость#коредор: Реле 1023 4
pwm 2 4 Яркость#ванная: Реле 510 5
//---------------------------------------------------------------------
analog 0 Аналоговый#вход,#% Датчики progress-round 1 1024 1 1024 6
inputDigit digit1 При#скольки#включить? Датчики 10 7
inputDigit digit2 При#скольки#выключить? Датчики 0 8
button 4 na Нагреватель Датчики 0 9
//---------------------------------------------------------------------
button 5 na Вкл#обратный#таймер Таймеры 0 16
inputDigit digit3 Через#сколько#секунд#включить? Таймеры 5 17
button 6 na Включится#по#таймеру Таймеры 0 18
inputTime time1 Во#сколько#включить? Таймеры 20-30-00 19
button 7 5 Включится#по#таймеру Таймеры 0 20
//---------------------------------------------------------------------
switch 1 0 20
text 1 Вход: Охрана 20
textSet 1 не#обнаружено-time
button 8 na Сбросить Охрана 0 21
//---------------------------------------------------------------------
button 9 scenario Вкл#выкл#все#сценарии Сценарии 1 23
button 10 line1,line2, Вкл#выкл#выбранные#сценарии Сценарии 1 24

View File

@@ -0,0 +1,33 @@
button1 = 1
buttonSet 2 1
buttonSet 3 1
pwmSet 2 1024
end
button1 = 0
buttonSet 2 0
buttonSet 3 0
pwmSet 2 0
end
analog > digit1
buttonSet 4 1
end
analog < digit2
buttonSet 4 0
end
button5 = 1
timerStart 1 digit3 sec
end
timer1 = 0
buttonSet 6 1
end
timenow = time1
buttonSet 7 1
end
switch1 = 1
textSet 1 обнаружено#движение-time
push Внимание обнаружено#движение!
end
button8 = 1
textSet 1 не#обнаружено-time
buttonSet 8 0
end

View File

@@ -0,0 +1,10 @@
level Вода#в#баке,#% Датчики any-data 125 20 1
inputDigit digit1 При#скольки#выключить? Датчики 95 2
inputDigit digit2 При#скольки#включить? Датчики 10 3
button 1 5 Насос Датчики 0 4
button 2 line1,line2, Автоматический#режим Датчики 1 5
//125 - это расстояние от датчика до дна бака в сантиметрах
//20 - это расстояние от датчика до поверхности воды когда бак полный в сантиметрах
//вывод данных будет в процентах заполнения бака
//варианты отображения: any-data, progress-round, progress-line

View File

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

View File

@@ -0,0 +1,11 @@
button 1 5 Прихожая Освещение 0 1
inputDigit digit1 Задержка#выключения Освещение 30 2
switch 1 0 10
//0 - номер пина датчика движения
//5 - номер пина реле
//при срабатывании датчика движения включится реле и обратный таймер на 30 сек
//если движение не будет обнаружено повтороно в течении 30 секунд - свет выключится
//если движение повторится в течении 30 секунд то таймер продлится опять на 30 сек
//свет выключится только в том случае если в комнате все замрет на 30 сек
//задержку выключения можно будет настраивать в приложении

View File

@@ -0,0 +1,7 @@
switch1 = 1
timerStart 1 digit1 sec
buttonSet 1 1
end
timer1 = 0
buttonSet 1 0
end

View File

@@ -0,0 +1,10 @@
switch 1 0 20
text 1 Вход: Охрана 1
textSet 1 не#обнаружено-time
button 1 na Сбросить Охрана 0 2
//0 - номер пина датчика
//при срабатывании датчика движения устройство пошлет пуш и в приложении будет
//написано в текстовом поле, что движение было обнаружено, так же будет зафиксирован
//момент времени срабатывания датчика
//перевести датчик снова в режим ожидания движения можно нажав кнопку сброса в приложении

View File

@@ -0,0 +1,8 @@
switch1 = 1
textSet 1 обнаружено#движение-time
push Внимание обнаружено#движение!
end
button1 = 1
textSet 1 не#обнаружено-time
buttonSet 1 0
end

View File

@@ -0,0 +1,6 @@
pwm 1 3 Яркость#коредор: Реле 1023 1
pwm 2 4 Яркость#ванная: Реле 510 2
//в приложении появятся ползунки, соответствующее значение pwm
//будет установленно на пинах 3 и 4
//1023 и 510 это начальные значения после загрузки модуля

View File

@@ -0,0 +1 @@

View File

@@ -0,0 +1,3 @@
button 1 5 Включить#реле Реле 0 1
//это простая кнопка номер 1 управляющая пином 5 имеющая начальное состояние 0

View File

@@ -0,0 +1 @@

View File

@@ -0,0 +1,6 @@
button 1 5 Включить#все Реле 0 1
//что бы использовать эту конфигурацию на другой esp необходимо активировать пресет
//"Вкл. выкл. локального реле", затем в сценарии данного модуля подставить Device ID
//того esp, кнопка на этом девайсе будет выключать другие устройства по воздуху

View File

@@ -0,0 +1,8 @@
button1 = 1
mqtt 3233662-1589485 buttonSet_1_1
mqtt 2233662-1589486 buttonSet_1_1
end
button1 = 0
mqtt 3233662-1589485 buttonSet_1_0
mqtt 2233662-1589486 buttonSet_1_0
end

View File

@@ -0,0 +1,4 @@
button 1 5 Вкл#на#время Таймеры 0 1
inputDigit digit1 Через#сколько#секунд#выключить? Таймеры 5 2
//в сценариях можно поменять на sec, min или hours если нужны другие размерности времени

View File

@@ -0,0 +1,6 @@
button1 = 1
timerStart 1 digit1 sec
end
timer1 = 0
buttonSet 1 0
end

View File

@@ -0,0 +1,3 @@
switch 1 0 10
//физическая кнопка номер 1 подключенная к пину 0, задержка от дребезга 10 мс

View File

@@ -0,0 +1,3 @@
switch1 = 1
mqtt 3233662-1589489 buttonChange_1
end

View File

@@ -0,0 +1,3 @@
button 1 na Включить#все Освещение 0 1
//при нажатии на эту кнопку пины номер 5 и 13 поведут себя как установленно в сценариях

View File

@@ -0,0 +1,8 @@
button1 = 1
pinSet 5 1
pinSet 13 0
end
button1 = 0
pinSet 5 0
pinSet 13 1
end

View File

@@ -0,0 +1,6 @@
switch 1 0 10
//что бы использовать эту конфигурацию на другой esp необходимо активировать пресет
//"Вкл. выкл. локального реле", затем в сценарии данного модуля подставить Device ID
//того esp, к данному модулю нужно подключить кнопку к пину 0 и тогда
//один девайс будет управлять другим по воздуху

View File

@@ -0,0 +1,4 @@
switch1 = 1
mqtt 3233662-1589485 buttonChange_1
mqtt 2233662-1589486 buttonChange_1
end

View File

@@ -0,0 +1,4 @@
button 1 13 Включить#реле Реле 0 1
switch 1 0 10
//можно управлять реле на пине 13 кнопкой на пине 0 или кнопкой в приложении

View File

@@ -0,0 +1,3 @@
switch1 = 1
buttonChange 1
end

View File

@@ -0,0 +1,6 @@
inputTime time1 Во#сколько#включить? Таймеры 20-30-00 1
inputTime time2 Во#сколько#выключить? Таймеры 20-35-00 2
button 1 5 Кнопка#(по#таймеру) Таймеры 0 3
//время в приложение необходимо вводить в строгом формате: ЧЧ-ММ-СС
//можно создавать любое количество таймеров, копируя строку inputTime...

View File

@@ -0,0 +1,6 @@
timenow = time1
buttonSet 1 1
end
timenow = time2
buttonSet 1 0
end

View File

@@ -0,0 +1,12 @@
dallas 2 Водонагреватель,#t°C Термостат any-data 1
inputDigit digit1 При#скольки#выключить? Термостат 40 2
inputDigit digit2 При#скольки#включить? Термостат 20 3
button 1 5 Нагреватель Термостат 0 4
button 2 line1,line2, Автоматический#режим Термостат 1 5
//2 - номер пина датчика
//5 - номер пина реле
//это термостат который будет держать температуру между двумя
//установленными в приложении значениями, так же можно выключить
//автоматический режим, и тогда нагреватель будет управляться в ручную

View File

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

View File

@@ -4,6 +4,7 @@
"/config.live.json",
"/config.setup.json",
"/config.option.json"
],
"class":"col-sm-offset-1 col-sm-10",
"content": [
@@ -27,6 +28,33 @@
{
"type": "hr"
},
{
"type":"dropdown",
"name":"help-url",
"class":"btn btn-warning btn-lg",
"style":"display:inline",
"title": {
"#":"Выбирите то, во что Вы хотите превратить ESP <span class=\"caret\"></span>",
"/relay":"Вкл. выкл. локального реле",
"/relay_timer":"Вкл. выкл. локального реле в определенное время",
"/relay_countdown":"Вкл. выкл. локального реле на определенный период времени",
"/relay_several":"Вкл. выкл. нескольких локальных реле кнопкой в приложении",
"/relay_switch":"Вкл. выкл. локального реле физической кнопкой (кнопка так же дублируется в приложении)",
"/relay_button_remote":"Вкл. выкл. нескольких удаленных реле кнопкой в приложении (нужно указать Device ID)",
"/relay_switch_remote":"Вкл. выкл. нескольких удаленных реле физической кнопкой (нужно указать Device ID)",
"/pwm":"Широтно импульсная модуляция",
"/dht11":"Сенсор DHT11",
"/dht22":"Сенсор DHT22, DHT33, DHT44, AM2302, RHT03",
"/analog":"Аналоговый сенсор",
"/dallas":"Сенсор DS18B20",
"/termostat":"Термостат на DS18B20 с переключением в ручной режим",
"/level":"Контроль уровня в баке на сенсорах: JSN-SR04T, HC-SR04, HY-SRF05 (управление насосом)",
"/moution_relay":"Датчик движения включающий свет",
"/moution_security":"Охранный датчик движения",
"/default":"Настройки по умолчанию"
}
},
{
"type": "h2",
"title": "Конфигурация устройства"
@@ -68,67 +96,6 @@
"action": "/scenario?status=1",
"class":"btn btn-block btn-success"
},
{
"type": "h2",
"title": "Данные модулей"
},
{
"type": "hr"
},
{
"type": "h4",
"title": "Модуль уровня воды (level)",
"style": "width:100%"
},
{
"type": "h6",
"title": "Расстояние от датчика до воды: {{level_in}} см"
},
{
"type": "h6",
"title": " Заполнение бака: {{level}} %"
},
{
"type": "hr"
},
{
"type": "h4",
"title": "Модуль аналогового входа (analog)",
"style": "width:100%"
},
{
"type": "h6",
"title": "Прочитанное значение: {{analog_in}}"
},
{
"type": "h6",
"title": "Преобразованное значение: {{analog}}"
},
{
"type": "hr"
},
{
"type": "h4",
"title": "Модуль температурного датчика (dallas)",
"style": "width:100%"
},
{
"type": "h6",
"title": "Текущее значение: {{dallas}} °C"
},
{
"type": "hr"
},
{
"type": "h4",
"title": "Модуль pH сенсора от df robot (ph)",
"style": "width:100%"
},
{
"type": "h6",
"title": "Текущее значение: {{ph}}"
},
{
"type": "hr"
},

BIN
data/edit.htm.gz Normal file

Binary file not shown.

View File

@@ -3,27 +3,22 @@ button 2 13 Прихожая Реле 0 2
button 3 14 Кухня Реле 0 3
pwm 1 3 Яркость#коредор: Реле 1023 4
pwm 2 4 Яркость#ванная: Реле 510 5
//-------------------------------------------------------------------------------------------------
//analog 0 Аналоговый#вход,#% Датчики progress-round 1 1024 1 1024 6
//---------------------------------------------------------------------
analog 0 Аналоговый#вход,#% Датчики progress-round 1 1024 1 1024 6
inputDigit digit1 При#скольки#включить? Датчики 10 7
inputDigit digit2 При#скольки#выключить? Датчики 0 8
button 4 na Нагреватель Датчики 0 9
//dallas 2 Водонагреватель,#t°C Датчики any-data 10
dhtT DHT11 2 Температура#DHT,#t°C Датчики any-data 11
dhtH DHT11 2 Влажность#DHT,#% Датчики any-data 12
dhtComfort Степень#комфорта: Датчики 12
dhtPerception Восприятие: Датчики 13
//level Вода#в#баке,#% Датчики any-data 125 20 14
//-------------------------------------------------------------------------------------------------
button 5 na Вкл#обратный#таймер Таймеры 0 15
inputDigit digit3 Через#сколько#секунд#включить? Таймеры 5 16
button 6 na Включится#по#таймеру Таймеры 0 17
inputTime time1 Во#сколько#включить? Таймеры 20.30 18
button 7 5 Включится#по#таймеру Таймеры 0 19
//-------------------------------------------------------------------------------------------------
//---------------------------------------------------------------------
button 5 na Вкл#обратный#таймер Таймеры 0 16
inputDigit digit3 Через#сколько#секунд#включить? Таймеры 5 17
button 6 na Включится#по#таймеру Таймеры 0 18
inputTime time1 Во#сколько#включить? Таймеры 20-30-00 19
button 7 5 Включится#по#таймеру Таймеры 0 20
//---------------------------------------------------------------------
switch 1 0 20
textSet 1 неопределено
text 1 Квартира Двери 22
//-------------------------------------------------------------------------------------------------
button 8 scenario Вкл#выкл#все#сценарии Сценарии 1 23
button 9 line1,line2, Вкл#выкл#выбранные#сценарии Сценарии 1 24
text 1 Вход: Охрана 20
textSet 1 не#обнаружено-time
button 8 na Сбросить Охрана 0 21
//---------------------------------------------------------------------
button 9 scenario Вкл#выкл#все#сценарии Сценарии 1 23
button 10 line1,line2, Вкл#выкл#выбранные#сценарии Сценарии 1 24

View File

@@ -24,9 +24,10 @@ timenow = time1
buttonSet 7 1
end
switch1 = 1
textSet 1 закрыто-time
push закрыто вход
textSet 1 обнаружено#движение-time
push Внимание обнаружено#движение!
end
switch1 = 0
textSet 1 открыто-time
button8 = 1
textSet 1 не#обнаружено-time
buttonSet 8 0
end

View File

@@ -19,6 +19,18 @@
"type": "h4",
"title": "IP address: {{ip}}"
},
{
"type": "h4",
"title": "Uptime: {{uptime}}"
},
{
"type": "h4",
"title": "Build version: {{firmware_version}}"
},
{
"type": "h4",
"title": "SPIFFS version: 2.2"
},
{
"type": "link",
"title": "Конфигурация устройства",
@@ -46,6 +58,25 @@
"action": "/page.htm?pushingbox",
"class": "btn btn-block btn-success"
},
{
"type": "hr"
},
{
"type":"h3",
"name":"my-block",
"style":"position:fixed;top:30%;left:50%;width:400px;margin-left:-200px;text-align:center;",
"class":"hidden"
},
{
"type": "button",
"title":"Обновить прошивку",
"action": "/upgrade",
"response":"[[my-block]]",
"class": "btn btn-block btn-success"
},
{
"type": "hr"
},
{
"type": "link",
"title": "Скачать приложение IoT Manager для android",

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
data/mode-html.js.gz Normal file

Binary file not shown.

View File

@@ -1,57 +0,0 @@
{
"configs": [
"/config.live.json",
"/config.option.json",
"/config.setup.json",
"/lang/lang.ru.json",
"socket {{ip}}:81/"
],
"title": "Главная",
"class":"col-sm-offset-1 col-sm-10 col-md-offset-2 col-md-8 col-lg-offset-3 col-lg-6",
"content": [
{
"type": "h5",
"title": "{{SSDP}}",
"class":"alert-warning"
},
{
"type": "h4",
"title": "Module tank level:",
"style": "width:80%;float:left;"
},
{
"type": "h4",
"title": "{{module_tank_level_s}}",
"style": "width:20%;float:right;"
},
{
"type": "h4",
"title": "Module analog:",
"style": "width:80%;float:left;"
},
{
"type": "h4",
"title": "{{module_analog_s}}",
"style": "width:20%;float:right;"
},
{
"type": "h4",
"title": "Module ds18b20:",
"style": "width:80%;float:left;"
},
{
"type": "h4",
"title": "{{module_ds18b20_s}}",
"style": "width:20%;float:right;"
},
{
"type": "link",
"title": "Главная",
"action": "/page.htm?index",
"class": "btn btn-block btn-danger btn-sm",
"style": "width:100%;float:right;"
}
]
}

View File

@@ -3,7 +3,7 @@
void setup() {
Serial.begin(115200);
Serial.setDebugOutput(true);
//Serial.setDebugOutput(true);
Serial.println("--------------started----------------");
//--------------------------------------------------------------
SPIFFS.begin();
@@ -25,6 +25,8 @@ void setup() {
Serial.setDebugOutput(0);
#endif
jsonWrite(configSetup, "firmware_version", firmware_version);
prex = prefix + "/" + chipID;
Serial.println(chipID);
//--------------------------------------------------------------
@@ -48,17 +50,21 @@ void setup() {
//--------------------------------------------------------------
Push_init();
Serial.println("[V] Push_init");
//--------------------------------------------------------------
statistics();
Serial.println("[V] statistics");
//--------------------------------------------------------------
initUpgrade();
Serial.println("[V] initUpgrade");
//--------------------------------------------------------------
getMemoryLoad("[i] After loading");
ts.add(TEST, 14400, [&](void*) {
ts.add(TEST, 5000, [&](void*) {
up_time();
}, nullptr, true);
statistics();
}, nullptr, false);
}
void loop() {
@@ -78,4 +84,5 @@ void loop() {
handleScenario();
ts.update();
handle_upgrade();
}

View File

@@ -137,8 +137,7 @@ String getURL(String urls) {
if (httpCode == HTTP_CODE_OK) {
answer = http.getString();
}
else
{
else {
answer = "error";
}
http.end();

114
mqtt.ino
View File

@@ -4,45 +4,60 @@ void MQTT_init() {
server.on("/mqttSave", HTTP_GET, [](AsyncWebServerRequest * request) {
if (request->hasArg("mqttServer")) {
jsonWrite(configSetup, "mqttServer", request->getParam("mqttServer")->value());
jsonWrite(configSetup, "mqttServer", request->getParam("mqttServer")->value());
}
if (request->hasArg("mqttPort")) {
int port = (request->getParam("mqttPort")->value()).toInt();
jsonWrite(configSetup, "mqttPort", port);
int port = (request->getParam("mqttPort")->value()).toInt();
jsonWrite(configSetup, "mqttPort", port);
}
if (request->hasArg("mqttUser")) {
jsonWrite(configSetup, "mqttUser", request->getParam("mqttUser")->value());
jsonWrite(configSetup, "mqttUser", request->getParam("mqttUser")->value());
}
if (request->hasArg("mqttPass")) {
jsonWrite(configSetup, "mqttPass", request->getParam("mqttPass")->value());
jsonWrite(configSetup, "mqttPass", request->getParam("mqttPass")->value());
}
saveConfig();
client.disconnect();
MQTT_Connecting(false);
MQTT_Connecting();
/*
int i = 0;
while (!client.connected() && i <= 25) {
delay(1000);
Serial.print(".");
i++;
}
*/
String tmp = "{}";
jsonWrite(tmp, "title", "<button class=\"close\" onclick=\"toggle('my-block')\">×</button>" + stateMQTT());
jsonWrite(tmp, "class", "pop-up");
#ifdef ESP8266
request->send(200, "text/text", "ok");
//request->send(200, "text/text", tmp); // отправляем ответ о выполнении
#endif
#ifdef ESP32
request->send(200, "text/text", tmp);
#endif
});
//проверка подключения к серверу
ts.add(WIFI_MQTT_CONNECTION_CHECK, wifi_mqtt_reconnecting, [&](void*) {
up_time();
if (WiFi.status() == WL_CONNECTED) {
Serial.println("[V] WiFi-ok");
if (client.connected()) {
Serial.println("[V] MQTT-ok");
} else {
MQTT_Connecting(true);
MQTT_Connecting();
mqtt_lost_error++;
}
} else {
Serial.println("[E] Lost WiFi connection");
wifi_lost_error++;
ts.remove(WIFI_MQTT_CONNECTION_CHECK);
StartAPMode();
}
@@ -59,63 +74,42 @@ void handleMQTT() {
}
}
//===============================================ПОДКЛЮЧЕНИЕ========================================================
void MQTT_Connecting(boolean out_date_send) {
boolean MQTT_Connecting() {
String mqtt_server = jsonRead(configSetup, "mqttServer");
if ((mqtt_server != "")) {
static boolean first = true;
if (!first) Serial.println("[E] Lost MQTT connection, start reconnecting");
first = false;
//ssl//espClient.setCACert(local_root_ca1);
client.setServer(mqtt_server.c_str(), jsonReadtoInt(configSetup, "mqttPort"));
// подключаемся к MQTT серверу
if (WiFi.status() == WL_CONNECTED) {
if (!client.connected()) {
Serial.println("[V] Connecting to MQTT server commenced");
//busy = true;
if (client.connect(chipID.c_str(), jsonRead(configSetup, "mqttUser").c_str(), jsonRead(configSetup, "mqttPass").c_str())) {
Serial.println("[V] MQTT connected");
client.setCallback(callback);
client.subscribe(prefix.c_str()); // Для приема получения HELLOW и подтверждения связи
client.subscribe((prefix + "/" + chipID + "/+/control").c_str()); // Подписываемся на топики control
client.subscribe((prefix + "/" + chipID + "/order").c_str()); // Подписываемся на топики order
//client.subscribe((prefix + "/" + chipID + "/test").c_str()); //Для приема получения work и подтверждения связи (для приложения mqtt IOT MQTT Panel)
/* String tmp_line = id_of_other_device;
while (tmp_line.length() != 0) {
String id = selectToMarker(tmp_line, ","); //2058631-1589487 1
id = selectFromMarkerToMarker(id, " ", 0);
client.subscribe((prefix + "/" + id + "/+/status").c_str(), 0);
Serial.println("->subscribed to device, id: " + id);
tmp_line = deleteBeforeDelimiter(tmp_line, ",");
}*/
client.subscribe((prefix + "/ids").c_str()); // Подписываемся на топики ids
sendMQTT("test", "work");
Serial.println("[V] Callback set, subscribe done");
//busy = false;
if (out_date_send) outcoming_date(); //отправляем данные в виджеты
//if (out_date_send) outcoming_date(); //отправляем данные в виджеты
return true;
} else {
//Serial.println(stateMQTT());
Serial.println("[E] try again in " + String(wifi_mqtt_reconnecting / 1000) + " sec");
return false;
}
}
}
} else {
Serial.println("[E] No date for MQTT connection");
return false;
}
}
//=====================================================ВХОДЯЩИЕ ДАННЫЕ========================================================
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("[MQTT] ");
Serial.print(topic);
@@ -127,11 +121,9 @@ void callback(char* topic, byte* payload, unsigned int length) {
}
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 /IoTmanager/9139530-1458400/RelaySet1/control -> 1
if (topic_str.indexOf("control") > 0) { //IoTmanager/800324-1458415/RelaySet1/control 1
//Serial.println(topic_str);
String topic = selectFromMarkerToMarker(topic_str, "/", 3); //RelaySet1
String number = selectToMarkerLast(topic, "Set"); //1
@@ -151,8 +143,6 @@ void callback(char* topic, byte* payload, unsigned int length) {
//данные которые отправляем при подключении или отбновлении страницы
void outcoming_date() {
//busy = true;
sendAllWigets();
sendAllData();
@@ -163,12 +153,8 @@ void outcoming_date() {
Serial.println("[V] Sending all date to iot manager completed");
//busy = false;
}
//======================================CONFIG==================================================
///IoTmanager/2058631-1589487/config {----viget----}
///sendMQTT("config", data);
boolean sendMQTT(String end_of_topik, String data) {
String topik = prefix + "/" + chipID + "/" + end_of_topik;
boolean send_status = client.beginPublish(topik.c_str(), data.length(), false);
@@ -177,38 +163,16 @@ boolean sendMQTT(String end_of_topik, String data) {
return send_status;
}
//======================================STATUS==================================================
///IoTmanager/2058631-1589487/rel1/status {"status":"1"}
///sendSTATUS(topic, state)
void sendSTATUS(String topik, String state) {
topik = prefix + "/" + chipID + "/" + topik + "/" + "status";
String json_ = "{}";
jsonWrite(json_, "status", state);
//long st_time = millis();
int send_status = client.publish (topik.c_str(), json_.c_str(), false);
//long end_time = millis();
//Serial.println("send status = " + String(send_status) + ", timeout = " + String(end_time - st_time));
}
/*void sendSTATUS(String topik, String state, String type, String param) {
topik = prefix + "/" + chipID + "/" + topik + "/" + "status";
String json_ = "{}";
jsonWrite(json_, "status", state);
jsonWrite(json_, type, param);
//long st_time = millis();
int send_status = client.publish (topik.c_str(), json_.c_str(), false);
//long end_time = millis();
//Serial.println("send status = " + String(send_status) + ", timeout = " + String(end_time - st_time));
}*/
//======================================CONTROL==================================================
///IoTmanager/2058631-1589487/rel1/control 1
void sendCONTROL(String id, String topik, String state) {
String all_line = prefix + "/" + id + "/" + topik + "/control";
//long st_time = millis();
int send_status = client.publish (all_line.c_str(), state.c_str(), false);
//long end_time = millis();
//Serial.println("send control = " + String(send_status) + ", timeout = " + String(end_time - st_time));
}
//=====================================================ОТПРАВЛЯЕМ ВИДЖЕТЫ========================================================
@@ -218,9 +182,7 @@ void sendAllWigets() {
String line;
int psn_1 = 0;
int psn_2;
do {
psn_2 = all_vigets.indexOf("\r\n", psn_1);
line = all_vigets.substring(psn_1, psn_2);
line.replace("\n", "");
@@ -228,17 +190,14 @@ void sendAllWigets() {
//jsonWrite(line, "id", String(counter));
//jsonWrite(line, "pageId", String(counter));
counter++;
sendMQTT("config",line);
sendMQTT("config", line);
Serial.println("[V] " + line);
psn_1 = psn_2 + 1;
} while (psn_2 + 2 < all_vigets.length());
getMemoryLoad("[i] after send all vigets");
}
}
//=====================================================ОТПРАВЛЯЕМ ДАННЫЕ В ВИДЖЕТЫ ПРИ ОБНОВЛЕНИИ СТРАНИЦЫ========================================================
void sendAllData() { //берет строку json и ключи превращает в топики а значения колючей в них посылает
String current_config = configJson; //{"SSDP":"MODULES","lang":"","ip":"192.168.43.60","DS":"34.00","rel1":"1","rel2":"1"}
@@ -250,12 +209,9 @@ void sendAllData() { //берет строку json и ключи превра
while (current_config.length() != 0) {
String tmp = selectToMarker (current_config, ",");
String topic = selectToMarker (tmp, ":");
String topic = selectToMarker (tmp, ":");
topic.replace("\"", "");
String state = selectToMarkerLast (tmp, ":");
if (topic.indexOf("time") < 0) {
state.replace(".", ":");
}
state.replace("\"", "");
if (topic != ssdpS && topic != "lang" && topic != "ip" && topic.indexOf("_in") < 0) {
sendSTATUS(topic, state);
@@ -284,7 +240,7 @@ void sendLogData(String file, String topic) {
}
String stateMQTT() {
int state = client.state();
switch (state) {

79
set.h
View File

@@ -1,9 +1,42 @@
String firmware_version = "2.2";
String new_version;
//#define OTA_enable
//#define MDNS_enable
//#define WS_enable
#define TIME_COMPILING String(__TIME__)
#define DATE_COMPILING String(__DATE__)
#define wifi_mqtt_reconnecting 20000
//-----------------------------------------------------------------
#define analog_update_int 5000
//-----------------------------------------------------------------
#define ph_shooting_interval 500 //интервал выстрела датчика
#define ph_times_to_send 10 //после скольки выстрелов делать отправку данных
//-----------------------------------------------------------------
#define temp_update_int 5000
//-----------------------------------------------------------------
#define tank_level_shooting_interval 500 //интервал выстрела датчика
#define tank_level_times_to_send 20 //после скольки выстрелов делать отправку данных
//-----------------------------------------------------------------
#define dhtT_update_int 10000
#define dhtH_update_int 10000
#define dht_calculation_update_int 10000
//-----------------------------------------------------------------
//==библиотеки и объекты для ESP8266==//
#ifdef ESP8266
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <ESPAsyncTCP.h>
#include <ESP8266mDNS.h>
#include <ESP8266httpUpdate.h>
#include <ESP8266HTTPUpdateServer.h>
ESP8266HTTPUpdateServer httpUpdater;
#endif
//==библиотеки и объекты для ESP32==//
@@ -15,8 +48,12 @@
#endif
#include <AsyncTCP.h>
#include <analogWrite.h>
#include <HTTPUpdate.h>
#include <HTTPClient.h>
HTTPClient http;
//HTTPClient http;
#endif
//==общие библиотеки и объекты==//
@@ -36,7 +73,7 @@ AsyncEventSource events("/events");
#include "time.h"
#include <TickerScheduler.h>
TickerScheduler ts(30);
enum { ROUTER_SEARCHING, WIFI_MQTT_CONNECTION_CHECK, LEVEL, ANALOG_, DALLAS, DHTT, DHTH, DHTC, DHTP, ANALOG_LOG, LEVEL_LOG, DALLAS_LOG, PH_LOG, CMD , TIMER_COUNTDOWN, TIMERS, TIME, TEST};
enum {ROUTER_SEARCHING, WIFI_MQTT_CONNECTION_CHECK, LEVEL, ANALOG_, DALLAS, DHTT, DHTH, DHTC, DHTP, DHTD, ANALOG_LOG, LEVEL_LOG, DALLAS_LOG, PH_LOG, CMD , TIMER_COUNTDOWN, TIMERS, TIME, TEST};
//ssl//#include "dependencies/WiFiClientSecure/WiFiClientSecure.h" //using older WiFiClientSecure
#include <PubSubClient.h>
@@ -67,34 +104,7 @@ DHTesp dht;
Adafruit_Si7021 sensor_Si7021 = Adafruit_Si7021();
//-----------------------------------------------------------------
//#define OTA_enable
//-----------------------------------------------------------------
//#define MDNS_enable
//-----------------------------------------------------------------
//#define WS_enable
//-----------------------------------------------------------------
#define wifi_mqtt_reconnecting 20000
//-----------------------------------------------------------------
#define analog_update_int 5000
//-----------------------------------------------------------------
#define ph_shooting_interval 500 //интервал выстрела датчика
#define ph_times_to_send 10 //после скольки выстрелов делать отправку данных
//-----------------------------------------------------------------
#define temp_update_int 5000
//-----------------------------------------------------------------
#define tank_level_shooting_interval 500 //интервал выстрела датчика
#define tank_level_times_to_send 20 //после скольки выстрелов делать отправку данных
//-----------------------------------------------------------------
#define dhtT_update_int 5000
#define dhtH_update_int 5000
#define dhtComfort_update_int 5000
#define dhtPerception_update_int 5000
//-----------------------------------------------------------------
const char* hostName = "esp-async";
const char* hostName = "IoT Manager";
String configSetup = "{}";
String configJson = "{}";
@@ -123,3 +133,12 @@ const String ssdpS = "SSDP";
String current_time;
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 wifi_lost_error = 0;
int mqtt_lost_error = -1;
String var;
boolean upgrade_flag = false;
boolean get_url_flag = false;