mirror of
https://github.com/IoTManagerProject/IoTManager.git
synced 2026-05-26 04:39:22 +03:00
@@ -1,7 +1,7 @@
|
|||||||
#pragma once
|
//#pragma once
|
||||||
#include "Global.h"
|
//#include "Global.h"
|
||||||
#include "MqttClient.h"
|
//#include "MqttClient.h"
|
||||||
|
|
||||||
void eventGen2(String eventName, String eventValue);
|
//void eventGen2(String eventName, String eventValue);
|
||||||
extern void spaceCmdExecute(String &cmdStr);
|
//extern void spaceCmdExecute(String &cmdStr);
|
||||||
extern String getValueJson(String &key);
|
//extern String getValueJson(String &key);
|
||||||
@@ -10,14 +10,14 @@ struct IoTValue {
|
|||||||
|
|
||||||
class IoTItem {
|
class IoTItem {
|
||||||
public:
|
public:
|
||||||
IoTItem(String parameters);
|
IoTItem(const String ¶meters);
|
||||||
virtual ~IoTItem() {}
|
virtual ~IoTItem() {}
|
||||||
virtual void loop();
|
virtual void loop();
|
||||||
virtual void doByInterval();
|
virtual void doByInterval();
|
||||||
virtual IoTValue execute(String command, std::vector<IoTValue>& param);
|
virtual IoTValue execute(String command, std::vector<IoTValue>& param);
|
||||||
|
|
||||||
virtual void regEvent(String value, String consoleInfo, bool error = false);
|
virtual void regEvent(const String& value, const String& consoleInfo, bool error = false, bool genEvent = true);
|
||||||
virtual void regEvent(float value, String consoleInfo, bool error = false);
|
virtual void regEvent(float value, const String& consoleInfo, bool error = false, bool genEvent = true);
|
||||||
|
|
||||||
String getSubtype();
|
String getSubtype();
|
||||||
|
|
||||||
@@ -38,8 +38,8 @@ class IoTItem {
|
|||||||
bool enableDoByInt = true;
|
bool enableDoByInt = true;
|
||||||
|
|
||||||
virtual IoTGpio* getGpioDriver();
|
virtual IoTGpio* getGpioDriver();
|
||||||
virtual void setValue(IoTValue Value, bool generateEvent = true);
|
virtual void setValue(const IoTValue& Value, bool genEvent = true);
|
||||||
virtual void setValue(String valStr, bool generateEvent = true);
|
virtual void setValue(const String& valStr, bool genEvent = true);
|
||||||
String getRoundValue();
|
String getRoundValue();
|
||||||
|
|
||||||
//методы для графиков
|
//методы для графиков
|
||||||
@@ -51,30 +51,30 @@ class IoTItem {
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool _needSave = false; // признак необходимости сохранять и загружать значение элемента на flash
|
bool _needSave = false; // признак необходимости сохранять и загружать значение элемента на flash
|
||||||
String _subtype;
|
String _subtype = "";
|
||||||
String _id;
|
String _id = "";
|
||||||
unsigned long _interval;
|
unsigned long _interval = 1000;
|
||||||
|
|
||||||
float _multiply; // умножаем на значение
|
float _multiply; // умножаем на значение
|
||||||
float _plus; // увеличиваем на значение
|
float _plus; // увеличиваем на значение
|
||||||
int _map1;
|
int _map1 = 0;
|
||||||
int _map2;
|
int _map2 = 0;
|
||||||
int _map3;
|
int _map3 = 0;
|
||||||
int _map4;
|
int _map4 = 0;
|
||||||
int _round; // 1, 10, 100, 1000, 10000
|
int _round = 1; // 1, 10, 100, 1000, 10000
|
||||||
|
|
||||||
bool _global = false; // характеристика айтема, что ему нужно слать и принимать события из внешнего мира
|
bool _global = false; // характеристика айтема, что ему нужно слать и принимать события из внешнего мира
|
||||||
};
|
};
|
||||||
|
|
||||||
IoTItem* findIoTItem(String name); // поиск экземпляра элемента модуля по имени
|
IoTItem* findIoTItem(const String& name); // поиск экземпляра элемента модуля по имени
|
||||||
String getItemValue(String name); // поиск плюс получение значения
|
String getItemValue(const String& name); // поиск плюс получение значения
|
||||||
bool isItemExist(String name); // существует ли айтем
|
bool isItemExist(const String& name); // существует ли айтем
|
||||||
StaticJsonDocument<JSON_BUFFER_SIZE>* getLocalItemsAsJSON(); // сбор всех локальных значений Items
|
StaticJsonDocument<JSON_BUFFER_SIZE>* getLocalItemsAsJSON(); // сбор всех локальных значений Items
|
||||||
|
|
||||||
class externalVariable : IoTItem { // объект, создаваемый при получении информации о событии на другом контроллере для хранения информации о событии указанное время
|
class externalVariable : IoTItem { // объект, создаваемый при получении информации о событии на другом контроллере для хранения информации о событии указанное время
|
||||||
|
|
||||||
public:
|
public:
|
||||||
externalVariable(String parameters);
|
externalVariable(const String& parameters);
|
||||||
~externalVariable();
|
~externalVariable();
|
||||||
void doByInterval(); // для данного класса doByInterval+int выполняет роль счетчика обратного отсчета до уничтожения
|
void doByInterval(); // для данного класса doByInterval+int выполняет роль счетчика обратного отсчета до уничтожения
|
||||||
};
|
};
|
||||||
@@ -10,20 +10,20 @@ extern String jsonWriteInt(String& json, String name, int value, bool e = true);
|
|||||||
extern String jsonWriteFloat(String& json, String name, float value, bool e = true);
|
extern String jsonWriteFloat(String& json, String name, float value, bool e = true);
|
||||||
extern String jsonWriteBool(String& json, String name, boolean value, bool e = true);
|
extern String jsonWriteBool(String& json, String name, boolean value, bool e = true);
|
||||||
|
|
||||||
extern bool jsonRead(String& json, String key, unsigned long& value, bool e = true);
|
extern bool jsonRead(const String& json, String key, unsigned long& value, bool e = true);
|
||||||
extern bool jsonRead(String& json, String key, float& value, bool e = true);
|
extern bool jsonRead(const String& json, String key, float& value, bool e = true);
|
||||||
extern bool jsonRead(String& json, String key, String& value, bool e = true);
|
extern bool jsonRead(const String& json, String key, String& value, bool e = true);
|
||||||
extern bool jsonRead(String& json, String key, bool& value, bool e = true);
|
extern bool jsonRead(const String& json, String key, bool& value, bool e = true);
|
||||||
extern bool jsonRead(String& json, String key, int& value, bool e = true);
|
extern bool jsonRead(const String& json, String key, int& value, bool e = true);
|
||||||
|
|
||||||
extern String jsonReadStr(String& json, String name, bool e = true);
|
extern String jsonReadStr(const String& json, String name, bool e = true);
|
||||||
extern int jsonReadInt(String& json, String name, bool e = true);
|
extern int jsonReadInt(const String& json, String name, bool e = true);
|
||||||
extern boolean jsonReadBool(String& json, String name, bool e = true);
|
extern boolean jsonReadBool(const String& json, String name, bool e = true);
|
||||||
|
|
||||||
extern bool jsonWriteStr_(String& json, String name, String value, bool e = true);
|
extern bool jsonWriteStr_(String& json, const String& name, const String& value, bool e = true);
|
||||||
extern bool jsonWriteBool_(String& json, String name, bool value, bool e = true);
|
extern bool jsonWriteBool_(String& json, const String& name, bool value, bool e = true);
|
||||||
extern bool jsonWriteInt_(String& json, String name, int value, bool e = true);
|
extern bool jsonWriteInt_(String& json, const String& name, int value, bool e = true);
|
||||||
extern bool jsonWriteFloat_(String& json, String name, float value, bool e = true);
|
extern bool jsonWriteFloat_(String& json, const String& name, float value, bool e = true);
|
||||||
void writeUint8tValueToJsonString(uint8_t* payload, size_t length, size_t headerLenth, String& json);
|
void writeUint8tValueToJsonString(uint8_t* payload, size_t length, size_t headerLenth, String& json);
|
||||||
extern bool jsonMergeObjects(String& json1, String& json2, bool e = true);
|
extern bool jsonMergeObjects(String& json1, String& json2, bool e = true);
|
||||||
extern void jsonMergeDocs(JsonObject dest, JsonObjectConst src);
|
extern void jsonMergeDocs(JsonObject dest, JsonObjectConst src);
|
||||||
|
|||||||
@@ -3,4 +3,4 @@
|
|||||||
#include "utils/TimeUtils.h"
|
#include "utils/TimeUtils.h"
|
||||||
#include "classes/IoTItem.h"
|
#include "classes/IoTItem.h"
|
||||||
|
|
||||||
void SerialPrint(String errorLevel, String module, String msg, String itemId = "");
|
void SerialPrint(const String& errorLevel, const String& module, const String& msg, const String& itemId = "");
|
||||||
@@ -8,29 +8,29 @@ void hex2string(byte array[], unsigned int len, char buffer[]);
|
|||||||
|
|
||||||
int string2hex(const char* str, unsigned char* bytes);
|
int string2hex(const char* str, unsigned char* bytes);
|
||||||
|
|
||||||
uint8_t hexStringToUint8(String hex);
|
uint8_t hexStringToUint8(const String& hex);
|
||||||
|
|
||||||
uint16_t hexStringToUint16(String hex);
|
uint16_t hexStringToUint16(const String& hex);
|
||||||
|
|
||||||
String selectToMarkerLast(String str, String found);
|
String selectToMarkerLast(String str, const String& found);
|
||||||
|
|
||||||
String selectToMarker(String str, String found);
|
String selectToMarker(String str, const String& found);
|
||||||
|
|
||||||
String extractInner(String str);
|
String extractInner(String str);
|
||||||
|
|
||||||
String deleteAfterDelimiter(String str, String found);
|
String deleteAfterDelimiter(String str, const String& found);
|
||||||
|
|
||||||
String deleteBeforeDelimiter(String str, String found);
|
String deleteBeforeDelimiter(String str, const String& found);
|
||||||
|
|
||||||
String deleteBeforeDelimiterTo(String str, String found);
|
String deleteBeforeDelimiterTo(String str, const String& found);
|
||||||
|
|
||||||
String deleteToMarkerLast(String str, String found);
|
String deleteToMarkerLast(String str, const String& found);
|
||||||
|
|
||||||
String selectFromMarkerToMarker(String str, String found, int number);
|
String selectFromMarkerToMarker(String str, const String& found, int number);
|
||||||
|
|
||||||
size_t itemsCount2(String str, const String& separator);
|
size_t itemsCount2(String str, const String& separator);
|
||||||
|
|
||||||
char* stringToChar(String& str);
|
char* stringToChar(const String& str);
|
||||||
|
|
||||||
//size_t itemsCount(String& str, const char* delim);
|
//size_t itemsCount(String& str, const char* delim);
|
||||||
|
|
||||||
@@ -42,4 +42,4 @@ String prettyBytes(size_t size);
|
|||||||
|
|
||||||
String uint64ToString(uint64_t input, uint8_t base = 10);
|
String uint64ToString(uint64_t input, uint8_t base = 10);
|
||||||
|
|
||||||
String cleanString(String str);
|
void cleanString(String& str);
|
||||||
|
|||||||
@@ -1,35 +1,35 @@
|
|||||||
#include "Buffers.h"
|
//#include "Buffers.h"
|
||||||
|
|
||||||
//генеирует событие
|
//генеирует событие
|
||||||
void eventGen2(String eventName, String eventValue) {
|
// void eventGen2(String eventName, String eventValue) {
|
||||||
if (!jsonReadBool(settingsFlashJson, "scen")) {
|
// if (!jsonReadBool(settingsFlashJson, "scen")) {
|
||||||
return;
|
// return;
|
||||||
}
|
// }
|
||||||
String event = eventName + " " + eventValue + ",";
|
// String event = eventName + " " + eventValue + ",";
|
||||||
eventBuf += event;
|
// eventBuf += event;
|
||||||
|
|
||||||
SerialPrint("i", "Event add", eventName + " " + eventValue);
|
// SerialPrint("i", "Event add", eventName + " " + eventValue);
|
||||||
|
|
||||||
if (jsonReadBool(settingsFlashJson, "MqttOut")) {
|
// if (jsonReadBool(settingsFlashJson, "MqttOut")) {
|
||||||
if (eventName != "timenow") {
|
// if (eventName != "timenow") {
|
||||||
publishEvent(eventName, eventValue);
|
// publishEvent(eventName, eventValue);
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
void spaceCmdExecute(String& cmdStr) {
|
// void spaceCmdExecute(String& cmdStr) {
|
||||||
cmdStr += "\r\n";
|
// cmdStr += "\r\n";
|
||||||
cmdStr.replace("\r\n", "\n");
|
// cmdStr.replace("\r\n", "\n");
|
||||||
cmdStr.replace("\r", "\n");
|
// cmdStr.replace("\r", "\n");
|
||||||
while (cmdStr.length()) {
|
// while (cmdStr.length()) {
|
||||||
String buf = selectToMarker(cmdStr, "\n");
|
// String buf = selectToMarker(cmdStr, "\n");
|
||||||
if (buf != "") {
|
// if (buf != "") {
|
||||||
sCmd.readStr(buf);
|
// sCmd.readStr(buf);
|
||||||
SerialPrint("i", F("Order done W"), buf);
|
// SerialPrint("i", F("Order done W"), buf);
|
||||||
}
|
// }
|
||||||
cmdStr = deleteBeforeDelimiter(cmdStr, "\n");
|
// cmdStr = deleteBeforeDelimiter(cmdStr, "\n");
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
// String getValueJson(String& key) {
|
// String getValueJson(String& key) {
|
||||||
// String live = jsonReadStr(paramsHeapJson, key);
|
// String live = jsonReadStr(paramsHeapJson, key);
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
#include "EventsAndOrders.h"
|
#include "EventsAndOrders.h"
|
||||||
|
|
||||||
//получение параметров в экземпляр класса
|
//получение параметров в экземпляр класса
|
||||||
IoTItem::IoTItem(String parameters) {
|
IoTItem::IoTItem(const String& parameters) {
|
||||||
jsonRead(parameters, F("int"), _interval);
|
jsonRead(parameters, F("int"), _interval);
|
||||||
if (_interval == 0) enableDoByInt = false;
|
if (_interval == 0) enableDoByInt = false;
|
||||||
_interval = _interval * 1000;
|
_interval = _interval * 1000;
|
||||||
@@ -18,14 +18,6 @@ IoTItem::IoTItem(String parameters) {
|
|||||||
|
|
||||||
if (!jsonRead(parameters, F("global"), _global, false)) _global = false;
|
if (!jsonRead(parameters, F("global"), _global, false)) _global = false;
|
||||||
|
|
||||||
String valAsStr;
|
|
||||||
if (jsonRead(parameters, F("val"), valAsStr, false)) // значение переменной или датчика при инициализации если есть в конфигурации
|
|
||||||
setValue(valAsStr, false);
|
|
||||||
|
|
||||||
jsonRead(parameters, F("needSave"), _needSave, false);
|
|
||||||
if (_needSave && jsonRead(valuesFlashJson, _id, valAsStr, false)) // пробуем достать из сохранения значение элемента, если указано, что нужно сохранять
|
|
||||||
setValue(valAsStr, false);
|
|
||||||
|
|
||||||
String map;
|
String map;
|
||||||
jsonRead(parameters, F("map"), map, false);
|
jsonRead(parameters, F("map"), map, false);
|
||||||
if (map != "") {
|
if (map != "") {
|
||||||
@@ -35,6 +27,14 @@ IoTItem::IoTItem(String parameters) {
|
|||||||
_map4 = selectFromMarkerToMarker(map, ",", 3).toInt();
|
_map4 = selectFromMarkerToMarker(map, ",", 3).toInt();
|
||||||
} else
|
} else
|
||||||
_map1 = _map2 = _map3 = _map4 = 0;
|
_map1 = _map2 = _map3 = _map4 = 0;
|
||||||
|
|
||||||
|
String valAsStr = "";
|
||||||
|
if (jsonRead(parameters, F("val"), valAsStr, false)) // значение переменной или датчика при инициализации если есть в конфигурации
|
||||||
|
setValue(valAsStr, false);
|
||||||
|
|
||||||
|
jsonRead(parameters, F("needSave"), _needSave, false);
|
||||||
|
if (_needSave && jsonRead(valuesFlashJson, _id, valAsStr, false)) // пробуем достать из сохранения значение элемента, если указано, что нужно сохранять
|
||||||
|
setValue(valAsStr, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
//луп выполняющий переодическое дерганье
|
//луп выполняющий переодическое дерганье
|
||||||
@@ -58,53 +58,52 @@ String IoTItem::getValue() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//определяем тип прилетевшей величины
|
//определяем тип прилетевшей величины
|
||||||
void IoTItem::setValue(String valStr, bool generateEvent) {
|
void IoTItem::setValue(const String& valStr, bool genEvent) {
|
||||||
if (value.isDecimal = isDigitDotCommaStr(valStr)) {
|
value.isDecimal = isDigitDotCommaStr(valStr);
|
||||||
|
|
||||||
|
if (value.isDecimal) {
|
||||||
value.valD = valStr.toFloat();
|
value.valD = valStr.toFloat();
|
||||||
} else {
|
} else {
|
||||||
value.valS = valStr;
|
value.valS = valStr;
|
||||||
}
|
}
|
||||||
setValue(value, generateEvent);
|
setValue(value, genEvent);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
void IoTItem::setValue(IoTValue Value, bool generateEvent) {
|
void IoTItem::setValue(const IoTValue& Value, bool genEvent) {
|
||||||
value = Value;
|
value = Value;
|
||||||
if (generateEvent)
|
|
||||||
if (value.isDecimal) {
|
if (value.isDecimal) {
|
||||||
regEvent(value.valD, "");
|
regEvent(value.valD, "", false, genEvent);
|
||||||
} else {
|
} else {
|
||||||
regEvent(value.valS, "");
|
regEvent(value.valS, "", false, genEvent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//когда событие случилось
|
//когда событие случилось
|
||||||
void IoTItem::regEvent(String value, String consoleInfo, bool error) {
|
void IoTItem::regEvent(const String& value, const String& consoleInfo, bool error, bool genEvent) {
|
||||||
if (_needSave) {
|
if (_needSave) {
|
||||||
jsonWriteStr_(valuesFlashJson, _id, value);
|
jsonWriteStr_(valuesFlashJson, _id, value);
|
||||||
needSaveValues = true;
|
needSaveValues = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
generateEvent(_id, value);
|
|
||||||
publishStatusMqtt(_id, value);
|
publishStatusMqtt(_id, value);
|
||||||
|
|
||||||
publishStatusWs(_id, value);
|
publishStatusWs(_id, value);
|
||||||
SerialPrint("i", "Sensor", consoleInfo + " '" + _id + "' data: " + value + "'");
|
//SerialPrint("i", "Sensor", consoleInfo + " '" + _id + "' data: " + value + "'");
|
||||||
|
|
||||||
// проверка если global установлен то шлем всем о событии
|
if (genEvent) {
|
||||||
// if (_global) {
|
generateEvent(_id, value);
|
||||||
// SerialPrint("i", F("=>ALLMQTT"), "Broadcast event: ");
|
|
||||||
// }
|
//отправка события другим устройствам в сети если не было ошибки==============================
|
||||||
//отправка события другим устройствам в сети если не было ошибки==============================
|
if (jsonReadBool(settingsFlashJson, "mqttin") && _global && !error) {
|
||||||
if (jsonReadBool(settingsFlashJson, "mqttin") && _global && !error) {
|
String json = "{}";
|
||||||
String json = "{}";
|
jsonWriteStr_(json, "id", _id);
|
||||||
jsonWriteStr_(json, "id", _id);
|
jsonWriteStr_(json, "val", value);
|
||||||
jsonWriteStr_(json, "val", value);
|
jsonWriteInt_(json, "int", _interval/1000 + 5); // 5 секунд про запас
|
||||||
jsonWriteInt_(json, "int", _interval/1000 + 5); // 5 секунд про запас
|
publishEvent(_id, json);
|
||||||
publishEvent(_id, json);
|
SerialPrint("i", F("<=MQTT"), "Broadcast event: " + json);
|
||||||
SerialPrint("i", F("<=MQTT"), "Broadcast event: " + json);
|
}
|
||||||
|
//========================================================================
|
||||||
}
|
}
|
||||||
//========================================================================
|
|
||||||
}
|
}
|
||||||
|
|
||||||
String IoTItem::getRoundValue() {
|
String IoTItem::getRoundValue() {
|
||||||
@@ -120,14 +119,14 @@ String IoTItem::getRoundValue() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void IoTItem::regEvent(float regvalue, String consoleInfo, bool error) {
|
void IoTItem::regEvent(float regvalue, const String& consoleInfo, bool error, bool genEvent) {
|
||||||
value.valD = regvalue;
|
value.valD = regvalue;
|
||||||
|
|
||||||
if (_multiply) value.valD = value.valD * _multiply;
|
if (_multiply) value.valD = value.valD * _multiply;
|
||||||
if (_plus) value.valD = value.valD + _plus;
|
if (_plus) value.valD = value.valD + _plus;
|
||||||
if (_map1 != _map2) value.valD = map(value.valD, _map1, _map2, _map3, _map4);
|
if (_map1 != _map2) value.valD = map(value.valD, _map1, _map2, _map3, _map4);
|
||||||
|
|
||||||
regEvent(getRoundValue(), consoleInfo, error);
|
regEvent(getRoundValue(), consoleInfo, error, genEvent);
|
||||||
}
|
}
|
||||||
|
|
||||||
void IoTItem::doByInterval() {}
|
void IoTItem::doByInterval() {}
|
||||||
@@ -162,7 +161,7 @@ IoTGpio* IoTItem::getGpioDriver() {
|
|||||||
|
|
||||||
//сетевое общение====================================================================================================================================
|
//сетевое общение====================================================================================================================================
|
||||||
|
|
||||||
externalVariable::externalVariable(String parameters) : IoTItem(parameters) {
|
externalVariable::externalVariable(const String& parameters) : IoTItem(parameters) {
|
||||||
prevMillis = millis(); // запоминаем текущее значение таймера для выполения doByInterval после int сек
|
prevMillis = millis(); // запоминаем текущее значение таймера для выполения doByInterval после int сек
|
||||||
iAmLocal = false; // указываем, что это сущность прилетела из сети
|
iAmLocal = false; // указываем, что это сущность прилетела из сети
|
||||||
//Serial.printf("Call from externalVariable: parameters %s %d\n", parameters.c_str(), _interval);
|
//Serial.printf("Call from externalVariable: parameters %s %d\n", parameters.c_str(), _interval);
|
||||||
@@ -181,7 +180,7 @@ void externalVariable::doByInterval() { // для данного класса d
|
|||||||
IoTItem* myIoTItem;
|
IoTItem* myIoTItem;
|
||||||
|
|
||||||
// поиск элемента модуля в существующей конфигурации
|
// поиск элемента модуля в существующей конфигурации
|
||||||
IoTItem* findIoTItem(String name) {
|
IoTItem* findIoTItem(const String& name) {
|
||||||
for (std::list<IoTItem*>::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) {
|
for (std::list<IoTItem*>::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) {
|
||||||
if ((*it)->getID() == name) return *it;
|
if ((*it)->getID() == name) return *it;
|
||||||
}
|
}
|
||||||
@@ -189,7 +188,7 @@ IoTItem* findIoTItem(String name) {
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
// поиск плюс получение значения
|
// поиск плюс получение значения
|
||||||
String getItemValue(String name) {
|
String getItemValue(const String& name) {
|
||||||
IoTItem* tmp = findIoTItem(name);
|
IoTItem* tmp = findIoTItem(name);
|
||||||
if (tmp)
|
if (tmp)
|
||||||
return tmp->getValue();
|
return tmp->getValue();
|
||||||
@@ -198,7 +197,7 @@ String getItemValue(String name) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// существует ли айтем
|
// существует ли айтем
|
||||||
bool isItemExist(String name) {
|
bool isItemExist(const String& name) {
|
||||||
IoTItem* tmp = findIoTItem(name);
|
IoTItem* tmp = findIoTItem(name);
|
||||||
if (tmp)
|
if (tmp)
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -566,7 +566,7 @@ class IfExprAST : public ExprAST {
|
|||||||
// if (!res_ret) Serial.printf("Call from IfExprAST: Cond result = %f, no body result\n", cond_ret->valD);
|
// if (!res_ret) Serial.printf("Call from IfExprAST: Cond result = %f, no body result\n", cond_ret->valD);
|
||||||
// else if (res_ret->isDecimal) Serial.printf("Call from IfExprAST: Cond result = %f, result = %f\n", cond_ret->valD, res_ret->valD);
|
// else if (res_ret->isDecimal) Serial.printf("Call from IfExprAST: Cond result = %f, result = %f\n", cond_ret->valD, res_ret->valD);
|
||||||
// else Serial.printf("Call from IfExprAST: Cond result = %f, result = %s\n", cond_ret->valD, res_ret->valS.c_str());
|
// else Serial.printf("Call from IfExprAST: Cond result = %f, result = %s\n", cond_ret->valD, res_ret->valS.c_str());
|
||||||
Serial.printf("\n");
|
//Serial.printf("\n");
|
||||||
return cond_ret;
|
return cond_ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -171,14 +171,14 @@ public:
|
|||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
void setValue(IoTValue Value, bool generateEvent = true){
|
void setValue(const IoTValue& Value, bool genEvent = true){
|
||||||
if (!_strip) return;
|
if (!_strip) return;
|
||||||
|
|
||||||
value = Value;
|
value = Value;
|
||||||
int b = map(value.valD, 1,1024,1,255);
|
int b = map(value.valD, 1,1024,1,255);
|
||||||
_strip->setBrightness(b);
|
_strip->setBrightness(b);
|
||||||
_strip->show();
|
_strip->show();
|
||||||
if (generateEvent) regEvent(value.valD, "Ws2812b");
|
regEvent(value.valD, "Ws2812b", false, genEvent);
|
||||||
}
|
}
|
||||||
|
|
||||||
~Ws2812b(){};
|
~Ws2812b(){};
|
||||||
|
|||||||
@@ -68,9 +68,9 @@ class ButtonIn : public IoTItem {
|
|||||||
_lastButtonState = _reading;
|
_lastButtonState = _reading;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setValue(IoTValue Value, bool generateEvent = true) {
|
void setValue(const IoTValue& Value, bool genEvent = true) {
|
||||||
value = Value;
|
value = Value;
|
||||||
if (generateEvent) regEvent((String)(int)value.valD, "ButtonIn");
|
regEvent((String)(int)value.valD, "ButtonIn", false, genEvent);
|
||||||
}
|
}
|
||||||
|
|
||||||
String getValue() {
|
String getValue() {
|
||||||
|
|||||||
@@ -37,10 +37,10 @@ class ButtonOut : public IoTItem {
|
|||||||
return {}; // команда поддерживает возвращаемое значения. Т.е. по итогу выполнения команды или общения с внешней системой, можно вернуть значение в сценарий для дальнейшей обработки
|
return {}; // команда поддерживает возвращаемое значения. Т.е. по итогу выполнения команды или общения с внешней системой, можно вернуть значение в сценарий для дальнейшей обработки
|
||||||
}
|
}
|
||||||
|
|
||||||
void setValue(IoTValue Value, bool generateEvent = true) {
|
void setValue(const IoTValue& Value, bool genEvent = true) {
|
||||||
value = Value;
|
value = Value;
|
||||||
IoTgpio.digitalWrite(_pin, _inv?!value.valD:value.valD);
|
IoTgpio.digitalWrite(_pin, _inv?!value.valD:value.valD);
|
||||||
if (generateEvent) regEvent((String)(int)value.valD, "ButtonOut");
|
regEvent((String)(int)value.valD, "ButtonOut", false, genEvent);
|
||||||
}
|
}
|
||||||
|
|
||||||
String getValue() {
|
String getValue() {
|
||||||
|
|||||||
@@ -52,12 +52,12 @@ class IoTServo : public IoTItem {
|
|||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
void setValue(IoTValue Value, bool generateEvent = true) {
|
void setValue(const IoTValue& Value, bool genEvent = true) {
|
||||||
value = Value;
|
value = Value;
|
||||||
if (value.isDecimal & (_oldValue != value.valD)) {
|
if (value.isDecimal & (_oldValue != value.valD)) {
|
||||||
_oldValue = value.valD;
|
_oldValue = value.valD;
|
||||||
servObj.write(_oldValue);
|
servObj.write(_oldValue);
|
||||||
if (generateEvent) regEvent(value.valD, "IoTServo");
|
regEvent(value.valD, "IoTServo", false, genEvent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -54,10 +54,10 @@ class Pwm32 : public IoTItem {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void setValue(IoTValue Value, bool generateEvent = true) {
|
void setValue(const IoTValue& Value, bool genEvent = true) {
|
||||||
value = Value;
|
value = Value;
|
||||||
ledcWrite(_ledChannel, value.valD);
|
ledcWrite(_ledChannel, value.valD);
|
||||||
if (generateEvent) regEvent(value.valD, "Pwm32");
|
regEvent(value.valD, "Pwm32", false, genEvent);
|
||||||
}
|
}
|
||||||
//=======================================================================================================
|
//=======================================================================================================
|
||||||
|
|
||||||
|
|||||||
@@ -44,10 +44,10 @@ class Pwm8266 : public IoTItem {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void setValue(IoTValue Value, bool generateEvent = true) {
|
void setValue(const IoTValue& Value, bool genEvent = true) {
|
||||||
value = Value;
|
value = Value;
|
||||||
IoTgpio.analogWrite(_pin, value.valD);
|
IoTgpio.analogWrite(_pin, value.valD);
|
||||||
if (generateEvent) regEvent(value.valD, "Pwm8266");
|
regEvent(value.valD, "Pwm8266", false, genEvent);
|
||||||
}
|
}
|
||||||
//=======================================================================================================
|
//=======================================================================================================
|
||||||
|
|
||||||
|
|||||||
@@ -12,13 +12,12 @@
|
|||||||
#include "Wire.h"
|
#include "Wire.h"
|
||||||
#include <Adafruit_ADS1X15.h> // Библиотека для работы с модулями ADS1115 и ADS1015
|
#include <Adafruit_ADS1X15.h> // Библиотека для работы с модулями ADS1115 и ADS1015
|
||||||
|
|
||||||
// to do убрать глобальный экземпляр
|
|
||||||
Adafruit_ADS1115 ads;
|
|
||||||
|
|
||||||
class Ads1115 : public IoTItem {
|
class Ads1115 : public IoTItem {
|
||||||
int _pin;
|
int _pin;
|
||||||
bool _isRaw;
|
bool _isRaw;
|
||||||
bool _isInited = false;
|
bool _isInited = false;
|
||||||
|
Adafruit_ADS1115 ads;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Ads1115(String parameters) : IoTItem(parameters) {
|
Ads1115(String parameters) : IoTItem(parameters) {
|
||||||
|
|||||||
@@ -7,30 +7,30 @@
|
|||||||
|
|
||||||
std::map<String, AHTxx*> ahts;
|
std::map<String, AHTxx*> ahts;
|
||||||
|
|
||||||
void printStatus(AHTxx *aht) {
|
String getStatus(AHTxx *aht) {
|
||||||
switch (aht->getStatus()) {
|
switch (aht->getStatus()) {
|
||||||
case AHTXX_NO_ERROR:
|
case AHTXX_NO_ERROR:
|
||||||
Serial.println(F("no error"));
|
return F("no error");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case AHTXX_BUSY_ERROR:
|
case AHTXX_BUSY_ERROR:
|
||||||
Serial.println(F("sensor AHT busy, increase polling time"));
|
return F("sensor AHT busy, increase polling time");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case AHTXX_ACK_ERROR:
|
case AHTXX_ACK_ERROR:
|
||||||
Serial.println(F("sensor AHT didn't return ACK, not connected, broken, long wires (reduce speed), bus locked by slave (increase stretch limit)"));
|
return F("sensor AHT didn't return ACK, not connected, broken, long wires (reduce speed), bus locked by slave (increase stretch limit)");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case AHTXX_DATA_ERROR:
|
case AHTXX_DATA_ERROR:
|
||||||
Serial.println(F(" AHT: received data smaller than expected, not connected, broken, long wires (reduce speed), bus locked by slave (increase stretch limit)"));
|
return F(" AHT: received data smaller than expected, not connected, broken, long wires (reduce speed), bus locked by slave (increase stretch limit)");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case AHTXX_CRC8_ERROR:
|
case AHTXX_CRC8_ERROR:
|
||||||
Serial.println(F("AHT: computed CRC8 not match received CRC8, this feature supported only by AHT2x sensors"));
|
return F("AHT: computed CRC8 not match received CRC8, this feature supported only by AHT2x sensors");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
Serial.println(F("AHT: unknown status"));
|
return F("AHT: unknown status");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -49,7 +49,7 @@ class AhtXXt : public IoTItem {
|
|||||||
if (value.valD != AHTXX_ERROR) {
|
if (value.valD != AHTXX_ERROR) {
|
||||||
regEvent(value.valD, "AhtXXt");
|
regEvent(value.valD, "AhtXXt");
|
||||||
} else {
|
} else {
|
||||||
printStatus(_aht); //print temperature command status
|
SerialPrint("E", "Sensor AHTXX", getStatus(_aht), _id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -70,7 +70,7 @@ class AhtXXh : public IoTItem {
|
|||||||
if (value.valD != AHTXX_ERROR) {
|
if (value.valD != AHTXX_ERROR) {
|
||||||
regEvent(value.valD, "AhtXXh");
|
regEvent(value.valD, "AhtXXh");
|
||||||
} else {
|
} else {
|
||||||
printStatus(_aht); //print temperature command status
|
SerialPrint("E", "Sensor AHTXX", getStatus(_aht), _id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ class Bme280t : public IoTItem {
|
|||||||
if (value.valD != NAN && value.valD < 145)
|
if (value.valD != NAN && value.valD < 145)
|
||||||
regEvent(value.valD, "Bme280t");
|
regEvent(value.valD, "Bme280t");
|
||||||
else
|
else
|
||||||
SerialPrint("E", "Sensor Bme280t", "Error");
|
SerialPrint("E", "Sensor Bme280t", "Error", _id);
|
||||||
}
|
}
|
||||||
|
|
||||||
~Bme280t(){};
|
~Bme280t(){};
|
||||||
@@ -46,7 +46,7 @@ class Bme280h : public IoTItem {
|
|||||||
if (value.valD != NAN && value.valD < 100)
|
if (value.valD != NAN && value.valD < 100)
|
||||||
regEvent(value.valD, "Bme280h");
|
regEvent(value.valD, "Bme280h");
|
||||||
else
|
else
|
||||||
SerialPrint("E", "Sensor Bme280h", "Error");
|
SerialPrint("E", "Sensor Bme280h", "Error", _id);
|
||||||
}
|
}
|
||||||
|
|
||||||
~Bme280h(){};
|
~Bme280h(){};
|
||||||
@@ -67,7 +67,7 @@ class Bme280p : public IoTItem {
|
|||||||
value.valD = value.valD / 1.333224 / 100;
|
value.valD = value.valD / 1.333224 / 100;
|
||||||
regEvent(value.valD, "Bme280p");
|
regEvent(value.valD, "Bme280p");
|
||||||
} else
|
} else
|
||||||
SerialPrint("E", "Sensor Bme280p", "Error");
|
SerialPrint("E", "Sensor Bme280p", "Error", _id);
|
||||||
}
|
}
|
||||||
|
|
||||||
~Bme280p(){};
|
~Bme280p(){};
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ class Bmp280t : public IoTItem {
|
|||||||
if (value.valD != NAN && value.valD < 150)
|
if (value.valD != NAN && value.valD < 150)
|
||||||
regEvent(value.valD, "Bmp280t");
|
regEvent(value.valD, "Bmp280t");
|
||||||
else
|
else
|
||||||
SerialPrint("E", "Sensor Bmp280t", "Error");
|
SerialPrint("E", "Sensor Bmp280t", "Error", _id);
|
||||||
}
|
}
|
||||||
|
|
||||||
~Bmp280t(){};
|
~Bmp280t(){};
|
||||||
@@ -47,7 +47,7 @@ class Bmp280p : public IoTItem {
|
|||||||
value.valD = value.valD / 1.333224 / 100;
|
value.valD = value.valD / 1.333224 / 100;
|
||||||
regEvent(value.valD, "Bmp280p");
|
regEvent(value.valD, "Bmp280p");
|
||||||
} else
|
} else
|
||||||
SerialPrint("E", "Sensor Bmp280p", "Error");
|
SerialPrint("E", "Sensor Bmp280p", "Error", _id);
|
||||||
}
|
}
|
||||||
|
|
||||||
~Bmp280p(){};
|
~Bmp280p(){};
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ class Dht1122t : public IoTItem {
|
|||||||
if (String(value.valD) != "nan")
|
if (String(value.valD) != "nan")
|
||||||
regEvent(value.valD, "Dht1122t");
|
regEvent(value.valD, "Dht1122t");
|
||||||
else
|
else
|
||||||
SerialPrint("E", "Sensor DHTt", "Error");
|
SerialPrint("E", "Sensor DHTt", "Error", _id);
|
||||||
}
|
}
|
||||||
|
|
||||||
~Dht1122t(){};
|
~Dht1122t(){};
|
||||||
@@ -46,7 +46,7 @@ class Dht1122h : public IoTItem {
|
|||||||
if (String(value.valD) != "nan")
|
if (String(value.valD) != "nan")
|
||||||
regEvent(value.valD, "Dht1122h");
|
regEvent(value.valD, "Dht1122h");
|
||||||
else
|
else
|
||||||
SerialPrint("E", "Sensor DHTh", "Error");
|
SerialPrint("E", "Sensor DHTh", "Error", _id);
|
||||||
}
|
}
|
||||||
|
|
||||||
~Dht1122h(){};
|
~Dht1122h(){};
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ class Ds18b20 : public IoTItem {
|
|||||||
if (value.valD != DEVICE_DISCONNECTED_C)
|
if (value.valD != DEVICE_DISCONNECTED_C)
|
||||||
regEvent(value.valD, ""); //обязательный вызов для отправки результата работы
|
regEvent(value.valD, ""); //обязательный вызов для отправки результата работы
|
||||||
else
|
else
|
||||||
SerialPrint("E", "Sensor Ds18b20", "Error");
|
SerialPrint("E", "Sensor Ds18b20", "Error", _id);
|
||||||
}
|
}
|
||||||
//=======================================================================================================
|
//=======================================================================================================
|
||||||
|
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ class GY21t : public IoTItem {
|
|||||||
if (value.valD < 300)
|
if (value.valD < 300)
|
||||||
regEvent(value.valD, "GY21"); // TODO: найти способ понимания ошибки получения данных
|
regEvent(value.valD, "GY21"); // TODO: найти способ понимания ошибки получения данных
|
||||||
else
|
else
|
||||||
SerialPrint("E", "Sensor GY21t", "Error");
|
SerialPrint("E", "Sensor GY21t", "Error", _id);
|
||||||
}
|
}
|
||||||
|
|
||||||
~GY21t(){};
|
~GY21t(){};
|
||||||
@@ -39,7 +39,7 @@ class GY21h : public IoTItem {
|
|||||||
if (value.valD != 0)
|
if (value.valD != 0)
|
||||||
regEvent(value.valD, "GY21h"); // TODO: найти способ понимания ошибки получения данных
|
regEvent(value.valD, "GY21h"); // TODO: найти способ понимания ошибки получения данных
|
||||||
else
|
else
|
||||||
SerialPrint("E", "Sensor GY21h", "Error");
|
SerialPrint("E", "Sensor GY21h", "Error", _id);
|
||||||
}
|
}
|
||||||
|
|
||||||
~GY21h(){};
|
~GY21h(){};
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ class Hdc1080t : public IoTItem {
|
|||||||
if (value.valD < 124)
|
if (value.valD < 124)
|
||||||
regEvent(value.valD, "Hdc1080t");
|
regEvent(value.valD, "Hdc1080t");
|
||||||
else
|
else
|
||||||
SerialPrint("E", "Sensor Hdc1080t", "Error");
|
SerialPrint("E", "Sensor Hdc1080t", "Error", _id);
|
||||||
}
|
}
|
||||||
|
|
||||||
~Hdc1080t(){};
|
~Hdc1080t(){};
|
||||||
@@ -39,7 +39,7 @@ class Hdc1080h : public IoTItem {
|
|||||||
if (value.valD < 99)
|
if (value.valD < 99)
|
||||||
regEvent(value.valD, "Hdc1080h");
|
regEvent(value.valD, "Hdc1080h");
|
||||||
else
|
else
|
||||||
SerialPrint("E", "Sensor Hdc1080h", "Error");
|
SerialPrint("E", "Sensor Hdc1080h", "Error", _id);
|
||||||
}
|
}
|
||||||
|
|
||||||
~Hdc1080h(){};
|
~Hdc1080h(){};
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ class MAX6675t : public IoTItem {
|
|||||||
if (String(value.valD) != "nan") {
|
if (String(value.valD) != "nan") {
|
||||||
regEvent(value.valD, "Max6675t");
|
regEvent(value.valD, "Max6675t");
|
||||||
} else {
|
} else {
|
||||||
SerialPrint("E", "Sensor Max6675t", "Error");
|
SerialPrint("E", "Sensor Max6675t", "Error", _id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ class Sht20t : public IoTItem {
|
|||||||
if (value.valD > -46.85F)
|
if (value.valD > -46.85F)
|
||||||
regEvent(value.valD, "Sht20t");
|
regEvent(value.valD, "Sht20t");
|
||||||
else
|
else
|
||||||
SerialPrint("E", "Sensor Sht20t", "Error");
|
SerialPrint("E", "Sensor Sht20t", "Error", _id);
|
||||||
}
|
}
|
||||||
|
|
||||||
~Sht20t(){};
|
~Sht20t(){};
|
||||||
@@ -32,7 +32,7 @@ class Sht20h : public IoTItem {
|
|||||||
if (value.valD != -6)
|
if (value.valD != -6)
|
||||||
regEvent(value.valD, "Sht20h");
|
regEvent(value.valD, "Sht20h");
|
||||||
else
|
else
|
||||||
SerialPrint("E", "Sensor Sht20h", "Error");
|
SerialPrint("E", "Sensor Sht20h", "Error", _id);
|
||||||
}
|
}
|
||||||
|
|
||||||
~Sht20h(){};
|
~Sht20h(){};
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ class Sht30t : public IoTItem {
|
|||||||
SerialPrint("E", "Sensor Sht30t", "OK");
|
SerialPrint("E", "Sensor Sht30t", "OK");
|
||||||
|
|
||||||
if (value.valD < -46.85F) regEvent(value.valD, "Sht30t"); // TODO: найти способ понимания ошибки получения данных
|
if (value.valD < -46.85F) regEvent(value.valD, "Sht30t"); // TODO: найти способ понимания ошибки получения данных
|
||||||
else SerialPrint("E", "Sensor Sht30t", "Error");
|
else SerialPrint("E", "Sensor Sht30t", "Error", _id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
~Sht30t() {};
|
~Sht30t() {};
|
||||||
@@ -42,7 +42,7 @@ class Sht30h : public IoTItem {
|
|||||||
|
|
||||||
SerialPrint("E", "Sensor Sht30h", "OK");
|
SerialPrint("E", "Sensor Sht30h", "OK");
|
||||||
if (value.valD != -6) regEvent(value.valD, "Sht30h"); // TODO: найти способ понимания ошибки получения данных
|
if (value.valD != -6) regEvent(value.valD, "Sht30h"); // TODO: найти способ понимания ошибки получения данных
|
||||||
else SerialPrint("E", "Sensor Sht30h", "Error");
|
else SerialPrint("E", "Sensor Sht30h", "Error", _id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
~Sht30h() {};
|
~Sht30h() {};
|
||||||
|
|||||||
@@ -263,7 +263,7 @@ class Loging : public IoTItem {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void regEvent(String value, String consoleInfo, bool error = false) {
|
void regEvent(const String& value, const String& consoleInfo, bool error = false, bool genEvent = true) {
|
||||||
String userDate = getItemValue(id + "-date");
|
String userDate = getItemValue(id + "-date");
|
||||||
String currentDate = getTodayDateDotFormated();
|
String currentDate = getTodayDateDotFormated();
|
||||||
//отправляем в график данные только когда выбран сегодняшний день
|
//отправляем в график данные только когда выбран сегодняшний день
|
||||||
@@ -306,14 +306,14 @@ class Date : public IoTItem {
|
|||||||
value.isDecimal = false;
|
value.isDecimal = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setValue(String valStr) {
|
void setValue(const String& valStr, bool genEvent = true) {
|
||||||
value.valS = valStr;
|
value.valS = valStr;
|
||||||
setValue(value);
|
setValue(value, genEvent);
|
||||||
}
|
}
|
||||||
|
|
||||||
void setValue(IoTValue Value, bool generateEvent = true) {
|
void setValue(const IoTValue& Value, bool genEvent = true) {
|
||||||
value = Value;
|
value = Value;
|
||||||
if (generateEvent) regEvent(value.valS, "");
|
regEvent(value.valS, "", false, genEvent);
|
||||||
//отправка данных при изменении даты
|
//отправка данных при изменении даты
|
||||||
for (std::list<IoTItem *>::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) {
|
for (std::list<IoTItem *>::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) {
|
||||||
if ((*it)->getSubtype() == "Loging") {
|
if ((*it)->getSubtype() == "Loging") {
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ class Timer : public IoTItem {
|
|||||||
if (value.valD == 0) {
|
if (value.valD == 0) {
|
||||||
regEvent(value.valD, "Time's up");
|
regEvent(value.valD, "Time's up");
|
||||||
}
|
}
|
||||||
|
if (!_ticker) regEvent(getValue(), "Timer tick", false, false); // только регистрируем изменения без генерации тиков
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_ticker && (value.valD > 0 || _unfin) && !_pause) regEvent(value.valD, "Timer tick");
|
if (_ticker && (value.valD > 0 || _unfin) && !_pause) regEvent(value.valD, "Timer tick");
|
||||||
|
|||||||
@@ -6,9 +6,9 @@ class VButton : public IoTItem {
|
|||||||
public:
|
public:
|
||||||
VButton(String parameters): IoTItem(parameters) { }
|
VButton(String parameters): IoTItem(parameters) { }
|
||||||
|
|
||||||
void setValue(IoTValue Value, bool generateEvent = true) {
|
void setValue(const IoTValue& Value, bool genEvent = true) {
|
||||||
value = Value;
|
value = Value;
|
||||||
if (generateEvent) regEvent((String)(int)value.valD, "VButton");
|
regEvent((String)(int)value.valD, "VButton", false, genEvent);
|
||||||
}
|
}
|
||||||
|
|
||||||
String getValue() {
|
String getValue() {
|
||||||
|
|||||||
@@ -8,11 +8,6 @@ class Variable : public IoTItem {
|
|||||||
Variable(String parameters) : IoTItem(parameters) {
|
Variable(String parameters) : IoTItem(parameters) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// особенность данного модуля - просто хранение значения для сценария, нет событий
|
|
||||||
// void setValue(IoTValue Value, bool generateEvent = true) {
|
|
||||||
// value = Value;
|
|
||||||
// }
|
|
||||||
|
|
||||||
void doByInterval() {
|
void doByInterval() {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -11,113 +11,87 @@ void jsonWriteStrDoc(DynamicJsonDocument& doc, String name, String value) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// new==============================================================================
|
// new==============================================================================
|
||||||
bool jsonRead(String& json, String key, unsigned long& value, bool e) {
|
bool jsonRead(const String& json, String key, unsigned long& value, bool e) {
|
||||||
bool ret = true;
|
|
||||||
DynamicJsonDocument doc(JSON_BUFFER_SIZE);
|
DynamicJsonDocument doc(JSON_BUFFER_SIZE);
|
||||||
DeserializationError error = deserializeJson(doc, json);
|
DeserializationError error = deserializeJson(doc, json);
|
||||||
if (error) {
|
if (error) {
|
||||||
if (e) {
|
SerialPrint("EE", F("jsonRead"), error.f_str());
|
||||||
SerialPrint("EE", F("jsonRead"), error.f_str());
|
jsonErrorDetected();
|
||||||
jsonErrorDetected();
|
return false;
|
||||||
}
|
|
||||||
ret = false;
|
|
||||||
} else if (!doc.containsKey(key)) {
|
} else if (!doc.containsKey(key)) {
|
||||||
if (e) {
|
if (e) {
|
||||||
SerialPrint("EE", F("jsonRead"), "json key '" + key + "' missing");
|
SerialPrint("EE", F("jsonRead"), key + " missing");
|
||||||
jsonErrorDetected();
|
jsonErrorDetected();
|
||||||
}
|
}
|
||||||
ret = false;
|
return false;
|
||||||
}
|
}
|
||||||
value = doc[key].as<unsigned long>();
|
value = doc[key].as<unsigned long>();
|
||||||
return ret;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool jsonRead(String& json, String key, float& value, bool e) {
|
bool jsonRead(const String& json, String key, float& value, bool e) {
|
||||||
bool ret = true;
|
|
||||||
DynamicJsonDocument doc(JSON_BUFFER_SIZE);
|
DynamicJsonDocument doc(JSON_BUFFER_SIZE);
|
||||||
DeserializationError error = deserializeJson(doc, json);
|
DeserializationError error = deserializeJson(doc, json);
|
||||||
if (error) {
|
if (error) {
|
||||||
if (e) {
|
SerialPrint("EE", F("jsonRead"), error.f_str());
|
||||||
SerialPrint("EE", F("jsonRead"), error.f_str());
|
jsonErrorDetected();
|
||||||
jsonErrorDetected();
|
return false;
|
||||||
}
|
|
||||||
ret = false;
|
|
||||||
} else if (!doc.containsKey(key)) {
|
} else if (!doc.containsKey(key)) {
|
||||||
if (e) {
|
if (e) {
|
||||||
SerialPrint("EE", F("jsonRead"), key + " missing");
|
SerialPrint("EE", F("jsonRead"), key + " missing");
|
||||||
jsonErrorDetected();
|
jsonErrorDetected();
|
||||||
}
|
}
|
||||||
ret = false;
|
return false;
|
||||||
}
|
}
|
||||||
value = doc[key].as<float>();
|
value = doc[key].as<float>();
|
||||||
return ret;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool jsonRead(String& json, String key, String& value, bool e) {
|
bool jsonRead(const String& json, String key, String& value, bool e) {
|
||||||
bool ret = true;
|
|
||||||
DynamicJsonDocument doc(JSON_BUFFER_SIZE);
|
DynamicJsonDocument doc(JSON_BUFFER_SIZE);
|
||||||
DeserializationError error = deserializeJson(doc, json);
|
DeserializationError error = deserializeJson(doc, json);
|
||||||
if (error) {
|
if (error) {
|
||||||
if (e) {
|
SerialPrint("EE", F("jsonRead"), error.f_str());
|
||||||
SerialPrint("EE", F("jsonRead"), error.f_str());
|
jsonErrorDetected();
|
||||||
jsonErrorDetected();
|
return false;
|
||||||
}
|
|
||||||
ret = false;
|
|
||||||
} else if (!doc.containsKey(key)) {
|
} else if (!doc.containsKey(key)) {
|
||||||
if (e) {
|
if (e) {
|
||||||
SerialPrint("EE", F("jsonRead"), key + " missing");
|
SerialPrint("EE", F("jsonRead"), key + " missing");
|
||||||
jsonErrorDetected();
|
jsonErrorDetected();
|
||||||
}
|
}
|
||||||
ret = false;
|
return false;
|
||||||
}
|
}
|
||||||
value = doc[key].as<String>();
|
value = doc[key].as<String>();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool jsonRead(const String& json, String key, bool& value, bool e) {
|
||||||
|
int lvalue = value;
|
||||||
|
bool ret = jsonRead(json, key, lvalue, e);
|
||||||
|
value = lvalue;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool jsonRead(String& json, String key, bool& value, bool e) {
|
bool jsonRead(const String& json, String key, int& value, bool e) {
|
||||||
bool ret = true;
|
|
||||||
DynamicJsonDocument doc(JSON_BUFFER_SIZE);
|
DynamicJsonDocument doc(JSON_BUFFER_SIZE);
|
||||||
DeserializationError error = deserializeJson(doc, json);
|
DeserializationError error = deserializeJson(doc, json);
|
||||||
if (error) {
|
if (error) {
|
||||||
if (e) {
|
SerialPrint("EE", F("jsonRead"), error.f_str());
|
||||||
SerialPrint("EE", F("jsonRead"), error.f_str());
|
jsonErrorDetected();
|
||||||
jsonErrorDetected();
|
return false;
|
||||||
}
|
|
||||||
ret = false;
|
|
||||||
} else if (!doc.containsKey(key)) {
|
} else if (!doc.containsKey(key)) {
|
||||||
if (e) {
|
if (e) {
|
||||||
SerialPrint("EE", F("jsonRead"), key + " missing");
|
SerialPrint("EE", F("jsonRead"), key + " missing");
|
||||||
jsonErrorDetected();
|
jsonErrorDetected();
|
||||||
}
|
}
|
||||||
ret = false;
|
return false;
|
||||||
}
|
}
|
||||||
value = doc[key].as<int>();
|
value = doc[key].as<int>();
|
||||||
return ret;
|
return true;
|
||||||
}
|
|
||||||
|
|
||||||
bool jsonRead(String& json, String key, int& value, bool e) {
|
|
||||||
bool ret = true;
|
|
||||||
DynamicJsonDocument doc(JSON_BUFFER_SIZE);
|
|
||||||
DeserializationError error = deserializeJson(doc, json);
|
|
||||||
if (error) {
|
|
||||||
if (e) {
|
|
||||||
SerialPrint("EE", F("jsonRead"), error.f_str());
|
|
||||||
jsonErrorDetected();
|
|
||||||
}
|
|
||||||
ret = false;
|
|
||||||
} else if (!doc.containsKey(key)) {
|
|
||||||
if (e) {
|
|
||||||
SerialPrint("EE", F("jsonRead"), key + " missing");
|
|
||||||
jsonErrorDetected();
|
|
||||||
}
|
|
||||||
ret = false;
|
|
||||||
}
|
|
||||||
value = doc[key].as<int>();
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// new==============================================================================
|
// new==============================================================================
|
||||||
bool jsonWriteStr_(String& json, String key, String value, bool e) {
|
bool jsonWriteStr_(String& json, const String& key, const String& value, bool e) {
|
||||||
bool ret = true;
|
bool ret = true;
|
||||||
DynamicJsonDocument doc(JSON_BUFFER_SIZE);
|
DynamicJsonDocument doc(JSON_BUFFER_SIZE);
|
||||||
DeserializationError error = deserializeJson(doc, json);
|
DeserializationError error = deserializeJson(doc, json);
|
||||||
@@ -134,7 +108,7 @@ bool jsonWriteStr_(String& json, String key, String value, bool e) {
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool jsonWriteBool_(String& json, String key, bool value, bool e) {
|
bool jsonWriteBool_(String& json, const String& key, bool value, bool e) {
|
||||||
bool ret = true;
|
bool ret = true;
|
||||||
DynamicJsonDocument doc(JSON_BUFFER_SIZE);
|
DynamicJsonDocument doc(JSON_BUFFER_SIZE);
|
||||||
DeserializationError error = deserializeJson(doc, json);
|
DeserializationError error = deserializeJson(doc, json);
|
||||||
@@ -151,7 +125,7 @@ bool jsonWriteBool_(String& json, String key, bool value, bool e) {
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool jsonWriteInt_(String& json, String key, int value, bool e) {
|
bool jsonWriteInt_(String& json, const String& key, int value, bool e) {
|
||||||
bool ret = true;
|
bool ret = true;
|
||||||
DynamicJsonDocument doc(JSON_BUFFER_SIZE);
|
DynamicJsonDocument doc(JSON_BUFFER_SIZE);
|
||||||
DeserializationError error = deserializeJson(doc, json);
|
DeserializationError error = deserializeJson(doc, json);
|
||||||
@@ -168,7 +142,7 @@ bool jsonWriteInt_(String& json, String key, int value, bool e) {
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool jsonWriteFloat_(String& json, String key, float value, bool e) {
|
bool jsonWriteFloat_(String& json, const String &key, float value, bool e) {
|
||||||
bool ret = true;
|
bool ret = true;
|
||||||
DynamicJsonDocument doc(JSON_BUFFER_SIZE);
|
DynamicJsonDocument doc(JSON_BUFFER_SIZE);
|
||||||
DeserializationError error = deserializeJson(doc, json);
|
DeserializationError error = deserializeJson(doc, json);
|
||||||
@@ -220,7 +194,7 @@ void jsonMergeDocs(JsonObject dest, JsonObjectConst src) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// depricated======================================================================
|
// depricated======================================================================
|
||||||
String jsonReadStr(String& json, String name, bool e) {
|
String jsonReadStr(const String& json, String name, bool e) {
|
||||||
DynamicJsonDocument doc(JSON_BUFFER_SIZE);
|
DynamicJsonDocument doc(JSON_BUFFER_SIZE);
|
||||||
DeserializationError error = deserializeJson(doc, json);
|
DeserializationError error = deserializeJson(doc, json);
|
||||||
if (error) {
|
if (error) {
|
||||||
@@ -232,7 +206,7 @@ String jsonReadStr(String& json, String name, bool e) {
|
|||||||
return doc[name].as<String>();
|
return doc[name].as<String>();
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean jsonReadBool(String& json, String name, bool e) {
|
boolean jsonReadBool(const String& json, String name, bool e) {
|
||||||
DynamicJsonDocument doc(JSON_BUFFER_SIZE);
|
DynamicJsonDocument doc(JSON_BUFFER_SIZE);
|
||||||
DeserializationError error = deserializeJson(doc, json);
|
DeserializationError error = deserializeJson(doc, json);
|
||||||
if (error) {
|
if (error) {
|
||||||
@@ -244,7 +218,7 @@ boolean jsonReadBool(String& json, String name, bool e) {
|
|||||||
return doc[name].as<bool>();
|
return doc[name].as<bool>();
|
||||||
}
|
}
|
||||||
|
|
||||||
int jsonReadInt(String& json, String name, bool e) {
|
int jsonReadInt(const String& json, String name, bool e) {
|
||||||
DynamicJsonDocument doc(JSON_BUFFER_SIZE);
|
DynamicJsonDocument doc(JSON_BUFFER_SIZE);
|
||||||
DeserializationError error = deserializeJson(doc, json);
|
DeserializationError error = deserializeJson(doc, json);
|
||||||
if (error) {
|
if (error) {
|
||||||
|
|||||||
@@ -1,23 +1,16 @@
|
|||||||
|
|
||||||
#include "utils/SerialPrint.h"
|
#include "utils/SerialPrint.h"
|
||||||
|
|
||||||
void SerialPrint(String errorLevel, String module, String msg, String itemId) {
|
void SerialPrint(const String& errorLevel, const String& module, const String& msg, const String& itemId) {
|
||||||
String tosend = prettyMillis(millis());
|
String tosend = prettyMillis(millis());
|
||||||
tosend = tosend + " [" + errorLevel + "] [" + module + "] " + msg;
|
tosend += " [";
|
||||||
|
tosend += errorLevel;
|
||||||
|
tosend += "] [";
|
||||||
|
tosend += module;
|
||||||
|
tosend += "] ";
|
||||||
|
tosend += msg;
|
||||||
Serial.println(tosend);
|
Serial.println(tosend);
|
||||||
|
|
||||||
if (errorLevel == "E") {
|
|
||||||
msg = cleanString(msg);
|
|
||||||
// создаем событие об ошибке для возможной реакции в сценарии
|
|
||||||
if (itemId != "") {
|
|
||||||
IoTItems.push_back((IoTItem *)new externalVariable("{\"id\":\"" + itemId + "_onError\",\"val\":\"" + msg + "\",\"int\":1}"));
|
|
||||||
generateEvent(itemId + "_onError", "1");
|
|
||||||
} else {
|
|
||||||
IoTItems.push_back((IoTItem *)new externalVariable("{\"id\":\"onError\",\"val\":\"" + module + " " + msg + "\",\"int\":1}"));
|
|
||||||
generateEvent("onError", "1");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isNetworkActive()) {
|
if (isNetworkActive()) {
|
||||||
if (jsonReadInt(settingsFlashJson, F("log")) != 0) {
|
if (jsonReadInt(settingsFlashJson, F("log")) != 0) {
|
||||||
// String pl = "/log|" + tosend;
|
// String pl = "/log|" + tosend;
|
||||||
@@ -25,4 +18,18 @@ void SerialPrint(String errorLevel, String module, String msg, String itemId) {
|
|||||||
sendStringToWs("corelg", tosend, -1);
|
sendStringToWs("corelg", tosend, -1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (errorLevel == "E") {
|
||||||
|
cleanString(tosend);
|
||||||
|
// создаем событие об ошибке для возможной реакции в сценарии
|
||||||
|
if (itemId != "") {
|
||||||
|
IoTItems.push_back((IoTItem *)new externalVariable("{\"id\":\"" + itemId + "_onError\",\"val\":\"" + tosend + "\",\"int\":1}"));
|
||||||
|
generateEvent(itemId + "_onError", "1");
|
||||||
|
} else {
|
||||||
|
IoTItems.push_back((IoTItem *)new externalVariable("{\"id\":\"onError\",\"val\":\"" + module + " " + tosend + "\",\"int\":1}"));
|
||||||
|
generateEvent("onError", "1");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -8,12 +8,12 @@ void writeUint8tToString(uint8_t* payload, size_t length, size_t headerLenth, St
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
String selectToMarkerLast(String str, String found) {
|
String selectToMarkerLast(String str, const String& found) {
|
||||||
int p = str.lastIndexOf(found);
|
int p = str.lastIndexOf(found);
|
||||||
return str.substring(p + found.length());
|
return str.substring(p + found.length());
|
||||||
}
|
}
|
||||||
|
|
||||||
String selectToMarker(String str, String found) {
|
String selectToMarker(String str, const String& found) {
|
||||||
int p = str.indexOf(found);
|
int p = str.indexOf(found);
|
||||||
return str.substring(0, p);
|
return str.substring(0, p);
|
||||||
}
|
}
|
||||||
@@ -24,32 +24,32 @@ String extractInner(String str) {
|
|||||||
return str.substring(p1 + 1, p2);
|
return str.substring(p1 + 1, p2);
|
||||||
}
|
}
|
||||||
|
|
||||||
String deleteAfterDelimiter(String str, String found) {
|
String deleteAfterDelimiter(String str, const String& found) {
|
||||||
int p = str.indexOf(found);
|
int p = str.indexOf(found);
|
||||||
return str.substring(0, p);
|
return str.substring(0, p);
|
||||||
}
|
}
|
||||||
|
|
||||||
String deleteBeforeDelimiter(String str, String found) {
|
String deleteBeforeDelimiter(String str, const String& found) {
|
||||||
int p = str.indexOf(found) + found.length();
|
int p = str.indexOf(found) + found.length();
|
||||||
return str.substring(p);
|
return str.substring(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
String deleteBeforeDelimiterTo(String str, String found) {
|
String deleteBeforeDelimiterTo(String str, const String& found) {
|
||||||
int p = str.indexOf(found);
|
int p = str.indexOf(found);
|
||||||
return str.substring(p);
|
return str.substring(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
String deleteToMarkerLast(String str, String found) {
|
String deleteToMarkerLast(String str, const String& found) {
|
||||||
int p = str.lastIndexOf(found);
|
int p = str.lastIndexOf(found);
|
||||||
return str.substring(0, p);
|
return str.substring(0, p);
|
||||||
}
|
}
|
||||||
|
|
||||||
String selectToMarkerPlus(String str, String found, int plus) {
|
String selectToMarkerPlus(String str, const String& found, int plus) {
|
||||||
int p = str.indexOf(found);
|
int p = str.indexOf(found);
|
||||||
return str.substring(0, p + plus);
|
return str.substring(0, p + plus);
|
||||||
}
|
}
|
||||||
|
|
||||||
String selectFromMarkerToMarker(String str, String tofind, int number) {
|
String selectFromMarkerToMarker(String str, const String& tofind, int number) {
|
||||||
if (str.indexOf(tofind) == -1) {
|
if (str.indexOf(tofind) == -1) {
|
||||||
return "not found";
|
return "not found";
|
||||||
}
|
}
|
||||||
@@ -98,14 +98,14 @@ int string2hex(const char* str, unsigned char* bytes) {
|
|||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t hexStringToUint8(String hex) {
|
uint8_t hexStringToUint8(const String& hex) {
|
||||||
uint8_t tmp = strtol(hex.c_str(), NULL, 0);
|
uint8_t tmp = strtol(hex.c_str(), NULL, 0);
|
||||||
if (tmp >= 0x00 && tmp <= 0xFF) {
|
if (tmp >= 0x00 && tmp <= 0xFF) {
|
||||||
return tmp;
|
return tmp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t hexStringToUint16(String hex) {
|
uint16_t hexStringToUint16(const String& hex) {
|
||||||
uint16_t tmp = strtol(hex.c_str(), NULL, 0);
|
uint16_t tmp = strtol(hex.c_str(), NULL, 0);
|
||||||
if (tmp >= 0x0000 && tmp <= 0xFFFF) {
|
if (tmp >= 0x0000 && tmp <= 0xFFFF) {
|
||||||
return tmp;
|
return tmp;
|
||||||
@@ -141,7 +141,7 @@ size_t itemsCount2(String str, const String& separator) {
|
|||||||
// return cnt;
|
// return cnt;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
char* stringToChar(String& str) {
|
char* stringToChar(const String& str) {
|
||||||
char* mychar = new char[str.length() + 1];
|
char* mychar = new char[str.length() + 1];
|
||||||
strcpy(mychar, str.c_str());
|
strcpy(mychar, str.c_str());
|
||||||
return mychar;
|
return mychar;
|
||||||
@@ -199,11 +199,9 @@ String uint64ToString(uint64_t input, uint8_t base) {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
String cleanString(String str) {
|
void cleanString(String& str) {
|
||||||
String clearStr = "";
|
const String allowedChars = F("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя.!-+ ");
|
||||||
const String allowedChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя.!-+ ";
|
|
||||||
for (size_t i = 0; i < str.length(); i++) {
|
for (size_t i = 0; i < str.length(); i++) {
|
||||||
if (allowedChars.indexOf(str.charAt(i)) != -1) clearStr += str.charAt(i);
|
if (allowedChars.indexOf(str.charAt(i)) == -1) str.setCharAt(i, ' ');
|
||||||
}
|
}
|
||||||
return clearStr;
|
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user