From d9788f96bd3f7ab6c82f5393466ab71fa7b9755b Mon Sep 17 00:00:00 2001 From: biver Date: Sat, 29 Oct 2022 20:04:02 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B0=D0=B7=D0=B4=D0=B5=D0=BB=D1=8F?= =?UTF-8?q?=D0=B5=D0=BC=20=D0=BF=D0=BE=D0=BD=D1=8F=D1=82=D0=B8=D1=8F=20?= =?UTF-8?q?=D1=80=D0=B5=D0=B3=D0=B8=D1=81=D1=82=D1=80=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D0=B8=20=D0=B8=20=D0=B3=D0=B5=D0=BD=D0=B5=D1=80=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D0=B8=20=D1=81=D0=BE=D0=B1=D1=8B=D1=82=D0=B8=D1=8F=20?= =?UTF-8?q?=D1=80=D0=B5=D0=B3=D0=B8=D1=81=D1=82=D1=80=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=BF=D0=BE=D0=B4=D1=80=D0=B0=D0=B7=D1=83=D0=BC=D0=B5?= =?UTF-8?q?=D0=B2=D0=B0=D0=B5=D1=82=20=D1=84=D0=B8=D0=BA=D1=81=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D1=8E=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B9=20=D0=B8=20=D1=83=D0=B2=D0=B5=D0=B4=D0=BE=D0=BC=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20WS=20=D0=B8=20MQTT=20=D0=B8=D0=BD?= =?UTF-8?q?=D1=82=D0=B5=D1=80=D1=84=D0=B5=D0=B9=D1=81=D0=B0=20=D0=B3=D0=B5?= =?UTF-8?q?=D0=BD=D0=B5=D1=80=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BF=D0=BE=D0=B4?= =?UTF-8?q?=D1=80=D0=B0=D0=B7=D1=83=D0=BC=D0=B5=D0=B2=D0=B0=D0=B5=D1=82=20?= =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D1=84=D0=B0=D0=BA=D1=82=D0=B0=20=D1=81=D0=BE=D0=B1=D1=8B=D1=82?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=B2=20=D0=BE=D1=87=D0=B5=D1=80=D0=B5=D0=B4?= =?UTF-8?q?=D1=8C=20=D1=81=D1=86=D0=B5=D0=BD=D0=B0=D1=80=D0=B8=D1=8F=20?= =?UTF-8?q?=D0=B8=20=D0=BE=D1=82=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D1=83=20?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=B4=D1=80=D1=83=D0=B3=D0=B8=D0=B5=20=D1=83?= =?UTF-8?q?=D1=81=D1=82=D1=80=D0=BE=D0=B9=D1=81=D1=82=D0=B2=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/classes/IoTItem.h | 24 ++++---- src/classes/IoTItem.cpp | 70 ++++++++++++----------- src/modules/display/Ws2812b/Ws2181b.cpp | 4 +- src/modules/exec/ButtonIn/ButtonIn.cpp | 4 +- src/modules/exec/ButtonOut/ButtonOut.cpp | 4 +- src/modules/exec/IoTServo/IoTServo.cpp | 4 +- src/modules/exec/Pwm32/Pwm32.cpp | 4 +- src/modules/exec/Pwm8266/Pwm8266.cpp | 4 +- src/modules/virtual/Loging/Loging.cpp | 10 ++-- src/modules/virtual/VButton/VButton.cpp | 4 +- src/modules/virtual/Variable/Variable.cpp | 5 -- 11 files changed, 68 insertions(+), 69 deletions(-) diff --git a/include/classes/IoTItem.h b/include/classes/IoTItem.h index dc42c57a..ba2b1053 100644 --- a/include/classes/IoTItem.h +++ b/include/classes/IoTItem.h @@ -16,8 +16,8 @@ class IoTItem { virtual void doByInterval(); virtual IoTValue execute(String command, std::vector& param); - virtual void regEvent(const String& value, const String& consoleInfo, bool error = false); - virtual void regEvent(float 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, bool genEvent = true); String getSubtype(); @@ -38,8 +38,8 @@ class IoTItem { bool enableDoByInt = true; virtual IoTGpio* getGpioDriver(); - virtual void setValue(const IoTValue& Value, bool generateEvent = true); - virtual void setValue(const String& valStr, bool generateEvent = true); + virtual void setValue(const IoTValue& Value, bool genEvent = true); + virtual void setValue(const String& valStr, bool genEvent = true); String getRoundValue(); //методы для графиков @@ -51,17 +51,17 @@ class IoTItem { protected: bool _needSave = false; // признак необходимости сохранять и загружать значение элемента на flash - String _subtype; - String _id; - unsigned long _interval; + String _subtype = ""; + String _id = ""; + unsigned long _interval = 1000; float _multiply; // умножаем на значение float _plus; // увеличиваем на значение - int _map1; - int _map2; - int _map3; - int _map4; - int _round; // 1, 10, 100, 1000, 10000 + int _map1 = 0; + int _map2 = 0; + int _map3 = 0; + int _map4 = 0; + int _round = 1; // 1, 10, 100, 1000, 10000 bool _global = false; // характеристика айтема, что ему нужно слать и принимать события из внешнего мира }; diff --git a/src/classes/IoTItem.cpp b/src/classes/IoTItem.cpp index c63d12a7..e78e6b42 100644 --- a/src/classes/IoTItem.cpp +++ b/src/classes/IoTItem.cpp @@ -18,14 +18,6 @@ IoTItem::IoTItem(const String& parameters) { 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; jsonRead(parameters, F("map"), map, false); if (map != "") { @@ -35,6 +27,14 @@ IoTItem::IoTItem(const String& parameters) { _map4 = selectFromMarkerToMarker(map, ",", 3).toInt(); } else _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,48 +58,52 @@ String IoTItem::getValue() { } //определяем тип прилетевшей величины -void IoTItem::setValue(const String& valStr, bool generateEvent) { - if (value.isDecimal = isDigitDotCommaStr(valStr)) { +void IoTItem::setValue(const String& valStr, bool genEvent) { + value.isDecimal = isDigitDotCommaStr(valStr); + + if (value.isDecimal) { value.valD = valStr.toFloat(); } else { 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; - if (generateEvent) - if (value.isDecimal) { - regEvent(value.valD, ""); - } else { - regEvent(value.valS, ""); - } + + if (value.isDecimal) { + regEvent(value.valD, "", false, genEvent); + } else { + 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) { jsonWriteStr_(valuesFlashJson, _id, value); needSaveValues = true; } publishStatusMqtt(_id, value); publishStatusWs(_id, value); - SerialPrint("i", "Sensor", consoleInfo + " '" + _id + "' data: " + value + "'"); + //SerialPrint("i", "Sensor", consoleInfo + " '" + _id + "' data: " + value + "'"); - generateEvent(_id, value); + if (genEvent) { + generateEvent(_id, value); - //отправка события другим устройствам в сети если не было ошибки============================== - if (jsonReadBool(settingsFlashJson, "mqttin") && _global && !error) { - String json = "{}"; - jsonWriteStr_(json, "id", _id); - jsonWriteStr_(json, "val", value); - jsonWriteInt_(json, "int", _interval/1000 + 5); // 5 секунд про запас - publishEvent(_id, json); - SerialPrint("i", F("<=MQTT"), "Broadcast event: " + json); + //отправка события другим устройствам в сети если не было ошибки============================== + if (jsonReadBool(settingsFlashJson, "mqttin") && _global && !error) { + String json = "{}"; + jsonWriteStr_(json, "id", _id); + jsonWriteStr_(json, "val", value); + jsonWriteInt_(json, "int", _interval/1000 + 5); // 5 секунд про запас + publishEvent(_id, json); + SerialPrint("i", F("<=MQTT"), "Broadcast event: " + json); + } + //======================================================================== } - //======================================================================== } String IoTItem::getRoundValue() { @@ -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; if (_multiply) value.valD = value.valD * _multiply; if (_plus) value.valD = value.valD + _plus; if (_map1 != _map2) value.valD = map(value.valD, _map1, _map2, _map3, _map4); - - regEvent(getRoundValue(), consoleInfo, error); + + regEvent(getRoundValue(), consoleInfo, error, genEvent); } void IoTItem::doByInterval() {} diff --git a/src/modules/display/Ws2812b/Ws2181b.cpp b/src/modules/display/Ws2812b/Ws2181b.cpp index 9ddac234..0dbf5362 100644 --- a/src/modules/display/Ws2812b/Ws2181b.cpp +++ b/src/modules/display/Ws2812b/Ws2181b.cpp @@ -171,14 +171,14 @@ public: return {}; } - void setValue(IoTValue Value, bool generateEvent = true){ + void setValue(const IoTValue& Value, bool genEvent = true){ if (!_strip) return; value = Value; int b = map(value.valD, 1,1024,1,255); _strip->setBrightness(b); _strip->show(); - if (generateEvent) regEvent(value.valD, "Ws2812b"); + regEvent(value.valD, "Ws2812b", false, genEvent); } ~Ws2812b(){}; diff --git a/src/modules/exec/ButtonIn/ButtonIn.cpp b/src/modules/exec/ButtonIn/ButtonIn.cpp index 700edce7..bd532aab 100644 --- a/src/modules/exec/ButtonIn/ButtonIn.cpp +++ b/src/modules/exec/ButtonIn/ButtonIn.cpp @@ -68,9 +68,9 @@ class ButtonIn : public IoTItem { _lastButtonState = _reading; } - void setValue(const IoTValue& Value, bool generateEvent = true) { + void setValue(const IoTValue& Value, bool genEvent = true) { value = Value; - if (generateEvent) regEvent((String)(int)value.valD, "ButtonIn"); + regEvent((String)(int)value.valD, "ButtonIn", false, genEvent); } String getValue() { diff --git a/src/modules/exec/ButtonOut/ButtonOut.cpp b/src/modules/exec/ButtonOut/ButtonOut.cpp index 2f3005d1..017d1fc9 100644 --- a/src/modules/exec/ButtonOut/ButtonOut.cpp +++ b/src/modules/exec/ButtonOut/ButtonOut.cpp @@ -37,10 +37,10 @@ class ButtonOut : public IoTItem { return {}; // команда поддерживает возвращаемое значения. Т.е. по итогу выполнения команды или общения с внешней системой, можно вернуть значение в сценарий для дальнейшей обработки } - void setValue(const IoTValue& Value, bool generateEvent = true) { + void setValue(const IoTValue& Value, bool genEvent = true) { value = Value; 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() { diff --git a/src/modules/exec/IoTServo/IoTServo.cpp b/src/modules/exec/IoTServo/IoTServo.cpp index b2340558..3cd672cf 100644 --- a/src/modules/exec/IoTServo/IoTServo.cpp +++ b/src/modules/exec/IoTServo/IoTServo.cpp @@ -52,12 +52,12 @@ class IoTServo : public IoTItem { return {}; } - void setValue(const IoTValue& Value, bool generateEvent = true) { + void setValue(const IoTValue& Value, bool genEvent = true) { value = Value; if (value.isDecimal & (_oldValue != value.valD)) { _oldValue = value.valD; servObj.write(_oldValue); - if (generateEvent) regEvent(value.valD, "IoTServo"); + regEvent(value.valD, "IoTServo", false, genEvent); } } diff --git a/src/modules/exec/Pwm32/Pwm32.cpp b/src/modules/exec/Pwm32/Pwm32.cpp index a1d3cb99..79f6eedf 100644 --- a/src/modules/exec/Pwm32/Pwm32.cpp +++ b/src/modules/exec/Pwm32/Pwm32.cpp @@ -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; ledcWrite(_ledChannel, value.valD); - if (generateEvent) regEvent(value.valD, "Pwm32"); + regEvent(value.valD, "Pwm32", false, genEvent); } //======================================================================================================= diff --git a/src/modules/exec/Pwm8266/Pwm8266.cpp b/src/modules/exec/Pwm8266/Pwm8266.cpp index 10cc1b01..2f8883f4 100644 --- a/src/modules/exec/Pwm8266/Pwm8266.cpp +++ b/src/modules/exec/Pwm8266/Pwm8266.cpp @@ -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; IoTgpio.analogWrite(_pin, value.valD); - if (generateEvent) regEvent(value.valD, "Pwm8266"); + regEvent(value.valD, "Pwm8266", false, genEvent); } //======================================================================================================= diff --git a/src/modules/virtual/Loging/Loging.cpp b/src/modules/virtual/Loging/Loging.cpp index 117afead..a189d046 100644 --- a/src/modules/virtual/Loging/Loging.cpp +++ b/src/modules/virtual/Loging/Loging.cpp @@ -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 currentDate = getTodayDateDotFormated(); //отправляем в график данные только когда выбран сегодняшний день @@ -306,14 +306,14 @@ class Date : public IoTItem { value.isDecimal = false; } - void setValue(const String& valStr) { + void setValue(const String& valStr, bool genEvent = true) { 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; - if (generateEvent) regEvent(value.valS, ""); + regEvent(value.valS, "", false, genEvent); //отправка данных при изменении даты for (std::list::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) { if ((*it)->getSubtype() == "Loging") { diff --git a/src/modules/virtual/VButton/VButton.cpp b/src/modules/virtual/VButton/VButton.cpp index b5411af0..747ded1c 100644 --- a/src/modules/virtual/VButton/VButton.cpp +++ b/src/modules/virtual/VButton/VButton.cpp @@ -6,9 +6,9 @@ class VButton : public IoTItem { public: VButton(String parameters): IoTItem(parameters) { } - void setValue(const IoTValue& Value, bool generateEvent = true) { + void setValue(const IoTValue& Value, bool genEvent = true) { value = Value; - if (generateEvent) regEvent((String)(int)value.valD, "VButton"); + regEvent((String)(int)value.valD, "VButton", false, genEvent); } String getValue() { diff --git a/src/modules/virtual/Variable/Variable.cpp b/src/modules/virtual/Variable/Variable.cpp index 28d495ed..755506a4 100644 --- a/src/modules/virtual/Variable/Variable.cpp +++ b/src/modules/virtual/Variable/Variable.cpp @@ -8,11 +8,6 @@ class Variable : public IoTItem { Variable(String parameters) : IoTItem(parameters) { } - // особенность данного модуля - просто хранение значения для сценария, нет событий - // void setValue(const IoTValue& Value, bool generateEvent = true) { - // value = Value; - // } - void doByInterval() { } };