Files
IoTManager/main.ino

448 lines
17 KiB
Arduino
Raw Normal View History

2020-05-26 17:42:50 +02:00
//============================================================================================================
2019-12-24 11:53:26 +03:00
//=============================================JSON===========================================================
2020-05-26 17:42:50 +02:00
// ------------- Чтение значения json ------------------------------------------------------------------------
String jsonReadStr(String &json, String name) {
2019-12-24 11:53:26 +03:00
DynamicJsonBuffer jsonBuffer;
JsonObject& root = jsonBuffer.parseObject(json);
return root[name].as<String>();
}
2020-05-26 17:42:50 +02:00
// ------------- Чтение значения json ------------------------------------------------------------------------
int jsonReadInt(String &json, String name) {
2019-12-24 11:53:26 +03:00
DynamicJsonBuffer jsonBuffer;
JsonObject& root = jsonBuffer.parseObject(json);
return root[name];
}
2020-05-26 17:42:50 +02:00
// ------------- Запись значения json String -----------------------------------------------------------------
String jsonWriteStr(String &json, String name, String volume) {
DynamicJsonBuffer jsonBuffer;
JsonObject& root = jsonBuffer.parseObject(json);
root[name] = volume;
json = "";
root.printTo(json);
return json;
2020-05-26 17:42:50 +02:00
}
2019-12-24 11:53:26 +03:00
2020-05-26 17:42:50 +02:00
// ------------- Запись значения json int ---------------------------------------------------------------------
String jsonWriteInt(String &json, String name, int volume) {
2019-12-24 11:53:26 +03:00
DynamicJsonBuffer jsonBuffer;
JsonObject& root = jsonBuffer.parseObject(json);
root[name] = volume;
json = "";
root.printTo(json);
return json;
}
2020-05-26 17:42:50 +02:00
// ------------- Запись значения json float -------------------------------------------------------------------
String jsonWriteFloat(String &json, String name, float volume) {
2019-12-24 11:53:26 +03:00
DynamicJsonBuffer jsonBuffer;
JsonObject& root = jsonBuffer.parseObject(json);
root[name] = volume;
json = "";
root.printTo(json);
return json;
}
2020-05-26 17:42:50 +02:00
/*
2019-12-24 11:53:26 +03:00
DynamicJsonBuffer jsonBuffer;
JsonObject& root = jsonBuffer.parseObject(json);
root[name] = volume;
json = "";
root.printTo(json);
return json;
2020-05-26 17:42:50 +02:00
DynamicJsonDocument jsonBuffer(1024);
deserializeJson(jsonBuffer,json);
jsonBuffer[name] = volume;
json = "";
serializeJson(jsonBuffer,json);
return json;
*/
/*
String jsonWriteArray(String &json, String value1, String value2, String value3) {
const int capacity = JSON_ARRAY_SIZE(1) + 3 * JSON_OBJECT_SIZE(3);
StaticJsonBuffer<capacity> jb;
JsonArray& arr = jb.createArray();
JsonObject& obj1 = jb.createObject();
obj1[value1] = 1;
obj1[value2] = 2;
obj1[value3] = 3;
arr.add(obj1);
arr.printTo(json);
return json;
}
*/
2020-05-26 17:42:50 +02:00
//============================================================================================================
//=============================================BIT AND BYTE===================================================
uint8_t hexStringToUint8(String hex) {
uint8_t tmp = strtol(hex.c_str(), NULL, 0);
if (tmp >= 0x00 && tmp <= 0xFF) {
return tmp;
}
}
uint16_t hexStringToUint16(String hex) {
uint16_t tmp = strtol(hex.c_str(), NULL, 0);
if (tmp >= 0x0000 && tmp <= 0xFFFF) {
return tmp;
}
}
//==============================================================================================================
2019-12-24 11:53:26 +03:00
//=============================================CONFIG===========================================================
void saveConfig () {
writeFile("config.json", configSetup);
}
2020-05-26 17:42:50 +02:00
//==============================================================================================================
//=============================================STRING===========================================================
2019-12-24 11:53:26 +03:00
// --------Выделяем строку от конца строки до маркера-----------------------------------------------------------
String selectToMarkerLast (String str, String found) {
int p = str.lastIndexOf(found);
return str.substring(p + found.length());
}
// --------Выделяем строку до маркера---------------------------------------------------------------------------
String selectToMarker (String str, String found) {
int p = str.indexOf(found);
return str.substring(0, p);
}
// --------Удаляем все после символа разделителя (вместе с символом разделителя)--------------------------------
String deleteAfterDelimiter (String str, String found) {
int p = str.indexOf(found);
return str.substring(0, p);
}
//---------Удаляем все до символа разделителя (вместе с символом разделителя)-----------------------------------
String deleteBeforeDelimiter(String str, String found) {
int p = str.indexOf(found) + found.length();
return str.substring(p);
}
//----------------------Удаляем все до символа разделителя (без символа разделителя)----------------------------
String deleteBeforeDelimiterTo(String str, String found) {
int p = str.indexOf(found);
return str.substring(p);
}
// -------------------Выделяем строку от конца строки до маркера ------------------------------------------------
String deleteToMarkerLast (String str, String found) {
int p = str.lastIndexOf(found);
return str.substring(0, p);
}
2020-05-26 17:42:50 +02:00
// -------------------Выделяем строку от конца строки до маркера + ----------------------------------------------
2019-12-24 11:53:26 +03:00
String selectToMarkerPlus (String str, String found, int plus) {
int p = str.indexOf(found);
return str.substring(0, p + plus);
}
2020-05-26 17:42:50 +02:00
//--------------------Выделяем строку от маркера до маркера -----------------------------------------------------
2019-12-24 11:53:26 +03:00
String selectFromMarkerToMarker(String str, String found, int number) {
if (str.indexOf(found) == -1) return "not found"; // если строки поиск нет сразу выход
str += found; // добавим для корректного поиска
uint8_t i = 0; // Индекс перебора
do {
if (i == number) return selectToMarker(str, found); // если индекс совпал с позицией законцим вернем резултат
str = deleteBeforeDelimiter(str, found); // отбросим проверенный блок до разделителя
i++; // увеличим индекс
} while (str.length() != 0); // повторим пока строка не пустая
return "not found"; // Достигли пустой строки и ничего не нашли
}
2020-05-26 17:42:50 +02:00
//--------------------Посчитать -----------------------------------------------------------------------------------
2019-12-24 11:53:26 +03:00
int count(String str, String found) {
if (str.indexOf(found) == -1) return 0; // если строки поиск нет сразу выход
str += found; // добавим для корректного поиска
uint8_t i = 0; // Индекс перебора
while (str.length() != 0) {
str = deleteBeforeDelimiter(str, found); // отбросим проверенный блок до разделителя
i++; // увеличим индекс
}
return i; // Достигли пустой строки и ничего не нашли
}
2020-05-26 17:42:50 +02:00
//--------------------проверка на цифры ---------------------------------------------------------------------------
2019-12-24 11:53:26 +03:00
boolean isDigitStr (String str) {
if (str.length() == 1) {
return Digit (str);
}
if (str.length() > 1) {
for (int i = 0; i < str.length(); i++) {
if (!Digit (String(str.charAt(i)))) return false;
}
return true;
}
}
boolean Digit (String str) {
if (str == "0" || str == "1" || str == "2" || str == "3" || str == "4" || str == "5" || str == "6" || str == "7" || str == "8" || str == "9") {
return true;
} else {
return false;
}
}
2020-05-26 17:42:50 +02:00
//==================================================================================================================
2019-12-24 11:53:26 +03:00
//============================================URL===================================================================
// ----------------------Запрос на удаленный URL
String getURL(String urls) {
String answer = "";
HTTPClient http;
http.begin(urls); //HTTP
int httpCode = http.GET();
if (httpCode == HTTP_CODE_OK) {
answer = http.getString();
}
2020-03-04 00:27:35 +03:00
else {
2019-12-24 11:53:26 +03:00
answer = "error";
}
http.end();
return answer;
}
2020-05-26 17:42:50 +02:00
//===================================================================================================================
2019-12-24 11:53:26 +03:00
//===========================================FILES===================================================================
2020-05-26 17:42:50 +02:00
// ------------- Добавление файла -----------------------------------------------------------------------------------
String safeDataToFile(String data, String Folder) {
2019-12-24 11:53:26 +03:00
//String fileName = GetDate();
String fileName;
fileName.toLowerCase();
fileName = deleteBeforeDelimiter(fileName, " ");
fileName.replace(" ", ".");
fileName.replace("..", ".");
fileName = Folder + "/" + fileName + ".txt";
2020-03-16 00:00:59 +01:00
// addFile(fileName, GetTime() + "/" + data);
2019-12-24 11:53:26 +03:00
Serial.println(fileName);
jsonWriteStr(configJson, "test", fileName);
2019-12-24 11:53:26 +03:00
}
2020-05-26 17:42:50 +02:00
// ------------- Чтение файла в строку -------------------------------------------------------------------------------
2019-12-24 11:53:26 +03:00
String readFile(String fileName, size_t len ) {
File configFile = SPIFFS.open("/" + fileName, "r");
if (!configFile) {
return "Failed";
}
size_t size = configFile.size();
if (size > len) {
configFile.close();
return "Large";
}
String temp = configFile.readString();
configFile.close();
return temp;
}
2020-05-26 17:42:50 +02:00
// ------------- Размер файла ----------------------------------------------------------------------------------------
2019-12-24 11:53:26 +03:00
String sizeFile(String fileName) {
File configFile = SPIFFS.open("/" + fileName, "r");
if (!configFile) {
return "Failed";
}
size_t size = configFile.size();
configFile.close();
return String(size);
}
2020-05-26 17:42:50 +02:00
// ------------- Запись строки в файл ---------------------------------------------------------------------------------
2019-12-24 11:53:26 +03:00
String writeFile(String fileName, String strings ) {
File configFile = SPIFFS.open("/" + fileName, "w");
if (!configFile) {
return "Failed to open config file";
}
configFile.print(strings);
//strings.printTo(configFile);
configFile.close();
return "Write sucsses";
}
2020-05-26 17:42:50 +02:00
// ------------- Добовление строки в файл ------------------------------------------------------------------------------
2019-12-24 11:53:26 +03:00
String addFile(String fileName, String strings ) {
File configFile = SPIFFS.open("/" + fileName, "a");
if (!configFile) {
return "Failed to open config file";
}
configFile.println(strings);
configFile.close();
return "Write sucsses";
}
2020-05-26 17:42:50 +02:00
// ------------- Чтение строки из файла ---------------------------------------------------------------------------------
//возвращает стоку из файла в которой есть искомое слово found
String readFileString(String fileName, String found) {
2019-12-24 11:53:26 +03:00
File configFile = SPIFFS.open("/" + fileName, "r");
if (!configFile) {
return "Failed";
}
if (configFile.find(found.c_str())) {
return configFile.readStringUntil('\n'); //'\r'
2019-12-24 11:53:26 +03:00
}
configFile.close();
}
2020-05-26 17:42:50 +02:00
//=========================================================================================================================
//=======================================УПРАВЛЕНИЕ ВИДЖЕТАМИ MQTT=========================================================
2019-12-24 11:53:26 +03:00
void sendCONFIG(String topik, String widgetConfig, String key, String date) {
yield();
2020-05-26 17:42:50 +02:00
topik = jsonReadStr(configSetup, "mqttPrefix") + "/" + chipID + "/" + topik + "/status";
2019-12-24 11:53:26 +03:00
String outer = "{\"widgetConfig\":";
String inner = "{\"";
inner = inner + key;
inner = inner + "\":\"";
inner = inner + date;
inner = inner + "\"";
inner = inner + "}}";
String t = outer + inner;
//Serial.println(t);
2020-05-02 12:20:30 +02:00
//client_mqtt.publish(MQTT::Publish(topik, t).set_qos(1));
2019-12-24 11:53:26 +03:00
yield();
}
2020-05-26 17:42:50 +02:00
//=========================================================================================================================
//=========================================МИГАНИЕ СВЕТОДИОДОМ=============================================================
2020-05-20 02:16:23 +02:00
void led_blink(String satus) {
2020-05-26 17:42:50 +02:00
#ifdef ESP8266
#ifdef blink_pin
2020-05-20 02:16:23 +02:00
pinMode(blink_pin, OUTPUT);
if (satus == "off") {
noTone(blink_pin);
digitalWrite(blink_pin, HIGH);
2019-12-24 11:53:26 +03:00
}
2020-05-20 02:16:23 +02:00
if (satus == "on") {
noTone(blink_pin);
digitalWrite(blink_pin, LOW);
}
if (satus == "slow") tone(blink_pin, 1);
if (satus == "fast") tone(blink_pin, 20);
2020-05-26 17:42:50 +02:00
#endif
#endif
2019-12-24 11:53:26 +03:00
}
2020-05-26 17:42:50 +02:00
//=========================================================================================================================
//=========================================ОСТАВШАЯСЯ ОПЕРАТИВНАЯ ПАМЯТЬ===================================================
2019-12-24 11:53:26 +03:00
void getMemoryLoad(String text) {
2020-03-16 00:00:59 +01:00
#ifdef ESP8266
int all_memory = 52864;
2020-03-16 00:00:59 +01:00
#endif
#ifdef ESP32
2019-12-24 11:53:26 +03:00
int all_memory = 362868;
2020-03-16 00:00:59 +01:00
#endif
2019-12-24 11:53:26 +03:00
int memory_remain = ESP.getFreeHeap();
int memory_used = all_memory - memory_remain;
2020-02-15 20:17:25 +03:00
int memory_load = (memory_used * 100) / all_memory;
2019-12-24 11:53:26 +03:00
if (memory_load > 65) Serial.print("Attention!!! too match memory used!!!");
Serial.print(text + " memory used:");
2020-02-10 01:06:18 +03:00
Serial.print(String(memory_load) + "%; ");
2020-03-22 01:50:31 +01:00
Serial.print("memory remain: ");
2020-02-10 01:06:18 +03:00
Serial.println(String(memory_remain) + " k bytes");
2020-03-16 00:00:59 +01:00
2019-12-24 11:53:26 +03:00
}
2020-02-10 01:06:18 +03:00
//esp32 full memory = 362868 k bytes
//esp8266 full memory = 52864 k bytes
2020-03-18 09:57:46 +01:00
2020-05-26 17:42:50 +02:00
2020-03-18 09:57:46 +01:00
//===================================================================
/*
2020-03-20 21:00:11 +01:00
void web_print (String text) {
2020-03-17 00:54:27 +01:00
if (WiFi.status() == WL_CONNECTED) {
2020-05-26 17:42:50 +02:00
jsonWriteStr(json, "test1", jsonReadStr(json, "test2"));
jsonWriteStr(json, "test2", jsonReadStr(json, "test3"));
jsonWriteStr(json, "test3", jsonReadStr(json, "test4"));
jsonWriteStr(json, "test4", jsonReadStr(json, "test5"));
jsonWriteStr(json, "test5", jsonReadStr(json, "test6"));
2020-03-16 00:00:59 +01:00
jsonWriteStr(json, "test6", GetTime() + " " + text);
2020-03-16 00:00:59 +01:00
2020-03-17 00:54:27 +01:00
ws.textAll(json);
}
2020-03-20 21:00:11 +01:00
}
2020-03-18 09:57:46 +01:00
*/
//===================================================================
/*
"socket": [
"ws://{{ip}}/ws"
],
*/
//===================================================================
2020-03-17 17:54:57 +01:00
/*
{
"type": "h4",
"title": "('{{build2}}'=='{{firmware_version}}'?'NEW':'OLD')"
},
*/
2020-03-18 09:57:46 +01:00
//===================================================================
2020-03-17 17:54:57 +01:00
/*
{
"type": "button",
"title": "Конфигурация устройства",
"socket": "test2",
"class": "btn btn-block btn-primary"
},
2020-03-17 17:54:57 +01:00
{
2020-03-17 00:54:27 +01:00
"type": "hr"
},
{
"type": "h6",
"title": "{{test1}}"
},
{
"type": "h6",
"title": "{{test2}}"
},
{
"type": "h6",
"title": "{{test3}}"
},
{
"type": "h6",
"title": "{{test4}}"
},
{
"type": "h6",
"title": "{{test5}}"
},
{
"type": "h6",
"title": "{{test6}}"
},
{
"type": "hr"
},
*/
2020-03-18 09:57:46 +01:00
//===================================================================
2020-03-21 18:14:38 +01:00
/*
String getResetReason(uint8_t core) {
2020-03-21 18:14:38 +01:00
int reason = rtc_get_reset_reason(core);
switch (reason) {
case 1 : return "Power on"; break; //Vbat power on reset
case 3 : return "Software reset digital core"; break; //Software reset digital core
case 4 : return "Legacy watch dog reset digital core"; break; //Legacy watch dog reset digital core
case 5 : return "Deep Sleep reset digital core"; break; //Deep Sleep reset digital core
case 6 : return "Reset by SLC module, reset digital core"; break; //Reset by SLC module, reset digital core
case 7 : return "Timer Group0 Watch dog reset digital core"; break; //Timer Group0 Watch dog reset digital core
case 8 : return "Timer Group1 Watch dog reset digital core"; break; //Timer Group1 Watch dog reset digital core
case 9 : return "RTC Watch dog Reset digital core"; break; //
case 10 : return "Instrusion tested to reset CPU"; break;
case 11 : return "Time Group reset CPU"; break;
case 12 : return "Software reset CPU"; break;
case 13 : return "RTC Watch dog Reset CPU"; break;
case 14 : return "for APP CPU, reseted by PRO CPU"; break;
case 15 : return "Reset when the vdd voltage is not stable"; break;
case 16 : return "RTC Watch dog reset digital core and rtc module"; break;
default : return "NO_MEAN";
}
}
2020-03-21 18:14:38 +01:00
String EspClass::getResetReason(void) {
2020-03-21 18:14:38 +01:00
char buff[32];
if (resetInfo.reason == REASON_DEFAULT_RST) { // normal startup by power on
strcpy_P(buff, PSTR("Power on"));
} else if (resetInfo.reason == REASON_WDT_RST) { // hardware watch dog reset
strcpy_P(buff, PSTR("Hardware Watchdog"));
} else if (resetInfo.reason == REASON_EXCEPTION_RST) { // exception reset, GPIO status wont change
strcpy_P(buff, PSTR("Exception"));
} else if (resetInfo.reason == REASON_SOFT_WDT_RST) { // software watch dog reset, GPIO status wont change
strcpy_P(buff, PSTR("Software Watchdog"));
} else if (resetInfo.reason == REASON_SOFT_RESTART) { // software restart ,system_restart , GPIO status wont change
strcpy_P(buff, PSTR("Software/System restart"));
} else if (resetInfo.reason == REASON_DEEP_SLEEP_AWAKE) { // wake up from deep-sleep
strcpy_P(buff, PSTR("Deep-Sleep Wake"));
} else if (resetInfo.reason == REASON_EXT_SYS_RST) { // external system reset
strcpy_P(buff, PSTR("External System"));
} else {
strcpy_P(buff, PSTR("Unknown"));
}
return String(buff);
}
2020-03-21 18:14:38 +01:00
*/