From 1f46226a463cc836ca69319136c346b99dcadb07 Mon Sep 17 00:00:00 2001 From: Dmitry Borisenko <49808844+DmitryBorisenko33@users.noreply.github.com> Date: Fri, 6 Nov 2020 20:17:49 +0300 Subject: [PATCH 1/2] fixed scenario bug --- data/config.json | 2 +- data/presets/dal.s.txt | 2 + data/presets/dht.c.txt | 2 +- data/presets/dht.s.txt | 2 + data/set.device.json | 4 +- include/Class/ScenarioClass.h | 128 ------------------ include/Class/ScenarioClass2.h | 68 ++++++++++ include/Telegram.h | 3 +- .../{ScenarioClass.cpp => ScenarioClass2.cpp} | 3 +- src/Telegram.cpp | 56 +++++++- src/Utils/statUtils.cpp | 2 +- src/main.cpp | 2 +- 12 files changed, 131 insertions(+), 143 deletions(-) delete mode 100644 include/Class/ScenarioClass.h create mode 100644 include/Class/ScenarioClass2.h rename src/Class/{ScenarioClass.cpp => ScenarioClass2.cpp} (72%) diff --git a/data/config.json b/data/config.json index bf6da577..592a7138 100644 --- a/data/config.json +++ b/data/config.json @@ -13,7 +13,7 @@ "mqttUser": "rise", "mqttPass": "23ri22se32", "scen": "1", - "telegramApi": "1425283609:AAFf3YO8ouCJF23kU8CMiU7XXy21MFhbn9w", + "telegramApi": "1416711569:AAEI0j83GmXqwzb_gnK1B0Am0gDwZoJt5xo", "telegonof": "0", "weblogin": "admin", "webpass": "admin", diff --git a/data/presets/dal.s.txt b/data/presets/dal.s.txt index 43f05cc5..dc4c8c07 100644 --- a/data/presets/dal.s.txt +++ b/data/presets/dal.s.txt @@ -1,6 +1,8 @@ temp > inputU button 0 +telegram нагрев#выключен 1 end temp < inputL button 1 +telegram нагрев#включен 1 end \ No newline at end of file diff --git a/data/presets/dht.c.txt b/data/presets/dht.c.txt index 2c9acd11..35f8dd19 100644 --- a/data/presets/dht.c.txt +++ b/data/presets/dht.c.txt @@ -1,5 +1,5 @@ 0;dht-hum;hum;anydataHum;Теплица;Влажность;1;pin[2];type[dht11];c[1] -0;logging;log;chart;Теплица;Влажность;2;val[hum];int[60];cnt[100] +0;logging;log;chart;Теплица;История;2;val[hum];int[60];cnt[100] 0;input-digit;inputU;inputDigit;Теплица;Верхний#порог;3;st[45] 0;input-digit;inputL;inputDigit;Теплица;Нижний#порог;4;st[35] 0;button-out;button;toggle;Теплица;Полив;5;pin[12];st[0] \ No newline at end of file diff --git a/data/presets/dht.s.txt b/data/presets/dht.s.txt index bbf78407..f69cdc54 100644 --- a/data/presets/dht.s.txt +++ b/data/presets/dht.s.txt @@ -1,6 +1,8 @@ hum > inputU button 0 +telegram полив#выключен 1 end hum < inputL button 1 +telegram полив#включен 1 end \ No newline at end of file diff --git a/data/set.device.json b/data/set.device.json index 345d62eb..4ba722d1 100644 --- a/data/set.device.json +++ b/data/set.device.json @@ -87,8 +87,8 @@ "style": "display:inline", "title": { "#": "Выберите пресет из списка", - "/set?addPreset=dal.c": "1.Термостат на основе ds18b20 (устройство держит заданный уровень температуры)", - "/set?addPreset=dht.c": "2.Контроль влажности на основе DHT (устройство держит заданный уровень влажности)" + "/set?addPreset=dal.c": "1.Термостат на основе ds18b20 с оповещением в телеграм", + "/set?addPreset=dht.c": "2.Контроль влажности на основе DHT с оповещением в телеграм" } }, { diff --git a/include/Class/ScenarioClass.h b/include/Class/ScenarioClass.h deleted file mode 100644 index b3a1f064..00000000 --- a/include/Class/ScenarioClass.h +++ /dev/null @@ -1,128 +0,0 @@ -#pragma once -#include -#include "Cmd.h" -#include "Global.h" - -class Scenario { -protected: - String _scenarioTmp; - String _condition; - String _conditionParam; - String _conditionSign; - String _conditionValue; - String _scenBlok; - String _event; - String _eventParam; - String _eventValue; - -public: - Scenario() : _scenarioTmp{ "" }, - _condition{ "" }, - _conditionParam{ "" }, - _conditionSign{ "" }, - _conditionValue{ "" }, - _scenBlok{ "" }, - _event{ "" }, - _eventParam{ "" }, - _eventValue{ "" } {}; - - void load() { - _scenarioTmp = scenario; - } - - void calculate1() { - _scenBlok = selectToMarker(_scenarioTmp, "end\n"); - _condition = selectToMarker(_scenBlok, "\n"); - _eventParam = selectToMarker(eventBuf, ","); - } - - bool isIncommingEventInScenario() { - bool ret = false; - if (_condition.indexOf(_eventParam) != -1) { - ret = true; - } - return ret; - } - - void calculate2() { - _scenarioTmp += "\n"; - _scenarioTmp.replace("\r\n", "\n"); - _scenarioTmp.replace("\r", "\n"); - - _conditionParam = selectFromMarkerToMarker(_condition, " ", 0); - _conditionSign = selectFromMarkerToMarker(_condition, " ", 1); - _conditionValue = selectFromMarkerToMarker(_condition, " ", 2); - if (!isDigitStr(_conditionValue)) _conditionValue = jsonReadStr(configLiveJson, _conditionValue); - _eventValue = jsonReadStr(configLiveJson, _conditionParam); - } - - void delOneScenBlock() { - _scenarioTmp = deleteBeforeDelimiter(_scenarioTmp, "end\n"); - } - - void delOneEvent() { - eventBuf = deleteBeforeDelimiter(eventBuf, ","); - } - - bool isConditionSatisfied() { - boolean flag = false; - - if (_conditionSign == "=") { - flag = _eventValue == _conditionValue; - } - else if (_conditionSign == "!=") { - flag = _eventValue != _conditionValue; - } - else if (_conditionSign == "<") { - flag = _eventValue.toFloat() < _conditionValue.toFloat(); - } - else if (_conditionSign == ">") { - flag = _eventValue.toFloat() > _conditionValue.toFloat(); - } - else if (_conditionSign == ">=") { - flag = _eventValue.toFloat() >= _conditionValue.toFloat(); - } - else if (_conditionSign == "<=") { - flag = _eventValue.toFloat() <= _conditionValue.toFloat(); - } - - if (flag) { - //SerialPrint("I", "Scenario", "event value: " + _eventValue); - //SerialPrint("I", "Scenario", "condition value: " + _conditionValue); - SerialPrint("I", "Scenario", "event: " + _condition); - } - - return flag; - } - - void loop() { - if (!this->isScenarioEnabled()) { - return; - } - this->load(); //после этого мы получили все сценарии - while (_scenarioTmp.length() > 1) { - this->calculate1(); //расчет необходимый для ответа на следующий вопрос - if (this->isIncommingEventInScenario()) { //если вошедшее событие есть в сценарии - this->calculate2(); - if (this->isConditionSatisfied()) { //если вошедшее событие выполняет условие сценария - _scenBlok = deleteBeforeDelimiter(_scenBlok, "\n"); - String forPrint = _scenBlok; - forPrint.replace("end", ""); - forPrint.replace("\r\n", ""); - forPrint.replace("\r", ""); - forPrint.replace("\n", ""); - SerialPrint("I", "Scenario", "making: " + forPrint); - spaceCmdExecute(_scenBlok); - } - } - this->delOneScenBlock(); //удалим использованный блок - } - this->delOneEvent(); - } - - bool isScenarioEnabled() { - return jsonReadBool(configSetupJson, "scen") && eventBuf != ""; - } -}; - -extern Scenario* myScenario; \ No newline at end of file diff --git a/include/Class/ScenarioClass2.h b/include/Class/ScenarioClass2.h new file mode 100644 index 00000000..4b7434fb --- /dev/null +++ b/include/Class/ScenarioClass2.h @@ -0,0 +1,68 @@ +#pragma once +#include +#include "Cmd.h" +#include "Global.h" + +class Scenario { + +public: + + void loop() { + + String allBlocks = scenario; + allBlocks.replace("\r\n", "\n"); + allBlocks.replace("\r", "\n"); + allBlocks += "\n"; + + String incommingEvent = selectToMarker(eventBuf, ","); + + while (allBlocks.length() > 1) { + String oneBlock = selectToMarker(allBlocks, "end\n"); + String condition = selectToMarker(oneBlock, "\n"); + + String setEvent = selectFromMarkerToMarker(condition, " ", 0); + String setEventSign = selectFromMarkerToMarker(condition, " ", 1); + String setEventValue = selectFromMarkerToMarker(condition, " ", 2); + if (!isDigitStr(setEventValue)) setEventValue = jsonReadStr(configLiveJson, setEventValue); + String incommingEventValue = jsonReadStr(configLiveJson, incommingEvent); + + if (incommingEvent == setEvent) { + + boolean flag = false; + + if (setEventSign == "=") { + flag = incommingEventValue == setEventValue; + } + else if (setEventSign == "!=") { + flag = incommingEventValue != setEventValue; + } + else if (setEventSign == "<") { + flag = incommingEventValue.toFloat() < setEventValue.toFloat(); + } + else if (setEventSign == ">") { + flag = incommingEventValue.toFloat() > setEventValue.toFloat(); + } + else if (setEventSign == ">=") { + flag = incommingEventValue.toFloat() >= setEventValue.toFloat(); + } + else if (setEventSign == "<=") { + flag = incommingEventValue.toFloat() <= setEventValue.toFloat(); + } + + if (flag) { + //SerialPrint("I", "Scenario", "incomming Event Value: " + incommingEventValue); + //SerialPrint("I", "Scenario", "set Event Value: " + setEventValue); + + oneBlock = deleteBeforeDelimiter(oneBlock, "\n"); + oneBlock.replace("end", ""); + SerialPrint("I", "Scenario", condition + " set:\n" + oneBlock); + spaceCmdExecute(oneBlock); + } + } + allBlocks = deleteBeforeDelimiter(allBlocks, "end\n"); + } + eventBuf = deleteBeforeDelimiter(eventBuf, ","); + } +}; + +extern Scenario* myScenario; \ No newline at end of file diff --git a/include/Telegram.h b/include/Telegram.h index 69a75811..9fd18857 100644 --- a/include/Telegram.h +++ b/include/Telegram.h @@ -5,4 +5,5 @@ extern void sendTelegramMsg(); extern void telegramInit(); extern void handleTelegram(); extern bool isTelegramEnabled(); -extern void telegramMsgParse(String msg); \ No newline at end of file +extern void telegramMsgParse(String msg); +extern String returnListOfParams(); \ No newline at end of file diff --git a/src/Class/ScenarioClass.cpp b/src/Class/ScenarioClass2.cpp similarity index 72% rename from src/Class/ScenarioClass.cpp rename to src/Class/ScenarioClass2.cpp index b7de405e..113a4ee3 100644 --- a/src/Class/ScenarioClass.cpp +++ b/src/Class/ScenarioClass2.cpp @@ -1,9 +1,10 @@ -#include "Class/ScenarioClass.h" +#include "Class/ScenarioClass2.h" Scenario* myScenario; void eventGen(String event_name, String number) { if (!jsonReadBool(configSetupJson, "scen")) { return; } + SerialPrint("", "", event_name); eventBuf += event_name + number + ","; } \ No newline at end of file diff --git a/src/Telegram.cpp b/src/Telegram.cpp index 46973e42..89425e5a 100644 --- a/src/Telegram.cpp +++ b/src/Telegram.cpp @@ -43,28 +43,70 @@ void handleTelegram() { } void telegramMsgParse(String msg) { - SerialPrint("<-", "Telegram", "chat ID: " + String(jsonReadInt(configSetupJson, "chatId")) + ", msg: " + String(msg)); - if (msg.indexOf("order") != -1) { - msg = deleteBeforeDelimiter(msg, " "); + if (msg.indexOf("set") != -1) { + msg = deleteBeforeDelimiter(msg, "_"); + msg.replace("_", " "); orderBuf += String(msg) + ","; myBot->sendMessage(jsonReadInt(configSetupJson, "chatId"), "order done"); + SerialPrint("<-", "Telegram", "chat ID: " + String(jsonReadInt(configSetupJson, "chatId")) + ", msg: " + String(msg)); } else if (msg.indexOf("get") != -1) { - msg = deleteBeforeDelimiter(msg, " "); + msg = deleteBeforeDelimiter(msg, "_"); myBot->sendMessage(jsonReadInt(configSetupJson, "chatId"), jsonReadStr(configLiveJson, msg)); + SerialPrint("<-", "Telegram", "chat ID: " + String(jsonReadInt(configSetupJson, "chatId")) + ", msg: " + String(msg)); + } + else if (msg.indexOf("all") != -1) { + String list = returnListOfParams(); + myBot->sendMessage(jsonReadInt(configSetupJson, "chatId"), list); + SerialPrint("<-", "Telegram", "chat ID: " + String(jsonReadInt(configSetupJson, "chatId")) + "\n" + list); } else { - myBot->sendMessage(jsonReadInt(configSetupJson, "chatId"), "wrong order, use 'get id' to get value, or 'order id value' to send order"); + myBot->sendMessage(jsonReadInt(configSetupJson, "chatId"), "Wrong order, use /all to get all values, /get_id to get value, or /set_id_value to set value"); } } void sendTelegramMsg() { String msg = sCmd.next(); + String type = sCmd.next(); msg.replace("#", " "); - myBot->sendMessage(jsonReadInt(configSetupJson, "chatId"), msg); - SerialPrint("<-", "Telegram", "chat ID: " + String(jsonReadInt(configSetupJson, "chatId")) + ", msg: " + msg); + if (type == "1") { + static String prevMsg; + if (prevMsg != msg) { + prevMsg = msg; + myBot->sendMessage(jsonReadInt(configSetupJson, "chatId"), msg); + SerialPrint("<-", "Telegram", "chat ID: " + String(jsonReadInt(configSetupJson, "chatId")) + ", msg: " + msg); + } + } else if (type == "2") { + myBot->sendMessage(jsonReadInt(configSetupJson, "chatId"), msg); + SerialPrint("<-", "Telegram", "chat ID: " + String(jsonReadInt(configSetupJson, "chatId")) + ", msg: " + msg); + } } bool isTelegramEnabled() { return jsonReadBool(configSetupJson, "telegonof"); +} + + +String returnListOfParams() { + String cmdStr = readFile(DEVICE_CONFIG_FILE, 4096); + cmdStr += "\r\n"; + cmdStr.replace("\r\n", "\n"); + cmdStr.replace("\r", "\n"); + int count = 0; + String out; + while (cmdStr.length()) { + String buf = selectToMarker(cmdStr, "\n"); + count++; + if (count > 1) { + String id = selectFromMarkerToMarker(buf, ";", 2); + String value = jsonReadStr(configLiveJson, id); + String page = selectFromMarkerToMarker(buf, ";", 4); + page.replace("#", " "); + String name = selectFromMarkerToMarker(buf, ";", 5); + name.replace("#", " "); + out += page + " " + " " + name + " " + value + "\n"; + } + cmdStr = deleteBeforeDelimiter(cmdStr, "\n"); + } + return out; } \ No newline at end of file diff --git a/src/Utils/statUtils.cpp b/src/Utils/statUtils.cpp index af789650..f924ec05 100644 --- a/src/Utils/statUtils.cpp +++ b/src/Utils/statUtils.cpp @@ -68,7 +68,7 @@ String addNewDevice() { //============================================== jsonWriteStr(json, "uniqueId", mac); jsonWriteStr(json, "name", FIRMWARE_NAME); - jsonWriteInt(json, "model", FIRMWARE_VERSION); + jsonWriteStr(json, "model", getChipId()); //============================================== http.begin(client, serverIP + F(":8082/api/devices/")); http.setAuthorization("admin", "admin"); diff --git a/src/main.cpp b/src/main.cpp index fef52869..c10b8cbc 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -5,7 +5,7 @@ #include "Bus.h" #include "Class/CallBackTest.h" #include "Class/NotAsync.h" -#include "Class/ScenarioClass.h" +#include "Class/ScenarioClass2.h" #include "Cmd.h" #include "Global.h" #include "Init.h" From 709a1fe1f7edd81386ef50be0d4d1be871a5e389 Mon Sep 17 00:00:00 2001 From: Dmitry Borisenko <49808844+DmitryBorisenko33@users.noreply.github.com> Date: Sat, 7 Nov 2020 01:11:32 +0300 Subject: [PATCH 2/2] 267 Scenario bug fully fixed Stable --- data/config.json | 10 ++-- data/items/input-time.txt | 2 +- data/presets/rel.c.txt | 4 ++ data/presets/rel.s.txt | 8 +++ data/set.device.json | 14 +++++- data/set.telegram.json | 9 ++++ include/Class/ScenarioClass2.h | 1 + include/Class/ScenarioClass3.h | 70 +++++++++++++++++++++++++++ include/Consts.h | 10 ++-- include/Global.h | 2 +- include/items/ButtonInClass.h | 2 +- include/items/ButtonOutClass.h | 2 +- include/items/InputClass.h | 4 +- include/items/OutputTextClass.h | 2 +- include/items/PwmOutClass.h | 2 +- include/items/SensorAnalogClass.h | 2 +- include/items/SensorBme280Class.h | 6 +-- include/items/SensorBmp280Class.h | 4 +- include/items/SensorDhtClass.h | 4 +- include/items/SensorModbusClass.h | 2 +- include/items/SensorUltrasonicClass.h | 2 +- src/Class/ScenarioClass2.cpp | 10 ---- src/Class/ScenarioClass3.cpp | 18 +++++++ src/ItemsCmd.cpp | 2 +- src/Sensors.cpp | 22 ++++----- src/Timers.cpp | 2 +- src/Utils/statUtils.cpp | 3 +- src/items/InputTimeClass.cpp | 11 +++-- src/items/SensorDallas.cpp | 2 +- src/main.cpp | 2 +- 30 files changed, 177 insertions(+), 57 deletions(-) create mode 100644 data/presets/rel.c.txt create mode 100644 data/presets/rel.s.txt create mode 100644 include/Class/ScenarioClass3.h delete mode 100644 src/Class/ScenarioClass2.cpp create mode 100644 src/Class/ScenarioClass3.cpp diff --git a/data/config.json b/data/config.json index 592a7138..88fa28c5 100644 --- a/data/config.json +++ b/data/config.json @@ -5,13 +5,13 @@ "appass": "", "routerssid": "VOLODYA", "routerpass": "BELCHENKO", - "timezone": 2, + "timezone": 1, "ntp": "pool.ntp.org", - "mqttServer": "91.204.228.124", - "mqttPort": 1883, + "mqttServer": "m12.cloudmqtt.com", + "mqttPort": 14053, "mqttPrefix": "/iotTest", - "mqttUser": "rise", - "mqttPass": "23ri22se32", + "mqttUser": "lbscvzuj", + "mqttPass": "bLxlveOgaF8F", "scen": "1", "telegramApi": "1416711569:AAEI0j83GmXqwzb_gnK1B0Am0gDwZoJt5xo", "telegonof": "0", diff --git a/data/items/input-time.txt b/data/items/input-time.txt index e90f7689..14c29d89 100644 --- a/data/items/input-time.txt +++ b/data/items/input-time.txt @@ -1 +1 @@ -0;input-time;id;inputTime;Ввод;Введите#время;order;st[10:00:00] \ No newline at end of file +0;input-time;id;inputTime;Ввод;Введите#время;order;st[10:00] \ No newline at end of file diff --git a/data/presets/rel.c.txt b/data/presets/rel.c.txt new file mode 100644 index 00000000..af8550f0 --- /dev/null +++ b/data/presets/rel.c.txt @@ -0,0 +1,4 @@ +0;button-out;button1;toggle;Реле;Освещение;1;pin[12];st[0] +0;button-out;button2;toggle;Реле;Освещение;2;pin[13];st[0] +0;input-time;T1;inputTime;Реле;Введите#время#включения;3;st[10:00] +0;input-time;T2;inputTime;Реле;Введите#время#выключения;4;st[11:00] \ No newline at end of file diff --git a/data/presets/rel.s.txt b/data/presets/rel.s.txt new file mode 100644 index 00000000..844d1c5b --- /dev/null +++ b/data/presets/rel.s.txt @@ -0,0 +1,8 @@ +timenow = T1 +button1 1 +button2 0 +end +timenow = T2 +button1 0 +button2 1 +end \ No newline at end of file diff --git a/data/set.device.json b/data/set.device.json index 4ba722d1..55a874a1 100644 --- a/data/set.device.json +++ b/data/set.device.json @@ -43,7 +43,7 @@ }, { "type": "h4", - "title": "LittleFS version: 266" + "title": "LittleFS version: 267" }, { "type": "hr" @@ -88,7 +88,8 @@ "title": { "#": "Выберите пресет из списка", "/set?addPreset=dal.c": "1.Термостат на основе ds18b20 с оповещением в телеграм", - "/set?addPreset=dht.c": "2.Контроль влажности на основе DHT с оповещением в телеграм" + "/set?addPreset=dht.c": "2.Контроль влажности на основе DHT с оповещением в телеграм", + "/set?addPreset=rel.c": "3.Включение выключение реле в заданное время" } }, { @@ -184,6 +185,15 @@ "action": "/check", "response": "[[my-block]]", "class": "btn btn-block btn-default" + }, + { + "type": "hr" + }, + { + "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.telegram.json b/data/set.telegram.json index e4a22bb7..76560093 100644 --- a/data/set.telegram.json +++ b/data/set.telegram.json @@ -54,6 +54,15 @@ { "type": "text", "title": "

После настройки telegram перезагрузите устройство что бы изменения вступили в силу

" + }, + { + "type": "hr" + }, + { + "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/include/Class/ScenarioClass2.h b/include/Class/ScenarioClass2.h index 4b7434fb..6dc84eb6 100644 --- a/include/Class/ScenarioClass2.h +++ b/include/Class/ScenarioClass2.h @@ -24,6 +24,7 @@ public: String setEventSign = selectFromMarkerToMarker(condition, " ", 1); String setEventValue = selectFromMarkerToMarker(condition, " ", 2); if (!isDigitStr(setEventValue)) setEventValue = jsonReadStr(configLiveJson, setEventValue); + String incommingEventValue = jsonReadStr(configLiveJson, incommingEvent); if (incommingEvent == setEvent) { diff --git a/include/Class/ScenarioClass3.h b/include/Class/ScenarioClass3.h new file mode 100644 index 00000000..3bedf2bc --- /dev/null +++ b/include/Class/ScenarioClass3.h @@ -0,0 +1,70 @@ +#pragma once +#include +#include "Cmd.h" +#include "Global.h" + +class Scenario { + +public: + + void loop() { + + String allBlocks = scenario; + allBlocks.replace("\r\n", "\n"); + allBlocks.replace("\r", "\n"); + allBlocks += "\n"; + + String incommingEvent = selectToMarker(eventBuf, ","); + String incommingEventKey = selectToMarker(incommingEvent, " "); + String incommingEventValue = selectToMarkerLast(incommingEvent, " "); + + while (allBlocks.length() > 1) { + String oneBlock = selectToMarker(allBlocks, "end\n"); + String condition = selectToMarker(oneBlock, "\n"); + + String setEventKey = selectFromMarkerToMarker(condition, " ", 0); + + if (incommingEventKey == setEventKey) { + + String setEventSign = selectFromMarkerToMarker(condition, " ", 1); + String setEventValue = selectFromMarkerToMarker(condition, " ", 2); + if (!isDigitStr(setEventValue)) setEventValue = jsonReadStr(configLiveJson, setEventValue); + + boolean flag = false; + + if (setEventSign == "=") { + flag = incommingEventValue == setEventValue; + } + else if (setEventSign == "!=") { + flag = incommingEventValue != setEventValue; + } + else if (setEventSign == "<") { + flag = incommingEventValue.toFloat() < setEventValue.toFloat(); + } + else if (setEventSign == ">") { + flag = incommingEventValue.toFloat() > setEventValue.toFloat(); + } + else if (setEventSign == ">=") { + flag = incommingEventValue.toFloat() >= setEventValue.toFloat(); + } + else if (setEventSign == "<=") { + flag = incommingEventValue.toFloat() <= setEventValue.toFloat(); + } + + if (flag) { + //SerialPrint("I", "Scenario", "incomming Event Value: " + incommingEventValue); + //SerialPrint("I", "Scenario", "set Event Value: " + setEventValue); + + oneBlock = deleteBeforeDelimiter(oneBlock, "\n"); + oneBlock.replace("end", ""); + SerialPrint("I", "Scenario", condition + " \n" + oneBlock); + spaceCmdExecute(oneBlock); + } + } + allBlocks = deleteBeforeDelimiter(allBlocks, "end\n"); + } + eventBuf = deleteBeforeDelimiter(eventBuf, ","); + } +}; + +extern Scenario* myScenario; \ No newline at end of file diff --git a/include/Consts.h b/include/Consts.h index a81d1977..e0679110 100644 --- a/include/Consts.h +++ b/include/Consts.h @@ -3,11 +3,11 @@ //===========Firmware============================================================================================================================================= #ifdef ESP8266 #define FIRMWARE_NAME "esp8266-iotm" -#define FIRMWARE_VERSION 266 +#define FIRMWARE_VERSION 267 #endif #ifdef ESP32 #define FIRMWARE_NAME "esp32-iotm" -#define FIRMWARE_VERSION 266 +#define FIRMWARE_VERSION 267 #endif #define FLASH_4MB true @@ -105,4 +105,8 @@ enum LedStatus_t { enum ConfigType_t { CT_CONFIG, CT_SCENARIO -}; \ No newline at end of file +}; + +//07.11.2020 +//RAM: [===== ] 46.8% (used 38376 bytes from 81920 bytes) +//Flash: [===== ] 54.2% (used 566004 bytes from 1044464 bytes) \ No newline at end of file diff --git a/include/Global.h b/include/Global.h index 11de486a..59226d64 100644 --- a/include/Global.h +++ b/include/Global.h @@ -93,7 +93,7 @@ extern void servo_(); extern void setLedStatus(LedStatus_t); //Scenario -extern void eventGen(String event_name, String number); +extern void eventGen2(String eventName, String eventValue); extern String add_set(String param_name); //Timers diff --git a/include/items/ButtonInClass.h b/include/items/ButtonInClass.h index 07f3793f..1c66b945 100644 --- a/include/items/ButtonInClass.h +++ b/include/items/ButtonInClass.h @@ -52,7 +52,7 @@ class ButtonInClass : public LineParsing { } void switchChangeVirtual(String key, String state) { - eventGen(key, ""); + eventGen2(key, state); jsonWriteInt(configLiveJson, key, state.toInt()); publishStatus(key, state); } diff --git a/include/items/ButtonOutClass.h b/include/items/ButtonOutClass.h index bd3587c3..1afebc63 100644 --- a/include/items/ButtonOutClass.h +++ b/include/items/ButtonOutClass.h @@ -32,7 +32,7 @@ public: else { digitalWrite(pinInt, !state.toInt()); } - eventGen(key, ""); + eventGen2(key, state); jsonWriteInt(configLiveJson, key, state.toInt()); publishStatus(key, state); } diff --git a/include/items/InputClass.h b/include/items/InputClass.h index afe5a0f8..447fccfe 100644 --- a/include/items/InputClass.h +++ b/include/items/InputClass.h @@ -16,13 +16,13 @@ class InputClass : public LineParsing { } void inputSetFloat(String key, String state) { - eventGen(key, ""); + eventGen2(key, state); jsonWriteFloat(configLiveJson, key, state.toFloat()); publishStatus(key, state); } void inputSetStr(String key, String state) { - eventGen(key, ""); + eventGen2(key, state); jsonWriteStr(configLiveJson, key, state); publishStatus(key, state); } diff --git a/include/items/OutputTextClass.h b/include/items/OutputTextClass.h index c52cd54c..8e3867ba 100644 --- a/include/items/OutputTextClass.h +++ b/include/items/OutputTextClass.h @@ -15,7 +15,7 @@ class OutputTextClass : public LineParsing { void OutputModuleChange(String key, String state) { state.replace("#", " "); - eventGen(key, ""); + eventGen2(key, state); jsonWriteStr(configLiveJson, key, state); publishStatus(key, state); } diff --git a/include/items/PwmOutClass.h b/include/items/PwmOutClass.h index 807762d6..bd6570ba 100644 --- a/include/items/PwmOutClass.h +++ b/include/items/PwmOutClass.h @@ -22,7 +22,7 @@ class PwmOutClass : public LineParsing { void pwmChange(String key, String pin, String state) { int pinInt = pin.toInt(); analogWrite(pinInt, state.toInt()); - eventGen(key, ""); + eventGen2(key, state); jsonWriteInt(configLiveJson, key, state.toInt()); publishStatus(key, state); } diff --git a/include/items/SensorAnalogClass.h b/include/items/SensorAnalogClass.h index f1659263..ccaba263 100644 --- a/include/items/SensorAnalogClass.h +++ b/include/items/SensorAnalogClass.h @@ -26,7 +26,7 @@ class SensorAnalogClass : public SensorConvertingClass { #endif value = this->mapping(key, value); float valueFl = this->correction(key, value); - eventGen(key, ""); + eventGen2(key, String(valueFl)); jsonWriteStr(configLiveJson, key, String(valueFl)); publishStatus(key, String(valueFl)); SerialPrint("I", "Sensor", "'" + key + "' data: " + String(valueFl)); diff --git a/include/items/SensorBme280Class.h b/include/items/SensorBme280Class.h index 11e97169..42b7d532 100644 --- a/include/items/SensorBme280Class.h +++ b/include/items/SensorBme280Class.h @@ -25,7 +25,7 @@ class SensorBme280Class : public SensorConvertingClass { float value; value = bme.readTemperature(); float valueFl = this->correction(key, value); - eventGen(key, ""); + eventGen2(key, String(valueFl)); jsonWriteStr(configLiveJson, key, String(valueFl)); publishStatus(key, String(valueFl)); SerialPrint("I", "Sensor", "'" + key + "' data: " + String(valueFl)); @@ -35,7 +35,7 @@ class SensorBme280Class : public SensorConvertingClass { float value; value = bme.readHumidity(); float valueFl = this->correction(key, value); - eventGen(key, ""); + eventGen2(key, String(valueFl)); jsonWriteStr(configLiveJson, key, String(valueFl)); publishStatus(key, String(valueFl)); SerialPrint("I", "Sensor", "'" + key + "' data: " + String(valueFl)); @@ -46,7 +46,7 @@ class SensorBme280Class : public SensorConvertingClass { value = bme.readPressure(); value = value / 1.333224 / 100; float valueFl = this->correction(key, value); - eventGen(key, ""); + eventGen2(key, String(valueFl)); jsonWriteStr(configLiveJson, key, String(valueFl)); publishStatus(key, String(valueFl)); SerialPrint("I", "Sensor", "'" + key + "' data: " + String(valueFl)); diff --git a/include/items/SensorBmp280Class.h b/include/items/SensorBmp280Class.h index 28ef71a0..934245a1 100644 --- a/include/items/SensorBmp280Class.h +++ b/include/items/SensorBmp280Class.h @@ -26,7 +26,7 @@ class SensorBmp280Class : public SensorConvertingClass { bmp_temp->getEvent(&temp_event); value = temp_event.temperature; float valueFl = this->correction(key, value); - eventGen(key, ""); + eventGen2(key, String(valueFl)); jsonWriteStr(configLiveJson, key, String(valueFl)); publishStatus(key, String(valueFl)); SerialPrint("I", "Sensor", "'" + key + "' data: " + String(valueFl)); @@ -39,7 +39,7 @@ class SensorBmp280Class : public SensorConvertingClass { value = pressure_event.pressure; value = value / 1.333224; float valueFl = this->correction(key, value); - eventGen(key, ""); + eventGen2(key, String(valueFl)); jsonWriteStr(configLiveJson, key, String(valueFl)); publishStatus(key, String(valueFl)); SerialPrint("I", "Sensor", "'" + key + "' data: " + String(valueFl)); diff --git a/include/items/SensorDhtClass.h b/include/items/SensorDhtClass.h index c90fc578..6eb4433b 100644 --- a/include/items/SensorDhtClass.h +++ b/include/items/SensorDhtClass.h @@ -41,7 +41,7 @@ class SensorDhtClass : public SensorConvertingClass { if (String(value) != "nan") { //value = this->mapping(key, value); float valueFl = this->correction(key, value); - eventGen(key, ""); + eventGen2(key, String(valueFl)); jsonWriteStr(configLiveJson, key, String(valueFl)); publishStatus(key, String(valueFl)); SerialPrint("I", "Sensor", "'" + key + "' data: " + String(valueFl)); @@ -65,7 +65,7 @@ class SensorDhtClass : public SensorConvertingClass { if (String(value) != "nan") { //value = this->mapping(key, value); float valueFl = this->correction(key, value); - eventGen(key, ""); + eventGen2(key, String(valueFl)); jsonWriteStr(configLiveJson, key, String(valueFl)); publishStatus(key, String(valueFl)); SerialPrint("I", "Sensor", "'" + key + "' data: " + String(valueFl)); diff --git a/include/items/SensorModbusClass.h b/include/items/SensorModbusClass.h index 39c3d8bd..a93063c8 100644 --- a/include/items/SensorModbusClass.h +++ b/include/items/SensorModbusClass.h @@ -35,7 +35,7 @@ // } // // int valueFl = this->correction(key, value); -// eventGen(key, ""); +// eventGen2(key, String(valueFl)); // jsonWriteStr(configLiveJson, key, String(valueFl)); // publishStatus(key, String(valueFl)); // SerialPrint("I", "Sensor", "'" + key + "' data: " + String(valueFl) + ", Slave dev addr: " + String(slaveAddress) + ", Register: " + String(regAddress)); diff --git a/include/items/SensorUltrasonicClass.h b/include/items/SensorUltrasonicClass.h index 5dee38dd..6adce30d 100644 --- a/include/items/SensorUltrasonicClass.h +++ b/include/items/SensorUltrasonicClass.h @@ -40,7 +40,7 @@ class SensorUltrasonic : public SensorConvertingClass { value = this->mapping(key, value); float valueFl = this->correction(key, value); - eventGen(key, ""); + eventGen2(key, String(valueFl)); jsonWriteStr(configLiveJson, key, String(valueFl)); publishStatus(key, String(valueFl)); SerialPrint("I", "Sensor", "'" + key + "' data: " + String(valueFl)); diff --git a/src/Class/ScenarioClass2.cpp b/src/Class/ScenarioClass2.cpp deleted file mode 100644 index 113a4ee3..00000000 --- a/src/Class/ScenarioClass2.cpp +++ /dev/null @@ -1,10 +0,0 @@ -#include "Class/ScenarioClass2.h" -Scenario* myScenario; - -void eventGen(String event_name, String number) { - if (!jsonReadBool(configSetupJson, "scen")) { - return; - } - SerialPrint("", "", event_name); - eventBuf += event_name + number + ","; -} \ No newline at end of file diff --git a/src/Class/ScenarioClass3.cpp b/src/Class/ScenarioClass3.cpp new file mode 100644 index 00000000..1876711f --- /dev/null +++ b/src/Class/ScenarioClass3.cpp @@ -0,0 +1,18 @@ +#include "Class/ScenarioClass3.h" +Scenario* myScenario; + +//void eventGen(String event_name, String number) { +// if (!jsonReadBool(configSetupJson, "scen")) { +// return; +// } +// SerialPrint("", "", event_name); +// eventBuf += event_name + number + ","; +//} + +void eventGen2(String eventName, String eventValue) { + if (!jsonReadBool(configSetupJson, "scen")) { + return; + } + //Serial.println(eventName + " " + eventValue); + eventBuf += eventName + " " + eventValue + ","; +} \ No newline at end of file diff --git a/src/ItemsCmd.cpp b/src/ItemsCmd.cpp index 0b448b42..be6330ac 100644 --- a/src/ItemsCmd.cpp +++ b/src/ItemsCmd.cpp @@ -249,7 +249,7 @@ // servo->write(value); // } // -// eventGen("servo", number); +// eventGen2("servo", number); // jsonWriteInt(configLiveJson, "servo" + number, value); // publishStatus("servo" + number, String(value, DEC)); //} diff --git a/src/Sensors.cpp b/src/Sensors.cpp index d3a0817b..4b657757 100644 --- a/src/Sensors.cpp +++ b/src/Sensors.cpp @@ -54,7 +54,7 @@ // counter = 0; // value = dht.getTemperature(); // if (String(value) != "nan") { -// //eventGen(dhtT_value_name, ""); +// //eventGen2(dhtT_value_name, ""); // //jsonWriteStr(configLiveJson, dhtT_value_name, String(value)); // // publishStatus(dhtT_value_name, String(value)); // //SerialPrint("I", "Sensor", "'" + dhtT_value_name + "' data: " + String(value)); @@ -92,7 +92,7 @@ // counter = 0; // value = dht.getHumidity(); // if (String(value) != "nan") { -// //eventGen(dhtH_value_name, ""); +// //eventGen2(dhtH_value_name, ""); // //jsonWriteStr(configLiveJson, dhtH_value_name, String(value)); // // publishStatus(dhtH_value_name, String(value)); // //SerialPrint("I", "Sensor", "'" + dhtH_value_name + "' data: " + String(value)); @@ -117,7 +117,7 @@ // //value = dht.computePerception(jsonReadStr(configLiveJson, dhtT_value_name).toFloat(), jsonReadStr(configLiveJson, dhtH_value_name).toFloat(), false); // String final_line = perceptionStr(value); // jsonWriteStr(configLiveJson, "dhtPerception", final_line); -// eventGen("dhtPerception", ""); +// eventGen2("dhtPerception", ""); // publishStatus("dhtPerception", final_line); // if (mqtt.connected()) { // SerialPrint("I", "Sensor", "'dhtPerception' data: " + final_line); @@ -142,7 +142,7 @@ // //dht.getComfortRatio(cf, jsonReadStr(configLiveJson, dhtT_value_name).toFloat(), jsonReadStr(configLiveJson, dhtH_value_name).toFloat(), false); // String final_line = comfortStr(cf); // jsonWriteStr(configLiveJson, "dhtComfort", final_line); -// eventGen("dhtComfort", ""); +// eventGen2("dhtComfort", ""); // publishStatus("dhtComfort", final_line); // SerialPrint("I", "Sensor", "'dhtComfort' send date " + final_line); // } @@ -234,7 +234,7 @@ // } else { // //value = dht.computeDewPoint(jsonReadStr(configLiveJson, dhtT_value_name).toFloat(), jsonReadStr(configLiveJson, dhtH_value_name).toFloat(), false); // jsonWriteInt(configLiveJson, "dhtDewpoint", value); -// eventGen("dhtDewpoint", ""); +// eventGen2("dhtDewpoint", ""); // publishStatus("dhtDewpoint", String(value)); // SerialPrint("I", "Sensor", "'dhtDewpoint' data: " + String(value)); // } @@ -270,7 +270,7 @@ // bmp_temp->getEvent(&temp_event); // value = temp_event.temperature; // //jsonWriteStr(configLiveJson, bmp280T_value_name, String(value)); -// //eventGen(bmp280T_value_name, ""); +// //eventGen2(bmp280T_value_name, ""); // // publishStatus(bmp280T_value_name, String(value)); // //SerialPrint("I", "Sensor", "'" + bmp280T_value_name + "' data: " + String(value)); //} @@ -302,7 +302,7 @@ // value = pressure_event.pressure; // value = value / 1.333224; // //jsonWriteStr(configLiveJson, bmp280P_value_name, String(value)); -// //eventGen(bmp280P_value_name, ""); +// //eventGen2(bmp280P_value_name, ""); // // publishStatus(bmp280P_value_name, String(value)); // //SerialPrint("I", "Sensor", "'" + bmp280P_value_name + "' data: " + String(value)); //} @@ -327,7 +327,7 @@ // float value = 0; // value = bme.readTemperature(); // //jsonWriteStr(configLiveJson, bme280T_value_name, String(value)); -// //eventGen(bme280T_value_name, ""); +// //eventGen2(bme280T_value_name, ""); // // publishStatus(bme280T_value_name, String(value)); // //SerialPrint("I", "Sensor", "'" + bme280T_value_name + "' data: " + String(value)); //} @@ -351,7 +351,7 @@ // value = bme.readPressure(); // value = value / 1.333224 / 100; // //jsonWriteStr(configLiveJson, bme280P_value_name, String(value)); -// //eventGen(bme280P_value_name, ""); +// //eventGen2(bme280P_value_name, ""); // // publishStatus(bme280P_value_name, String(value)); // //SerialPrint("I", "Sensor", "'" + bme280P_value_name + "' data: " + String(value)); //} @@ -374,7 +374,7 @@ // float value = 0; // value = bme.readHumidity(); // //jsonWriteStr(configLiveJson, bme280H_value_name, String(value)); -// //eventGen(bme280H_value_name, ""); +// //eventGen2(bme280H_value_name, ""); // // publishStatus(bme280H_value_name, String(value)); // //SerialPrint("I", "Sensor", "'" + bme280H_value_name + "' data: " + String(value)); //} @@ -397,7 +397,7 @@ // float value = bme.readAltitude(1013.25); // //jsonWriteStr(configLiveJson, bme280A_value_name, String(value, 2)); // -// //eventGen(bme280A_value_name, ""); +// //eventGen2(bme280A_value_name, ""); // // // publishStatus(bme280A_value_name, String(value)); // diff --git a/src/Timers.cpp b/src/Timers.cpp index dda1007b..b45ab7b6 100644 --- a/src/Timers.cpp +++ b/src/Timers.cpp @@ -19,7 +19,7 @@ void Timer_countdown_init() { if (time == 0) { delTimer(String(number)); jsonWriteStr(configLiveJson, "timer" + String(number), "0"); - eventGen("timer", String(number)); + eventGen2("timer", String(number)); } else { time--; addTimer(String(number), String(time)); diff --git a/src/Utils/statUtils.cpp b/src/Utils/statUtils.cpp index f924ec05..0145e5f2 100644 --- a/src/Utils/statUtils.cpp +++ b/src/Utils/statUtils.cpp @@ -141,7 +141,8 @@ String updateDeviceStatus() { "&uptime=" + timeNow->getUptime() + "&uptimeTotal=" + getUptimeTotal() + "&version=" + FIRMWARE_VERSION + - "&resetsTotal=" + String(getCurrentNumber("stat.txt")) + ""); + "&resetsTotal=" + String(getCurrentNumber("stat.txt")) + + "&heap=" + String(ESP.getFreeHeap()) + ""); if (httpCode > 0) { ret = httpCode; if (httpCode == HTTP_CODE_OK) { diff --git a/src/items/InputTimeClass.cpp b/src/items/InputTimeClass.cpp index 4d632550..9dc16dd4 100644 --- a/src/items/InputTimeClass.cpp +++ b/src/items/InputTimeClass.cpp @@ -19,9 +19,14 @@ void inputTimeSet() { void handle_time_init() { ts.add( - TIME, 1000, [&](void *) { - jsonWriteStr(configLiveJson, "timenow", timeNow->getTime()); - eventGen("timenow", ""); + TIME, 1000, [&](void*) { + String timenow = timeNow->getTimeWOsec(); + static String prevTime; + if (prevTime != timenow) { + prevTime = timenow; + jsonWriteStr(configLiveJson, "timenow", timenow); + eventGen2("timenow", timenow); + } }, nullptr, true); } \ No newline at end of file diff --git a/src/items/SensorDallas.cpp b/src/items/SensorDallas.cpp index f30983fc..1abadc25 100644 --- a/src/items/SensorDallas.cpp +++ b/src/items/SensorDallas.cpp @@ -30,7 +30,7 @@ void SensorDallas::loop() { void SensorDallas::readDallas() { sensors.requestTemperaturesByIndex(_index); float value = sensors.getTempCByIndex(_index); - eventGen(_key, ""); + eventGen2(_key, String(value)); jsonWriteStr(configLiveJson, _key, String(value)); publishStatus(_key, String(value)); SerialPrint("I", "Sensor", "'" + _key + "' data: " + String(value)); diff --git a/src/main.cpp b/src/main.cpp index c10b8cbc..08c03929 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -5,7 +5,7 @@ #include "Bus.h" #include "Class/CallBackTest.h" #include "Class/NotAsync.h" -#include "Class/ScenarioClass2.h" +#include "Class/ScenarioClass3.h" #include "Cmd.h" #include "Global.h" #include "Init.h"