diff --git a/src/driver/drv_tuyaMCU.c b/src/driver/drv_tuyaMCU.c index bb2b0428d..321ddfc99 100644 --- a/src/driver/drv_tuyaMCU.c +++ b/src/driver/drv_tuyaMCU.c @@ -727,6 +727,17 @@ void TuyaMCU_ApplyMapping(int fnID, int value) { CHANNEL_Set(mapping->channel,mappedValue,0); } +bool TuyaMCU_IsChannelUsedByTuyaMCU(int channel) { + tuyaMCUMapping_t *mapping; + + // find mapping + mapping = TuyaMCU_FindDefForChannel(channel); + + if (mapping == 0) { + return false; + } + return true; +} void TuyaMCU_OnChannelChanged(int channel, int iVal) { tuyaMCUMapping_t *mapping; int mappediVal = iVal; diff --git a/src/driver/drv_tuyaMCU.h b/src/driver/drv_tuyaMCU.h index 348aacf2b..802875162 100644 --- a/src/driver/drv_tuyaMCU.h +++ b/src/driver/drv_tuyaMCU.h @@ -5,3 +5,5 @@ void TuyaMCU_RunFrame(); void TuyaMCU_Send(byte *data, int size); void TuyaMCU_OnChannelChanged(int channel,int iVal); void TuyaMCU_Send_RawBuffer(byte *data, int len); +bool TuyaMCU_IsChannelUsedByTuyaMCU(int channelIndex); + diff --git a/src/driver/drv_tuyaMCUSensor.c b/src/driver/drv_tuyaMCUSensor.c index 2ef49319a..0fe1a8d99 100644 --- a/src/driver/drv_tuyaMCUSensor.c +++ b/src/driver/drv_tuyaMCUSensor.c @@ -13,6 +13,8 @@ static int g_elapsedTime = 0; static int g_hadMQTT = 0; +static int g_delay_between_publishes = 10; +static int g_cur_delay_publish = 0; static byte g_hello[] = { 0x55, 0xAA, 0x00, 0x01, 0x00, 0x00, 0x00 }; static byte g_request_state[] = { 0x55, 0xAA, 0x00, 0x02, 0x00, 0x01, 0x04, 0x06 }; @@ -33,6 +35,10 @@ void TuyaMCU_Sensor_RunFrame() { if(Main_HasMQTTConnected()) { g_hadMQTT++; if(g_hadMQTT > 2){ + g_cur_delay_publish--; + if (g_cur_delay_publish <= 0) { + + } MQTT_PublishOnlyDeviceChannelsIfPossible(); } } else { diff --git a/src/httpserver/http_fns.c b/src/httpserver/http_fns.c index 44e5be31c..ba27b4e2d 100644 --- a/src/httpserver/http_fns.c +++ b/src/httpserver/http_fns.c @@ -2359,7 +2359,7 @@ const char* g_obk_flagNames[] = { "[MQTT] Broadcast led final color RGBCW (topic name: YourDevName/led_finalcolor_rgbcw/get)", "[LED] Automatically enable Light when changing brightness, color or temperature on WWW panel", "[LED] Smooth transitions for LED (EXPERIMENTAL)", - "error", + "[MQTT] Always publish channels used by TuyaMCU", "error", "error", }; diff --git a/src/mqtt/new_mqtt.c b/src/mqtt/new_mqtt.c index fffda134b..0c0d1ceca 100644 --- a/src/mqtt/new_mqtt.c +++ b/src/mqtt/new_mqtt.c @@ -9,6 +9,7 @@ #include "../hal/hal_wifi.h" #include "../driver/drv_public.h" #include "../driver/drv_ntp.h" +#include "../driver/drv_tuyaMCU.h" #include "../ota/ota.h" #ifndef LWIP_MQTT_EXAMPLE_IPADDR_INIT @@ -1136,8 +1137,10 @@ OBK_Publish_Result MQTT_DoItemPublishString(const char* sChannel, const char* va OBK_Publish_Result MQTT_DoItemPublish(int idx) { + int type; int role; char dataStr[3 * 6 + 1]; //This is sufficient to hold mac value + bool bWantsToPublish; switch (idx) { case PUBLISHITEM_SELF_STATIC_RESERVED_2: @@ -1205,8 +1208,19 @@ OBK_Publish_Result MQTT_DoItemPublish(int idx) // We do not need raw values for RGBCW lights (or RGB, etc) // because we are using led_basecolor_rgb, led_dimmer, led_enableAll, etc // NOTE: negative indexes are not channels - they are special values + bWantsToPublish = false; role = CHANNEL_GetRoleForOutputChannel(idx); if (role == IOR_Relay || role == IOR_Relay_n || role == IOR_LED || role == IOR_LED_n) { + bWantsToPublish = true; + } + // publish if channel is used by TuyaMCU (no pin role set), for example door sensor state with power saving V0 protocol + // Not enabled by default, you have to set OBK_FLAG_TUYAMCU_ALWAYSPUBLISHCHANNELS flag + if (CFG_HasFlag(OBK_FLAG_TUYAMCU_ALWAYSPUBLISHCHANNELS) && TuyaMCU_IsChannelUsedByTuyaMCU(idx)) { + bWantsToPublish = true; + } + // TODO + //type = CHANNEL_GetType(idx); + if (bWantsToPublish) { return MQTT_ChannelPublish(g_publishItemIndex, OBK_PUBLISH_FLAG_MUTEX_SILENT); } diff --git a/src/new_pins.h b/src/new_pins.h index bbc10a8a5..cc36cdad8 100644 --- a/src/new_pins.h +++ b/src/new_pins.h @@ -157,9 +157,10 @@ typedef struct pinsState_s { #define OBK_FLAG_LED_BROADCAST_FULL_RGBCW 16 #define OBK_FLAG_LED_AUTOENABLE_ON_WWW_ACTION 17 #define OBK_FLAG_LED_SMOOTH_TRANSITIONS 18 +#define OBK_FLAG_TUYAMCU_ALWAYSPUBLISHCHANNELS 19 -#define OBK_TOTAL_FLAGS 19 +#define OBK_TOTAL_FLAGS 20 #define CGF_MQTT_CLIENT_ID_SIZE 64