From 5bd19d54db2d7bd964ba00bbbae9d950d94fe925 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Wed, 25 Sep 2019 14:24:49 +0200 Subject: [PATCH] Change command Tariffx to allow time entries like 23 (hours), 1320 (minutes) or 23:00 Change command Tariffx to allow time entries like 23 (hours), 1320 (minutes) or 23:00. NOTE: As this is development branch previous tariffs are lost! (#6488) --- sonoff/_changelog.ino | 1 + sonoff/settings.h | 3 +- sonoff/sonoff.h | 2 +- sonoff/support_rtc.ino | 9 +++++- sonoff/xdrv_03_energy.ino | 59 +++++++++++++++++++++++++-------------- 5 files changed, 50 insertions(+), 24 deletions(-) diff --git a/sonoff/_changelog.ino b/sonoff/_changelog.ino index f7a8ca31a..6fd2e5f0a 100644 --- a/sonoff/_changelog.ino +++ b/sonoff/_changelog.ino @@ -1,5 +1,6 @@ /*********************************************************************************************\ * 6.6.0.14 20190925 + * Change command Tariffx to allow time entries like 23 (hours), 1320 (minutes) or 23:00. NOTE: As this is development branch previous tariffs are lost! (#6488) * * 6.6.0.13 20190922 * Add command EnergyReset4 x,x to initialize total usage for two tarrifs diff --git a/sonoff/settings.h b/sonoff/settings.h index 46fc8b555..ac2079412 100644 --- a/sonoff/settings.h +++ b/sonoff/settings.h @@ -373,8 +373,9 @@ struct SYSCFG { TuyaFnidDpidMap tuya_fnid_map[MAX_TUYA_FUNCTIONS]; // E00 32 bytes uint16_t ina226_r_shunt[4]; // E20 uint16_t ina226_i_fs[4]; // E28 + uint16_t tariff[4][2]; // E30 - uint8_t free_e30[456]; // E30 + uint8_t free_e40[440]; // E40 uint32_t cfg_timestamp; // FF8 uint32_t cfg_crc32; // FFC diff --git a/sonoff/sonoff.h b/sonoff/sonoff.h index 7269ac5fa..ec317d7f5 100644 --- a/sonoff/sonoff.h +++ b/sonoff/sonoff.h @@ -252,7 +252,7 @@ enum SettingsParamIndex { P_HOLD_TIME, P_MAX_POWER_RETRY, P_ex_TUYA_DIMMER_ID, P P_ex_ENERGY_TARIFF1, P_ex_ENERGY_TARIFF2, // SetOption47 .. SetOption48 P_MAX_PARAM8 }; // Max is PARAM8_SIZE (18) - SetOption32 until SetOption49 -enum SettingsRegister8 { R8_ENERGY_TARIFF1_ST, R8_ENERGY_TARIFF2_ST, R8_ENERGY_TARIFF1_DS, R8_ENERGY_TARIFF2_DS, +enum SettingsRegister8 { R8_SPARE00, R8_SPARE01, R8_SPARE02, R8_SPARE03, R8_SPARE04, R8_SPARE05, R8_SPARE06, R8_SPARE07, R8_SPARE08, R8_SPARE09, R8_SPARE10, R8_SPARE11, R8_SPARE12, R8_SPARE13, R8_SPARE14, R8_SPARE15, diff --git a/sonoff/support_rtc.ino b/sonoff/support_rtc.ino index 961869687..b799003c4 100644 --- a/sonoff/support_rtc.ino +++ b/sonoff/support_rtc.ino @@ -120,10 +120,17 @@ String GetBuildDateAndTime(void) return String(bdt); // 2017-03-07T11:08:02 } +String GetMinuteTime(uint32_t minutes) +{ + char tm[6]; + snprintf_P(tm, sizeof(tm), PSTR("%02d:%02d"), minutes / 60, minutes % 60); + + return String(tm); // 03:45 +} + String GetTimeZone(void) { char tz[7]; - snprintf_P(tz, sizeof(tz), PSTR("%+03d:%02d"), Rtc.time_timezone / 60, abs(Rtc.time_timezone % 60)); return String(tz); // -03:45 diff --git a/sonoff/xdrv_03_energy.ino b/sonoff/xdrv_03_energy.ino index 4e4931b33..55bf1a15f 100644 --- a/sonoff/xdrv_03_energy.ino +++ b/sonoff/xdrv_03_energy.ino @@ -129,18 +129,18 @@ Ticker ticker_energy; bool EnergyTariff1Active() // Off-Peak hours { - uint8_t tariff1 = Settings.register8[R8_ENERGY_TARIFF1_ST]; - uint8_t tariff2 = Settings.register8[R8_ENERGY_TARIFF2_ST]; - if (IsDst() && (Settings.register8[R8_ENERGY_TARIFF1_DS] != Settings.register8[R8_ENERGY_TARIFF2_DS])) { - tariff1 = Settings.register8[R8_ENERGY_TARIFF1_DS]; - tariff2 = Settings.register8[R8_ENERGY_TARIFF2_DS]; + uint8_t dst = 0; + if (IsDst() && (Settings.tariff[0][1] != Settings.tariff[1][1])) { + dst = 1; } - if (tariff1 != tariff2) { - return ((RtcTime.hour < tariff2) || // Tarrif1 = Off-Peak - (RtcTime.hour >= tariff1) || + if (Settings.tariff[0][dst] != Settings.tariff[1][dst]) { + uint32_t minutes = MinutesPastMidnight(); + return ((minutes < Settings.tariff[1][dst]) || // Tarrif1 = Off-Peak + (minutes >= Settings.tariff[0][dst]) || (Settings.flag3.energy_weekend && ((RtcTime.day_of_week == 1) || (RtcTime.day_of_week == 7))) ); + } else { return false; } @@ -583,30 +583,46 @@ void CmndEnergyReset(void) void CmndTariff(void) { - // Tariff1 22,23 - Tariff1 start hour for Standard Time and Daylight Savings Time - // Tariff2 6,7 - Tariff2 start hour for Standard Time and Daylight Savings Time + // Tariff1 22:00,23:00 - Tariff1 start hour for Standard Time and Daylight Savings Time + // Tariff2 6:00,7:00 - Tariff2 start hour for Standard Time and Daylight Savings Time + // Tariffx 1320, 1380 = minutes and also 22:00, 23:00 + // Tariffx 22, 23 = hours and also 22:00, 23:00 // Tariff9 0/1 if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= 2)) { - char *p; - char *str = strtok_r(XdrvMailbox.data, ", ", &p); + uint32_t tariff = XdrvMailbox.index -1; uint32_t time_type = 0; - while ((str != nullptr) && (time_type <= 2)) { - uint8_t value = strtol(str, nullptr, 10); - if ((value >= 0) && (value < 24)) { - Settings.register8[R8_ENERGY_TARIFF1_ST + (XdrvMailbox.index -1) + time_type] = value; + 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; + } + 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 += 2; + time_type++; } } else if (XdrvMailbox.index == 9) { Settings.flag3.energy_weekend = XdrvMailbox.payload & 1; } - Response_P(PSTR("{\"%s\":{\"Off-Peak\":[%d,%d],\"Standard\":[%d,%d],\"Weekend\":\"%s\"}}"), + Response_P(PSTR("{\"%s\":{\"Off-Peak\":{\"STD\":\"%s\",\"DST\":\"%s\"},\"Standard\":{\"STD\":\"%s\",\"DST\":\"%s\"},\"Weekend\":\"%s\"}}"), XdrvMailbox.command, - Settings.register8[R8_ENERGY_TARIFF1_ST], Settings.register8[R8_ENERGY_TARIFF1_DS], - Settings.register8[R8_ENERGY_TARIFF2_ST], Settings.register8[R8_ENERGY_TARIFF2_DS], + 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)); } @@ -954,7 +970,8 @@ void EnergyShow(bool json) char export_active_chr[3][FLOATSZ]; dtostrfd(Energy.export_active, Settings.flag2.energy_resolution, export_active_chr[0]); uint8_t energy_total_fields = 1; - if (Settings.register8[R8_ENERGY_TARIFF1_ST] != Settings.register8[R8_ENERGY_TARIFF2_ST]) { + + if (Settings.tariff[0][0] != Settings.tariff[1][0]) { dtostrfd((float)RtcSettings.energy_usage.usage1_kWhtotal / 100000, Settings.flag2.energy_resolution, energy_total_chr[1]); // Tariff1 dtostrfd((float)RtcSettings.energy_usage.usage2_kWhtotal / 100000, Settings.flag2.energy_resolution, energy_total_chr[2]); // Tariff2 dtostrfd((float)RtcSettings.energy_usage.return1_kWhtotal / 100000, Settings.flag2.energy_resolution, export_active_chr[1]); // Tariff1