fixed scenario bug

This commit is contained in:
Dmitry Borisenko
2020-11-06 20:17:49 +03:00
parent e52437b828
commit 1f46226a46
12 changed files with 131 additions and 143 deletions

View File

@@ -13,7 +13,7 @@
"mqttUser": "rise",
"mqttPass": "23ri22se32",
"scen": "1",
"telegramApi": "1425283609:AAFf3YO8ouCJF23kU8CMiU7XXy21MFhbn9w",
"telegramApi": "1416711569:AAEI0j83GmXqwzb_gnK1B0Am0gDwZoJt5xo",
"telegonof": "0",
"weblogin": "admin",
"webpass": "admin",

View File

@@ -1,6 +1,8 @@
temp > inputU
button 0
telegram нагрев#выключен 1
end
temp < inputL
button 1
telegram нагрев#включен 1
end

View File

@@ -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]

View File

@@ -1,6 +1,8 @@
hum > inputU
button 0
telegram полив#выключен 1
end
hum < inputL
button 1
telegram полив#включен 1
end

View File

@@ -87,8 +87,8 @@
"style": "display:inline",
"title": {
"#": "Выберите пресет из списка<span class=\"caret\"></span>",
"/set?addPreset=dal.c": "1.Термостат на основе ds18b20 (устройство держит заданный уровень температуры)",
"/set?addPreset=dht.c": "2.Контроль влажности на основе DHT (устройство держит заданный уровень влажности)"
"/set?addPreset=dal.c": "1.Термостат на основе ds18b20 с оповещением в телеграм",
"/set?addPreset=dht.c": "2.Контроль влажности на основе DHT с оповещением в телеграм"
}
},
{

View File

@@ -1,128 +0,0 @@
#pragma once
#include <Arduino.h>
#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;

View File

@@ -0,0 +1,68 @@
#pragma once
#include <Arduino.h>
#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;

View File

@@ -5,4 +5,5 @@ extern void sendTelegramMsg();
extern void telegramInit();
extern void handleTelegram();
extern bool isTelegramEnabled();
extern void telegramMsgParse(String msg);
extern void telegramMsgParse(String msg);
extern String returnListOfParams();

View File

@@ -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 + ",";
}

View File

@@ -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;
}

View File

@@ -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");

View File

@@ -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"