Разделяем понятия регистрации и генерации события

регистрация подразумевает фиксацию изменений и уведомление
WS и MQTT интерфейса
генерация подразумевает добавление факта события в очередь сценария
и отправку на другие устройства
This commit is contained in:
2022-10-29 20:04:02 +03:00
parent 4ddbd97999
commit d9788f96bd
11 changed files with 68 additions and 69 deletions

View File

@@ -16,8 +16,8 @@ class IoTItem {
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(const String& value, const 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, const 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(const IoTValue& Value, bool generateEvent = true); virtual void setValue(const IoTValue& Value, bool genEvent = true);
virtual void setValue(const String& valStr, bool generateEvent = true); virtual void setValue(const String& valStr, bool genEvent = true);
String getRoundValue(); String getRoundValue();
//методы для графиков //методы для графиков
@@ -51,17 +51,17 @@ 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; // характеристика айтема, что ему нужно слать и принимать события из внешнего мира
}; };

View File

@@ -18,14 +18,6 @@ IoTItem::IoTItem(const 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(const 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,36 +58,39 @@ String IoTItem::getValue() {
} }
//определяем тип прилетевшей величины //определяем тип прилетевшей величины
void IoTItem::setValue(const 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(const 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(const String& value, const 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;
} }
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 + "'");
if (genEvent) {
generateEvent(_id, value); generateEvent(_id, value);
//отправка события другим устройствам в сети если не было ошибки============================== //отправка события другим устройствам в сети если не было ошибки==============================
@@ -101,6 +104,7 @@ void IoTItem::regEvent(const String& value, const String& consoleInfo, bool erro
} }
//======================================================================== //========================================================================
} }
}
String IoTItem::getRoundValue() { String IoTItem::getRoundValue() {
if (_round >= 0 && _round <= 6) { if (_round >= 0 && _round <= 6) {
@@ -115,14 +119,14 @@ String IoTItem::getRoundValue() {
} }
} }
void IoTItem::regEvent(float regvalue, const 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() {}

View File

@@ -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(){};

View File

@@ -68,9 +68,9 @@ class ButtonIn : public IoTItem {
_lastButtonState = _reading; _lastButtonState = _reading;
} }
void setValue(const 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() {

View File

@@ -37,10 +37,10 @@ class ButtonOut : public IoTItem {
return {}; // команда поддерживает возвращаемое значения. Т.е. по итогу выполнения команды или общения с внешней системой, можно вернуть значение в сценарий для дальнейшей обработки return {}; // команда поддерживает возвращаемое значения. Т.е. по итогу выполнения команды или общения с внешней системой, можно вернуть значение в сценарий для дальнейшей обработки
} }
void setValue(const 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() {

View File

@@ -52,12 +52,12 @@ class IoTServo : public IoTItem {
return {}; return {};
} }
void setValue(const 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);
} }
} }

View File

@@ -54,10 +54,10 @@ class Pwm32 : public IoTItem {
} }
} }
void setValue(const 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);
} }
//======================================================================================================= //=======================================================================================================

View File

@@ -44,10 +44,10 @@ class Pwm8266 : public IoTItem {
} }
} }
void setValue(const 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);
} }
//======================================================================================================= //=======================================================================================================

View File

@@ -263,7 +263,7 @@ class Loging : public IoTItem {
} }
} }
void regEvent(const String& value, const 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(const String& valStr) { void setValue(const String& valStr, bool genEvent = true) {
value.valS = valStr; value.valS = valStr;
setValue(value); setValue(value, genEvent);
} }
void setValue(const 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") {

View File

@@ -6,9 +6,9 @@ class VButton : public IoTItem {
public: public:
VButton(String parameters): IoTItem(parameters) { } VButton(String parameters): IoTItem(parameters) { }
void setValue(const 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() {

View File

@@ -8,11 +8,6 @@ class Variable : public IoTItem {
Variable(String parameters) : IoTItem(parameters) { Variable(String parameters) : IoTItem(parameters) {
} }
// особенность данного модуля - просто хранение значения для сценария, нет событий
// void setValue(const IoTValue& Value, bool generateEvent = true) {
// value = Value;
// }
void doByInterval() { void doByInterval() {
} }
}; };