diff --git a/data/config.json b/data/config.json index b00e72d2..8c8b402a 100644 --- a/data/config.json +++ b/data/config.json @@ -18,5 +18,6 @@ "webpass": "admin", "udponoff": "1", "blink": "0", - "oneWirePin": "2" + "oneWirePin": "2", + "serverip": "http://206.189.49.244" } \ No newline at end of file diff --git a/data/items/logging.txt b/data/items/logging.txt new file mode 100644 index 00000000..8253774f --- /dev/null +++ b/data/items/logging.txt @@ -0,0 +1 @@ +0;logging;id;chart;Графики;История;order;val[any];int[60];cnt[100] \ No newline at end of file diff --git a/data/js/function.js.gz b/data/js/function.js.gz index 10c9953a..b3e5ea56 100644 Binary files a/data/js/function.js.gz and b/data/js/function.js.gz differ diff --git a/data/set.dev.json b/data/set.dev.json new file mode 100644 index 00000000..fb697b50 --- /dev/null +++ b/data/set.dev.json @@ -0,0 +1,46 @@ +{ + "configs": [ + "/config.setup.json", + "/lang/lang.ru.json" + ], + "title": "Конфигурация", + "class": "col-sm-offset-1 col-sm-10 col-md-offset-2 col-md-8 col-lg-offset-3 col-lg-6", + "content": [ + { + "type": "h5", + "title": "{{name}}", + "class": "alert-default" + }, + { + "type": "link", + "title": "{{ButMainPage}}", + "action": "/", + "class": "btn btn-block btn-default" + }, + { + "type": "hr" + }, + { + "type": "h3", + "title": "Адрес сервера обновлений" + }, + { + "type": "input", + "title": "ip address", + "name": "serverip-arg", + "state": "{{serverip}}" + }, + { + "type": "button", + "title": "{{ButSave}}", + "action": "set?serverip=[[serverip-arg]]", + "class": "btn btn-block btn-default" + }, + { + "type": "link", + "title": "Перезагрузить устройство", + "action": "javascript:if(confirm(renameBlock(jsonResponse,'Перезагрузить?'))){send_request(this,'/set?device=ok');}", + "class": "btn btn-block btn-danger" + } + ] + } \ No newline at end of file diff --git a/data/set.device.json b/data/set.device.json index e6d6698e..e504dd19 100644 --- a/data/set.device.json +++ b/data/set.device.json @@ -75,7 +75,8 @@ "/set?addItem=bmp280-temp": "18.Датчик температуры bmp280", "/set?addItem=bmp280-press": "19.Датчик давления bmp280", "/set?addItem=modbus": "20.Прочитать регистр modbus устройства", - "/set?addItem=uptime": "a.Отобразить время работы устройства" + "/set?addItem=logging": "a.Логгирование и вывод в график любой величины", + "/set?addItem=uptime": "b.Отобразить время работы устройства" } }, @@ -98,6 +99,9 @@ "action": "/set?saveItems", "class": "btn btn-block btn-default" }, + { + "type": "hr" + }, { "type": "link", "title": "Удалить выбранные элементы", @@ -112,7 +116,7 @@ }, { "type": "text", - "title": "

После любого изменения таблицы элементов, включая удаление/добавление строк, необходимо нажать кнопку Save

" + "title": "

После любого изменения таблицы элементов, включая удаление/добавление строк, необходимо нажать кнопку Сохранить таблицу

" }, { "type": "h2", diff --git a/data/widgets/chart.json b/data/widgets/chart.json index 47c6473b..9ecc61e3 100644 --- a/data/widgets/chart.json +++ b/data/widgets/chart.json @@ -1,5 +1,4 @@ { "widget": "chart", - "series": "Temperature, °C", "dateFormat": "HH:mm" } \ No newline at end of file diff --git a/include/Class/LineParsing.h b/include/Class/LineParsing.h index fa117948..faa4848e 100644 --- a/include/Class/LineParsing.h +++ b/include/Class/LineParsing.h @@ -12,7 +12,6 @@ class LineParsing { String _page; String _descr; String _order; - String _addr; String _reg; String _pin; @@ -22,6 +21,9 @@ class LineParsing { String _state; String _db; String _type; + String _int; + String _cnt; + String _val; public: LineParsing() : @@ -39,7 +41,10 @@ class LineParsing { _inv{""}, _state{""}, _db{""}, - _type{""} + _type{""}, + _int{""}, + _cnt{""}, + _val{""} {}; @@ -84,6 +89,15 @@ class LineParsing { if (arg.indexOf("reg[") != -1) { _reg = extractInner(arg); } + if (arg.indexOf("int[") != -1) { + _int = extractInner(arg); + } + if (arg.indexOf("cnt[") != -1) { + _cnt = extractInner(arg); + } + if (arg.indexOf("val[") != -1) { + _val = extractInner(arg); + } } } @@ -115,10 +129,10 @@ class LineParsing { return _order; } String gpin() { - return _pin; // + return _pin; } String ginv() { - return _inv; // + return _inv; } String gstate() { return _state; @@ -138,6 +152,15 @@ class LineParsing { String gregaddr() { return _reg; } + String gint() { + return _int; + } + String gmaxcnt() { + return _cnt; + } + String gvalue() { + return _val; + } void clear() { _key = ""; @@ -154,6 +177,9 @@ class LineParsing { _state = ""; _db = ""; _type = ""; + _int = ""; + _cnt = ""; + _val = ""; } String extractInnerDigit(String str) { diff --git a/include/Consts.h b/include/Consts.h index 8379bf8d..fcda15c4 100644 --- a/include/Consts.h +++ b/include/Consts.h @@ -44,7 +44,7 @@ //#define MDNS_ENABLED //#define WEBSOCKET_ENABLED //#define LAYOUT_IN_RAM -//#define UDP_ENABLED +#define UDP_ENABLED #define SSDP_ENABLED // @@ -88,13 +88,6 @@ enum TimerTask_t { WIFI_SCAN, WIFI_MQTT_CONNECTION_CHECK, SENSORS10SEC, SENSORS30SEC, - STEPPER1, - STEPPER2, - LOG1, - LOG2, - LOG3, - LOG4, - LOG5, TIMER_COUNTDOWN, TIME, TIME_SYNC, diff --git a/include/ItemsCmd.h b/include/ItemsCmd.h index 4330993f..24d04b67 100644 --- a/include/ItemsCmd.h +++ b/include/ItemsCmd.h @@ -49,3 +49,5 @@ extern void bmp280ReadingPress(); extern void sysUptime(); extern void uptimeReading(); + +extern void logging(); diff --git a/include/RemoteOrdersUdp.h b/include/RemoteOrdersUdp.h index 5aff5be4..a8c2d8e0 100644 --- a/include/RemoteOrdersUdp.h +++ b/include/RemoteOrdersUdp.h @@ -1,7 +1,7 @@ -//#pragma once -//#include "ESPAsyncUDP.h" -//extern AsyncUDP asyncUdp; -//extern void asyncUdpInit(); -//extern String uint8tToString(uint8_t* data, size_t len); -//extern bool udpPacketValidation(String& data); -//extern void udpPacketParse(String& data); \ No newline at end of file +#pragma once +#include "ESPAsyncUDP.h" +extern AsyncUDP asyncUdp; +extern void asyncUdpInit(); +extern String uint8tToString(uint8_t* data, size_t len); +extern bool udpPacketValidation(String& data); +extern void udpPacketParse(String& data); \ No newline at end of file diff --git a/src/Global.cpp b/src/Global.cpp index 4de7df8c..c47fe17e 100644 --- a/src/Global.cpp +++ b/src/Global.cpp @@ -47,7 +47,7 @@ String logging_value_names_list; int enter_to_logging_counter; // Upgrade -String serverIP = "http://206.189.49.244"; +String serverIP; // 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}; diff --git a/src/Init.cpp b/src/Init.cpp index f2e5c82e..8fc8f6aa 100644 --- a/src/Init.cpp +++ b/src/Init.cpp @@ -14,6 +14,8 @@ void loadConfig() { prex = jsonReadStr(configSetupJson, "mqttPrefix") + "/" + chipId; Serial.println(configSetupJson); + + serverIP = jsonReadStr(configSetupJson, "serverip"); } void all_init() { diff --git a/src/ItemsCmd.cpp b/src/ItemsCmd.cpp index 678aa11c..2a949050 100644 --- a/src/ItemsCmd.cpp +++ b/src/ItemsCmd.cpp @@ -47,6 +47,8 @@ void cmd_init() { sCmd.addCommand("uptime", sysUptime); + sCmd.addCommand("logging", logging); + handle_time_init(); } diff --git a/src/Logging.cpp b/src/Logging.cpp index 44b323a4..41f04790 100644 --- a/src/Logging.cpp +++ b/src/Logging.cpp @@ -7,7 +7,7 @@ void sendLogData(String file, String topic); #ifdef LOGGING_ENABLED //===============================================Логирование============================================================ //logging temp1 1 10 Температура Датчики 2 -void logging() { +/*void logging2() { String value_name = sCmd.next(); String period_min = sCmd.next(); String maxCount = sCmd.next(); @@ -67,12 +67,12 @@ void logging() { }, nullptr, false); } -} +}*/ /* * Удаление стрых данных и запись новых */ -void deleteOldDate(const String filename, size_t max_lines_cnt, String payload) { +/*void deleteOldDate(const String filename, size_t max_lines_cnt, String payload) { String log_date = readFile(filename, 5120); size_t lines_cnt = itemsCount(log_date, "\r\n"); @@ -94,7 +94,7 @@ void deleteOldDate(const String filename, size_t max_lines_cnt, String payload) addFileLn(filename, timeNow->getTimeUnix() + " " + payload); } } -} +}*/ //=========================================Выбор какие данные отправлять================================================================== void choose_log_date_and_send() { diff --git a/src/RemoteOrdersUdp.cpp b/src/RemoteOrdersUdp.cpp index e09693b0..6187d0bd 100644 --- a/src/RemoteOrdersUdp.cpp +++ b/src/RemoteOrdersUdp.cpp @@ -1,71 +1,70 @@ -//#include "RemoteOrdersUdp.h" -// -//#include -// -//#include "Global.h" -// -//AsyncUDP asyncUdp; -// -//void asyncUdpInit() { -// //if (asyncUdp.listen(1234)) { -// if (asyncUdp.listenMulticast(IPAddress(239, 255, 255, 255), 1234)) { -// asyncUdp.onPacket([](AsyncUDPPacket packet) { -// -// //Serial.print("UDP Packet Type: "); -// //Serial.print(packet.isBroadcast() ? "Broadcast" : packet.isMulticast() ? "Multicast" : "Unicast"); -// // -// //Serial.print(", From: "); -// //Serial.print(packet.remoteIP()); -// //Serial.print(":"); -// //Serial.print(packet.remotePort()); -// // -// //Serial.print(", To: "); -// //Serial.print(packet.localIP()); -// //Serial.print(":"); -// //Serial.print(packet.localPort()); -// // -// //Serial.print(", Length: "); -// //Serial.print(packet.length()); -// // -// //Serial.print(", Data: "); -// //Serial.write(packet.data(), packet.length()); -// -// String data = uint8tToString(packet.data(), packet.length()); -// Serial.print("[i] [udp] Packet received: '"); -// Serial.print(data); -// if (udpPacketValidation(data)) { -// udpPacketParse(data); -// //Serial.println("', Packet valid"); -// } else { -// //Serial.println("', Packet invalid"); -// } -// -// //reply to the client -// -// packet.printf("Got %u bytes of data", packet.length()); -// }); -// } -//} -// -//String uint8tToString(uint8_t* data, size_t len) { -// String ret; -// while (len--) { -// ret += (char)*data++; -// } -// return ret; -//} -// -//bool udpPacketValidation(String& data) { -// if (data.indexOf("iotm;") != -1 && data.indexOf(getChipId()) != -1) { -// return true; -// } else { -// return false; -// } -//} -// -////iotm;chipid;button-out-1_1 -//void udpPacketParse(String& data) { -// data = selectFromMarkerToMarker(data, ";", 2); -// data.replace("_", " "); -// orderBuf += data + ","; -//} \ No newline at end of file +#include "RemoteOrdersUdp.h" +#include +#include "Global.h" + +#ifdef UDP_ENABLED +AsyncUDP asyncUdp; + +void asyncUdpInit() { + //if (asyncUdp.listen(1234)) { + if (asyncUdp.listenMulticast(IPAddress(239, 255, 255, 255), 1234)) { + asyncUdp.onPacket([](AsyncUDPPacket packet) { + //Serial.print("UDP Packet Type: "); + //Serial.print(packet.isBroadcast() ? "Broadcast" : packet.isMulticast() ? "Multicast" : "Unicast"); + // + //Serial.print(", From: "); + //Serial.print(packet.remoteIP()); + //Serial.print(":"); + //Serial.print(packet.remotePort()); + // + //Serial.print(", To: "); + //Serial.print(packet.localIP()); + //Serial.print(":"); + //Serial.print(packet.localPort()); + // + //Serial.print(", Length: "); + //Serial.print(packet.length()); + // + //Serial.print(", Data: "); + //Serial.write(packet.data(), packet.length()); + + String data = uint8tToString(packet.data(), packet.length()); + Serial.print("[i] [udp] Packet received: '"); + Serial.print(data); + if (udpPacketValidation(data)) { + udpPacketParse(data); + //Serial.println("', Packet valid"); + } else { + //Serial.println("', Packet invalid"); + } + + //reply to the client + + packet.printf("Got %u bytes of data", packet.length()); + }); + } +} + +String uint8tToString(uint8_t* data, size_t len) { + String ret; + while (len--) { + ret += (char)*data++; + } + return ret; +} + +bool udpPacketValidation(String& data) { + if (data.indexOf("iotm;") != -1 && data.indexOf(getChipId()) != -1) { + return true; + } else { + return false; + } +} + +//iotm;chipid;button-out-1_1 +void udpPacketParse(String& data) { + data = selectFromMarkerToMarker(data, ";", 2); + data.replace("_", " "); + orderBuf += data + ","; +} +#endif \ No newline at end of file diff --git a/src/Web.cpp b/src/Web.cpp index 409f9836..fe1a1a02 100644 --- a/src/Web.cpp +++ b/src/Web.cpp @@ -200,6 +200,14 @@ void web_init() { myNotAsyncActions->make(do_BUSSCAN); request->redirect("/?set.utilities"); } + + //==============================developer settings============================================= + if (request->hasArg("serverip")) { + jsonWriteStr(configSetupJson, "serverip", request->getParam("serverip")->value()); + saveConfig(); + serverIP = jsonReadStr(configSetupJson, "serverip"); + request->send(200); + } }); //==============================list of items===================================================== diff --git a/src/items/LoggingClass.cpp b/src/items/LoggingClass.cpp index 8fffec28..0b809781 100644 --- a/src/items/LoggingClass.cpp +++ b/src/items/LoggingClass.cpp @@ -1,7 +1,13 @@ #include "items/LoggingClass.h" +#include + +#include "Class/LineParsing.h" +#include "Global.h" +#include "ItemsCmd.h" + LoggingClass::LoggingClass(unsigned long period, unsigned int maxPoints, String key) { - _period = period; + _period = period * 1000; _maxPoints = maxPoints; _key = key; } @@ -17,7 +23,6 @@ void LoggingClass::loop() { } } - void LoggingClass::addNewDelOldData(const String filename, size_t maxPoints, String payload) { String logData = readFile(filename, 5120); size_t lines_cnt = itemsCount(logData, "\r\n"); @@ -28,18 +33,33 @@ void LoggingClass::addNewDelOldData(const String filename, size_t maxPoints, Str removeFile(filename); lines_cnt = 0; } - - if (lines_cnt > maxPoints) { - logData = deleteBeforeDelimiter(logData, "\r\n"); - if (timeNow->hasTimeSynced()) { - logData += timeNow->getTimeUnix() + " " + payload + "\r\n"; - writeFile(filename, logData); - } - } else { - if (timeNow->hasTimeSynced()) { - addFileLn(filename, timeNow->getTimeUnix() + " " + payload); + + if (payload != "") { + if (lines_cnt > maxPoints) { + logData = deleteBeforeDelimiter(logData, "\r\n"); + if (timeNow->hasTimeSynced()) { + logData += timeNow->getTimeUnix() + " " + payload + "\r\n"; + writeFile(filename, logData); + } + } else { + if (timeNow->hasTimeSynced()) { + addFileLn(filename, timeNow->getTimeUnix() + " " + payload); + } } } } -MyLoggingVector* myLogging = nullptr; \ No newline at end of file +MyLoggingVector* myLogging = nullptr; + +void logging() { + myLineParsing.update(); + String value = myLineParsing.gvalue(); + String interv = myLineParsing.gint(); + String maxcnt = myLineParsing.gmaxcnt(); + myLineParsing.clear(); + + static bool firstTime = true; + if (firstTime) myLogging = new MyLoggingVector(); + firstTime = false; + myLogging->push_back(LoggingClass(interv.toInt(), maxcnt.toInt(), value)); +} diff --git a/src/main.cpp b/src/main.cpp index 8bd9b7ca..287e340f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -14,7 +14,7 @@ #include "Utils/WebUtils.h" #include "items/ButtonInClass.h" #include "items/LoggingClass.h" -//#include "RemoteOrdersUdp.h" +#include "RemoteOrdersUdp.h" #include "Bus.h" void not_async_actions(); @@ -74,9 +74,11 @@ void setup() { SerialPrint("I", "Stat", "Stat Init"); initSt(); - - //SerialPrint("I","UDP","Udp Init"); - //asyncUdpInit(); + + #ifdef UDP_ENABLED + SerialPrint("I","UDP","Udp Init"); + asyncUdpInit(); + #endif SerialPrint("I", "Bus", "Bus Init"); busInit(); @@ -97,8 +99,8 @@ void setup() { just_load = false; initialized = true; //this second POST makes the data to be processed (you don't need to connect as "keep-alive" for that to work) - myLogging = new MyLoggingVector(); - myLogging->push_back(LoggingClass(30000, 10, "analog-adc-1")); + //myLogging = new MyLoggingVector(); + //myLogging->push_back(LoggingClass(30000, 10, "analog-adc-1")); //myLogging->push_back(LoggingClass(10000, 1, "10 sec")); }