diff --git a/CHANGELOG.md b/CHANGELOG.md index b26a83fba..2cc245820 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ All notable changes to this project will be documented in this file. ### Added - Support for multiple MCP23008 as switch/button/relay - Support for multiple PCF8574 as switch/button/relay +- Extended Tariff command for forced tariff (#18080) ### Breaking Changed - Shelly Pro 4PM using standard MCP23xxx driver and needs one time Auto-Configuration diff --git a/tasmota/include/tasmota_types.h b/tasmota/include/tasmota_types.h index edf1e7166..7f947a51d 100644 --- a/tasmota/include/tasmota_types.h +++ b/tasmota/include/tasmota_types.h @@ -266,8 +266,7 @@ typedef union { uint32_t spare23 : 1; // bit 23 uint32_t spare24 : 1; // bit 24 uint32_t spare25 : 1; // bit 25 - uint32_t spare26 : 1; // bit 26 - uint32_t spare27 : 1; // bit 27 + uint32_t tariff_forced : 2; // bit 26..27 (v12.4.0.2) - Energy forced tariff : 0=tariff change on time, 1|2=tariff forced uint32_t sunrise_dawn_angle : 2; // bits 28/29 (v12.1.1.4) - uint32_t temperature_set_res : 2; // bits 30/31 (v9.3.1.4) - (Tuya) }; diff --git a/tasmota/tasmota_xdrv_driver/xdrv_03_energy.ino b/tasmota/tasmota_xdrv_driver/xdrv_03_energy.ino index 5de2c90af..48fc8e8ae 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_03_energy.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_03_energy.ino @@ -225,6 +225,9 @@ char* WebEnergyFormat(char* result, float* input, uint32_t resolution, uint32_t /********************************************************************************************/ bool EnergyTariff1Active() { // Off-Peak hours + if (Settings->mbflag2.tariff_forced) { + return 1 == Settings->mbflag2.tariff_forced; + } uint8_t dst = 0; if (IsDst() && (Settings->tariff[0][1] != Settings->tariff[1][1])) { dst = 1; @@ -825,37 +828,44 @@ void CmndTariff(void) { uint32_t tariff = XdrvMailbox.index -1; uint32_t time_type = 0; char *p; - char *str = strtok_r(XdrvMailbox.data, ", ", &p); // 23:15, 22:30 - while ((str != nullptr) && (time_type < 2)) { - char *q; - uint32_t value = strtol(str, &q, 10); // 23 or 22 - Settings->tariff[tariff][time_type] = value; - if (value < 24) { // Below 24 is hours - Settings->tariff[tariff][time_type] *= 60; // Multiply hours by 60 minutes - char *minute = strtok_r(nullptr, ":", &q); - if (minute) { - value = strtol(minute, nullptr, 10); // 15 or 30 - if (value > 59) { - value = 59; + if (POWER_OFF == XdrvMailbox.payload) + Settings->mbflag2.tariff_forced = 0; + else if (POWER_ON == XdrvMailbox.payload) + Settings->mbflag2.tariff_forced = tariff + 1; + else { + char *str = strtok_r(XdrvMailbox.data, ", ", &p); // 23:15, 22:30 + while ((str != nullptr) && (time_type < 2)) { + char *q; + uint32_t value = strtol(str, &q, 10); // 23 or 22 + Settings->tariff[tariff][time_type] = value; + if (value < 24) { // Below 24 is hours + Settings->tariff[tariff][time_type] *= 60; // Multiply hours by 60 minutes + char *minute = strtok_r(nullptr, ":", &q); + if (minute) { + value = strtol(minute, nullptr, 10); // 15 or 30 + if (value > 59) { + value = 59; + } + Settings->tariff[tariff][time_type] += value; } - Settings->tariff[tariff][time_type] += value; } + if (Settings->tariff[tariff][time_type] > 1439) { + Settings->tariff[tariff][time_type] = 1439; // Max is 23:59 + } + str = strtok_r(nullptr, ", ", &p); + time_type++; } - if (Settings->tariff[tariff][time_type] > 1439) { - Settings->tariff[tariff][time_type] = 1439; // Max is 23:59 - } - str = strtok_r(nullptr, ", ", &p); - time_type++; } } else if (XdrvMailbox.index == 9) { Settings->flag3.energy_weekend = XdrvMailbox.payload & 1; // CMND_TARIFF } - Response_P(PSTR("{\"%s\":{\"Off-Peak\":{\"STD\":\"%s\",\"DST\":\"%s\"},\"Standard\":{\"STD\":\"%s\",\"DST\":\"%s\"},\"Weekend\":\"%s\"}}"), + Response_P(PSTR("{\"%s\":{\"Off-Peak\":{\"STD\":\"%s\",\"DST\":\"%s\"},\"Standard\":{\"STD\":\"%s\",\"DST\":\"%s\"},\"Weekend\":\"%s\",\"Forced\":\"%d\"}}"), XdrvMailbox.command, GetMinuteTime(Settings->tariff[0][0]).c_str(),GetMinuteTime(Settings->tariff[0][1]).c_str(), GetMinuteTime(Settings->tariff[1][0]).c_str(),GetMinuteTime(Settings->tariff[1][1]).c_str(), - GetStateText(Settings->flag3.energy_weekend)); // CMND_TARIFF + GetStateText(Settings->flag3.energy_weekend), // Tariff9 + Settings->mbflag2.tariff_forced); // Tariff ON|OFF } uint32_t EnergyGetCalibration(uint32_t cal_type, uint32_t chan = 0) { @@ -1238,7 +1248,7 @@ void EnergyShow(bool json) { bool energy_tariff = false; float energy_usage[2]; float energy_return[2]; - if (Settings->tariff[0][0] != Settings->tariff[1][0]) { + if (Settings->mbflag2.tariff_forced || (Settings->tariff[0][0] != Settings->tariff[1][0])) { energy_usage[0] = (float)RtcSettings.energy_usage.usage1_kWhtotal / 1000; // Tariff1 energy_usage[1] = (float)RtcSettings.energy_usage.usage2_kWhtotal / 1000; // Tariff2 energy_return[0] = (float)RtcSettings.energy_usage.return1_kWhtotal / 1000; // Tariff1 diff --git a/tasmota/tasmota_xdrv_driver/xdrv_03_esp32_energy.ino b/tasmota/tasmota_xdrv_driver/xdrv_03_esp32_energy.ino index 8d66aa23f..916198675 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_03_esp32_energy.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_03_esp32_energy.ino @@ -181,7 +181,6 @@ typedef struct { uint8_t gui_rotate; uint8_t gui_count; uint8_t gui_offset; - uint8_t tariff_forced; // 0: tariff change on time, 1|2: tariff forced bool voltage_common; // Use common voltage bool frequency_common; // Use common frequency @@ -449,8 +448,8 @@ char* WebEnergyFormat(char* result, float* input, uint32_t resolution, uint32_t /********************************************************************************************/ bool EnergyTariff1Active() { // Off-Peak hours - if (Energy->tariff_forced) { - return 1 == Energy->tariff_forced; + if (Settings->mbflag2.tariff_forced) { + return 1 == Settings->mbflag2.tariff_forced; } uint8_t dst = 0; if (IsDst() && (Energy->Settings.tariff[0][1] != Energy->Settings.tariff[1][1])) { @@ -1058,9 +1057,9 @@ void CmndTariff(void) { uint32_t time_type = 0; char *p; if (POWER_OFF == XdrvMailbox.payload) - Energy->tariff_forced = 0; + Settings->mbflag2.tariff_forced = 0; else if (POWER_ON == XdrvMailbox.payload) - Energy->tariff_forced = tariff + 1; + Settings->mbflag2.tariff_forced = tariff + 1; else { char *str = strtok_r(XdrvMailbox.data, ", ", &p); // 23:15, 22:30 while ((str != nullptr) && (time_type < 2)) { @@ -1093,8 +1092,8 @@ void CmndTariff(void) { XdrvMailbox.command, GetMinuteTime(Energy->Settings.tariff[0][0]).c_str(),GetMinuteTime(Energy->Settings.tariff[0][1]).c_str(), GetMinuteTime(Energy->Settings.tariff[1][0]).c_str(),GetMinuteTime(Energy->Settings.tariff[1][1]).c_str(), - GetStateText(Settings->flag3.energy_weekend), - Energy->tariff_forced); // CMND_TARIFF + GetStateText(Settings->flag3.energy_weekend), // Tariff9 + Settings->mbflag2.tariff_forced); // Tariff ON|OFF } uint32_t EnergyGetCalibration(uint32_t cal_type, uint32_t chan = 0) { @@ -1479,7 +1478,7 @@ void EnergyShow(bool json) { bool energy_tariff = false; float energy_usage_kWh[2]; float energy_return_kWh[2]; - if (Energy->tariff_forced || (Energy->Settings.tariff[0][0] != Energy->Settings.tariff[1][0])) { + if (Settings->mbflag2.tariff_forced || (Energy->Settings.tariff[0][0] != Energy->Settings.tariff[1][0])) { energy_usage_kWh[0] = RtcEnergySettings.energy_usage.usage_total_kWh[0]; // Tariff1 energy_usage_kWh[1] = RtcEnergySettings.energy_usage.usage_total_kWh[1]; // Tariff2 energy_return_kWh[0] = RtcEnergySettings.energy_usage.return_total_kWh[0]; // Tariff1