Change display of energy values in GUI

Change display of energy values in GUI use columns when define ``USE_ENERGY_COLUMN_GUI`` is enabled (default)
This commit is contained in:
Theo Arends 2022-03-15 15:43:23 +01:00
parent a1a5bd6b21
commit 4c3f223ddf
6 changed files with 144 additions and 79 deletions

View File

@ -11,8 +11,9 @@ All notable changes to this project will be documented in this file.
### Changed
- Consolidate three RTC chip drivers (DS3231, BM8563, PCF85363) into one driver updating RTC as soon as possible after restart
- Removed command ``Sensor33`` and replaced by ``RtcNtpserver``
- define ``USE_RTC_ADDR`` into ``DS3231_ADDRESS``
- DS3231 I2C address define ``USE_RTC_ADDR`` into ``DS3231_ADDRESS``
- NeoPool remove ambiguous device color names
- Display of energy values in GUI use columns when define ``USE_ENERGY_COLUMN_GUI`` is enabled (default)
### Fixed
- NeoPool NPBit and NPRead/NPReadL output

View File

@ -132,7 +132,8 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo
- Extent number of pulsetimers from 8 to 32 [#8266](https://github.com/arendst/Tasmota/issues/8266)
- Consolidate three RTC chip drivers (DS3231, BM8563, PCF85363) into one driver updating RTC as soon as possible after restart
- Removed command ``Sensor33`` and replaced by ``RtcNtpserver``
- define ``USE_RTC_ADDR`` into ``DS3231_ADDRESS``
- DS3231 I2C address define ``USE_RTC_ADDR`` into ``DS3231_ADDRESS``
- Display of energy values in GUI use columns when define ``USE_ENERGY_COLUMN_GUI`` is enabled (default)
- ESP32 Arduino core from v2.0.2.2 to v2.0.2.3
- ESP32 LVGL library from v8.1.0 to v8.2.0
- ESP32 NimBLE library from v1.3.3 to v1.3.6

View File

@ -775,6 +775,7 @@
// -- Power monitoring sensors --------------------
#define USE_ENERGY_SENSOR // Add support for Energy Monitors (+14k code)
#define USE_ENERGY_COLUMN_GUI // Add support for column display in GUI (+0k5 code)
#define USE_ENERGY_MARGIN_DETECTION // Add support for Energy Margin detection (+1k6 code)
#define USE_ENERGY_POWER_LIMIT // Add additional support for Energy Power Limit detection (+1k2 code)
#define USE_ENERGY_DUMMY // Add support for dummy Energy monitor allowing user values (+0k7 code)

View File

@ -370,7 +370,7 @@ enum LightTypes { LT_BASIC, LT_PWM1, LT_PWM2, LT_PWM3, LT_PWM4, LT
enum XsnsFunctions {FUNC_SETTINGS_OVERRIDE, FUNC_PIN_STATE, FUNC_MODULE_INIT, FUNC_PRE_INIT, FUNC_INIT,
FUNC_LOOP, FUNC_EVERY_50_MSECOND, FUNC_EVERY_100_MSECOND, FUNC_EVERY_200_MSECOND, FUNC_EVERY_250_MSECOND, FUNC_EVERY_SECOND,
FUNC_SAVE_SETTINGS, FUNC_SAVE_AT_MIDNIGHT, FUNC_SAVE_BEFORE_RESTART,
FUNC_AFTER_TELEPERIOD, FUNC_JSON_APPEND, FUNC_WEB_SENSOR, FUNC_COMMAND, FUNC_COMMAND_SENSOR, FUNC_COMMAND_DRIVER,
FUNC_AFTER_TELEPERIOD, FUNC_JSON_APPEND, FUNC_WEB_SENSOR, FUNC_WEB_COL_SENSOR, FUNC_COMMAND, FUNC_COMMAND_SENSOR, FUNC_COMMAND_DRIVER,
FUNC_MQTT_SUBSCRIBE, FUNC_MQTT_INIT, FUNC_MQTT_DATA,
FUNC_SET_POWER, FUNC_SET_DEVICE_POWER, FUNC_SHOW_SENSOR, FUNC_ANY_KEY,
FUNC_ENERGY_EVERY_SECOND, FUNC_ENERGY_RESET,

View File

@ -71,8 +71,6 @@ void (* const EnergyCommand[])(void) PROGMEM = {
#endif // USE_ENERGY_MARGIN_DETECTION
&CmndEnergyToday, &CmndEnergyYesterday, &CmndEnergyTotal, &CmndEnergyUsage, &CmndEnergyExport, &CmndTariff};
const char kEnergyPhases[] PROGMEM = "|%*_f / %*_f|%*_f / %*_f / %*_f||[%*_f,%*_f]|[%*_f,%*_f,%*_f]";
struct ENERGY {
float voltage[ENERGY_MAX_PHASES]; // 123.1 V
float current[ENERGY_MAX_PHASES]; // 123.123 A
@ -134,39 +132,68 @@ Ticker ticker_energy;
/********************************************************************************************/
char* EnergyFormatIndex(char* result, float* input, uint32_t resolution, bool json, uint32_t index, bool single = false) {
char layout[20];
GetTextIndexed(layout, sizeof(layout), (index -1) + (ENERGY_MAX_PHASES * json), kEnergyPhases);
switch (index) {
case 2:
ext_snprintf_P(result, FLOATSZ * ENERGY_MAX_PHASES, layout, resolution, &input[0], resolution, &input[1]);
break;
case 3:
ext_snprintf_P(result, FLOATSZ * ENERGY_MAX_PHASES, layout, resolution, &input[0], resolution, &input[1], resolution, &input[2]);
break;
default:
ext_snprintf_P(result, FLOATSZ * ENERGY_MAX_PHASES, PSTR("%*_f"), resolution, &input[0]);
char* EnergyFormat(char* result, float* input, uint32_t resolution, uint32_t single = 0);
char* EnergyFormat(char* result, float* input, uint32_t resolution, uint32_t single) {
// single = 0 - Energy.phase_count - xx or [xx,xx] or [xx,xx,xx]
// single = 1 - Energy.voltage_common or Energy.frequency_common - xx
// single = 2 - Sum of Energy.phase_count - xx
// single = 5 - single &0x03 = 1 - xx
// single = 6 - single &0x03 = 2 - [xx,xx] - used by tarriff
// single = 7 - single &0x03 = 3 - [xx,xx,xx]
uint32_t index = (single > 3) ? single &0x03 : (0 == single) ? Energy.phase_count : 1; // 1,2,3
if (single > 2) { single = 0; } // 0,1,2
if (single > 1) {
float input_sum = 0.0;
if (!Settings->flag5.energy_phase) { // SetOption129 - (Energy) Show phase information
for (uint32_t i = 0; i < Energy.phase_count; i++) {
input_sum += input[i];
}
input = &input_sum;
}
}
result[0] = '\0';
for (uint32_t i = 0; i < index; i++) {
ext_snprintf_P(result, TOPSZ, PSTR("%s%s%*_f%s"), result, (0==i)?(1==index)?"":"[":",", resolution, &input[i], (index-1==i)?(1==index)?"":"]":"");
}
return result;
}
char* EnergyFormat(char* result, float* input, uint32_t resolution, bool json, bool single = false) {
uint8_t index = (single) ? 1 : Energy.phase_count; // 1,2,3
return EnergyFormatIndex(result, input, resolution, json, index, single);
}
char* EnergyFormatSum(char* result, float* input, uint32_t resolution, bool json, bool single = false) {
uint8_t index = (single) ? 1 : Energy.phase_count; // 1,2,3
float input_sum = 0.0;
if (!Settings->flag5.energy_phase) {
for (uint32_t i = 0; i < index; i++) {
input_sum += input[i];
#ifdef USE_WEBSERVER
char* WebEnergyFormat(char* result, float* input, uint32_t resolution, uint32_t single = 0);
char* WebEnergyFormat(char* result, float* input, uint32_t resolution, uint32_t single) {
// single = 0 - Energy.phase_count - xx / xx / xx or multi column
// single = 1 - Energy.voltage_common or Energy.frequency_common - xx or single column using colspan (if needed)
// single = 2 - Sum of Energy.phase_count - xx or single column using colspan (if needed)
if (single > 1) { // Sum and/or Single column
float input_sum = 0.0;
if (!Settings->flag5.energy_phase) { // SetOption129 - (Energy) Show phase information
for (uint32_t i = 0; i < Energy.phase_count; i++) {
input_sum += input[i];
}
input = &input_sum;
} else {
single = 0;
}
input = &input_sum;
index = 1;
}
return EnergyFormatIndex(result, input, resolution, json, index, single);
#ifdef USE_ENERGY_COLUMN_GUI
if ((Energy.phase_count > 1) && single) { // Need to set colspan so need a new column
ext_snprintf_P(result, TOPSZ, PSTR("</td><td colspan='%d' style='text-align:center;'>%*_f</td><td>"), Energy.phase_count, resolution, &input[0]);
} else {
ext_snprintf_P(result, TOPSZ, PSTR("</td><td>")); // Skip first column
for (uint32_t i = 0; i < Energy.phase_count; i++) {
ext_snprintf_P(result, TOPSZ, PSTR("%s%*_f</td><td>"), result, resolution, &input[i]);
}
}
#else // not USE_ENERGY_COLUMN_GUI
uint32_t index = (single) ? 1 : Energy.phase_count; // 1,2,3
result[0] = '\0';
for (uint32_t i = 0; i < index; i++) {
ext_snprintf_P(result, TOPSZ, PSTR("%s%s%*_f"), result, (i)?" / ":"", resolution, &input[i]);
}
#endif // USE_ENERGY_COLUMN_GUI
return result;
}
#endif // USE_WEBSERVER
/********************************************************************************************/
@ -398,20 +425,12 @@ void EnergyMarginCheck(void)
Energy.power_history[phase][2] = active_power;
}
if (jsonflg) {
/*
char power_diff_chr[Energy.phase_count][FLOATSZ];
for (uint32_t phase = 0; phase < Energy.phase_count; phase++) {
dtostrfd(power_diff[phase], 0, power_diff_chr[phase]);
}
char value_chr[FLOATSZ * ENERGY_MAX_PHASES];
ResponseAppend_P(PSTR("\"" D_CMND_POWERDELTA "\":%s"), EnergyFormat(value_chr, power_diff_chr[0], 1));
*/
float power_diff_f[Energy.phase_count];
for (uint32_t phase = 0; phase < Energy.phase_count; phase++) {
power_diff_f[phase] = power_diff[phase];
}
char value_chr[FLOATSZ * ENERGY_MAX_PHASES];
ResponseAppend_P(PSTR("\"" D_CMND_POWERDELTA "\":%s"), EnergyFormat(value_chr, power_diff_f, 0, 1));
char value_chr[TOPSZ];
ResponseAppend_P(PSTR("\"" D_CMND_POWERDELTA "\":%s"), EnergyFormat(value_chr, power_diff_f, 0));
}
uint16_t energy_power_u = (uint16_t)(Energy.active_power[0]);
@ -590,9 +609,9 @@ void EnergyCommandCalResponse(uint32_t nvalue) {
}
void ResponseCmndEnergyTotalYesterdayToday(void) {
char value_chr[FLOATSZ * ENERGY_MAX_PHASES]; // Used by EnergyFormatIndex
char value2_chr[FLOATSZ * ENERGY_MAX_PHASES];
char value3_chr[FLOATSZ * ENERGY_MAX_PHASES];
char value_chr[TOPSZ]; // Used by EnergyFormatIndex
char value2_chr[TOPSZ];
char value3_chr[TOPSZ];
float energy_yesterday_ph[3];
for (uint32_t i = 0; i < Energy.phase_count; i++) {
@ -602,9 +621,9 @@ void ResponseCmndEnergyTotalYesterdayToday(void) {
Response_P(PSTR("{\"%s\":{\"" D_JSON_TOTAL "\":%s,\"" D_JSON_YESTERDAY "\":%s,\"" D_JSON_TODAY "\":%s}}"),
XdrvMailbox.command,
EnergyFormat(value_chr, Energy.total, Settings->flag2.energy_resolution, true),
EnergyFormat(value2_chr, energy_yesterday_ph, Settings->flag2.energy_resolution, true),
EnergyFormat(value3_chr, Energy.daily, Settings->flag2.energy_resolution, true));
EnergyFormat(value_chr, Energy.total, Settings->flag2.energy_resolution),
EnergyFormat(value2_chr, energy_yesterday_ph, Settings->flag2.energy_resolution),
EnergyFormat(value3_chr, Energy.daily, Settings->flag2.energy_resolution));
}
void CmndEnergyTotal(void) {
@ -1089,34 +1108,34 @@ void EnergyShow(bool json) {
energy_tariff = true;
}
char value_chr[FLOATSZ * ENERGY_MAX_PHASES]; // Used by EnergyFormatIndex
char value2_chr[FLOATSZ * ENERGY_MAX_PHASES];
char value3_chr[FLOATSZ * ENERGY_MAX_PHASES];
char value_chr[TOPSZ]; // Used by EnergyFormatIndex
char value2_chr[TOPSZ];
char value3_chr[TOPSZ];
if (json) {
bool show_energy_period = (0 == TasmotaGlobal.tele_period);
ResponseAppend_P(PSTR(",\"" D_RSLT_ENERGY "\":{\"" D_JSON_TOTAL_START_TIME "\":\"%s\",\"" D_JSON_TOTAL "\":%s"),
GetDateAndTime(DT_ENERGY).c_str(),
EnergyFormatSum(value_chr, Energy.total, Settings->flag2.energy_resolution, json));
EnergyFormat(value_chr, Energy.total, Settings->flag2.energy_resolution, 2));
if (energy_tariff) {
ResponseAppend_P(PSTR(",\"" D_JSON_TOTAL D_CMND_TARIFF "\":%s"),
EnergyFormatIndex(value_chr, energy_usage, Settings->flag2.energy_resolution, json, 2));
EnergyFormat(value_chr, energy_usage, Settings->flag2.energy_resolution, 6));
}
ResponseAppend_P(PSTR(",\"" D_JSON_YESTERDAY "\":%s,\"" D_JSON_TODAY "\":%s"),
EnergyFormatSum(value_chr, energy_yesterday_ph, Settings->flag2.energy_resolution, json),
EnergyFormatSum(value2_chr, Energy.daily, Settings->flag2.energy_resolution, json));
EnergyFormat(value_chr, energy_yesterday_ph, Settings->flag2.energy_resolution, 2),
EnergyFormat(value2_chr, Energy.daily, Settings->flag2.energy_resolution, 2));
/*
#if defined(SDM630_IMPORT) || defined(SDM72_IMPEXP)
if (!isnan(Energy.import_active[0])) {
ResponseAppend_P(PSTR(",\"" D_JSON_IMPORT_ACTIVE "\":%s"),
EnergyFormat(value_chr, Energy.import_active, Settings->flag2.energy_resolution, json));
EnergyFormat(value_chr, Energy.import_active, Settings->flag2.energy_resolution));
if (energy_tariff) {
ResponseAppend_P(PSTR(",\"" D_JSON_IMPORT D_CMND_TARIFF "\":%s"),
EnergyFormatIndex(value_chr, energy_return, Settings->flag2.energy_resolution, json, 2));
EnergyFormat(value_chr, energy_return, Settings->flag2.energy_resolution, 6));
}
}
#endif // SDM630_IMPORT || SDM72_IMPEXP
@ -1124,10 +1143,10 @@ void EnergyShow(bool json) {
if (!isnan(Energy.export_active[0])) {
ResponseAppend_P(PSTR(",\"" D_JSON_EXPORT_ACTIVE "\":%s"),
EnergyFormat(value_chr, Energy.export_active, Settings->flag2.energy_resolution, json));
EnergyFormat(value_chr, Energy.export_active, Settings->flag2.energy_resolution));
if (energy_tariff) {
ResponseAppend_P(PSTR(",\"" D_JSON_EXPORT D_CMND_TARIFF "\":%s"),
EnergyFormatIndex(value_chr, energy_return, Settings->flag2.energy_resolution, json, 2));
EnergyFormat(value_chr, energy_return, Settings->flag2.energy_resolution, 6));
}
}
@ -1138,30 +1157,30 @@ void EnergyShow(bool json) {
Energy.period[i] = RtcSettings.energy_kWhtoday_ph[i];
}
ResponseAppend_P(PSTR(",\"" D_JSON_PERIOD "\":%s"),
EnergyFormat(value_chr, energy_period, Settings->flag2.wattage_resolution, json));
EnergyFormat(value_chr, energy_period, Settings->flag2.wattage_resolution));
}
ResponseAppend_P(PSTR(",\"" D_JSON_POWERUSAGE "\":%s"),
EnergyFormat(value_chr, Energy.active_power, Settings->flag2.wattage_resolution, json));
EnergyFormat(value_chr, Energy.active_power, Settings->flag2.wattage_resolution));
if (!Energy.type_dc) {
if (Energy.current_available && Energy.voltage_available) {
ResponseAppend_P(PSTR(",\"" D_JSON_APPARENT_POWERUSAGE "\":%s,\"" D_JSON_REACTIVE_POWERUSAGE "\":%s,\"" D_JSON_POWERFACTOR "\":%s"),
EnergyFormat(value_chr, apparent_power, Settings->flag2.wattage_resolution, json),
EnergyFormat(value2_chr, reactive_power, Settings->flag2.wattage_resolution, json),
EnergyFormat(value3_chr, power_factor, 2, json));
EnergyFormat(value_chr, apparent_power, Settings->flag2.wattage_resolution),
EnergyFormat(value2_chr, reactive_power, Settings->flag2.wattage_resolution),
EnergyFormat(value3_chr, power_factor, 2));
}
if (!isnan(Energy.frequency[0])) {
ResponseAppend_P(PSTR(",\"" D_JSON_FREQUENCY "\":%s"),
EnergyFormat(value_chr, Energy.frequency, Settings->flag2.frequency_resolution, json, Energy.frequency_common));
EnergyFormat(value_chr, Energy.frequency, Settings->flag2.frequency_resolution, Energy.frequency_common));
}
}
if (Energy.voltage_available) {
ResponseAppend_P(PSTR(",\"" D_JSON_VOLTAGE "\":%s"),
EnergyFormat(value_chr, Energy.voltage, Settings->flag2.voltage_resolution, json, Energy.voltage_common));
EnergyFormat(value_chr, Energy.voltage, Settings->flag2.voltage_resolution, Energy.voltage_common));
}
if (Energy.current_available) {
ResponseAppend_P(PSTR(",\"" D_JSON_CURRENT "\":%s"),
EnergyFormat(value_chr, Energy.current, Settings->flag2.current_resolution, json));
EnergyFormat(value_chr, Energy.current, Settings->flag2.current_resolution));
}
XnrgCall(FUNC_JSON_APPEND);
ResponseJsonEnd();
@ -1209,32 +1228,45 @@ void EnergyShow(bool json) {
#endif // USE_KNX
#ifdef USE_WEBSERVER
} else {
#ifdef USE_ENERGY_COLUMN_GUI
// Need a new table supporting more columns
WSContentSend_P(PSTR("</table>{t}{s}</th><th>")); // First column is empty ({t} = <table style='width:100%'>, {s} = <tr><th>)
bool no_label = Energy.voltage_common || (1 == Energy.phase_count);
for (uint32_t i = 0; i < Energy.phase_count; i++) {
WSContentSend_P(PSTR("</th><th style='width:60px;white-space:nowrap'>%s%s"), (no_label)?"":"L", (no_label)?"":itoa(i +1, value_chr, 10));
}
WSContentSend_P(PSTR("</th><td>{e}")); // Last column is units ({e} = </td></tr>)
#endif // USE_ENERGY_COLUMN_GUI
if (Energy.voltage_available) {
WSContentSend_PD(HTTP_SNS_VOLTAGE, EnergyFormat(value_chr, Energy.voltage, Settings->flag2.voltage_resolution, json, Energy.voltage_common));
WSContentSend_PD(HTTP_SNS_VOLTAGE, WebEnergyFormat(value_chr, Energy.voltage, Settings->flag2.voltage_resolution, Energy.voltage_common));
}
if (!Energy.type_dc) {
if (!isnan(Energy.frequency[0])) {
WSContentSend_PD(PSTR("{s}" D_FREQUENCY "{m}%s " D_UNIT_HERTZ "{e}"),
EnergyFormat(value_chr, Energy.frequency, Settings->flag2.frequency_resolution, json, Energy.frequency_common));
WebEnergyFormat(value_chr, Energy.frequency, Settings->flag2.frequency_resolution, Energy.frequency_common));
}
}
if (Energy.current_available) {
WSContentSend_PD(HTTP_SNS_CURRENT, EnergyFormat(value_chr, Energy.current, Settings->flag2.current_resolution, json));
WSContentSend_PD(HTTP_SNS_CURRENT, WebEnergyFormat(value_chr, Energy.current, Settings->flag2.current_resolution));
}
WSContentSend_PD(HTTP_SNS_POWER, EnergyFormat(value_chr, Energy.active_power, Settings->flag2.wattage_resolution, json));
WSContentSend_PD(HTTP_SNS_POWER, WebEnergyFormat(value_chr, Energy.active_power, Settings->flag2.wattage_resolution));
if (!Energy.type_dc) {
if (Energy.current_available && Energy.voltage_available) {
WSContentSend_PD(HTTP_ENERGY_SNS1, EnergyFormat(value_chr, apparent_power, Settings->flag2.wattage_resolution, json),
EnergyFormat(value2_chr, reactive_power, Settings->flag2.wattage_resolution, json),
EnergyFormat(value3_chr, power_factor, 2, json));
WSContentSend_PD(HTTP_ENERGY_SNS1, WebEnergyFormat(value_chr, apparent_power, Settings->flag2.wattage_resolution),
WebEnergyFormat(value2_chr, reactive_power, Settings->flag2.wattage_resolution),
WebEnergyFormat(value3_chr, power_factor, 2));
}
}
WSContentSend_PD(HTTP_ENERGY_SNS2, EnergyFormatSum(value_chr, Energy.daily, Settings->flag2.energy_resolution, json),
EnergyFormatSum(value2_chr, energy_yesterday_ph, Settings->flag2.energy_resolution, json),
EnergyFormatSum(value3_chr, Energy.total, Settings->flag2.energy_resolution, json));
WSContentSend_PD(HTTP_ENERGY_SNS2, WebEnergyFormat(value_chr, Energy.daily, Settings->flag2.energy_resolution, 2),
WebEnergyFormat(value2_chr, energy_yesterday_ph, Settings->flag2.energy_resolution, 2),
WebEnergyFormat(value3_chr, Energy.total, Settings->flag2.energy_resolution, 2));
if (!isnan(Energy.export_active[0])) {
WSContentSend_PD(HTTP_ENERGY_SNS3, EnergyFormat(value_chr, Energy.export_active, Settings->flag2.energy_resolution, json));
WSContentSend_PD(HTTP_ENERGY_SNS3, WebEnergyFormat(value_chr, Energy.export_active, Settings->flag2.energy_resolution, 2));
}
#ifdef USE_ENERGY_COLUMN_GUI
XnrgCall(FUNC_WEB_COL_SENSOR);
WSContentSend_P(PSTR("</table>{t}")); // {t} = <table style='width:100%'> - Define for next FUNC_WEB_SENSOR
#endif // USE_ENERGY_COLUMN_GUI
XnrgCall(FUNC_WEB_SENSOR);
#endif // USE_WEBSERVER
}

View File

@ -210,8 +210,8 @@ const char HTTP_ENERGY_SDM220[] PROGMEM =
"{s}" D_PHASE_ANGLE "{m}%s " D_UNIT_ANGLE "{e}";
#endif // USE_WEBSERVER
void Sdm220Show(bool json)
{
/*
void Sdm220Show(bool json) {
if (isnan(Sdm120.import_active)) { return; }
char import_active_chr[FLOATSZ];
@ -232,6 +232,30 @@ void Sdm220Show(bool json)
#endif // USE_WEBSERVER
}
}
*/
void Sdm220Show(bool json) {
if (isnan(Sdm120.import_active)) { return; }
char value_chr[TOPSZ];
char value2_chr[TOPSZ];
char value3_chr[TOPSZ];
char value4_chr[TOPSZ];
if (json) {
ResponseAppend_P(PSTR(",\"" D_JSON_IMPORT_ACTIVE "\":%s,\"" D_JSON_IMPORT_REACTIVE "\":%s,\"" D_JSON_EXPORT_REACTIVE "\":%s,\"" D_JSON_PHASE_ANGLE "\":%s"),
EnergyFormat(value_chr, &Sdm120.import_active, Settings->flag2.energy_resolution),
EnergyFormat(value2_chr, &Sdm120.import_reactive, Settings->flag2.energy_resolution),
EnergyFormat(value3_chr, &Sdm120.export_reactive, Settings->flag2.energy_resolution),
EnergyFormat(value4_chr, &Sdm120.phase_angle, 2));
#ifdef USE_WEBSERVER
} else {
WSContentSend_PD(HTTP_ENERGY_SDM220, WebEnergyFormat(value_chr, &Sdm120.import_reactive, Settings->flag2.energy_resolution, 2),
WebEnergyFormat(value2_chr, &Sdm120.export_reactive, Settings->flag2.energy_resolution, 2),
WebEnergyFormat(value3_chr, &Sdm120.phase_angle, 2));
#endif // USE_WEBSERVER
}
}
/*********************************************************************************************\
* Interface
@ -249,9 +273,15 @@ bool Xnrg08(uint8_t function)
Sdm220Show(1);
break;
#ifdef USE_WEBSERVER
#ifdef USE_ENERGY_COLUMN_GUI
case FUNC_WEB_COL_SENSOR:
Sdm220Show(0);
break;
#else // not USE_ENERGY_COLUMN_GUI
case FUNC_WEB_SENSOR:
Sdm220Show(0);
break;
#endif // USE_ENERGY_COLUMN_GUI
#endif // USE_WEBSERVER
case FUNC_ENERGY_RESET:
Sdm220Reset();