2022-02-15 11:37:31 +01:00
|
|
|
|
#include "utils/JsonUtils.h"
|
|
|
|
|
|
#include "utils/SerialPrint.h"
|
|
|
|
|
|
#include "classes/IoTItem.h"
|
2022-02-02 21:40:45 +01:00
|
|
|
|
#include "WsServer.h"
|
2022-02-14 12:48:59 +03:00
|
|
|
|
#include "ESPConfiguration.h"
|
2022-02-22 20:16:33 +01:00
|
|
|
|
#include "EventsAndOrders.h"
|
2022-01-14 21:48:43 +01:00
|
|
|
|
|
2022-08-11 15:04:58 +02:00
|
|
|
|
//получение параметров в экземпляр класса
|
2022-02-06 09:11:07 +03:00
|
|
|
|
IoTItem::IoTItem(String parameters) {
|
2022-02-22 16:40:46 +01:00
|
|
|
|
jsonRead(parameters, F("int"), _interval);
|
2022-06-02 23:17:52 +03:00
|
|
|
|
if (_interval == 0) enableDoByInt = false;
|
2022-02-01 23:04:06 +03:00
|
|
|
|
_interval = _interval * 1000;
|
2022-02-22 16:40:46 +01:00
|
|
|
|
jsonRead(parameters, F("subtype"), _subtype);
|
|
|
|
|
|
jsonRead(parameters, F("id"), _id);
|
2022-03-04 01:01:13 +03:00
|
|
|
|
if (!jsonRead(parameters, F("multiply"), _multiply, false)) _multiply = 1;
|
2022-03-01 21:07:17 +03:00
|
|
|
|
if (!jsonRead(parameters, F("plus"), _plus, false)) _plus = 0;
|
|
|
|
|
|
if (!jsonRead(parameters, F("round"), _round, false)) _round = -1;
|
2022-02-02 21:17:50 +01:00
|
|
|
|
|
2022-08-23 23:17:59 +03:00
|
|
|
|
if (!jsonRead(parameters, F("global"), _global, false)) _global = false;
|
|
|
|
|
|
|
2022-02-25 13:20:03 +03:00
|
|
|
|
String valAsStr;
|
2022-02-28 01:10:14 +01:00
|
|
|
|
if (jsonRead(parameters, F("val"), valAsStr, false)) // значение переменной или датчика при инициализации если есть в конфигурации
|
2022-08-12 22:33:36 +02:00
|
|
|
|
if (value.isDecimal = isDigitDotCommaStr(valAsStr)) {
|
2022-02-25 13:20:03 +03:00
|
|
|
|
value.valD = valAsStr.toFloat();
|
2022-08-12 22:33:36 +02:00
|
|
|
|
} else {
|
2022-02-25 13:20:03 +03:00
|
|
|
|
value.valS = valAsStr;
|
2022-08-12 22:33:36 +02:00
|
|
|
|
}
|
2022-02-25 13:20:03 +03:00
|
|
|
|
|
2022-02-01 23:04:06 +03:00
|
|
|
|
String map;
|
2022-02-22 16:40:46 +01:00
|
|
|
|
jsonRead(parameters, F("map"), map, false);
|
2022-02-01 23:04:06 +03:00
|
|
|
|
if (map != "") {
|
|
|
|
|
|
_map1 = selectFromMarkerToMarker(map, ",", 0).toInt();
|
|
|
|
|
|
_map2 = selectFromMarkerToMarker(map, ",", 1).toInt();
|
|
|
|
|
|
_map3 = selectFromMarkerToMarker(map, ",", 2).toInt();
|
|
|
|
|
|
_map4 = selectFromMarkerToMarker(map, ",", 3).toInt();
|
2022-02-02 21:17:50 +01:00
|
|
|
|
}
|
2022-02-01 12:51:34 +03:00
|
|
|
|
}
|
2022-02-25 15:38:32 +03:00
|
|
|
|
|
2022-08-11 15:21:12 +02:00
|
|
|
|
//луп выполняющий переодическое дерганье
|
|
|
|
|
|
void IoTItem::loop() {
|
|
|
|
|
|
if (enableDoByInt) {
|
|
|
|
|
|
currentMillis = millis();
|
|
|
|
|
|
difference = currentMillis - prevMillis;
|
|
|
|
|
|
if (difference >= _interval) {
|
|
|
|
|
|
prevMillis = millis();
|
|
|
|
|
|
this->doByInterval();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2022-04-27 14:18:44 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-08-11 15:21:12 +02:00
|
|
|
|
//получить
|
2022-02-26 22:42:57 +03:00
|
|
|
|
String IoTItem::getValue() {
|
2022-02-28 01:10:14 +01:00
|
|
|
|
if (value.isDecimal)
|
2022-04-26 23:03:00 +03:00
|
|
|
|
if (_round >= 0 && _round <= 6) {
|
2022-03-29 09:05:24 +03:00
|
|
|
|
char buf[15];
|
2022-03-04 01:01:13 +03:00
|
|
|
|
sprintf(buf, ("%1." + (String)_round + "f").c_str(), value.valD);
|
|
|
|
|
|
return (String)buf;
|
2022-08-11 15:04:58 +02:00
|
|
|
|
} else
|
|
|
|
|
|
return (String)value.valD;
|
2022-02-28 01:10:14 +01:00
|
|
|
|
else
|
|
|
|
|
|
return value.valS;
|
2022-02-26 22:42:57 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-08-11 15:21:12 +02:00
|
|
|
|
//установить
|
|
|
|
|
|
void IoTItem::setValue(String valStr) {
|
|
|
|
|
|
if (value.isDecimal = isDigitDotCommaStr(valStr)) {
|
|
|
|
|
|
value.valD = valStr.toFloat();
|
|
|
|
|
|
} else {
|
|
|
|
|
|
value.valS = valStr;
|
2022-01-14 21:48:43 +01:00
|
|
|
|
}
|
2022-08-11 15:21:12 +02:00
|
|
|
|
setValue(value);
|
2022-01-14 21:48:43 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-08-12 18:09:32 +02:00
|
|
|
|
//непонятный метод к удалению
|
2022-08-11 15:56:57 +02:00
|
|
|
|
void IoTItem::setValue(IoTValue Value) {
|
|
|
|
|
|
value = Value;
|
2022-08-12 17:53:08 +02:00
|
|
|
|
if (value.isDecimal) {
|
2022-08-11 15:56:57 +02:00
|
|
|
|
regEvent(value.valD, "");
|
2022-08-12 17:53:08 +02:00
|
|
|
|
} else {
|
2022-08-11 15:56:57 +02:00
|
|
|
|
regEvent(value.valS, "");
|
2022-08-12 17:53:08 +02:00
|
|
|
|
}
|
2022-08-11 15:56:57 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//когда событие случилось
|
2022-02-06 09:11:07 +03:00
|
|
|
|
void IoTItem::regEvent(String value, String consoleInfo = "") {
|
2022-02-22 20:16:33 +01:00
|
|
|
|
generateEvent(_id, value);
|
2022-02-02 21:17:50 +01:00
|
|
|
|
publishStatusMqtt(_id, value);
|
2022-08-23 23:17:59 +03:00
|
|
|
|
|
|
|
|
|
|
// проверка если global установлен то шлем всем о событии
|
|
|
|
|
|
if (_global) {
|
|
|
|
|
|
SerialPrint("i", F("=>ALLMQTT"), "Broadcast event: ");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-02-28 01:10:14 +01:00
|
|
|
|
//отправка события другим устройствам в сети==============================
|
2022-08-16 00:56:23 +02:00
|
|
|
|
// if (jsonReadBool(settingsFlashJson, "mqttin")) {
|
|
|
|
|
|
// String json = "{}";
|
|
|
|
|
|
// jsonWriteStr_(json, "id", _id);
|
|
|
|
|
|
// jsonWriteStr_(json, "val", value);
|
|
|
|
|
|
// jsonWriteInt_(json, "int", _interval + 5000); // 5 секунд про запас
|
|
|
|
|
|
// publishEvent(_id, json);
|
|
|
|
|
|
// SerialPrint("i", F("<=MQTT"), "Broadcast event: " + json);
|
|
|
|
|
|
//}
|
2022-02-28 01:10:14 +01:00
|
|
|
|
//========================================================================
|
2022-03-02 00:43:43 +01:00
|
|
|
|
publishStatusWs(_id, value); // Ilya, data: "1" (analog sensor, round set to 1, should be "1.0")
|
2022-02-16 00:53:52 +01:00
|
|
|
|
SerialPrint("i", "Sensor " + consoleInfo, "'" + _id + "' data: " + value + "'");
|
2022-02-01 23:04:06 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-03-01 20:16:12 +03:00
|
|
|
|
void IoTItem::regEvent(float regvalue, String consoleInfo = "") {
|
|
|
|
|
|
if (_multiply) regvalue = regvalue * _multiply;
|
2022-05-05 10:05:37 +03:00
|
|
|
|
if (_plus) regvalue = regvalue + _plus;
|
2022-03-04 01:01:13 +03:00
|
|
|
|
if (_round >= 0 && _round <= 6) {
|
2022-03-01 20:56:58 +03:00
|
|
|
|
int sot = _round ? pow(10, (int)_round) : 1;
|
2022-03-02 00:43:43 +01:00
|
|
|
|
regvalue = round(regvalue * sot) / sot;
|
2022-02-01 23:04:06 +03:00
|
|
|
|
}
|
2022-03-01 20:16:12 +03:00
|
|
|
|
if (_map1 != _map2) regvalue = map(regvalue, _map1, _map2, _map3, _map4);
|
|
|
|
|
|
|
|
|
|
|
|
value.valD = regvalue;
|
2022-02-01 23:04:06 +03:00
|
|
|
|
|
2022-03-04 01:01:13 +03:00
|
|
|
|
regEvent(getValue(), consoleInfo);
|
2022-01-14 21:48:43 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-02-06 09:11:07 +03:00
|
|
|
|
void IoTItem::doByInterval() {}
|
2022-01-15 16:30:34 +01:00
|
|
|
|
|
2022-02-16 00:53:52 +01:00
|
|
|
|
IoTValue IoTItem::execute(String command, std::vector<IoTValue>& param) { return {}; }
|
2022-02-14 12:48:59 +03:00
|
|
|
|
|
2022-08-11 15:21:12 +02:00
|
|
|
|
//==========================всякая херня==============================================================================================
|
|
|
|
|
|
//захрена эта хрень?
|
|
|
|
|
|
// String IoTItem::getSubtype() {
|
|
|
|
|
|
// return _subtype;
|
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
|
|
String IoTItem::getID() {
|
|
|
|
|
|
return _id;
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
void IoTItem::setInterval(unsigned long interval) {
|
|
|
|
|
|
_interval = interval;
|
2022-04-25 10:48:44 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-08-12 22:13:50 +02:00
|
|
|
|
bool IoTItem::isGpioDriver() {
|
|
|
|
|
|
return false;
|
2022-08-11 15:56:57 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
iarduino_RTC_BASE* IoTItem::getRtcDriver() {
|
|
|
|
|
|
return nullptr;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//сетевое общение====================================================================================================================================
|
|
|
|
|
|
|
2022-02-25 13:20:03 +03:00
|
|
|
|
externalVariable::externalVariable(String parameters) : IoTItem(parameters) {
|
2022-02-25 15:38:32 +03:00
|
|
|
|
prevMillis = millis(); // запоминаем текущее значение таймера для выполения doByInterval после int сек
|
2022-02-28 01:10:14 +01:00
|
|
|
|
iAmLocal = false; // указываем, что это сущность прилетела из сети
|
2022-02-25 15:38:32 +03:00
|
|
|
|
Serial.printf("Call from externalVariable: parameters %s %d\n", parameters.c_str(), _interval);
|
2022-02-25 13:20:03 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
externalVariable::~externalVariable() {
|
|
|
|
|
|
Serial.printf("Call from ~externalVariable: Im dead\n");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-02-28 01:10:14 +01:00
|
|
|
|
void externalVariable::doByInterval() { // для данного класса doByInterval+int выполняет роль счетчика обратного отсчета до уничтожения
|
2022-02-25 13:20:03 +03:00
|
|
|
|
iAmDead = true;
|
2022-02-26 22:42:57 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-08-11 15:21:12 +02:00
|
|
|
|
//=========================================================================================================================================
|
|
|
|
|
|
|
2022-02-26 22:42:57 +03:00
|
|
|
|
IoTItem* myIoTItem;
|
|
|
|
|
|
|
2022-08-12 16:05:44 +02:00
|
|
|
|
// поиск элемента модуля в существующей конфигурации
|
|
|
|
|
|
IoTItem* findIoTItem(String name) {
|
2022-02-28 01:10:14 +01:00
|
|
|
|
for (std::list<IoTItem*>::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) {
|
2022-02-26 22:42:57 +03:00
|
|
|
|
if ((*it)->getID() == name) return *it;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return nullptr;
|
|
|
|
|
|
}
|
2022-08-13 12:18:58 +02:00
|
|
|
|
// поиск плюс получение значения
|
|
|
|
|
|
String getItemValue(String name) {
|
2022-02-28 00:55:43 +03:00
|
|
|
|
IoTItem* tmp = findIoTItem(name);
|
2022-03-02 00:43:43 +01:00
|
|
|
|
if (tmp)
|
|
|
|
|
|
return tmp->getValue();
|
|
|
|
|
|
else
|
|
|
|
|
|
return "";
|
2022-02-28 00:55:43 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-02-26 22:42:57 +03:00
|
|
|
|
StaticJsonDocument<JSON_BUFFER_SIZE> docForExport;
|
|
|
|
|
|
|
2022-02-28 01:10:14 +01:00
|
|
|
|
StaticJsonDocument<JSON_BUFFER_SIZE>* getLocalItemsAsJSON() {
|
2022-02-26 22:42:57 +03:00
|
|
|
|
docForExport.clear();
|
2022-02-28 01:10:14 +01:00
|
|
|
|
for (std::list<IoTItem*>::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) {
|
2022-02-26 22:42:57 +03:00
|
|
|
|
if ((*it)->iAmLocal) docForExport[(*it)->getID()] = (*it)->getValue();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return &docForExport;
|
2022-02-14 18:33:52 +03:00
|
|
|
|
}
|