From 3e24bf61e0b0a1e4d752deaf9162ee1efa61cae3 Mon Sep 17 00:00:00 2001 From: avaksru Date: Tue, 27 Dec 2022 17:54:56 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9C=D0=BE=D0=B4=D1=83=D0=BB=D1=8C=20External?= =?UTF-8?q?MQTT?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/MqttClient.cpp | 4 +- .../sensors/ExternalMQTT/ExternalMQTT.cpp | 133 ++++++++++++++++++ src/modules/sensors/ExternalMQTT/modinfo.json | 58 ++++++++ 3 files changed, 193 insertions(+), 2 deletions(-) create mode 100644 src/modules/sensors/ExternalMQTT/ExternalMQTT.cpp create mode 100644 src/modules/sensors/ExternalMQTT/modinfo.json diff --git a/src/MqttClient.cpp b/src/MqttClient.cpp index a74c66ca..8ec11fe8 100644 --- a/src/MqttClient.cpp +++ b/src/MqttClient.cpp @@ -110,8 +110,8 @@ void mqttSubscribe() { mqtt.subscribe((mqttRootDevice + "/update").c_str()); if (jsonReadBool(settingsFlashJson, "mqttin")) { - mqtt.subscribe((mqttPrefix + "/+/+/event").c_str()); - mqtt.subscribe((mqttPrefix + "/+/+/order").c_str()); + mqtt.subscribe((mqttPrefix + "/+/+/event/#").c_str()); + mqtt.subscribe((mqttPrefix + "/+/+/order/#").c_str()); mqtt.subscribe((mqttPrefix + "/+/+/info").c_str()); } } diff --git a/src/modules/sensors/ExternalMQTT/ExternalMQTT.cpp b/src/modules/sensors/ExternalMQTT/ExternalMQTT.cpp new file mode 100644 index 00000000..3ad82a54 --- /dev/null +++ b/src/modules/sensors/ExternalMQTT/ExternalMQTT.cpp @@ -0,0 +1,133 @@ +#include "Global.h" +#include "classes/IoTItem.h" + +class ExternalMQTT : public IoTItem +{ +private: + String _MAC; + String _sensor; + IoTItem *tmp; + int _minutesPassed = 0; + String json = "{}"; + int orange = 0; + int red = 0; + int offline = 0; + bool dataFromNode = false; + +public: + ExternalMQTT(String parameters) : IoTItem(parameters) + { + _MAC = jsonReadStr(parameters, "MAC"); + _sensor = jsonReadStr(parameters, "sensor"); + jsonRead(parameters, F("orange"), orange); + jsonRead(parameters, F("red"), red); + jsonRead(parameters, F("offline"), offline); + dataFromNode = false; + } + 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; + } + void onMqttRecive(String &topic, String &msg) + { + if (msg.indexOf("HELLO") == -1) + { + + // SerialPrint("i", "onMqttRecive", "Прилетело " + topic); + // SerialPrint("i", "onMqttRecive", "Прилетело " + msg); + String dev = selectToMarkerLast(topic, "/"); + dev.toUpperCase(); + dev.replace(":", ""); + if (_MAC == "") + { + SerialPrint("i", "onMqttRecive", dev + " --> " + msg); + } + DynamicJsonDocument doc(JSON_BUFFER_SIZE); + DeserializationError error = deserializeJson(doc, msg); + if (error) + { + SerialPrint("E", F("onMqttRecive"), error.f_str()); + } + JsonObject jsonObject = doc.as(); + + for (JsonPair kv : jsonObject) + { + String key = kv.key().c_str(); + String val = kv.value(); + if (_MAC == dev && _sensor == key) + { + dataFromNode = true; + _minutesPassed = 0; + setValue(val); + // setNewWidgetAttributes(); + } + + // Serial.println("Key: " + key); + // Serial.println("Value: " + val); + } + } + } + + void doByInterval() + { + _minutesPassed++; + setNewWidgetAttributes(); + } + void onMqttWsAppConnectEvent() + { + setNewWidgetAttributes(); + } + + void setNewWidgetAttributes() + { + + jsonWriteStr(json, F("info"), prettyMinutsTimeout(_minutesPassed)); + if (dataFromNode) + { + if (orange != 0 && red != 0 && offline != 0) + { + if (_minutesPassed < orange) + { + jsonWriteStr(json, F("color"), ""); + } + if (_minutesPassed >= orange && _minutesPassed < red) + { + jsonWriteStr(json, F("color"), F("orange")); // сделаем виджет оранжевым + } + if (_minutesPassed >= red && _minutesPassed < offline) + { + jsonWriteStr(json, F("color"), F("red")); // сделаем виджет красным + } + if (_minutesPassed >= offline) + { + jsonWriteStr(json, F("info"), F("offline")); + } + } + } + else + { + jsonWriteStr(json, F("info"), F("awaiting")); + } + sendSubWidgetsValues(_id, json); + } + + ~ExternalMQTT(){}; +}; + +void *getAPI_ExternalMQTT(String subtype, String param) +{ + if (subtype == F("ExternalMQTT")) + { + return new ExternalMQTT(param); + } + else + { + return nullptr; + } +} diff --git a/src/modules/sensors/ExternalMQTT/modinfo.json b/src/modules/sensors/ExternalMQTT/modinfo.json new file mode 100644 index 00000000..090344e1 --- /dev/null +++ b/src/modules/sensors/ExternalMQTT/modinfo.json @@ -0,0 +1,58 @@ +{ + "menuSection": "Сенсоры", + + "configItem": [ + { + "global": 0, + "name": "MQTT парсер", + "type": "Reading", + "subtype": "ExternalMQTT", + "id": "MQTTin", + "widget": "", + "page": "", + "descr": "", + "MAC": "", + "sensor": "", + "round": "", + "orange": 60, + "red": 120, + "offline": 180, + "int": 60 + } + ], + + "about": { + "authorName": "AVAKS", + "authorContact": "https://t.me/@avaks_dev", + "authorGit": "https://github.com/avaksru", + "specialThanks": "", + "moduleName": "ExternalMQTT", + "moduleVersion": "1", + "usedRam": { + "esp32_4mb": 15, + "esp8266_4mb": 15 + }, + "title": "ExternalMQTT", + "moduleDesc": "Модуль получения данных из OpenMQTTGateway, Zigbee2MQTT, SLS, Tasmota, NodeRead, HA, openHAB, Fhem, domotiz, EEdom", + "propInfo": { + "round": "Округление после запятой.", + "int": "Интервал для изменения цвета", + "orange": "количество минут после которого окрасить виджет в оранжевый цвет", + "red": "количество минут после которого окрасить виджет в красный цвет", + "offline": "количество минут после которого отобразить что устройство offline, если все три orange red и offline поставить в ноль - то функция окраски выключится", + "MAC": "MAC адрес беспроводного датчика", + "sensor": "Тип сенсора: температура / влажность / время / ... " + } + }, + + "defActive": false, + + "usedLibs": { + "esp32_4mb": [], + "esp8266_4mb": [], + "esp8266_1mb": [], + "esp8266_1mb_ota": [], + "esp8285_1mb": [], + "esp8285_1mb_ota": [] + } +}