From 76a7ab513163f1512b4eafd7469b056914e036e6 Mon Sep 17 00:00:00 2001 From: SteWers <42718143+SteWers@users.noreply.github.com> Date: Sun, 21 Jan 2024 11:37:04 +0100 Subject: [PATCH] [Energy] Decoupled `FREQUENCY` and `Energy->type_dc` (#20549) --- tasmota/tasmota_xdrv_driver/xdrv_03_energy.ino | 18 ++++++++---------- .../xdrv_03_esp32_energy.ino | 18 ++++++++---------- .../tasmota_xnrg_energy/xnrg_12_solaxX1.ino | 2 +- 3 files changed, 17 insertions(+), 21 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_03_energy.ino b/tasmota/tasmota_xdrv_driver/xdrv_03_energy.ino index a5b0fd3e1..2623a4504 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_03_energy.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_03_energy.ino @@ -673,7 +673,7 @@ void EnergyEverySecond(void) { Energy->active_power[i] = 0; if (!isnan(Energy->apparent_power[i])) { Energy->apparent_power[i] = 0; } if (!isnan(Energy->reactive_power[i])) { Energy->reactive_power[i] = 0; } - if (!isnan(Energy->frequency[i])) { Energy->frequency[i] = 0; } + if (!isnan(Energy->frequency[i]) && !Energy->type_dc) { Energy->frequency[i] = 0; } if (!isnan(Energy->power_factor[i])) { Energy->power_factor[i] = 0; } if (!isnan(Energy->export_active[i])) { Energy->export_active[i] = 0; } @@ -1345,10 +1345,10 @@ void EnergyShow(bool json) { ResponseAppend_P(PSTR(",\"" D_JSON_POWERFACTOR "\":%s"), EnergyFmt(power_factor, 2)); } - if (!isnan(Energy->frequency[0])) { - ResponseAppend_P(PSTR(",\"" D_JSON_FREQUENCY "\":%s"), - EnergyFmt(Energy->frequency, Settings->flag2.frequency_resolution, frequency_common)); - } + } + if (!isnan(Energy->frequency[0])) { + ResponseAppend_P(PSTR(",\"" D_JSON_FREQUENCY "\":%s"), + EnergyFmt(Energy->frequency, Settings->flag2.frequency_resolution, frequency_common)); } if (Energy->voltage_available) { ResponseAppend_P(PSTR(",\"" D_JSON_VOLTAGE "\":%s"), @@ -1420,11 +1420,9 @@ void EnergyShow(bool json) { if (Energy->voltage_available) { WSContentSend_PD(HTTP_SNS_VOLTAGE, WebEnergyFmt(Energy->voltage, Settings->flag2.voltage_resolution, voltage_common)); } - if (!Energy->type_dc) { - if (!isnan(Energy->frequency[0])) { - WSContentSend_PD(PSTR("{s}" D_FREQUENCY "{m}%s " D_UNIT_HERTZ "{e}"), - WebEnergyFmt(Energy->frequency, Settings->flag2.frequency_resolution, frequency_common)); - } + if (!isnan(Energy->frequency[0])) { + WSContentSend_PD(PSTR("{s}" D_FREQUENCY "{m}%s " D_UNIT_HERTZ "{e}"), + WebEnergyFmt(Energy->frequency, Settings->flag2.frequency_resolution, frequency_common)); } if (Energy->current_available) { WSContentSend_PD(HTTP_SNS_CURRENT, WebEnergyFmt(Energy->current, Settings->flag2.current_resolution)); diff --git a/tasmota/tasmota_xdrv_driver/xdrv_03_esp32_energy.ino b/tasmota/tasmota_xdrv_driver/xdrv_03_esp32_energy.ino index a06c7125f..97010142a 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_03_esp32_energy.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_03_esp32_energy.ino @@ -893,7 +893,7 @@ void EnergyEverySecond(void) { Energy->active_power[i] = 0; if (!isnan(Energy->apparent_power[i])) { Energy->apparent_power[i] = 0; } if (!isnan(Energy->reactive_power[i])) { Energy->reactive_power[i] = 0; } - if (!isnan(Energy->frequency[i])) { Energy->frequency[i] = 0; } + if (!isnan(Energy->frequency[i]) && !Energy->type_dc) { Energy->frequency[i] = 0; } if (!isnan(Energy->power_factor[i])) { Energy->power_factor[i] = 0; } if (!isnan(Energy->export_active[i])) { Energy->export_active[i] = 0; } @@ -1580,10 +1580,10 @@ void EnergyShow(bool json) { ResponseAppend_P(PSTR(",\"" D_JSON_POWERFACTOR "\":%s"), EnergyFmt(power_factor, 2)); } - if (!isnan(Energy->frequency[0])) { - ResponseAppend_P(PSTR(",\"" D_JSON_FREQUENCY "\":%s"), - EnergyFmt(Energy->frequency, Settings->flag2.frequency_resolution, frequency_common)); - } + } + if (!isnan(Energy->frequency[0])) { + ResponseAppend_P(PSTR(",\"" D_JSON_FREQUENCY "\":%s"), + EnergyFmt(Energy->frequency, Settings->flag2.frequency_resolution, frequency_common)); } if (Energy->voltage_available) { ResponseAppend_P(PSTR(",\"" D_JSON_VOLTAGE "\":%s"), @@ -1702,11 +1702,9 @@ void EnergyShow(bool json) { if (Energy->voltage_available) { WSContentSend_PD(HTTP_SNS_VOLTAGE, WebEnergyFmt(Energy->voltage, Settings->flag2.voltage_resolution, voltage_common)); } - if (!Energy->type_dc) { - if (!isnan(Energy->frequency[0])) { - WSContentSend_PD(PSTR("{s}" D_FREQUENCY "{m}%s " D_UNIT_HERTZ "{e}"), - WebEnergyFmt(Energy->frequency, Settings->flag2.frequency_resolution, frequency_common)); - } + if (!isnan(Energy->frequency[0])) { + WSContentSend_PD(PSTR("{s}" D_FREQUENCY "{m}%s " D_UNIT_HERTZ "{e}"), + WebEnergyFmt(Energy->frequency, Settings->flag2.frequency_resolution, frequency_common)); } if (Energy->current_available) { WSContentSend_PD(HTTP_SNS_CURRENT, WebEnergyFmt(Energy->current, Settings->flag2.current_resolution)); diff --git a/tasmota/tasmota_xnrg_energy/xnrg_12_solaxX1.ino b/tasmota/tasmota_xnrg_energy/xnrg_12_solaxX1.ino index 356c8d65d..ec9ee7cd5 100644 --- a/tasmota/tasmota_xnrg_energy/xnrg_12_solaxX1.ino +++ b/tasmota/tasmota_xnrg_energy/xnrg_12_solaxX1.ino @@ -286,7 +286,6 @@ void solaxX1_250MSecond(void) { // Every 250 milliseconds Energy->voltage[0] = ((DataRead[23] << 8) | DataRead[24]) * 0.1f; // AC Voltage Energy->frequency[0] = ((DataRead[25] << 8) | DataRead[26]) * 0.01f; // AC Frequency Energy->active_power[0] = ((DataRead[27] << 8) | DataRead[28]); // AC Power - Energy->apparent_power[0] = Energy->active_power[0]; // U*I from inverter is not valid for apparent power; U*I could be lower than active power //temporal = (float)((DataRead[29] << 8) | DataRead[30]) * 0.1f; // Not Used Energy->import_active[0] = ((DataRead[31] << 24) | (DataRead[32] << 16) | (DataRead[33] << 8) | DataRead[34]) * 0.1f; // Energy Total uint32_t runtime_total = (DataRead[35] << 24) | (DataRead[36] << 16) | (DataRead[37] << 8) | DataRead[38]; // Work Time Total @@ -473,6 +472,7 @@ void solaxX1_SnsInit(void) { void solaxX1_DrvInit(void) { if (PinUsed(GPIO_SOLAXX1_RX) && PinUsed(GPIO_SOLAXX1_TX)) { TasmotaGlobal.energy_driver = XNRG_12; + Energy->type_dc = true; // Handle like DC, because U*I from inverter is not valid for apparent power; U*I could be lower than active power } }