mirror of
https://github.com/arendst/Tasmota.git
synced 2025-07-24 19:26:37 +00:00
tariff command variant to force tariff (#18102)
This commit is contained in:
parent
747ebae670
commit
6b016eb860
@ -181,6 +181,7 @@ typedef struct {
|
|||||||
uint8_t gui_rotate;
|
uint8_t gui_rotate;
|
||||||
uint8_t gui_count;
|
uint8_t gui_count;
|
||||||
uint8_t gui_offset;
|
uint8_t gui_offset;
|
||||||
|
uint8_t tariff_forced; // 0: tariff change on time, 1|2: tariff forced
|
||||||
|
|
||||||
bool voltage_common; // Use common voltage
|
bool voltage_common; // Use common voltage
|
||||||
bool frequency_common; // Use common frequency
|
bool frequency_common; // Use common frequency
|
||||||
@ -448,6 +449,9 @@ char* WebEnergyFormat(char* result, float* input, uint32_t resolution, uint32_t
|
|||||||
/********************************************************************************************/
|
/********************************************************************************************/
|
||||||
|
|
||||||
bool EnergyTariff1Active() { // Off-Peak hours
|
bool EnergyTariff1Active() { // Off-Peak hours
|
||||||
|
if (Energy->tariff_forced) {
|
||||||
|
return 1 == Energy->tariff_forced;
|
||||||
|
}
|
||||||
uint8_t dst = 0;
|
uint8_t dst = 0;
|
||||||
if (IsDst() && (Energy->Settings.tariff[0][1] != Energy->Settings.tariff[1][1])) {
|
if (IsDst() && (Energy->Settings.tariff[0][1] != Energy->Settings.tariff[1][1])) {
|
||||||
dst = 1;
|
dst = 1;
|
||||||
@ -1053,37 +1057,44 @@ void CmndTariff(void) {
|
|||||||
uint32_t tariff = XdrvMailbox.index -1;
|
uint32_t tariff = XdrvMailbox.index -1;
|
||||||
uint32_t time_type = 0;
|
uint32_t time_type = 0;
|
||||||
char *p;
|
char *p;
|
||||||
char *str = strtok_r(XdrvMailbox.data, ", ", &p); // 23:15, 22:30
|
if (POWER_OFF == XdrvMailbox.payload)
|
||||||
while ((str != nullptr) && (time_type < 2)) {
|
Energy->tariff_forced = 0;
|
||||||
char *q;
|
else if (POWER_ON == XdrvMailbox.payload)
|
||||||
uint32_t value = strtol(str, &q, 10); // 23 or 22
|
Energy->tariff_forced = tariff + 1;
|
||||||
Energy->Settings.tariff[tariff][time_type] = value;
|
else {
|
||||||
if (value < 24) { // Below 24 is hours
|
char *str = strtok_r(XdrvMailbox.data, ", ", &p); // 23:15, 22:30
|
||||||
Energy->Settings.tariff[tariff][time_type] *= 60; // Multiply hours by 60 minutes
|
while ((str != nullptr) && (time_type < 2)) {
|
||||||
char *minute = strtok_r(nullptr, ":", &q);
|
char *q;
|
||||||
if (minute) {
|
uint32_t value = strtol(str, &q, 10); // 23 or 22
|
||||||
value = strtol(minute, nullptr, 10); // 15 or 30
|
Energy->Settings.tariff[tariff][time_type] = value;
|
||||||
if (value > 59) {
|
if (value < 24) { // Below 24 is hours
|
||||||
value = 59;
|
Energy->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;
|
||||||
|
}
|
||||||
|
Energy->Settings.tariff[tariff][time_type] += value;
|
||||||
}
|
}
|
||||||
Energy->Settings.tariff[tariff][time_type] += value;
|
|
||||||
}
|
}
|
||||||
|
if (Energy->Settings.tariff[tariff][time_type] > 1439) {
|
||||||
|
Energy->Settings.tariff[tariff][time_type] = 1439; // Max is 23:59
|
||||||
|
}
|
||||||
|
str = strtok_r(nullptr, ", ", &p);
|
||||||
|
time_type++;
|
||||||
}
|
}
|
||||||
if (Energy->Settings.tariff[tariff][time_type] > 1439) {
|
|
||||||
Energy->Settings.tariff[tariff][time_type] = 1439; // Max is 23:59
|
|
||||||
}
|
|
||||||
str = strtok_r(nullptr, ", ", &p);
|
|
||||||
time_type++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (XdrvMailbox.index == 9) {
|
else if (XdrvMailbox.index == 9) {
|
||||||
Settings->flag3.energy_weekend = XdrvMailbox.payload & 1; // CMND_TARIFF
|
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,
|
XdrvMailbox.command,
|
||||||
GetMinuteTime(Energy->Settings.tariff[0][0]).c_str(),GetMinuteTime(Energy->Settings.tariff[0][1]).c_str(),
|
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(),
|
GetMinuteTime(Energy->Settings.tariff[1][0]).c_str(),GetMinuteTime(Energy->Settings.tariff[1][1]).c_str(),
|
||||||
GetStateText(Settings->flag3.energy_weekend)); // CMND_TARIFF
|
GetStateText(Settings->flag3.energy_weekend),
|
||||||
|
Energy->tariff_forced); // CMND_TARIFF
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t EnergyGetCalibration(uint32_t cal_type, uint32_t chan = 0) {
|
uint32_t EnergyGetCalibration(uint32_t cal_type, uint32_t chan = 0) {
|
||||||
@ -1468,7 +1479,7 @@ void EnergyShow(bool json) {
|
|||||||
bool energy_tariff = false;
|
bool energy_tariff = false;
|
||||||
float energy_usage_kWh[2];
|
float energy_usage_kWh[2];
|
||||||
float energy_return_kWh[2];
|
float energy_return_kWh[2];
|
||||||
if (Energy->Settings.tariff[0][0] != Energy->Settings.tariff[1][0]) {
|
if (Energy->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[0] = RtcEnergySettings.energy_usage.usage_total_kWh[0]; // Tariff1
|
||||||
energy_usage_kWh[1] = RtcEnergySettings.energy_usage.usage_total_kWh[1]; // Tariff2
|
energy_usage_kWh[1] = RtcEnergySettings.energy_usage.usage_total_kWh[1]; // Tariff2
|
||||||
energy_return_kWh[0] = RtcEnergySettings.energy_usage.return_total_kWh[0]; // Tariff1
|
energy_return_kWh[0] = RtcEnergySettings.energy_usage.return_total_kWh[0]; // Tariff1
|
||||||
|
Loading…
x
Reference in New Issue
Block a user