diff --git a/src/httpserver/http_fns.c b/src/httpserver/http_fns.c index 522484c1b..06f1e8bcb 100644 --- a/src/httpserver/http_fns.c +++ b/src/httpserver/http_fns.c @@ -2264,6 +2264,7 @@ const char* g_obk_flagNames[] = { "[MQTT] Enable Tasmota TELE etc publishes (for ioBroker etc)", "[UART] Enable UART command line", "[LED] Use old linear brightness mode, ignore gamma ramp", + "[MQTT] Apply channel type multiplier on (if any) on channel value before publishing it", "error", "error", "error", diff --git a/src/mqtt/new_mqtt.c b/src/mqtt/new_mqtt.c index 4eb50c41a..ee22c63a4 100644 --- a/src/mqtt/new_mqtt.c +++ b/src/mqtt/new_mqtt.c @@ -1210,19 +1210,63 @@ OBK_Publish_Result MQTT_PublishMain_StringString(const char* sChannel, const cha return MQTT_PublishMain(mqtt_client, sChannel, valueStr, flags, true); } +double MQTT_MultiplierConfiguredOnChannel(int channel, int iVal) { + // Init double variable + double dVal = 0; + + // Checking if flag is set + if (CFG_HasFlag(OBK_FLAG_PUBLISH_MULTIPLIED_VALUES)) { + switch (CHANNEL_GetType(channel)) + { + case ChType_Humidity_div10: + case ChType_Temperature_div10: + case ChType_Voltage_div10: + dVal = (double)iVal / 10; + break; + case ChType_Frequency_div100: + case ChType_Current_div100: + case ChType_EnergyTotal_kWh_div100: + dVal = (double)iVal / 100; + break; + case ChType_PowerFactor_div1000: + case ChType_EnergyTotal_kWh_div1000: + case ChType_EnergyExport_kWh_div1000: + case ChType_EnergyToday_kWh_div1000: + case ChType_Current_div1000: + dVal = (double)iVal / 1000; + break; + default: + break; + } + } + + // Returning double value. If it is zero then we dod nothing, or the value is indeed zero so it doesn't matter if we send a double or int. + return dVal; +} OBK_Publish_Result MQTT_ChannelChangeCallback(int channel, int iVal) { char channelNameStr[8]; char valueStr[16]; int flags; - flags = 0; - addLogAdv(LOG_INFO, LOG_FEATURE_MQTT, "Channel has changed! Publishing %i to channel %i \n", iVal, channel); + // Getting double value if any, and converting if required + double dVal = MQTT_MultiplierConfiguredOnChannel(channel, iVal); + if (dVal == 0) { + // Integer value + addLogAdv(LOG_INFO, LOG_FEATURE_MQTT, "Channel has changed! Publishing %i to channel %i \n", iVal, channel); + sprintf(valueStr, "%i", iVal); + } + else { + // Float value + addLogAdv(LOG_INFO, LOG_FEATURE_MQTT, "Channel has changed! Publishing %f to channel %i \n", dVal, channel); + sprintf(valueStr, "%lf", dVal); + } + flags = 0; MQTT_BroadcastTasmotaTeleSTATE(); + // String from channel number sprintf(channelNameStr, "%i", channel); - sprintf(valueStr, "%i", iVal); // This will set RETAIN flag for all channels that are used for RELAY if (CFG_HasFlag(OBK_FLAG_MQTT_RETAIN_POWER_CHANNELS)) { @@ -1241,10 +1285,21 @@ OBK_Publish_Result MQTT_ChannelPublish(int channel, int flags) iValue = CHANNEL_Get(channel); - addLogAdv(LOG_INFO, LOG_FEATURE_MQTT, "Forced channel publish! Publishing val %i to %i", iValue, channel); + // Getting double value if any, and converting if required + double dVal = MQTT_MultiplierConfiguredOnChannel(channel, iValue); + if (dVal == 0) { + // Integer value + addLogAdv(LOG_INFO, LOG_FEATURE_MQTT, "Forced channel publish! Publishing val %i to %i", iValue, channel); + sprintf(valueStr, "%i", iValue); + } + else { + // Float value + addLogAdv(LOG_INFO, LOG_FEATURE_MQTT, "Forced channel publish! Publishing val %f to %i", dVal, channel); + sprintf(valueStr, "%lf", dVal); + } + // String from channel number sprintf(channelNameStr, "%i", channel); - sprintf(valueStr, "%i", iValue); // This will set RETAIN flag for all channels that are used for RELAY if (CFG_HasFlag(OBK_FLAG_MQTT_RETAIN_POWER_CHANNELS)) { diff --git a/src/new_pins.h b/src/new_pins.h index 3815c8268..e7c5e54f9 100644 --- a/src/new_pins.h +++ b/src/new_pins.h @@ -203,8 +203,9 @@ typedef struct pinsState_s { #define OBK_FLAG_DO_TASMOTA_TELE_PUBLISHES 30 #define OBK_FLAG_CMD_ACCEPT_UART_COMMANDS 31 #define OBK_FLAG_LED_USE_OLD_LINEAR_MODE 32 +#define OBK_FLAG_PUBLISH_MULTIPLIED_VALUES 33 -#define OBK_TOTAL_FLAGS 33 +#define OBK_TOTAL_FLAGS 34 #define CGF_MQTT_CLIENT_ID_SIZE 64