Add minutes to commands Timezone

Add minutes to commands Timezone to allow all possible world timezones
This commit is contained in:
Theo Arends 2018-11-01 13:00:05 +01:00
parent a56832073b
commit 46a0a0afba
8 changed files with 93 additions and 78 deletions

View File

@ -1,7 +1,8 @@
/* 6.3.0.1 20181031 /* 6.3.0.1 20181031
* Add wifi status to Tuya (#4221) * Add wifi status to Tuya (#4221)
* Add default sleep 1 to sonoff-basic to lower enrgy consumption (#4217) * Add default sleep 1 to sonoff-basic to lower energy consumption (#4217)
* Fix unintended function overload of WifiState * Fix unintended function overload of WifiState
* Add minutes to commands Timezone to allow all possible world timezones
* *
* 6.3.0 20181030 * 6.3.0 20181030
* Release of v6.3.0 * Release of v6.3.0

View File

@ -302,9 +302,7 @@ struct SYSCFG {
uint16_t pulse_counter_type; // 5D0 uint16_t pulse_counter_type; // 5D0
uint16_t pulse_counter_debounce; // 5D2 uint16_t pulse_counter_debounce; // 5D2
uint8_t rf_code[17][9]; // 5D4 uint8_t rf_code[17][9]; // 5D4
uint8_t timezone_minutes; // 66D
byte free_66d[1]; // 66D
uint16_t switch_debounce; // 66E uint16_t switch_debounce; // 66E
Timer timer[MAX_TIMERS]; // 670 Timer timer[MAX_TIMERS]; // 670
int latitude; // 6B0 int latitude; // 6B0

View File

@ -607,7 +607,13 @@ void SettingsDefaultSet2()
SettingsDefaultSet_5_10_1(); // Display settings SettingsDefaultSet_5_10_1(); // Display settings
// Time // Time
if (((APP_TIMEZONE > -14) && (APP_TIMEZONE < 15)) || (99 == APP_TIMEZONE)) {
Settings.timezone = APP_TIMEZONE; Settings.timezone = APP_TIMEZONE;
Settings.timezone_minutes = 0;
} else {
Settings.timezone = APP_TIMEZONE / 60;
Settings.timezone_minutes = abs(APP_TIMEZONE % 60);
}
strlcpy(Settings.ntp_server[0], NTP_SERVER1, sizeof(Settings.ntp_server[0])); strlcpy(Settings.ntp_server[0], NTP_SERVER1, sizeof(Settings.ntp_server[0]));
strlcpy(Settings.ntp_server[1], NTP_SERVER2, sizeof(Settings.ntp_server[1])); strlcpy(Settings.ntp_server[1], NTP_SERVER2, sizeof(Settings.ntp_server[1]));
strlcpy(Settings.ntp_server[2], NTP_SERVER3, sizeof(Settings.ntp_server[2])); strlcpy(Settings.ntp_server[2], NTP_SERVER3, sizeof(Settings.ntp_server[2]));
@ -836,6 +842,9 @@ void SettingsDelta()
Settings.rgbwwTable[j] = 255; Settings.rgbwwTable[j] = 255;
} }
} }
if (Settings.version < 0x06030002) {
Settings.timezone_minutes = 0;
}
Settings.version = VERSION; Settings.version = VERSION;
SettingsSave(1); SettingsSave(1);

View File

@ -1163,10 +1163,29 @@ void MqttDataHandler(char* topic, byte* data, unsigned int data_len)
} }
} }
else if (CMND_TIMEZONE == command_code) { else if (CMND_TIMEZONE == command_code) {
if ((data_len > 0) && (((payload >= -13) && (payload <= 14)) || (99 == payload))) { if ((data_len > 0) && (payload >= -13)) {
Settings.timezone = payload; Settings.timezone = payload;
Settings.timezone_minutes = 0;
if (payload < 15) {
p = strtok (dataBuf, ":");
if (p) {
p = strtok (NULL, ":");
if (p) {
Settings.timezone_minutes = strtol(p, NULL, 10);
if (Settings.timezone_minutes > 59) { Settings.timezone_minutes = 59; }
} }
}
} else {
Settings.timezone = 99;
}
ntp_force_sync = 1;
}
if (99 == Settings.timezone) {
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_NVALUE, command, Settings.timezone); snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_NVALUE, command, Settings.timezone);
} else {
snprintf_P(stemp1, sizeof(stemp1), PSTR("%+03d:%02d"), Settings.timezone, Settings.timezone_minutes);
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_SVALUE, command, stemp1);
}
} }
else if ((CMND_TIMESTD == command_code) || (CMND_TIMEDST == command_code)) { else if ((CMND_TIMESTD == command_code) || (CMND_TIMEDST == command_code)) {
// TimeStd 0/1, 0/1/2/3/4, 1..12, 1..7, 0..23, +/-780 // TimeStd 0/1, 0/1/2/3/4, 1..12, 1..7, 0..23, +/-780
@ -1491,12 +1510,17 @@ void PublishStatus(uint8_t payload)
} }
if ((0 == payload) || (7 == payload)) { if ((0 == payload) || (7 == payload)) {
if (99 == Settings.timezone) {
snprintf_P(stemp, sizeof(stemp), PSTR("%d" ), Settings.timezone);
} else {
snprintf_P(stemp, sizeof(stemp), PSTR("\"%s\"" ), GetTimeZone().c_str());
}
#if defined(USE_TIMERS) && defined(USE_SUNRISE) #if defined(USE_TIMERS) && defined(USE_SUNRISE)
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_STATUS D_STATUS7_TIME "\":{\"" D_JSON_UTC_TIME "\":\"%s\",\"" D_JSON_LOCAL_TIME "\":\"%s\",\"" D_JSON_STARTDST "\":\"%s\",\"" D_JSON_ENDDST "\":\"%s\",\"" D_CMND_TIMEZONE "\":%d,\"" D_JSON_SUNRISE "\":\"%s\",\"" D_JSON_SUNSET "\":\"%s\"}}"), snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_STATUS D_STATUS7_TIME "\":{\"" D_JSON_UTC_TIME "\":\"%s\",\"" D_JSON_LOCAL_TIME "\":\"%s\",\"" D_JSON_STARTDST "\":\"%s\",\"" D_JSON_ENDDST "\":\"%s\",\"" D_CMND_TIMEZONE "\":%s,\"" D_JSON_SUNRISE "\":\"%s\",\"" D_JSON_SUNSET "\":\"%s\"}}"),
GetTime(0).c_str(), GetTime(1).c_str(), GetTime(2).c_str(), GetTime(3).c_str(), Settings.timezone, GetSun(0).c_str(), GetSun(1).c_str()); GetTime(0).c_str(), GetTime(1).c_str(), GetTime(2).c_str(), GetTime(3).c_str(), stemp, GetSun(0).c_str(), GetSun(1).c_str());
#else #else
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_STATUS D_STATUS7_TIME "\":{\"" D_JSON_UTC_TIME "\":\"%s\",\"" D_JSON_LOCAL_TIME "\":\"%s\",\"" D_JSON_STARTDST "\":\"%s\",\"" D_JSON_ENDDST "\":\"%s\",\"" D_CMND_TIMEZONE "\":%d}}"), snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_STATUS D_STATUS7_TIME "\":{\"" D_JSON_UTC_TIME "\":\"%s\",\"" D_JSON_LOCAL_TIME "\":\"%s\",\"" D_JSON_STARTDST "\":\"%s\",\"" D_JSON_ENDDST "\":\"%s\",\"" D_CMND_TIMEZONE "\":%s}}"),
GetTime(0).c_str(), GetTime(1).c_str(), GetTime(2).c_str(), GetTime(3).c_str(), Settings.timezone); GetTime(0).c_str(), GetTime(1).c_str(), GetTime(2).c_str(), GetTime(3).c_str(), stemp);
#endif // USE_TIMERS and USE_SUNRISE #endif // USE_TIMERS and USE_SUNRISE
MqttPublishPrefixTopic_P(option, PSTR(D_CMND_STATUS "7")); MqttPublishPrefixTopic_P(option, PSTR(D_CMND_STATUS "7"));
} }

View File

@ -1624,6 +1624,7 @@ int WifiState()
void WifiConnect() void WifiConnect()
{ {
WifiSetState(0);
WiFi.persistent(false); // Solve possible wifi init errors WiFi.persistent(false); // Solve possible wifi init errors
wifi_status = 0; wifi_status = 0;
wifi_retry_init = WIFI_RETRY_OFFSET_SEC + ((ESP.getChipId() & 0xF) * 2); wifi_retry_init = WIFI_RETRY_OFFSET_SEC + ((ESP.getChipId() & 0xF) * 2);
@ -1881,6 +1882,7 @@ extern "C" {
#define SECS_PER_MIN ((uint32_t)(60UL)) #define SECS_PER_MIN ((uint32_t)(60UL))
#define SECS_PER_HOUR ((uint32_t)(3600UL)) #define SECS_PER_HOUR ((uint32_t)(3600UL))
#define SECS_PER_DAY ((uint32_t)(SECS_PER_HOUR * 24UL)) #define SECS_PER_DAY ((uint32_t)(SECS_PER_HOUR * 24UL))
#define MINS_PER_HOUR ((uint32_t)(60UL))
#define LEAP_YEAR(Y) (((1970+Y)>0) && !((1970+Y)%4) && (((1970+Y)%100) || !((1970+Y)%400))) #define LEAP_YEAR(Y) (((1970+Y)>0) && !((1970+Y)%4) && (((1970+Y)%100) || !((1970+Y)%400)))
Ticker TickerRtc; Ticker TickerRtc;
@ -1895,7 +1897,7 @@ uint32_t standard_time = 0;
uint32_t ntp_time = 0; uint32_t ntp_time = 0;
uint32_t midnight = 1451602800; uint32_t midnight = 1451602800;
uint32_t restart_time = 0; uint32_t restart_time = 0;
int16_t time_timezone = 0; // Timezone * 10 int32_t time_zone = 0;
uint8_t midnight_now = 0; uint8_t midnight_now = 0;
uint8_t ntp_sync_minute = 0; uint8_t ntp_sync_minute = 0;
@ -1925,7 +1927,16 @@ String GetBuildDateAndTime()
} }
int month = (strstr(kMonthNamesEnglish, smonth) -kMonthNamesEnglish) /3 +1; int month = (strstr(kMonthNamesEnglish, smonth) -kMonthNamesEnglish) /3 +1;
snprintf_P(bdt, sizeof(bdt), PSTR("%d" D_YEAR_MONTH_SEPARATOR "%02d" D_MONTH_DAY_SEPARATOR "%02d" D_DATE_TIME_SEPARATOR "%s"), year, month, day, __TIME__); snprintf_P(bdt, sizeof(bdt), PSTR("%d" D_YEAR_MONTH_SEPARATOR "%02d" D_MONTH_DAY_SEPARATOR "%02d" D_DATE_TIME_SEPARATOR "%s"), year, month, day, __TIME__);
return String(bdt); return String(bdt); // 2017-03-07T11:08:02
}
String GetTimeZone()
{
char tz[7];
snprintf_P(tz, sizeof(tz), PSTR("%+03d:%02d"), time_zone / 60, abs(time_zone % 60));
return String(tz); // -03:45
} }
/* /*
@ -1970,10 +1981,27 @@ String GetDateAndTime(byte time_type)
if (Settings.flag3.time_append_timezone && (DT_LOCAL == time_type)) { if (Settings.flag3.time_append_timezone && (DT_LOCAL == time_type)) {
// if (Settings.flag3.time_append_timezone && ((DT_LOCAL == time_type) || (DT_ENERGY == time_type))) { // if (Settings.flag3.time_append_timezone && ((DT_LOCAL == time_type) || (DT_ENERGY == time_type))) {
snprintf_P(dt, sizeof(dt), PSTR("%s%+03d:%02d"), dt, time_timezone / 10, abs((time_timezone % 10) * 6)); // if timezone = +2:30 then time_timezone = 25 strncat(dt, GetTimeZone().c_str(), sizeof(dt));
} }
return String(dt); return String(dt); // 2017-03-07T11:08:02-07:00
}
String GetTime(int type)
{
/* type 1 - Local time
* type 2 - Daylight Savings time
* type 3 - Standard time
*/
char stime[25]; // Skip newline
uint32_t time = utc_time;
if (1 == type) time = local_time;
if (2 == type) time = daylight_saving_time;
if (3 == type) time = standard_time;
snprintf_P(stime, sizeof(stime), sntp_get_real_time(time));
return String(stime); // Thu Nov 01 11:41:02 2018
} }
String GetUptime() String GetUptime()
@ -1993,9 +2021,9 @@ String GetUptime()
// "128 14:35:44" - OpenVMS // "128 14:35:44" - OpenVMS
// "128T14:35:44" - Tasmota // "128T14:35:44" - Tasmota
snprintf_P(dt, sizeof(dt), PSTR("%dT%02d:%02d:%02d"), snprintf_P(dt, sizeof(dt), PSTR("%dT%02d:%02d:%02d"), ut.days, ut.hour, ut.minute, ut.second);
ut.days, ut.hour, ut.minute, ut.second);
return String(dt); return String(dt); // 128T14:35:44
} }
uint32_t GetMinutesUptime() uint32_t GetMinutesUptime()
@ -2143,18 +2171,6 @@ uint32_t RuleToTime(TimeRule r, int yr)
return t; return t;
} }
String GetTime(int type)
{
char stime[25]; // Skip newline
uint32_t time = utc_time;
if (1 == type) time = local_time;
if (2 == type) time = daylight_saving_time;
if (3 == type) time = standard_time;
snprintf_P(stime, sizeof(stime), sntp_get_real_time(time));
return String(stime);
}
uint32_t LocalTime() uint32_t LocalTime()
{ {
return local_time; return local_time;
@ -2174,8 +2190,6 @@ boolean MidnightNow()
void RtcSecond() void RtcSecond()
{ {
int32_t stdoffset;
int32_t dstoffset;
TIME_T tmpTime; TIME_T tmpTime;
if ((ntp_sync_minute > 59) && (RtcTime.minute > 2)) ntp_sync_minute = 1; // If sync prepare for a new cycle if ((ntp_sync_minute > 59) && (RtcTime.minute > 2)) ntp_sync_minute = 1; // If sync prepare for a new cycle
@ -2208,28 +2222,30 @@ void RtcSecond()
utc_time++; utc_time++;
local_time = utc_time; local_time = utc_time;
if (local_time > 1451602800) { // 2016-01-01 if (local_time > 1451602800) { // 2016-01-01
int32_t time_offset = Settings.timezone * SECS_PER_HOUR; int16_t timezone_minutes = Settings.timezone_minutes;
if (Settings.timezone < 0) { timezone_minutes *= -1; }
time_zone = (Settings.timezone * SECS_PER_HOUR) + (timezone_minutes * SECS_PER_MIN);
if (99 == Settings.timezone) { if (99 == Settings.timezone) {
dstoffset = Settings.toffset[1] * SECS_PER_MIN; int32_t dstoffset = Settings.toffset[1] * SECS_PER_MIN;
stdoffset = Settings.toffset[0] * SECS_PER_MIN; int32_t stdoffset = Settings.toffset[0] * SECS_PER_MIN;
if (Settings.tflag[1].hemis) { if (Settings.tflag[1].hemis) {
// Southern hemisphere // Southern hemisphere
if ((utc_time >= (standard_time - dstoffset)) && (utc_time < (daylight_saving_time - stdoffset))) { if ((utc_time >= (standard_time - dstoffset)) && (utc_time < (daylight_saving_time - stdoffset))) {
time_offset = stdoffset; // Standard Time time_zone = stdoffset; // Standard Time
} else { } else {
time_offset = dstoffset; // Daylight Saving Time time_zone = dstoffset; // Daylight Saving Time
} }
} else { } else {
// Northern hemisphere // Northern hemisphere
if ((utc_time >= (daylight_saving_time - stdoffset)) && (utc_time < (standard_time - dstoffset))) { if ((utc_time >= (daylight_saving_time - stdoffset)) && (utc_time < (standard_time - dstoffset))) {
time_offset = dstoffset; // Daylight Saving Time time_zone = dstoffset; // Daylight Saving Time
} else { } else {
time_offset = stdoffset; // Standard Time time_zone = stdoffset; // Standard Time
} }
} }
} }
local_time += time_offset; local_time += time_zone;
time_timezone = time_offset / 360; // (SECS_PER_HOUR / 10) fails as it is defined as UL time_zone /= 60;
if (!Settings.energy_kWhtotal_time) { Settings.energy_kWhtotal_time = local_time; } if (!Settings.energy_kWhtotal_time) { Settings.energy_kWhtotal_time = local_time; }
} }
BreakTime(local_time, RtcTime); BreakTime(local_time, RtcTime);

View File

@ -131,7 +131,7 @@ void DuskTillDawn(uint8_t *hour_up,uint8_t *minute_up, uint8_t *hour_down, uint8
// double Zeitzone = 0; //Weltzeit // double Zeitzone = 0; //Weltzeit
// double Zeitzone = 1; //Winterzeit // double Zeitzone = 1; //Winterzeit
// double Zeitzone = 2.0; //Sommerzeit // double Zeitzone = 2.0; //Sommerzeit
double Zeitzone = ((double)time_timezone) / 10; double Zeitzone = ((double)time_zone) / 60;
double Zeitgleichung = BerechneZeitgleichung(&DK, T); double Zeitgleichung = BerechneZeitgleichung(&DK, T);
double Minuten = Zeitgleichung * 60.0; double Minuten = Zeitgleichung * 60.0;
double Zeitdifferenz = 12.0*acos((sin(h) - sin(B)*sin(DK)) / (cos(B)*cos(DK)))/pi; double Zeitdifferenz = 12.0*acos((sin(h) - sin(B)*sin(DK)) / (cos(B)*cos(DK)))/pi;

View File

@ -226,22 +226,6 @@ void ShowFreeMem(const char *where)
/*********************************************************************************************\ /*********************************************************************************************\
* Function call to all xdrv * Function call to all xdrv
*
* FUNC_PRE_INIT
* FUNC_INIT
* FUNC_LOOP
* FUNC_MQTT_SUBSCRIBE
* FUNC_MQTT_INIT
* return FUNC_MQTT_DATA
* return FUNC_COMMAND
* FUNC_SET_POWER
* FUNC_SHOW_SENSOR
* FUNC_EVERY_SECOND
* FUNC_EVERY_50_MSECOND
* FUNC_EVERY_100_MSECOND
* FUNC_EVERY_250_MSECOND
* FUNC_RULES_PROCESS
* FUNC_FREE_MEM
\*********************************************************************************************/ \*********************************************************************************************/
boolean XdrvCall(byte Function) boolean XdrvCall(byte Function)
@ -249,9 +233,7 @@ boolean XdrvCall(byte Function)
boolean result = false; boolean result = false;
for (byte x = 0; x < xdrv_present; x++) { for (byte x = 0; x < xdrv_present; x++) {
if (!((WL_CONNECTED == WiFi.status()) && (static_cast<uint32_t>(WiFi.localIP()) != 0))) { if (global_state.wifi_down) { delay(1); }
delay(1);
}
result = xdrv_func_ptr[x](Function); result = xdrv_func_ptr[x](Function);
if (result) break; if (result) break;
} }

View File

@ -262,17 +262,6 @@ uint8_t xsns_index = 0;
/*********************************************************************************************\ /*********************************************************************************************\
* Function call to all xsns * Function call to all xsns
*
* FUNC_INIT
* FUNC_PREP_BEFORE_TELEPERIOD
* FUNC_SAVE_BEFORE_RESTART
* FUNC_JSON_APPEND
* FUNC_WEB_APPEND
* return FUNC_COMMAND
* FUNC_EVERY_50_MSECOND
* FUNC_EVERY_100_MSECOND
* FUNC_EVERY_250_MSECOND
* FUNC_EVERY_SECOND
\*********************************************************************************************/ \*********************************************************************************************/
uint8_t XsnsPresent() uint8_t XsnsPresent()
@ -284,9 +273,7 @@ boolean XsnsNextCall(byte Function)
{ {
xsns_index++; xsns_index++;
if (xsns_index == xsns_present) xsns_index = 0; if (xsns_index == xsns_present) xsns_index = 0;
if (!((WL_CONNECTED == WiFi.status()) && (static_cast<uint32_t>(WiFi.localIP()) != 0))) { if (global_state.wifi_down) { delay(1); }
delay(1);
}
return xsns_func_ptr[xsns_index](Function); return xsns_func_ptr[xsns_index](Function);
} }
@ -303,9 +290,7 @@ boolean XsnsCall(byte Function)
#ifdef PROFILE_XSNS_SENSOR_EVERY_SECOND #ifdef PROFILE_XSNS_SENSOR_EVERY_SECOND
uint32_t profile_start_millis = millis(); uint32_t profile_start_millis = millis();
#endif // PROFILE_XSNS_SENSOR_EVERY_SECOND #endif // PROFILE_XSNS_SENSOR_EVERY_SECOND
if (!((WL_CONNECTED == WiFi.status()) && (static_cast<uint32_t>(WiFi.localIP()) != 0))) { if (global_state.wifi_down) { delay(1); }
delay(1);
}
result = xsns_func_ptr[x](Function); result = xsns_func_ptr[x](Function);
#ifdef PROFILE_XSNS_SENSOR_EVERY_SECOND #ifdef PROFILE_XSNS_SENSOR_EVERY_SECOND