From e1ef48970685f536a388cb54b251a960a60ad006 Mon Sep 17 00:00:00 2001 From: Dmitry Borisenko <49808844+DmitryBorisenko33@users.noreply.github.com> Date: Mon, 16 Mar 2020 00:00:59 +0100 Subject: [PATCH] add web socket and stepper control --- Cmd.ino | 43 ++++++++++++++++++ Init.ino | 7 +++ Sensors.ino | 7 ++- Upgrade.ino | 20 +++++--- Web_server.ino | 14 ++++-- WiFi.ino | 6 +-- data/config.json | 2 +- data/configs/stepper.config.txt | 10 ++++ data/configs/stepper.scenario.txt | 6 +++ data/configuration.json | 33 +++++++------- data/css/build.css.gz | Bin 15178 -> 15178 bytes data/edit.htm.gz | Bin 5794 -> 5906 bytes data/index.htm.gz | Bin 1444 -> 1190 bytes data/index.json | 37 ++++++++++++++- data/index.json.gz | Bin 0 -> 708 bytes data/js/build.chart.js.gz | Bin 12758 -> 12758 bytes data/js/function.js.gz | Bin 17521 -> 18027 bytes data/setup.json | 3 +- ...2-esp8266_iot-manager_modules_firmware.ino | 9 ++-- main.ino | 25 +++++++--- mqtt.ino | 5 ++ set.h | 7 ++- 22 files changed, 189 insertions(+), 45 deletions(-) create mode 100644 data/configs/stepper.config.txt create mode 100644 data/configs/stepper.scenario.txt create mode 100644 data/index.json.gz diff --git a/Cmd.ino b/Cmd.ino index 90ec9fd9..c157e56e 100644 --- a/Cmd.ino +++ b/Cmd.ino @@ -4,6 +4,8 @@ void CMD_init() { sCmd.addCommand("buttonSet", buttonSet); sCmd.addCommand("buttonChange", buttonChange); + //sCmd.addCommand("button_touch", button_touch); + sCmd.addCommand("pinSet", pinSet); sCmd.addCommand("pinChange", pinChange); @@ -22,6 +24,9 @@ void CMD_init() { sCmd.addCommand("dhtComfort", dhtComfort); sCmd.addCommand("dhtDewpoint", dhtDewpoint); + sCmd.addCommand("stepper", stepper); + sCmd.addCommand("stepperSet", stepperSet); + sCmd.addCommand("logging", logging); sCmd.addCommand("inputDigit", inputDigit); @@ -322,6 +327,44 @@ void textSet() { sendSTATUS("textSet" + number, text); } +//===================================================================================================================================== +//=========================================Модуль шагового мотора====================================================================== + +//stepper 1 12 13 +void stepper() { + String stepper_number = sCmd.next(); + String pin_step = sCmd.next(); + String pin_dir = sCmd.next(); + + jsonWrite(optionJson, "stepper" + stepper_number, pin_step + " " + pin_dir); + pinMode(pin_step.toInt(), OUTPUT); + pinMode(pin_dir.toInt(), OUTPUT); +} + +//stepperSet 1 100 5 +void stepperSet() { + String stepper_number = sCmd.next(); + String steps = sCmd.next(); + String stepper_speed = sCmd.next(); + + String pin_step = selectToMarker (jsonRead(optionJson, "stepper" + stepper_number), " "); + String pin_dir = deleteBeforeDelimiter (jsonRead(optionJson, "stepper" + stepper_number), " "); + + Serial.println(pin_step); + Serial.println(pin_dir); + + if (steps.toInt() > 0) digitalWrite(pin_dir.toInt(), HIGH); + if (steps.toInt() < 0) digitalWrite(pin_dir.toInt(), LOW); + + for (int x = 0; x < abs(steps.toInt()); x++) + { + digitalWrite(pin_step.toInt(), HIGH); + delay(stepper_speed.toInt()); + digitalWrite(pin_step.toInt(), LOW); + delay(stepper_speed.toInt()); + } +} + //==================================================================================================================================================== /* diff --git a/Init.ino b/Init.ino index af386335..9549c6cd 100644 --- a/Init.ino +++ b/Init.ino @@ -187,6 +187,13 @@ void prsets_init() { request->redirect("/page.htm?configuration"); }); + server.on("/stepper", HTTP_GET, [](AsyncWebServerRequest * request) { + writeFile("firmware.config.txt", readFile("configs/stepper.config.txt", 2048)); + writeFile("firmware.scenario.txt", readFile("configs/stepper.scenario.txt", 2048)); + Device_init(); + Scenario_init(); + request->redirect("/page.htm?configuration"); + }); //default=============================================================================== diff --git a/Sensors.ino b/Sensors.ino index b67fd036..bdcb37da 100644 --- a/Sensors.ino +++ b/Sensors.ino @@ -19,7 +19,7 @@ void analog() { static int analog_old; #ifdef ESP32 //int pin_int = pin.toInt(); - int analog_in;// = analogRead(pin_int); + int analog_in = analogRead(34); #endif #ifdef ESP8266 int analog_in = analogRead(A0); @@ -36,6 +36,7 @@ void analog() { sendSTATUS("analog", String(analog)); if (client.connected()) { Serial.println("[i] sensor 'analog' send date " + String(analog)); + //web_print("sensor 'analog' send date " + String(analog)); } // } analog_old = analog; @@ -83,6 +84,7 @@ void level() { sendSTATUS("level", String(level)); if (client.connected()) { Serial.println("[i] sensor tank 'level' send date " + String(level)); + //web_print("sensor tank 'level' send date " + String(level)); } //} level_old = level; @@ -114,6 +116,7 @@ void dallas() { sendSTATUS("dallas", String(temp)); if (client.connected()) { Serial.println("[i] sensor 'dallas' send date " + String(temp)); + //web_print("sensor 'dallas' send date " + String(temp)); } //} temp_old = temp; @@ -153,6 +156,7 @@ void dhtT() { sendSTATUS("dhtT", String(value)); if (client.connected()) { Serial.println("[i] sensor 'dhtT' send date " + String(value)); + //web_print("sensor 'dhtT' send date " + String(value)); } //} value_old = value; @@ -191,6 +195,7 @@ void dhtH() { sendSTATUS("dhtH", String(value)); if (client.connected()) { Serial.println("[i] sensor 'dhtH' send date " + String(value)); + //web_print("sensor 'dhtH' send date " + String(value)); } //} value_old = value; diff --git a/Upgrade.ino b/Upgrade.ino index af38ae4d..e195f044 100644 --- a/Upgrade.ino +++ b/Upgrade.ino @@ -41,6 +41,8 @@ void upgrade_firmware() { configSetup_for_update = configSetup; Serial.println("Start upgrade SPIFFS, please wait..."); + web_print("Start upgrade SPIFFS, please wait..."); + WiFiClient client_for_upgrade; #ifdef ESP32 @@ -61,21 +63,25 @@ void upgrade_firmware() { Serial.println("SPIFFS upgrade done!"); Serial.println("Start upgrade BUILD, please wait..."); + web_print("SPIFFS upgrade done!"); + web_print("Start upgrade BUILD, please wait..."); #ifdef ESP32 - httpUpdate.rebootOnUpdate(true); + //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); + //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); + if (ret == HTTP_UPDATE_OK) { + web_print("BUILD upgrade done!"); + web_print("Restart ESP...."); + Serial.println("BUILD upgrade done!"); + Serial.println("Restart ESP...."); + ESP.restart(); + } } } diff --git a/Web_server.ino b/Web_server.ino index 1093e013..d537103a 100644 --- a/Web_server.ino +++ b/Web_server.ino @@ -41,7 +41,7 @@ void Web_server_init() { server.addHandler(&ws); events.onConnect([](AsyncEventSourceClient * client) { - client->send("hello!", NULL, millis(), 1000); + //!!!client->send("hello!", NULL, millis(), 1000); }); server.addHandler(&events); @@ -144,14 +144,22 @@ void Web_server_init() { server.on("/config.setup.json", HTTP_GET, [](AsyncWebServerRequest * request) { request->send(200, "application/json", configSetup); }); + + // ------------------Выполнение команды из запроса + server.on("/cmd", HTTP_GET, [](AsyncWebServerRequest * request) { //http://192.168.88.45/cmd?command=rel 1 1 + String com = request->getParam("command")->value(); + Serial.println(com); + order_loop += com + ","; + request->send(200, "text/text", "OK"); // отправляем ответ о выполнении + }); } //========================================WS========================================================================================= #ifdef WS_enable void onWsEvent(AsyncWebSocket * server, AsyncWebSocketClient * client, AwsEventType type, void * arg, uint8_t *data, size_t len) { if (type == WS_EVT_CONNECT) { Serial.printf("ws[%s][%u] connect\n", server->url(), client->id()); - client->printf(configJson.c_str(), client->id()); - client->ping(); + client->printf(json.c_str(), client->id()); + //client->ping(); } else if (type == WS_EVT_DISCONNECT) { Serial.printf("ws[%s][%u] disconnect\n", server->url(), client->id()); } else if (type == WS_EVT_ERROR) { diff --git a/WiFi.ino b/WiFi.ino index 3f5ad044..22013113 100644 --- a/WiFi.ino +++ b/WiFi.ino @@ -147,14 +147,14 @@ boolean RouterFind(String ssid) { } else { Serial.print(i); Serial.print(")"); - Serial.print(ssid); - Serial.print("<=>"); + //Serial.print(ssid); + //Serial.print("<=>"); if (i == n) { Serial.print(WiFi.SSID(i)); Serial.println("; "); } else { Serial.print(WiFi.SSID(i)); - Serial.print("; "); + Serial.println("; "); } } } diff --git a/data/config.json b/data/config.json index 0479064d..52ac45a5 100644 --- a/data/config.json +++ b/data/config.json @@ -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"} \ No newline at end of file +{"SSDP":"MODULES","chipID":"905542-1458415","ssidAP":"WiFi","passwordAP":"","ssid":"MW40V_782C","password":"05978600","timezone":3,"mqttServer":"m12.cloudmqtt.com","mqttPort":14053,"mqttUser":"lbscvzuj","mqttPass":"bLxlveOgaF8F","scenario":"1","timers":"0","pushingbox_id":"","web_login":"admin","web_pass":"admin"} \ No newline at end of file diff --git a/data/configs/stepper.config.txt b/data/configs/stepper.config.txt new file mode 100644 index 00000000..c9064aea --- /dev/null +++ b/data/configs/stepper.config.txt @@ -0,0 +1,10 @@ +stepper 1 12 13 +button 1 na Открыть#штору Шторы 0 1 + + +//добавляем шаговый двигатель с параметрами: +//1 - номер шагового двигателя, 12 - номер пина количества шагов, 13 - номер пина напрвления + +//stepperSet 1 100 5 - прокрутить шаговик номер 1 на 100 шагов по часовой стрелке +//с задержкой между шагами 5 милисекунд (чем меньше задержка тем больше скорость) +//если поставить -100 то будет вращаться против часовой стрелки \ No newline at end of file diff --git a/data/configs/stepper.scenario.txt b/data/configs/stepper.scenario.txt new file mode 100644 index 00000000..cb4cd521 --- /dev/null +++ b/data/configs/stepper.scenario.txt @@ -0,0 +1,6 @@ +button1 = 1 +stepperSet 1 100 5 +end +button1 = 0 +stepperSet 1 -100 5 +end \ No newline at end of file diff --git a/data/configuration.json b/data/configuration.json index 843e77e1..24079b45 100644 --- a/data/configuration.json +++ b/data/configuration.json @@ -36,22 +36,23 @@ "style":"display:inline", "title": { "#":"Выбирите то, во что Вы хотите превратить ESP ", - "/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":"Охранный датчик движения", + "/relay":"1.Вкл. выкл. локального реле", + "/relay_timer":"2.Вкл. выкл. локального реле в определенное время", + "/relay_countdown":"3.Вкл. выкл. локального реле на определенный период времени", + "/relay_several":"4.Вкл. выкл. нескольких локальных реле кнопкой в приложении", + "/relay_switch":"5.Вкл. выкл. локального реле физической кнопкой (кнопка так же дублируется в приложении)", + "/relay_button_remote":"6.Вкл. выкл. нескольких удаленных реле кнопкой в приложении (нужно указать Device ID)", + "/relay_switch_remote":"7.Вкл. выкл. нескольких удаленных реле физической кнопкой (нужно указать Device ID)", + "/pwm":"8.Широтно импульсная модуляция", + "/dht11":"9.Сенсор DHT11", + "/dht22":"10.Сенсор DHT22, DHT33, DHT44, AM2302, RHT03", + "/analog":"11.Аналоговый сенсор", + "/dallas":"12.Сенсор DS18B20", + "/termostat":"13.Термостат на DS18B20 с переключением в ручной режим", + "/level":"14.Контроль уровня в баке на сенсорах: JSN-SR04T, HC-SR04, HY-SRF05 (управление насосом)", + "/moution_relay":"15.Датчик движения включающий свет", + "/moution_security":"16.Охранный датчик движения", + "/stepper":"17.Система управления шаговым двигателем (открытие закрытие штор)", "/default":"Настройки по умолчанию" } }, diff --git a/data/css/build.css.gz b/data/css/build.css.gz index 4bf6e06001ba59fb28f775adfad194fffa985f28..a37a1ac123c1881512fe8e657783fa726e30939e 100644 GIT binary patch delta 17 YcmX?AcB+g+zMF$%?T_rZjT}za07JC~=Kufz delta 17 YcmX?AcB+g+zMF&N!Sb~+8#$b;0YsPw2><{9 diff --git a/data/edit.htm.gz b/data/edit.htm.gz index f1e48f7e7ebc62dfd1606da393b77a6d8c7f6444..bdfe12d380dd7f2f00018db72e412e4ef0982ea6 100644 GIT binary patch literal 5906 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 literal 5794 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

0jH>*O} z&|_p~!HcJ4;WyL1n&R|Ef~SbQIsbbSza>(#KN^i@33un)fiaqF59VJg47~`4CJyis zH}7jM{LcoCZ}0MK0r%I8aF00iS0>UVGYF*7-YIL#!HA(>b+8aF6PX$a7D>JK^0RNm zU@x`>m*^JUJp0CT(Ns^3dzKl*;U`Ms^wUn^mT>wSw7dbdNn@TE+~azh0sAi+4c0%F zo)f4fEOE2mY18EDsB|?b zqTpbZk}jliN>e*_3j28`nN6DLdVeQCN{*E0t0)ug7+Gc zMH}vl7Njw%g(9z!xds2kH+&8txv@#Y=97R;ShssgymY%OD7XKUj3f}@DUa8J_eox+ zE|B++;7WoDZ)l?gT}t*PyFSwKdtuneOd`-74HM!HD3P1I8|26(5)En}ZrSf(ZsOBX zf24I^3f#534TV& g5LW_-D}YE5h=^D;_~p+O{pru&03N9usuENH0JWN6kN^Mx diff --git a/data/index.htm.gz b/data/index.htm.gz index 139f0040889174476a6bea5be844dae04d7ea073..618ee19a856d1c5d4ca8d49043d71558fde5c921 100644 GIT binary patch literal 1190 zcmV;X1X=qZiwFoC#3Wt-18Ht#Wq2-VbZr2wR$Fh|HWYsMuV7Vdve8JggAL1UDIJis zTekuWlA^^{6b3CFS&S)BBPlt~u>U?D>SD<&GIZFB&C9ub=Q|fFe0Kfo)w|zrUXe`a z{BjaDeP)p#7OyR*Nzl+C;)7j*XX;>O# zx?Bdqe!urc5px#rd|pqkM4@S{mxL9mARnpzL5 zI`KRkdJdXeeGmSqSRFYS02JEO2B|~hW*0dc9&~`jtw@|vsX#}SPQ44qTH&nNnW%W= zs7y#5SDG-R>JYRNIV`7J2p+uVER&E%PD*Rs`sSyxp<>BOO%g~!5+&ovxmUraVm$HD zqxSFB%X;yhzc}~L=Zg!c$KkXX!hrADk& zquj+cO7*|clU7BnnJ7-vKTfwTj3#t@_f)yU_S&;~w6I{@QM5GI9 zIwODLJuwy3Hr~`tnN-@HS;fE5=`qkSXlGWq5y`@sA1K)_3n*;L5fG9m>>3U+X)N;Bz|d0<%bvuS{-O+ih01!t}$5Zl6?nQ%+s zJk9_)ODR|297#qQ+j6bHlSG4*LiR#ko<>Er(S^5_qACflHeAHJmU$AgqBKv_QP7I0 zDvkkXR+|PpAeP_EzZ$^8p)$zyuwC)qbn7wN$bDkq>x8%%(_O(0vIRCW5YP&YYtzqg0?u*XS3)ja)_}fPlje;UsOY;o@O0N-vP5&9j zI2~sHY}%>6>=sLxVTZW0)*zB8wp$LZV&72x@sP~{k#{!g&k{*bNyN{y6AI6f!lu8T zH(VN??8I&gj&$3|={pHs5-rHh)v%Fzy}p@_jdVJJCdacdXr_7?G+(HH0}APQ5xEKg E0D>hsF8}}l literal 1444 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 literal 17521 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 M1Nbs_X6-rw00Qs^$p8QV diff --git a/data/setup.json b/data/setup.json index d9295724..2b998ff4 100644 --- a/data/setup.json +++ b/data/setup.json @@ -53,8 +53,7 @@ "type": "password", "title": "Введите пароль", "name":"ssidPass", - "state": "{{password}}", - "pattern": ".{8,20}" + "state": "{{password}}" }, { "type": "button", diff --git a/esp32-esp8266_iot-manager_modules_firmware.ino b/esp32-esp8266_iot-manager_modules_firmware.ino index e618efe4..2cc12527 100644 --- a/esp32-esp8266_iot-manager_modules_firmware.ino +++ b/esp32-esp8266_iot-manager_modules_firmware.ino @@ -59,7 +59,7 @@ void setup() { //-------------------------------------------------------------- Serial.print("[i] Date compiling: "); Serial.println(DATE_COMPILING); - + getMemoryLoad("[i] After loading"); #ifdef ESP8266 @@ -72,11 +72,12 @@ void setup() { Serial.print("[i] Last firmware version: "); Serial.println(new_version); - ts.add(TEST, statistics_update, [&](void*) { + //ts.add(TEST, statistics_update, [&](void*) { - statistics(); + // statistics(); + + //}, nullptr, false); - }, nullptr, false); } void loop() { diff --git a/main.ino b/main.ino index c6a2662f..7e0f51a7 100644 --- a/main.ino +++ b/main.ino @@ -156,7 +156,7 @@ String safeDataToFile(String data, String Folder) fileName.replace("..", "."); fileName = Folder + "/" + fileName + ".txt"; - // addFile(fileName, GetTime() + "/" + data); + // addFile(fileName, GetTime() + "/" + data); Serial.println(fileName); jsonWrite(configJson, "test", fileName); @@ -259,12 +259,12 @@ void led_blink(int pin, int fq, String blink_satus) { #endif void getMemoryLoad(String text) { - #ifdef ESP8266 +#ifdef ESP8266 int all_memory = 53312; - #endif - #ifdef ESP32 +#endif +#ifdef ESP32 int all_memory = 362868; - #endif +#endif int memory_remain = ESP.getFreeHeap(); int memory_used = all_memory - memory_remain; int memory_load = (memory_used * 100) / all_memory; @@ -273,8 +273,21 @@ void getMemoryLoad(String text) { Serial.print(String(memory_load) + "%; "); Serial.print("memory remain:"); Serial.println(String(memory_remain) + " k bytes"); - + } //esp32 full memory = 362868 k bytes //esp8266 full memory = 53312 k bytes + +void web_print (String text) { + + jsonWrite(json, "test1", jsonRead(json, "test2")); + jsonWrite(json, "test2", jsonRead(json, "test3")); + jsonWrite(json, "test3", jsonRead(json, "test4")); + jsonWrite(json, "test4", jsonRead(json, "test5")); + jsonWrite(json, "test5", jsonRead(json, "test6")); + + jsonWrite(json, "test6", GetTime() + " " + text); + + ws.textAll(json); +} diff --git a/mqtt.ino b/mqtt.ino index 963caec0..aaee2113 100644 --- a/mqtt.ino +++ b/mqtt.ino @@ -51,6 +51,7 @@ void MQTT_init() { Serial.println("[V] WiFi-ok"); if (client.connected()) { Serial.println("[V] MQTT-ok"); + web_print("MQTT-ok"); } else { MQTT_Connecting(); mqtt_lost_error++; @@ -79,6 +80,7 @@ boolean MQTT_Connecting() { if ((mqtt_server != "")) { static boolean first = true; if (!first) Serial.println("[E] Lost MQTT connection, start reconnecting"); + web_print("Lost MQTT connection, start reconnecting"); first = false; //ssl//espClient.setCACert(local_root_ca1); client.setServer(mqtt_server.c_str(), jsonReadtoInt(configSetup, "mqttPort")); @@ -87,6 +89,7 @@ boolean MQTT_Connecting() { Serial.println("[V] Connecting to MQTT server commenced"); if (client.connect(chipID.c_str(), jsonRead(configSetup, "mqttUser").c_str(), jsonRead(configSetup, "mqttPass").c_str())) { Serial.println("[V] MQTT connected"); + web_print("MQTT connected"); client.setCallback(callback); client.subscribe(prefix.c_str()); // Для приема получения HELLOW и подтверждения связи client.subscribe((prefix + "/" + chipID + "/+/control").c_str()); // Подписываемся на топики control @@ -95,6 +98,7 @@ boolean MQTT_Connecting() { client.subscribe((prefix + "/ids").c_str()); // Подписываемся на топики ids sendMQTT("test", "work"); Serial.println("[V] Callback set, subscribe done"); + web_print("Callback set, subscribe done"); //if (out_date_send) outcoming_date(); //отправляем данные в виджеты return true; } else { @@ -105,6 +109,7 @@ boolean MQTT_Connecting() { } } else { Serial.println("[E] No date for MQTT connection"); + web_print("No date for MQTT connection"); return false; } } diff --git a/set.h b/set.h index a1370d4c..604aa719 100644 --- a/set.h +++ b/set.h @@ -4,7 +4,7 @@ String new_version; //#define OTA_enable //#define MDNS_enable -//#define WS_enable +#define WS_enable #define TIME_COMPILING String(__TIME__) #define DATE_COMPILING String(__DATE__) @@ -58,6 +58,7 @@ ESP8266HTTPUpdateServer httpUpdater; #endif //==общие библиотеки и объекты==// +#include #include "time.h" #ifdef OTA_enable #include @@ -105,12 +106,16 @@ DHTesp dht; Adafruit_Si7021 sensor_Si7021 = Adafruit_Si7021(); //----------------------------------------------------------------- + + const char* hostName = "IoT Manager"; String configSetup = "{}"; String configJson = "{}"; String optionJson = "{}"; +String json = "{}"; + String chipID = ""; String prefix = "/IoTmanager"; String prex;