diff --git a/src/httpserver/http_fns.c b/src/httpserver/http_fns.c index 06c73f9cd..c0d2b9305 100644 --- a/src/httpserver/http_fns.c +++ b/src/httpserver/http_fns.c @@ -367,16 +367,7 @@ int http_fn_index(http_request_t* request) { } channelType = CHANNEL_GetType(i); - if (channelType == ChType_Temperature) { - - iValue = CHANNEL_Get(i); - poststr(request, ""); - hprintf255(request, "Temperature Channel %s value %i C
", CHANNEL_GetLabel(i), iValue); - poststr(request, ""); - - } - else if (channelType == ChType_TimerSeconds) { - + if (channelType == ChType_TimerSeconds) { iValue = CHANNEL_Get(i); poststr(request, ""); @@ -398,65 +389,6 @@ int http_fn_index(http_request_t* request) { } poststr(request, ""); - } - else if (channelType == ChType_Temperature_div2) { - - iValue = CHANNEL_Get(i); - fValue = iValue * 0.5f; - - poststr(request, ""); - hprintf255(request, "Temperature Channel %s value %.2f C
", CHANNEL_GetLabel(i), fValue); - poststr(request, ""); - - } - else if (channelType == ChType_Temperature_div10) { - - iValue = CHANNEL_Get(i); - fValue = iValue * 0.1f; - - poststr(request, ""); - hprintf255(request, "Temperature Channel %s value %.2f C
", CHANNEL_GetLabel(i), fValue); - poststr(request, ""); - - } - else if (channelType == ChType_Pressure_div100) { - - iValue = CHANNEL_Get(i); - fValue = iValue * 0.01f; - - poststr(request, ""); - hprintf255(request, "Pressure Channel %s value %.2f hPa
", CHANNEL_GetLabel(i), fValue); - poststr(request, ""); - - } - else if (channelType == ChType_Temperature_div100) { - - iValue = CHANNEL_Get(i); - fValue = iValue * 0.01f; - - poststr(request, ""); - hprintf255(request, "Temperature Channel %s value %.2f C
", CHANNEL_GetLabel(i), fValue); - poststr(request, ""); - - } - else if (channelType == ChType_Humidity) { - - iValue = CHANNEL_Get(i); - - poststr(request, ""); - hprintf255(request, "Humidity Channel %s value %i Percent
", CHANNEL_GetLabel(i), iValue); - poststr(request, ""); - - } - else if (channelType == ChType_Humidity_div10) { - - iValue = CHANNEL_Get(i); - fValue = iValue * 0.1f; - - poststr(request, ""); - hprintf255(request, "Humidity Channel %s value %.2f Percent
", CHANNEL_GetLabel(i), fValue); - poststr(request, ""); - } else if (channelType == ChType_LowMidHigh) { const char* types[] = { "Low","Mid","High" }; @@ -550,13 +482,6 @@ int http_fn_index(http_request_t* request) { poststr(request, ""); } - else if (channelType == ChType_Illuminance) { - iValue = CHANNEL_Get(i); - - poststr(request, ""); - hprintf255(request, "Illuminance (%s) = %i Lux", CHANNEL_GetLabel(i), iValue); - poststr(request, ""); - } else if (channelType == ChType_ReadOnly) { iValue = CHANNEL_Get(i); @@ -564,132 +489,6 @@ int http_fn_index(http_request_t* request) { hprintf255(request, "Channel %s = %i", CHANNEL_GetLabel(i), iValue); poststr(request, ""); } - else if (channelType == ChType_Frequency_div100) { - iValue = CHANNEL_Get(i); - fValue = iValue * 0.01f; - - poststr(request, ""); - hprintf255(request, "Frequency %.2fHz (ch %s)", fValue, CHANNEL_GetLabel(i)); - poststr(request, ""); - } - else if (channelType == ChType_Frequency_div10) { - iValue = CHANNEL_Get(i); - fValue = iValue * 0.1f; - - poststr(request, ""); - hprintf255(request, "Frequency %.2fHz (ch %s)", fValue, CHANNEL_GetLabel(i)); - poststr(request, ""); - } - else if (channelType == ChType_EnergyToday_kWh_div1000) { - iValue = CHANNEL_Get(i); - fValue = iValue * 0.001f; - - poststr(request, ""); - hprintf255(request, "EnergyToday %.2fkWh (ch %s)", fValue, CHANNEL_GetLabel(i)); - poststr(request, ""); - } - else if (channelType == ChType_EnergyExport_kWh_div1000) { - iValue = CHANNEL_Get(i); - fValue = iValue * 0.001f; - - poststr(request, ""); - hprintf255(request, "EnergyExport(back to grid) %.2fkWh (ch %s)", fValue, CHANNEL_GetLabel(i)); - poststr(request, ""); - } - else if (channelType == ChType_EnergyTotal_kWh_div1000) { - iValue = CHANNEL_Get(i); - fValue = iValue * 0.001f; - - poststr(request, ""); - hprintf255(request, "EnergyTotal %.2fkWh (ch %s)", fValue, CHANNEL_GetLabel(i)); - poststr(request, ""); - } - else if (channelType == ChType_EnergyTotal_kWh_div100) { - iValue = CHANNEL_Get(i); - fValue = iValue * 0.01f; - - poststr(request, ""); - hprintf255(request, "EnergyTotal %.2fkWh (ch %s)", fValue, CHANNEL_GetLabel(i)); - poststr(request, ""); - } - else if (channelType == ChType_Voltage_div10) { - iValue = CHANNEL_Get(i); - fValue = iValue * 0.1f; - - poststr(request, ""); - hprintf255(request, "Voltage %.2fV (ch %s)", fValue, CHANNEL_GetLabel(i)); - poststr(request, ""); - } - else if (channelType == ChType_Voltage_div100) { - iValue = CHANNEL_Get(i); - fValue = iValue * 0.01f; - - poststr(request, ""); - hprintf255(request, "Voltage %.3fV (ch %s)", fValue, CHANNEL_GetLabel(i)); - poststr(request, ""); - } - else if (channelType == ChType_ReactivePower) { - iValue = CHANNEL_Get(i); - - poststr(request, ""); - hprintf255(request, "ReactivePower %iVAr (ch %s)", iValue, CHANNEL_GetLabel(i)); - poststr(request, ""); - } - else if (channelType == ChType_Power_div10) { - iValue = CHANNEL_Get(i); - - poststr(request, ""); - hprintf255(request, "Power %.2fW (ch %s)", (iValue * 0.1f), CHANNEL_GetLabel(i)); - poststr(request, ""); - } - else if (channelType == ChType_Power) { - iValue = CHANNEL_Get(i); - - poststr(request, ""); - hprintf255(request, "Power %iW (ch %s)", iValue, CHANNEL_GetLabel(i)); - poststr(request, ""); - } - else if (channelType == ChType_PowerFactor_div1000) { - iValue = CHANNEL_Get(i); - fValue = iValue * 0.001f; - - poststr(request, ""); - hprintf255(request, "PowerFactor %.4f (ch %i)", fValue, i); - poststr(request, ""); - } - else if (channelType == ChType_PowerFactor_div100) { - iValue = CHANNEL_Get(i); - fValue = iValue * 0.01f; - - poststr(request, ""); - hprintf255(request, "PowerFactor %.4f (ch %i)", fValue, i); - poststr(request, ""); - } - else if (channelType == ChType_Current_div100) { - iValue = CHANNEL_Get(i); - fValue = iValue * 0.01f; - - poststr(request, ""); - hprintf255(request, "Current %.3fA (ch %s)", fValue, CHANNEL_GetLabel(i)); - poststr(request, ""); - } - else if (channelType == ChType_Current_div1000) { - iValue = CHANNEL_Get(i); - fValue = iValue * 0.001f; - - poststr(request, ""); - hprintf255(request, "Current %.4fA (ch %s)", fValue, CHANNEL_GetLabel(i)); - poststr(request, ""); - } - else if (channelType == ChType_BatteryLevelPercent) { - iValue = CHANNEL_Get(i); - - poststr(request, ""); - hprintf255(request, "Battery level: %i", iValue); - poststr(request, "%"); - hprintf255(request, " (ch %i)", i); - poststr(request, ""); - } else if (channelType == ChType_OpenClosed) { iValue = CHANNEL_Get(i); @@ -759,6 +558,34 @@ int http_fn_index(http_request_t* request) { poststr(request, ""); } + else { + const char *channelTitle; + + channelTitle = ChannelType_GetTitle(channelType); + + if (*channelTitle) { + int div; + const char *channelUnit; + char formatStr[16]; + strcpy(formatStr, " %.4f"); + + div = ChannelType_GetDivider(channelType); + channelUnit = ChannelType_GetUnit(channelType); + + iValue = CHANNEL_Get(i); + fValue = (float)iValue / (float)div; + + poststr(request, ""); + poststr(request, channelTitle); + // how many decimal places? + formatStr[3] = '0'+ChannelType_GetDecimalPlaces(channelType); + + hprintf255(request, formatStr, fValue); + poststr(request, channelUnit); + hprintf255(request, " (%s)", CHANNEL_GetLabel(i)); + poststr(request, ""); + } + } } if (bRawPWMs == 0 || bForceShowRGBCW || bForceShowRGB) { @@ -2094,6 +1921,7 @@ void doHomeAssistantDiscovery(const char* topic, http_request_t* request) { discoveryQueued = true; } break; + case ChType_LeakageCurrent_div1000: case ChType_Current_div1000: { dev_info = hass_init_sensor_device_info(CURRENT_SENSOR, i, 3, 3, 1); diff --git a/src/new_pins.c b/src/new_pins.c index 5321e6432..3cf26dfbc 100644 --- a/src/new_pins.c +++ b/src/new_pins.c @@ -1038,20 +1038,27 @@ void CFG_ApplyChannelStartValues() { } } } -float CHANNEL_GetFinalValue(int channel) { - int iVal; - float dVal; - iVal = CHANNEL_Get(channel); +int ChannelType_GetDecimalPlaces(int type) { + int pl; - switch (CHANNEL_GetType(channel)) + int div = ChannelType_GetDivider(type); + int cur = 10; + for (pl = 0; pl < 6; pl++) { + if (div < cur) + return pl + 1; + cur *= 10; + } + return pl; +} +int ChannelType_GetDivider(int type) { + switch (type) { case ChType_Humidity_div10: case ChType_Temperature_div10: case ChType_Voltage_div10: case ChType_Power_div10: case ChType_Frequency_div10: - dVal = (float)iVal / 10; - break; + return 10; case ChType_Frequency_div100: case ChType_Current_div100: case ChType_EnergyTotal_kWh_div100: @@ -1059,19 +1066,113 @@ float CHANNEL_GetFinalValue(int channel) { case ChType_PowerFactor_div100: case ChType_Pressure_div100: case ChType_Temperature_div100: - dVal = (float)iVal / 100; - break; + return 100; case ChType_PowerFactor_div1000: case ChType_EnergyTotal_kWh_div1000: case ChType_EnergyExport_kWh_div1000: case ChType_EnergyToday_kWh_div1000: case ChType_Current_div1000: - dVal = (float)iVal / 1000; - break; - default: - dVal = (float)iVal; - break; + return 1000; + case ChType_Temperature_div2: + return 2; } + return 1; +} +const char *ChannelType_GetUnit(int type) { + switch (type) + { + case ChType_BatteryLevelPercent: + case ChType_Humidity: + case ChType_Humidity_div10: + return "%"; + case ChType_Temperature_div100: + case ChType_Temperature_div10: + case ChType_Temperature_div2: + case ChType_Temperature: + return "C"; + case ChType_Voltage_div100: + case ChType_Voltage_div10: + return "V"; + case ChType_Power: + case ChType_Power_div10: + return "W"; + case ChType_Frequency_div10: + case ChType_Frequency_div100: + return "Hz"; + case ChType_LeakageCurrent_div1000: + case ChType_Current_div1000: + case ChType_Current_div100: + return "A"; + case ChType_EnergyTotal_kWh_div1000: + case ChType_EnergyExport_kWh_div1000: + case ChType_EnergyToday_kWh_div1000: + case ChType_EnergyTotal_kWh_div100: + return "kWh"; + case ChType_PowerFactor_div1000: + case ChType_PowerFactor_div100: + return ""; + case ChType_Pressure_div100: + return "hPa"; + case ChType_ReactivePower: + return "vAr"; + case ChType_Illuminance: + return "Lux"; + } + return ""; +} +const char *ChannelType_GetTitle(int type) { + switch (type) + { + case ChType_BatteryLevelPercent: + return "Battery"; + case ChType_Humidity: + case ChType_Humidity_div10: + return "Humidity"; + case ChType_Temperature_div100: + case ChType_Temperature_div10: + case ChType_Temperature_div2: + case ChType_Temperature: + return "Temperature"; + case ChType_Voltage_div100: + case ChType_Voltage_div10: + return "Voltage"; + case ChType_Power: + case ChType_Power_div10: + return "Power"; + case ChType_Frequency_div10: + case ChType_Frequency_div100: + return "Frequency"; + case ChType_Current_div1000: + case ChType_Current_div100: + return "Current"; + case ChType_LeakageCurrent_div1000: + return "Leakage"; + case ChType_EnergyTotal_kWh_div1000: + case ChType_EnergyTotal_kWh_div100: + return "EnergyTotal"; + case ChType_EnergyExport_kWh_div1000: + return "EnergyExport"; + case ChType_EnergyToday_kWh_div1000: + return "EnergyToday"; + case ChType_PowerFactor_div1000: + case ChType_PowerFactor_div100: + return "PowerFactor"; + case ChType_Pressure_div100: + return "Pressure"; + case ChType_ReactivePower: + return "ReactivePower"; + case ChType_Illuminance: + return "Illuminance"; + } + return ""; +} +float CHANNEL_GetFinalValue(int channel) { + int iVal; + float dVal; + + iVal = CHANNEL_Get(channel); + iVal /= ChannelType_GetDivider(CHANNEL_GetType(channel)); + return dVal; } float CHANNEL_GetFloat(int ch) { @@ -1880,7 +1981,7 @@ const char* g_channelTypeNames[] = { "PowerFactor_div100", "Pressure_div100", "Temperature_div100", - "error", + "LeakageCurrent_div1000", "error", "error", }; diff --git a/src/new_pins.h b/src/new_pins.h index 362404498..673e692e1 100644 --- a/src/new_pins.h +++ b/src/new_pins.h @@ -901,6 +901,13 @@ typedef enum channelType_e { //chandetail:"file":"new_pins.h", //chandetail:"driver":""} ChType_Temperature_div100, + //chandetail:{"name":"LeakageCurrent_div1000", + //chandetail:"title":"TODO", + //chandetail:"descr":".", + //chandetail:"enum":"ChType_LeakageCurrent_div1000", + //chandetail:"file":"new_pins.h", + //chandetail:"driver":""} + ChType_LeakageCurrent_div1000, //chandetail:{"name":"Max", //chandetail:"title":"TODO", //chandetail:"descr":"This is the current total number of available channel types.", @@ -1296,6 +1303,10 @@ int h_isChannelPWM(int tg_ch); int h_isChannelRelay(int tg_ch); int h_isChannelDigitalInput(int tg_ch); +const char *ChannelType_GetTitle(int type); +const char *ChannelType_GetUnit(int type); +int ChannelType_GetDivider(int type); +int ChannelType_GetDecimalPlaces(int type); //int PIN_GetPWMIndexForPinIndex(int pin);