From 49cd22a5ddf369bad9d16da956415c4b887d8be9 Mon Sep 17 00:00:00 2001 From: Ilya Belyakov Date: Sun, 15 Oct 2023 19:55:45 +0300 Subject: [PATCH 1/9] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D1=8F?= =?UTF-8?q?=D0=B5=D0=BC=20=D1=82=D1=8E=D0=BD=D0=B8=D0=BD=D0=B3=20=D1=81?= =?UTF-8?q?=D0=B5=D1=80=D0=B2=D1=8B=20=D0=B8=20=D0=B7=D0=B0=D0=BC=D0=B5?= =?UTF-8?q?=D1=89=D0=B0=D0=B5=D0=BC=20=D0=B2=D0=BD=D1=83=D1=82=D1=80=D0=B5?= =?UTF-8?q?=D0=BD=D0=BD=D0=B8=D0=B9=20=D0=B0=D0=BD=D0=B0=D0=BB=D0=BE=D0=B3?= =?UTF-8?q?=20=D0=BD=D0=B0=20trackingID?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/exec/IoTServo/IoTServo.cpp | 51 ++++++++++++++------------ src/modules/exec/IoTServo/modinfo.json | 16 +++++--- 2 files changed, 38 insertions(+), 29 deletions(-) diff --git a/src/modules/exec/IoTServo/IoTServo.cpp b/src/modules/exec/IoTServo/IoTServo.cpp index 3cd672cf..adc894c1 100644 --- a/src/modules/exec/IoTServo/IoTServo.cpp +++ b/src/modules/exec/IoTServo/IoTServo.cpp @@ -9,37 +9,42 @@ extern IoTGpio IoTgpio; class IoTServo : public IoTItem { private: Servo servObj; - int _apin, _oldValue; - int _locmap1, _locmap2, _locmap3, _locmap4; + // int _apin, _oldValue; + int _oldValue; + // int _locmap1, _locmap2, _locmap3, _locmap4; public: IoTServo(String parameters): IoTItem(parameters) { - int pin; + int pin, minAngle, maxAngle, minPulseWidth, maxPulseWidth; jsonRead(parameters, "pin", pin); - servObj.attach(pin); + jsonRead(parameters, "minAngle", minAngle); + jsonRead(parameters, "maxAngle", maxAngle); + jsonRead(parameters, "minPulseWidth", minPulseWidth); + jsonRead(parameters, "maxPulseWidth", maxPulseWidth); + servObj.attach(pin, -1, minAngle, maxAngle, minPulseWidth, maxPulseWidth); - jsonRead(parameters, "apin", _apin); - if (_apin >= 0) IoTgpio.pinMode(_apin, INPUT); + // jsonRead(parameters, "apin", _apin); + // if (_apin >= 0) IoTgpio.pinMode(_apin, INPUT); - String map; - jsonRead(parameters, F("amap"), map, false); - if (map != "") { - _locmap1 = selectFromMarkerToMarker(map, ",", 0).toInt(); - _locmap2 = selectFromMarkerToMarker(map, ",", 1).toInt(); - _locmap3 = selectFromMarkerToMarker(map, ",", 2).toInt(); - _locmap4 = selectFromMarkerToMarker(map, ",", 3).toInt(); - } + // String map; + // jsonRead(parameters, F("amap"), map, false); + // if (map != "") { + // _locmap1 = selectFromMarkerToMarker(map, ",", 0).toInt(); + // _locmap2 = selectFromMarkerToMarker(map, ",", 1).toInt(); + // _locmap3 = selectFromMarkerToMarker(map, ",", 2).toInt(); + // _locmap4 = selectFromMarkerToMarker(map, ",", 3).toInt(); + // } } - void doByInterval() { - if (_apin >= 0) { - value.valD = map(IoTgpio.analogRead(_apin), _locmap1, _locmap2, _locmap3, _locmap4); - if (abs(_oldValue - value.valD) > 5) { - _oldValue = value.valD; - servObj.write(_oldValue); - } - } - } + // void doByInterval() { + // if (_apin >= 0) { + // value.valD = map(IoTgpio.analogRead(_apin), _locmap1, _locmap2, _locmap3, _locmap4); + // if (abs(_oldValue - value.valD) > 5) { + // _oldValue = value.valD; + // servObj.write(_oldValue); + // } + // } + // } IoTValue execute(String command, std::vector ¶m) { if (command == "rotate") { diff --git a/src/modules/exec/IoTServo/modinfo.json b/src/modules/exec/IoTServo/modinfo.json index 73f8e61e..09388af4 100644 --- a/src/modules/exec/IoTServo/modinfo.json +++ b/src/modules/exec/IoTServo/modinfo.json @@ -10,10 +10,12 @@ "widget": "rangeServo", "page": "servo", "descr": "угол", - "int": 1, "pin": 12, - "apin": -1, - "amap": "0, 4096, 0, 180" + "minAngle": 0, + "maxAngle": 180, + "minPulseWidth": 544, + "maxPulseWidth": 2400, + "trackingID": "" } ], "about": { @@ -30,10 +32,12 @@ "title": "Сервопривод", "moduleDesc": "Предназначен для управления сервоприводом по уровню аналогово сигнала.", "propInfo": { - "int": "Пауза в секундах между опросами аналогового входа. Если 0, то читаем постоянно", "pin": "Пин, к которому подключен сервопривод", - "apin": "Номер GPIO аналогового пина. Если -1, то функция отключена.", - "amap": "Настройки преобразования значений аналога в нужный диапазон сервы, имеет смысл, если аналог включен." + "minAngle": "Минимальный угол поворота", + "maxAngle": "Максимальный угол поворота", + "minPulseWidth": "Минимальная длина импульса", + "maxPulseWidth": "Максимальная длина импульса", + "trackingID": "Идентификатор отслеживания значения другого элемента конфигурации, например, чтение аналога" }, "retInfo": "Содержит текущее значение поворота", "funcInfo": [ From 4a8a05a0655f2a07d4b46a3d3e201dc82b8bb77c Mon Sep 17 00:00:00 2001 From: Ilya Belyakov Date: Sun, 22 Oct 2023 21:34:13 +0700 Subject: [PATCH 2/9] =?UTF-8?q?=D0=A3=D1=82=D0=BE=D1=87=D0=BD=D1=8F=D0=B5?= =?UTF-8?q?=D0=BC=20=D0=BF=D0=B0=D1=80=D0=B0=D0=BC=D0=B5=D1=82=D1=80=D1=8B?= =?UTF-8?q?=20=D0=B8=D0=BD=D0=B8=D1=86=D0=B8=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D0=B8=20=D1=81=D0=B5=D1=80=D0=B2=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/exec/IoTServo/IoTServo.cpp | 7 +++---- src/modules/exec/IoTServo/modinfo.json | 6 ++---- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/modules/exec/IoTServo/IoTServo.cpp b/src/modules/exec/IoTServo/IoTServo.cpp index adc894c1..d9e95974 100644 --- a/src/modules/exec/IoTServo/IoTServo.cpp +++ b/src/modules/exec/IoTServo/IoTServo.cpp @@ -15,13 +15,12 @@ class IoTServo : public IoTItem { public: IoTServo(String parameters): IoTItem(parameters) { - int pin, minAngle, maxAngle, minPulseWidth, maxPulseWidth; + int pin, minPulseWidth, maxPulseWidth, neutralPulseWidth; jsonRead(parameters, "pin", pin); - jsonRead(parameters, "minAngle", minAngle); - jsonRead(parameters, "maxAngle", maxAngle); jsonRead(parameters, "minPulseWidth", minPulseWidth); jsonRead(parameters, "maxPulseWidth", maxPulseWidth); - servObj.attach(pin, -1, minAngle, maxAngle, minPulseWidth, maxPulseWidth); + jsonRead(parameters, "neutralPulseWidth", neutralPulseWidth); + servObj.attach(pin, minPulseWidth, maxPulseWidth, neutralPulseWidth); // jsonRead(parameters, "apin", _apin); // if (_apin >= 0) IoTgpio.pinMode(_apin, INPUT); diff --git a/src/modules/exec/IoTServo/modinfo.json b/src/modules/exec/IoTServo/modinfo.json index 09388af4..5557aeb4 100644 --- a/src/modules/exec/IoTServo/modinfo.json +++ b/src/modules/exec/IoTServo/modinfo.json @@ -11,10 +11,9 @@ "page": "servo", "descr": "угол", "pin": 12, - "minAngle": 0, - "maxAngle": 180, "minPulseWidth": 544, "maxPulseWidth": 2400, + "neutralPulseWidth": 1500, "trackingID": "" } ], @@ -33,10 +32,9 @@ "moduleDesc": "Предназначен для управления сервоприводом по уровню аналогово сигнала.", "propInfo": { "pin": "Пин, к которому подключен сервопривод", - "minAngle": "Минимальный угол поворота", - "maxAngle": "Максимальный угол поворота", "minPulseWidth": "Минимальная длина импульса", "maxPulseWidth": "Максимальная длина импульса", + "neutralPulseWidth": "Нейтральная длина импульса", "trackingID": "Идентификатор отслеживания значения другого элемента конфигурации, например, чтение аналога" }, "retInfo": "Содержит текущее значение поворота", From d1c6e0e04f8971d4224f6cc316179b40437e16b3 Mon Sep 17 00:00:00 2001 From: Ilya Belyakov Date: Tue, 24 Oct 2023 21:24:33 +0700 Subject: [PATCH 3/9] =?UTF-8?q?=D0=9D=D0=BE=D0=B2=D1=8B=D0=B9=20=D0=BC?= =?UTF-8?q?=D0=BE=D0=B4=D1=83=D0=BB=D1=8C=20Math=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D1=85=D1=80=D0=B0=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BC=D0=B0?= =?UTF-8?q?=D1=82=D0=B5=D0=BC=D0=B0=D1=82=D0=B8=D1=87=D0=B5=D1=81=D0=BA?= =?UTF-8?q?=D0=B8=D1=85=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D1=8F=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D1=81=D1=86=D0=B5=D0=BD=D0=B0=D1=80=D0=B8?= =?UTF-8?q?=D0=B5=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- compilerProfile.json | 4 ++ data_svelte/flashProfile.json | 4 ++ data_svelte/items.json | 7 ++-- myProfile.json | 4 ++ src/modules/virtual/Math/Math.cpp | 25 ++++++++++++ src/modules/virtual/Math/modinfo.json | 55 +++++++++++++++++++++++++++ 6 files changed, 96 insertions(+), 3 deletions(-) create mode 100644 src/modules/virtual/Math/Math.cpp create mode 100644 src/modules/virtual/Math/modinfo.json diff --git a/compilerProfile.json b/compilerProfile.json index 381f87da..d206a12c 100644 --- a/compilerProfile.json +++ b/compilerProfile.json @@ -144,6 +144,10 @@ "path": "src/modules/virtual/LogingDaily", "active": true }, + { + "path": "src/modules/virtual/Math", + "active": false + }, { "path": "src/modules/virtual/owmWeather", "active": true diff --git a/data_svelte/flashProfile.json b/data_svelte/flashProfile.json index 903e5c8f..79eca748 100644 --- a/data_svelte/flashProfile.json +++ b/data_svelte/flashProfile.json @@ -22,6 +22,10 @@ "path": "src/modules/virtual/LogingDaily", "active": true }, + { + "path": "src/modules/virtual/Math", + "active": false + }, { "path": "src/modules/virtual/owmWeather", "active": true diff --git a/data_svelte/items.json b/data_svelte/items.json index 49d64ed4..6511d60c 100644 --- a/data_svelte/items.json +++ b/data_svelte/items.json @@ -723,10 +723,11 @@ "widget": "rangeServo", "page": "servo", "descr": "угол", - "int": 1, "pin": 12, - "apin": -1, - "amap": "0, 4096, 0, 180", + "minPulseWidth": 544, + "maxPulseWidth": 2400, + "neutralPulseWidth": 1500, + "trackingID": "", "num": 47 }, { diff --git a/myProfile.json b/myProfile.json index 381f87da..d206a12c 100644 --- a/myProfile.json +++ b/myProfile.json @@ -144,6 +144,10 @@ "path": "src/modules/virtual/LogingDaily", "active": true }, + { + "path": "src/modules/virtual/Math", + "active": false + }, { "path": "src/modules/virtual/owmWeather", "active": true diff --git a/src/modules/virtual/Math/Math.cpp b/src/modules/virtual/Math/Math.cpp new file mode 100644 index 00000000..09a4996a --- /dev/null +++ b/src/modules/virtual/Math/Math.cpp @@ -0,0 +1,25 @@ +#include "Global.h" +#include "classes/IoTItem.h" + +class IoTMath : public IoTItem { +private: +public: + IoTMath(String parameters) : IoTItem(parameters) {} + + IoTValue execute(String command, std::vector ¶m) { + if(command == "map" & param.size() == 5) { + IoTValue valTmp; + valTmp.isDecimal = true; + valTmp.valD = map(param[0].valD, param[1].valD, param[2].valD, param[3].valD, param[4].valD); + return valTmp; + } + return {}; + } +}; + +void *getAPI_IoTMath(String subtype, String param) { + if (subtype == F("IoTMath")) { + return new IoTMath(param); + } + return nullptr; +} diff --git a/src/modules/virtual/Math/modinfo.json b/src/modules/virtual/Math/modinfo.json new file mode 100644 index 00000000..c9d1dfe4 --- /dev/null +++ b/src/modules/virtual/Math/modinfo.json @@ -0,0 +1,55 @@ +{ + "menuSection": "virtual_elments", + "configItem": [ + { + "global": 0, + "name": "Math library", + "type": "Reading", + "subtype": "IoTMath", + "id": "math", + "widget": "anydataValue", + "page": "Математика", + "descr": "" + } + ], + "about": { + "authorName": "Berenbaum Maxim", + "authorContact": "https://t.me/Bermax_sys", + "authorGit": "https://github.com/xpohuk8", + "exampleURL": "https://iotmanager.org/wiki", + "specialThanks": "Ilya Belyakov", + "moduleName": "IoTMath", + "moduleVersion": "1.0", + "usedRam": { + "esp32_4mb": 15, + "esp8266_4mb": 15 + }, + "title": "Модуль Math", + "moduleDesc": "Модуль для расчета значений с использованием математических функций. Подходит для коррекции показаний датчиков.", + "propInfo": { + }, + "funcInfo": [ + { + "name": "map", + "descr": "Аналог функции map", + "params": [ + "Значение1", "Значение2", "Значение3", "Значение4" + ] + } + ] + }, + "defActive": false, + "usedLibs": { + "esp32_4mb": [], + "esp32_4mb3f": [], + "esp32cam_4mb": [], + "esp32s2_4mb": [], + "esp8266_4mb": [], + "esp8266_1mb": [], + "esp8266_1mb_ota": [], + "esp8285_1mb": [], + "esp8285_1mb_ota": [], + "esp8266_2mb": [], + "esp8266_2mb_ota": [] + } +} From a6a5bc3ea16c47c776ab67261e8465a57cf72ebe Mon Sep 17 00:00:00 2001 From: Mit4el Date: Sat, 28 Oct 2023 19:58:45 +0300 Subject: [PATCH 4/9] upd BLE v3 --- src/modules/sensors/Ble/Ble.cpp | 283 ++++++++++++++------------- src/modules/sensors/Ble/modinfo.json | 34 ++-- 2 files changed, 164 insertions(+), 153 deletions(-) diff --git a/src/modules/sensors/Ble/Ble.cpp b/src/modules/sensors/Ble/Ble.cpp index 8632fd97..1c83f442 100644 --- a/src/modules/sensors/Ble/Ble.cpp +++ b/src/modules/sensors/Ble/Ble.cpp @@ -1,27 +1,120 @@ #include "Global.h" #include "classes/IoTItem.h" #include -#ifdef ESP32 #include #include +#include // Создаем переменную для хранения данных с датчиков bluetooth -StaticJsonDocument BLEbuffer; -JsonObject extBLEdata = BLEbuffer.to(); +// StaticJsonDocument BLEbuffer; +// DynamicJsonDocument extBLEdata(JSON_BUFFER_SIZE * 4); +// JsonObject extBLEdata = BLEbuffer.to(); +class BleSens; +std::vector BleSensArray; -BLEScan *pBLEScan; -TheengsDecoder decoder; -StaticJsonDocument<512> doc; +class BleSens : public IoTItem +{ +private: + // описание параметров передаваемых из настроек датчика из веба + String _MAC; + String _sensor; + +public: + String whoIAm(/*String &mac, String &sens*/) + { + // mac = _MAC; + // sens = _sensor; + return _MAC; + } + + void setBLEdata(JsonObject extBLEdata) + { + if (_sensor == "last") + { + int valInt = extBLEdata[_sensor].as(); + char *s; + s = TimeToString(millis() / 1000 - valInt / 1000); + value.isDecimal = 0; + if (valInt > 0) + { + value.valS = s; + } + else + { + value.valS = ""; + } + regEvent(value.valS, _id); + } + else + { + String valStr = extBLEdata[_sensor].as(); + if (valStr != "null") + { + if (value.isDecimal == isDigitDotCommaStr(valStr)) + { + value.isDecimal = 1; + value.valD = valStr.toFloat(); + regEvent(value.valD, _id); + } + else + { + value.isDecimal = 0; + value.valS = valStr; + regEvent(value.valS, _id); + } + } + else + { + value.isDecimal = 0; + value.valS = ""; + regEvent(value.valS, _id); + } + } + } + char *TimeToString(unsigned long t) + { + static char str[12]; + long h = t / 3600; + t = t % 3600; + int m = t / 60; + int s = t % 60; + sprintf(str, "%02ld:%02d:%02d", h, m, s); + return str; + } + + BleSens(String parameters) : IoTItem(parameters) + { + _MAC = jsonReadStr(parameters, "MAC"); + _sensor = jsonReadStr(parameters, "sensor"); + BleSensArray.push_back(this); + } + + ~BleSens(){}; +}; + +//======================================================================================================= + +/** Callback to process the results of the last scan or restart it */ +void scanEndedCB(NimBLEScanResults results) +{ + int count = results.getCount(); + SerialPrint("i", F("BLE"), "Scan done! "); // +"Devices found: " + String(count)); + // pBLEScan->clearResults(); +} class BleScan : public IoTItem, BLEAdvertisedDeviceCallbacks { private: - //описание параметров передаваемых из настроек датчика из веба + // описание параметров передаваемых из настроек датчика из веба int _scanDuration; String _filter; + bool _debug; + + StaticJsonDocument<512> doc; + BLEScan *pBLEScan; + TheengsDecoder decoder; public: - //======================================================================================================= std::string convertServiceData(std::string deviceServiceData) { int serviceDataLength = (int)deviceServiceData.length(); @@ -67,169 +160,77 @@ public: if (decoder.decodeBLEJson(BLEdata)) { - BLEdata.remove("manufacturerdata"); BLEdata.remove("servicedata"); + BLEdata.remove("type"); + BLEdata.remove("cidc"); + BLEdata.remove("acts"); + BLEdata.remove("cont"); + BLEdata.remove("track"); String mac_address = BLEdata["id"].as(); mac_address.replace(":", ""); - - if (_filter != "") + // дописываем время прихода пакета данных + BLEdata["last"] = millis(); + if (_debug) { - if (BLEdata[_filter]) + if ((_filter != "" && BLEdata[_filter]) || _filter == "") { - for (JsonPair kv : BLEdata) - { - extBLEdata[mac_address][kv.key()] = BLEdata[kv.key()]; - } - - // дописываем время прихода пакета данных - extBLEdata[mac_address]["last"] = millis(); + // for (JsonPair kv : BLEdata) + // { + // String val = BLEdata.as(); + String output; + serializeJson(BLEdata, output); + SerialPrint("i", F("BLE"), _id + " " + output); + //} } } - else + BLEdata.remove("servicedatauuid"); + SerialPrint("i", F("BLE"), "found: " + mac_address); + // Перебираем все зарегистрированные сенсоры BleSens + for (std::vector::iterator it = BleSensArray.begin(); + it != BleSensArray.end(); ++it) { - for (JsonPair kv : BLEdata) - { - extBLEdata[mac_address][kv.key()] = BLEdata[kv.key()]; - } - // дописываем время прихода пакета данных - extBLEdata[mac_address]["last"] = millis(); + // Если это данные для нужного сенсора (по его МАКУ) + if ((*it)->whoIAm() == mac_address) + // то передаем ему json, дальше он сам разберется + (*it)->setBLEdata(BLEdata); } - }; + } } BleScan(String parameters) : IoTItem(parameters) { _scanDuration = jsonReadInt(parameters, "scanDuration"); _filter = jsonReadStr(parameters, "filter"); + jsonRead(parameters, "debug", _debug); - if (pBLEScan->isScanning() == false) - { - SerialPrint("i", F("BLE"), "Start Scanning..."); - BLEDevice::init(""); - pBLEScan = BLEDevice::getScan(); // create new scan - pBLEScan->setAdvertisedDeviceCallbacks(this); - pBLEScan->setActiveScan(false); // active scan uses more power, but get results faster - pBLEScan->setInterval(100); - pBLEScan->setWindow(99); // less or equal setInterval value - } + BLEDevice::init(""); + pBLEScan = BLEDevice::getScan(); // create new scan + pBLEScan->setAdvertisedDeviceCallbacks(this); + pBLEScan->setActiveScan(false); // active scan uses more power, but get results faster + pBLEScan->setInterval(100); + pBLEScan->setWindow(99); // less or equal setInterval value + pBLEScan->setMaxResults(0); // do not store the scan results, use callback only. } - //======================================================================================================= - // doByInterval() void doByInterval() { - - if (_scanDuration > 0) + if (pBLEScan->isScanning() == false) { - BLEScanResults foundDevices = pBLEScan->start(_scanDuration, true); - int count = foundDevices.getCount(); - SerialPrint("i", F("BLE"), "Devices found: " + String(count)); - SerialPrint("i", F("BLE"), "Scan done!"); - pBLEScan->clearResults(); - } - for (JsonPair kv : extBLEdata) - { - String val = extBLEdata[kv.key()].as(); - SerialPrint("i", F("BLE"), _id + " " + kv.key().c_str() + " " + val); + if (_scanDuration > 0) + { + SerialPrint("i", F("BLE"), "Start Scanning..."); + pBLEScan->start(_scanDuration, scanEndedCB, false); + } } } - //======================================================================================================= - ~BleScan(){}; }; -class BleSens : public IoTItem -{ -private: - //описание параметров передаваемых из настроек датчика из веба - String _MAC; - String _sensor; - -public: - //======================================================================================================= - char *TimeToString(unsigned long t) - { - static char str[12]; - long h = t / 3600; - t = t % 3600; - int m = t / 60; - int s = t % 60; - sprintf(str, "%02ld:%02d:%02d", h, m, s); - return str; - } - - BleSens(String parameters) : IoTItem(parameters) - { - _MAC = jsonReadStr(parameters, "MAC"); - _sensor = jsonReadStr(parameters, "sensor"); - } - - //======================================================================================================= - - // doByInterval() - void doByInterval() - { - if (_sensor == "last") - { - int valInt = extBLEdata[_MAC][_sensor].as(); - char *s; - s = TimeToString(millis() / 1000 - valInt / 1000); - value.isDecimal = 0; - if (valInt > 0) - { - value.valS = s; - } - else - { - value.valS = ""; - } - regEvent(value.valS, _id); - } - else - { - String valStr = extBLEdata[_MAC][_sensor].as(); - if (valStr != "null") - { - if (value.isDecimal = isDigitDotCommaStr(valStr)) - { - value.isDecimal = 1; - value.valD = valStr.toFloat(); - regEvent(value.valD, _id); - } - else - { - value.isDecimal = 0; - value.valS = valStr; - regEvent(value.valS, _id); - } - } - else - { - value.isDecimal = 0; - value.valS = ""; - regEvent(value.valS, _id); - } - } - } - //======================================================================================================= - - ~BleSens(){}; -}; -#endif - -// Заглушка для ESP8266 -#ifdef ESP8266 -class Ble : public IoTItem -{ -private: -public: - Ble(String parameters) : IoTItem(parameters) {} -}; -#endif +//======================================================================================================= void *getAPI_Ble(String subtype, String param) { diff --git a/src/modules/sensors/Ble/modinfo.json b/src/modules/sensors/Ble/modinfo.json index 090ccb24..0bd08eea 100644 --- a/src/modules/sensors/Ble/modinfo.json +++ b/src/modules/sensors/Ble/modinfo.json @@ -3,7 +3,6 @@ "configItem": [ { "name": "bluetooth сканер", - "num": 1, "type": "Reading", "subtype": "BleScan", "id": "BleScan", @@ -12,11 +11,11 @@ "descr": "", "int": 135, "scanDuration": 10, - "filter": "servicedatauuid" + "filter": "servicedatauuid", + "debug":1 }, { "name": "bluetooth датчик", - "num": 1, "type": "Reading", "subtype": "BleSens", "id": "BleSens", @@ -26,18 +25,17 @@ "needSave": 0, "global": 0, "round": 1, - "int": 60, "MAC": "", "sensor": "" } ], "about": { - "authorName": "AVAKS", - "authorContact": "https://t.me/@avaks_dev", - "authorGit": "https://github.com/avaksru", + "authorName": "AVAKS, v3 - Mit4bmw", + "authorContact": "https://t.me/@avaks, https://t.me/Mit4bmw", + "authorGit": "https://github.com/avaksru, https://github.com/Mit4el", "specialThanks": "@Serghei63", "moduleName": "Ble", - "moduleVersion": "1.0", + "moduleVersion": "3.0", "usedRam": { "esp32_4mb": 1261449, "esp8266_4mb": 0 @@ -50,9 +48,9 @@ "moduleDesc": "Позволяет получить данные с Bluetooth часов и термометров Mijia, Xiaomi, Cleargrass, ...", "propInfo": { "round": "Округление после запятой.", - "int": "Интервал сканирования BLE окружения (BleScan) / Интервал отправки собранной телеметрии в MQTT (BleSens)", + "int": "Интервал сканирования BLE окружения (BleScan) / В BleSens не используется, там обновляется по мене сканирования/поступления", "scanDuration": "Длительность сканирования ", - "filter": "Позволяет установить фильтр по параметру передаваемому датчиком. Данные будут считываться только с датчиков у которых есть передаваемый параметр указанный в фильтре", + "filter": "Позволяет установить фильтр по параметру передаваемому датчиком. Влияет только на вывод лога при debug=1, что бы было легче найти датчики, если много устройств в эфире", "MAC": "MAC адрес беспроводного датчика", "sensor": "Тип сенсора: температура / влажность / время / ... " } @@ -63,11 +61,23 @@ "https://github.com/h2zero/NimBLE-Arduino.git", "https://github.com/avaksru/decoder.git" ], - "esp32_4mb3f": [ + "esp32_16mb": [ "https://github.com/h2zero/NimBLE-Arduino.git", "https://github.com/avaksru/decoder.git" ], - "esp32cam_4mb": [ + "esp32_4mb3f": [ + "https://github.com/h2zero/NimBLE-Arduino.git", + "https://github.com/avaksru/decoder.git" + ], + "esp32s2_4mb": [ + "https://github.com/h2zero/NimBLE-Arduino.git", + "https://github.com/avaksru/decoder.git" + ], + "esp32s3_16mb": [ + "https://github.com/h2zero/NimBLE-Arduino.git", + "https://github.com/avaksru/decoder.git" + ], + "esp32c3m_4mb": [ "https://github.com/h2zero/NimBLE-Arduino.git", "https://github.com/avaksru/decoder.git" ] From 8b4c95998b4c688ce03033d84f06fc2a3fc63318 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Sat, 28 Oct 2023 20:05:19 +0300 Subject: [PATCH 5/9] ble --- src/modules/sensors/Ble/modinfo.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/sensors/Ble/modinfo.json b/src/modules/sensors/Ble/modinfo.json index 0bd08eea..739fc6bc 100644 --- a/src/modules/sensors/Ble/modinfo.json +++ b/src/modules/sensors/Ble/modinfo.json @@ -69,7 +69,7 @@ "https://github.com/h2zero/NimBLE-Arduino.git", "https://github.com/avaksru/decoder.git" ], - "esp32s2_4mb": [ + "esp32cam_4mb": [ "https://github.com/h2zero/NimBLE-Arduino.git", "https://github.com/avaksru/decoder.git" ], From 38be938f36a624d1427eb03fbf5dec06c15798f7 Mon Sep 17 00:00:00 2001 From: Ilya Belyakov Date: Sat, 28 Oct 2023 21:16:35 +0300 Subject: [PATCH 6/9] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D1=8F?= =?UTF-8?q?=D0=B5=D0=BC=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D1=8E=20?= =?UTF-8?q?=D1=80=D0=B0=D1=81=D1=87=D0=B5=D1=82=D0=B0=20=D0=B2=D1=80=D0=B5?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D0=B8=20=D0=B2=20=D1=84=D0=BE=D1=80=D0=BC?= =?UTF-8?q?=D0=B0=D1=82=D0=B5=20unixtime?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/virtual/Math/Math.cpp | 46 ++++++++++++++++++++++++++- src/modules/virtual/Math/modinfo.json | 9 +++++- 2 files changed, 53 insertions(+), 2 deletions(-) diff --git a/src/modules/virtual/Math/Math.cpp b/src/modules/virtual/Math/Math.cpp index 09a4996a..7b14c396 100644 --- a/src/modules/virtual/Math/Math.cpp +++ b/src/modules/virtual/Math/Math.cpp @@ -1,18 +1,62 @@ #include "Global.h" #include "classes/IoTItem.h" +#include class IoTMath : public IoTItem { private: + + time_t convertTime(float day, float month, float year, float hour, float minute) { + // Преобразование из float в int + int d = static_cast(day); + int m = static_cast(month); + int y = static_cast(year); + int h = static_cast(hour); + int min = static_cast(minute); + + if (d < 1 || d > 31 || m < 1 || m > 12 || y < 1900 || h < 0 || h > 23 || min < 0 || min > 59) { + SerialPrint("E", F("IoTMath"), F("Invalid date or time parameters!")); + return -1; + } + + // Структура для хранения даты и времени + struct tm t; + t.tm_year = y - 1900; + t.tm_mon = m - 1; + t.tm_mday = d; + t.tm_hour = h; + t.tm_min = min; + t.tm_sec = 0; + t.tm_isdst = -1; // Пусть система сама определяет DST + + return mktime(&t); + } + public: IoTMath(String parameters) : IoTItem(parameters) {} IoTValue execute(String command, std::vector ¶m) { - if(command == "map" & param.size() == 5) { + if(command == "map" && param.size() == 5) { IoTValue valTmp; valTmp.isDecimal = true; valTmp.valD = map(param[0].valD, param[1].valD, param[2].valD, param[3].valD, param[4].valD); + //SerialPrint("i", F("IoTMath"), F("Mapping value done.")); + return valTmp; + } else if(command == "convertTime" && param.size() == 5) { + time_t unixTime = convertTime(param[0].valD, param[1].valD, param[2].valD, param[3].valD, param[4].valD); + + if (unixTime == -1) { + SerialPrint("E", F("IoTMath"), F("Failed to convert time.")); + return {}; + } + + IoTValue valTmp; + valTmp.isDecimal = true; + valTmp.valD = unixTime; + //SerialPrint("i", F("IoTMath"), F("Time conversion done.")); return valTmp; } + + SerialPrint("E", F("IoTMath"), F("Unknown command or wrong parameters.")); return {}; } }; diff --git a/src/modules/virtual/Math/modinfo.json b/src/modules/virtual/Math/modinfo.json index c9d1dfe4..6265e85b 100644 --- a/src/modules/virtual/Math/modinfo.json +++ b/src/modules/virtual/Math/modinfo.json @@ -35,10 +35,17 @@ "params": [ "Значение1", "Значение2", "Значение3", "Значение4" ] + }, + { + "name": "convertTime", + "descr": "Перевести время из формата d-m-Y H:i:s например, 13-08-2023 16:24:00 в юникс-время ", + "params": [ + "tm.convertTime(13, 08, 2023, 16, 24); - передаем пять целых чисел. секунды подставятся в ноль" + ] } ] }, - "defActive": false, + "defActive": true, "usedLibs": { "esp32_4mb": [], "esp32_4mb3f": [], From 4fb6698de66c49428f72300cf0ad8927b0080a13 Mon Sep 17 00:00:00 2001 From: Ilya Belyakov Date: Sat, 28 Oct 2023 21:19:46 +0300 Subject: [PATCH 7/9] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D1=8F?= =?UTF-8?q?=D0=B5=D0=BC=20=D0=B2=20RTC=20=D1=83=D1=81=D1=82=D0=B0=D0=BD?= =?UTF-8?q?=D0=BE=D0=B2=D0=BA=D1=83=20=D0=B8=20=D1=87=D1=82=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=B8=20?= =?UTF-8?q?=D0=B8=D0=B7=20=D1=81=D1=86=D0=B5=D0=BD=D0=B0=D1=80=D0=B8=D1=8F?= =?UTF-8?q?=20=D0=B2=20=D1=87=D0=B8=D1=81=D0=BB=D0=B0=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/sensors/RTC/RTC.cpp | 36 ++++++++++++++++++++++++++++ src/modules/sensors/RTC/modinfo.json | 21 ++++++++++++++++ 2 files changed, 57 insertions(+) diff --git a/src/modules/sensors/RTC/RTC.cpp b/src/modules/sensors/RTC/RTC.cpp index b9994c5c..ea1dee8b 100644 --- a/src/modules/sensors/RTC/RTC.cpp +++ b/src/modules/sensors/RTC/RTC.cpp @@ -63,6 +63,42 @@ class RTC : public IoTItem { valTmp.valS = _watch->gettime(param[0].valS + " "); return valTmp; } + } else if (command == "setUnixTime") { + if (param.size() == 1) { + long ut = strtoul(param[0].valS.c_str(), nullptr, 10); + _watch->settimeUnix(ut); + return {}; + } + } else if (command == "setTime") { + if (param.size() == 6) { + _watch->settime(param[0].valD, param[1].valD, param[2].valD, param[3].valD, param[4].valD, param[5].valD); //сек, мин, час, день, мес, год + return {}; + } + } else if (command == "getTimeFloat") { + if (param.size() == 1) { + IoTValue valTmp; + _watch->gettime(); + valTmp.isDecimal = true; + String type = param[0].valS; + if (type == "H") { + valTmp.valD = static_cast(_watch->Hours); + } else if (type == "i") { + valTmp.valD = static_cast(_watch->minutes); + } else if (type == "s") { + valTmp.valD = static_cast(_watch->seconds); + } else if (type == "w") { + valTmp.valD = static_cast(_watch->weekday); + } else if (type == "d") { + valTmp.valD = static_cast(_watch->day); + } else if (type == "m") { + valTmp.valD = static_cast(_watch->month); + } else if (type == "Y") { + valTmp.valD = static_cast(_watch->year); + } else { + return {}; // Если переданный тип не поддерживается + } + return valTmp; + } } return {}; diff --git a/src/modules/sensors/RTC/modinfo.json b/src/modules/sensors/RTC/modinfo.json index 9e053b2d..f22250a1 100644 --- a/src/modules/sensors/RTC/modinfo.json +++ b/src/modules/sensors/RTC/modinfo.json @@ -54,6 +54,27 @@ "params": [ "Формат как у функции date() в PHP" ] + }, + { + "name": "setTime", + "descr": "Установить время через сценарии в формате сек, мин, час, день, мес, год.", + "params": [ + "сек", "мин", "час", "день", "мес", "год" + ] + }, + { + "name": "setUnixTime", + "descr": "Установить время через сценарий в формате юникстайм", + "params": [ + "rtc.setUnixTime('46489234') - параметр в виде строки" + ] + }, + { + "name": "getTimeFloat", + "descr": "Получить числовое значение времени по указанному формату", + "params": [ + "s - Вернуть секунды, i - Вернуть минуты, H - Вернуть часы в 24-часовом формате, d - Вернуть день месяца, w - Вернуть день недели, m - Вернуть месяц, Y - Вернуть год(4 знака)" + ] } ] }, From 125684f63b87fce86b71a87876ab5a926844b290 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Sat, 28 Oct 2023 22:12:15 +0300 Subject: [PATCH 8/9] time recv Ble --- src/modules/sensors/Ble/Ble.cpp | 27 +++++++++++++++++++++++---- src/modules/sensors/Ble/modinfo.json | 3 ++- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/modules/sensors/Ble/Ble.cpp b/src/modules/sensors/Ble/Ble.cpp index 1c83f442..6811e436 100644 --- a/src/modules/sensors/Ble/Ble.cpp +++ b/src/modules/sensors/Ble/Ble.cpp @@ -18,7 +18,7 @@ private: // описание параметров передаваемых из настроек датчика из веба String _MAC; String _sensor; - + int timeRecv; public: String whoIAm(/*String &mac, String &sens*/) { @@ -31,11 +31,11 @@ public: { if (_sensor == "last") { - int valInt = extBLEdata[_sensor].as(); + timeRecv = extBLEdata[_sensor].as(); char *s; - s = TimeToString(millis() / 1000 - valInt / 1000); + s = TimeToString(millis() / 1000 - timeRecv / 1000); value.isDecimal = 0; - if (valInt > 0) + if (timeRecv > 0) { value.valS = s; } @@ -82,6 +82,25 @@ public: return str; } + void doByInterval() + { + if (_sensor == "last") + { + char *s; + s = TimeToString(millis() / 1000 - timeRecv / 1000); + value.isDecimal = 0; + if (timeRecv > 0) + { + value.valS = s; + } + else + { + value.valS = ""; + } + regEvent(value.valS, _id); + } + } + BleSens(String parameters) : IoTItem(parameters) { _MAC = jsonReadStr(parameters, "MAC"); diff --git a/src/modules/sensors/Ble/modinfo.json b/src/modules/sensors/Ble/modinfo.json index 739fc6bc..7d9859db 100644 --- a/src/modules/sensors/Ble/modinfo.json +++ b/src/modules/sensors/Ble/modinfo.json @@ -23,6 +23,7 @@ "page": "Сенсоры", "descr": "", "needSave": 0, + "int": 30, "global": 0, "round": 1, "MAC": "", @@ -48,7 +49,7 @@ "moduleDesc": "Позволяет получить данные с Bluetooth часов и термометров Mijia, Xiaomi, Cleargrass, ...", "propInfo": { "round": "Округление после запятой.", - "int": "Интервал сканирования BLE окружения (BleScan) / В BleSens не используется, там обновляется по мене сканирования/поступления", + "int": "Интервал сканирования BLE окружения (BleScan) / В BleSens темп обновления времнени поступления данных, сами даные обновляются по мене сканирования/поступления", "scanDuration": "Длительность сканирования ", "filter": "Позволяет установить фильтр по параметру передаваемому датчиком. Влияет только на вывод лога при debug=1, что бы было легче найти датчики, если много устройств в эфире", "MAC": "MAC адрес беспроводного датчика", From b3662a7aa835d3c00464a698f1228410d7cfd21b Mon Sep 17 00:00:00 2001 From: Mit4el Date: Sat, 28 Oct 2023 22:24:14 +0300 Subject: [PATCH 9/9] lib ble new version --- src/modules/sensors/Ble/modinfo.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/modules/sensors/Ble/modinfo.json b/src/modules/sensors/Ble/modinfo.json index 7d9859db..b46fe322 100644 --- a/src/modules/sensors/Ble/modinfo.json +++ b/src/modules/sensors/Ble/modinfo.json @@ -60,27 +60,27 @@ "usedLibs": { "esp32_4mb": [ "https://github.com/h2zero/NimBLE-Arduino.git", - "https://github.com/avaksru/decoder.git" + "https://github.com/Mit4el/decoder.git" ], "esp32_16mb": [ "https://github.com/h2zero/NimBLE-Arduino.git", - "https://github.com/avaksru/decoder.git" + "https://github.com/Mit4el/decoder.git" ], "esp32_4mb3f": [ "https://github.com/h2zero/NimBLE-Arduino.git", - "https://github.com/avaksru/decoder.git" + "https://github.com/Mit4el/decoder.git" ], "esp32cam_4mb": [ "https://github.com/h2zero/NimBLE-Arduino.git", - "https://github.com/avaksru/decoder.git" + "https://github.com/Mit4el/decoder.git" ], "esp32s3_16mb": [ "https://github.com/h2zero/NimBLE-Arduino.git", - "https://github.com/avaksru/decoder.git" + "https://github.com/Mit4el/decoder.git" ], "esp32c3m_4mb": [ "https://github.com/h2zero/NimBLE-Arduino.git", - "https://github.com/avaksru/decoder.git" + "https://github.com/Mit4el/decoder.git" ] } } \ No newline at end of file