From e88718ada0b7c0409159c010c95508bdbb216047 Mon Sep 17 00:00:00 2001 From: Dmitry Borisenko <49808844+DmitryBorisenko33@users.noreply.github.com> Date: Wed, 2 Dec 2020 04:12:10 +0300 Subject: [PATCH] 268 Single Scenario changed to MQTT source --- data/config.json | 3 +- data/set.device.json | 10 +++--- include/Consts.h | 7 ++-- include/MqttClient.h | 1 + src/Class/ScenarioClass3.cpp | 2 +- src/MqttClient.cpp | 64 ++++++++++++++++++++++++++---------- src/RemoteOrdersUdp.cpp | 2 +- src/Web.cpp | 28 ++++++++++++---- 8 files changed, 83 insertions(+), 34 deletions(-) diff --git a/data/config.json b/data/config.json index bc169e5b..d5ebf98f 100644 --- a/data/config.json +++ b/data/config.json @@ -17,7 +17,8 @@ "telegonof": "0", "weblogin": "admin", "webpass": "admin", - "onescen": "1", + "snaUdp": "0", + "snaMqtt": "0", "blink": "1", "oneWirePin": "2", "serverip": "http://206.189.49.244" diff --git a/data/set.device.json b/data/set.device.json index 297c9c37..a8438cc1 100644 --- a/data/set.device.json +++ b/data/set.device.json @@ -172,18 +172,18 @@ }, { "type": "checkbox", - "name": "onescen", + "name": "snaMqtt", "title": "Включить единые сценарии для всех устройств", - "action": "/set?onescen=[[onescen]]", - "state": "{{onescen}}" + "action": "/set?snaMqtt=[[snaMqtt]]", + "state": "{{snaMqtt}}" }, { "type": "hr" }, { "type": "button", - "title": "Отправить сценарии всем устройствам в локальной сети", - "action": "/set?scenudp", + "title": "Синхронизировать сценарии на всех устройствах", + "action": "/set?scenMqtt", "class": "btn btn-block btn-default" }, { diff --git a/include/Consts.h b/include/Consts.h index d33a22dc..5f679e8c 100644 --- a/include/Consts.h +++ b/include/Consts.h @@ -3,11 +3,11 @@ //===========Firmware============================================================================================================================================= #ifdef ESP8266 #define FIRMWARE_NAME "esp8266-iotm" -#define FIRMWARE_VERSION 267 +#define FIRMWARE_VERSION 268 #endif #ifdef ESP32 #define FIRMWARE_NAME "esp32-iotm" -#define FIRMWARE_VERSION 267 +#define FIRMWARE_VERSION 268 #endif #define FLASH_4MB true @@ -31,7 +31,7 @@ //#define MDNS_ENABLED //#define WEBSOCKET_ENABLED //#define LAYOUT_IN_RAM -#define UDP_ENABLED +//#define UDP_ENABLED //#define SSDP_ENABLED //=========Sensors enable/disable================================================================================================================================= @@ -87,6 +87,7 @@ enum NotAsyncActions { do_deviceInit, do_delChoosingItems, do_sendScenUDP, + do_sendScenMQTT, do_LAST, }; diff --git a/include/MqttClient.h b/include/MqttClient.h index 1acc89b3..f2d7b82c 100644 --- a/include/MqttClient.h +++ b/include/MqttClient.h @@ -17,6 +17,7 @@ boolean publishChart(const String& topic, const String& data); boolean publishControl(String id, String topic, String state); boolean publishChart_test(const String& topic, const String& data); boolean publishStatus(const String& topic, const String& data); +boolean publishInfo(const String& topic, const String& data); void publishWidgets(); void publishState(); diff --git a/src/Class/ScenarioClass3.cpp b/src/Class/ScenarioClass3.cpp index 5bd439c9..085f8784 100644 --- a/src/Class/ScenarioClass3.cpp +++ b/src/Class/ScenarioClass3.cpp @@ -16,7 +16,7 @@ void eventGen2(String eventName, String eventValue) { void streamEventUDP(String event) { #ifdef UDP_ENABLED - if (!jsonReadBool(configSetupJson, "onescen")) { + if (!jsonReadBool(configSetupJson, "snaUdp")) { return; } diff --git a/src/MqttClient.cpp b/src/MqttClient.cpp index 38844fb0..3486745d 100644 --- a/src/MqttClient.cpp +++ b/src/MqttClient.cpp @@ -39,6 +39,13 @@ void mqttInit() { } }, nullptr, true); + + myNotAsyncActions->add( + do_sendScenMQTT, [&](void*) { + String scen = readFile(String(DEVICE_SCENARIO_FILE), 2048); + publishInfo("scen", scen); + }, + nullptr); } void mqttDisconnect() { @@ -63,8 +70,11 @@ void mqttSubscribe() { mqtt.subscribe(mqttPrefix.c_str()); mqtt.subscribe((mqttRootDevice + "/+/control").c_str()); mqtt.subscribe((mqttRootDevice + "/update").c_str()); - //mqtt.subscribe((mqttRootDevice + "/order").c_str()); - //mqtt.subscribe((mqttPrefix + "/event").c_str()); + + if (jsonReadBool(configSetupJson, "snaMqtt")) { + mqtt.subscribe((mqttPrefix + "/+/+/status").c_str()); + mqtt.subscribe((mqttPrefix + "/+/+/info").c_str()); + } } boolean mqttConnect() { @@ -101,14 +111,14 @@ boolean mqttConnect() { void mqttCallback(char* topic, uint8_t* payload, size_t length) { String topicStr = String(topic); - SerialPrint("I", "MQTT", topicStr); + //SerialPrint("I", "=>MQTT", topicStr); String payloadStr; payloadStr.reserve(length + 1); for (size_t i = 0; i < length; i++) { payloadStr += (char)payload[i]; } - SerialPrint("I", "MQTT", payloadStr); + //SerialPrint("I", "=>MQTT", payloadStr); if (payloadStr.startsWith("HELLO")) { SerialPrint("I", "MQTT", "Full update"); @@ -119,7 +129,8 @@ void mqttCallback(char* topic, uint8_t* payload, size_t length) { #endif } - else if (topicStr.indexOf("control")) { + + else if (topicStr.indexOf("control") != -1) { String key = selectFromMarkerToMarker(topicStr, "/", 3); @@ -128,23 +139,37 @@ void mqttCallback(char* topic, uint8_t* payload, size_t length) { orderBuf += payloadStr; orderBuf += ","; - } - else if (topicStr.indexOf("order")) { - //payloadStr.replace("_", " "); - //orderBuf += payloadStr; - //orderBuf += ","; - + SerialPrint("I", "=>MQTT", "Msg from iotmanager app: " + key + " " + payloadStr); } - //else if (topicStr.indexOf("event")) { - // eventBuf += payloadStr; - //} + else if (topicStr.indexOf("status") != -1) { + if (!jsonReadBool(configSetupJson, "snaMqtt")) { + return; + } + if (topicStr.indexOf(chipId) == -1) { + String devId = selectFromMarkerToMarker(topicStr, "/", 2); + String key = selectFromMarkerToMarker(topicStr, "/", 3); + String value = jsonReadStr(payloadStr, "status"); - else if (topicStr.indexOf("update")) { - if (payloadStr == "1") { - myNotAsyncActions->make(do_UPGRADE); + SerialPrint("I", "=>MQTT", "Msg from other device: '" + devId + "' " + key + " " + value); + + eventGen2(key, value); } } + + else if (topicStr.indexOf("info") != -1) { + if (topicStr.indexOf("scen") != -1) { + writeFile(String(DEVICE_SCENARIO_FILE), payloadStr); + loadScenario(); + SerialPrint("I", "=>MQTT", "Scenario received"); + } + } + + //else if (topicStr.indexOf("update")) { + // if (payloadStr == "1") { + // myNotAsyncActions->make(do_UPGRADE); + // } + //} } boolean publish(const String& topic, const String& data) { @@ -190,6 +215,11 @@ boolean publishStatus(const String& topic, const String& data) { return mqtt.publish(path.c_str(), json.c_str(), false); } +boolean publishInfo(const String& topic, const String& data) { + String path = mqttRootDevice + "/" + topic + "/info"; + return mqtt.publish(path.c_str(), data.c_str(), false); +} + #ifdef LAYOUT_IN_RAM void publishWidgets() { if (all_widgets != "") { diff --git a/src/RemoteOrdersUdp.cpp b/src/RemoteOrdersUdp.cpp index 2a705c68..c3428fec 100644 --- a/src/RemoteOrdersUdp.cpp +++ b/src/RemoteOrdersUdp.cpp @@ -9,7 +9,7 @@ AsyncUDP asyncUdp; void asyncUdpInit() { - if (!jsonReadBool(configSetupJson, "onescen")) { + if (!jsonReadBool(configSetupJson, "snaUdp")) { return; } diff --git a/src/Web.cpp b/src/Web.cpp index 3cef8edc..d3b68397 100644 --- a/src/Web.cpp +++ b/src/Web.cpp @@ -61,16 +61,32 @@ void web_init() { request->send(200); } - if (request->hasArg("onescen")) { - bool value = request->getParam("onescen")->value().toInt(); - jsonWriteBool(configSetupJson, "onescen", value); + //if (request->hasArg("snaUdp")) { + // bool value = request->getParam("snaUdp")->value().toInt(); + // jsonWriteBool(configSetupJson, "snaUdp", value); + // saveConfig(); + // #ifdef UDP_ENABLED + // asyncUdpInit(); + // #endif + // request->send(200); + //} + + //if (request->hasArg("scenUdp")) { + // myNotAsyncActions->make(do_sendScenUDP); + // request->send(200); + //} + + if (request->hasArg("snaMqtt")) { + bool value = request->getParam("snaMqtt")->value().toInt(); + jsonWriteBool(configSetupJson, "snaMqtt", value); saveConfig(); - asyncUdpInit(); + mqtt.subscribe((mqttPrefix + "/+/+/status").c_str()); + mqtt.subscribe((mqttPrefix + "/+/+/info").c_str()); request->send(200); } - if (request->hasArg("scenudp")) { - myNotAsyncActions->make(do_sendScenUDP); + if (request->hasArg("scenMqtt")) { + myNotAsyncActions->make(do_sendScenMQTT); request->send(200); }