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);