mirror of
https://github.com/arendst/Tasmota.git
synced 2025-07-24 19:26:37 +00:00
Fix RTC using manual time
This commit is contained in:
parent
e498b28864
commit
e5dfbb1137
@ -371,42 +371,46 @@ uint32_t RuleToTime(TimeRule r, int yr)
|
|||||||
void RtcSecond(void)
|
void RtcSecond(void)
|
||||||
{
|
{
|
||||||
static uint32_t last_sync = 0;
|
static uint32_t last_sync = 0;
|
||||||
|
static bool mutex = false;
|
||||||
|
|
||||||
|
if (mutex) { return; }
|
||||||
|
|
||||||
|
if (Rtc.time_synced) {
|
||||||
|
mutex = true;
|
||||||
|
|
||||||
|
Rtc.time_synced = false;
|
||||||
|
last_sync = Rtc.utc_time;
|
||||||
|
|
||||||
|
if (Rtc.restart_time == 0) {
|
||||||
|
Rtc.restart_time = Rtc.utc_time - TasmotaGlobal.uptime; // save first synced time as restart time
|
||||||
|
}
|
||||||
|
|
||||||
|
TIME_T tmpTime;
|
||||||
|
BreakTime(Rtc.utc_time, tmpTime);
|
||||||
|
RtcTime.year = tmpTime.year + 1970;
|
||||||
|
Rtc.daylight_saving_time = RuleToTime(Settings.tflag[1], RtcTime.year);
|
||||||
|
Rtc.standard_time = RuleToTime(Settings.tflag[0], RtcTime.year);
|
||||||
|
|
||||||
|
// Do not use AddLog_P( here (interrupt routine) if syslog or mqttlog is enabled. UDP/TCP will force exception 9
|
||||||
|
PrepLog_P(LOG_LEVEL_DEBUG, PSTR("RTC: " D_UTC_TIME " %s, " D_DST_TIME " %s, " D_STD_TIME " %s"),
|
||||||
|
GetDateAndTime(DT_UTC).c_str(), GetDateAndTime(DT_DST).c_str(), GetDateAndTime(DT_STD).c_str());
|
||||||
|
|
||||||
|
if (Rtc.local_time < START_VALID_TIME) { // 2016-01-01
|
||||||
|
TasmotaGlobal.rules_flag.time_init = 1;
|
||||||
|
} else {
|
||||||
|
TasmotaGlobal.rules_flag.time_set = 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Rtc.utc_time++; // Increment every second
|
||||||
|
}
|
||||||
Rtc.millis = millis();
|
Rtc.millis = millis();
|
||||||
|
|
||||||
if (!Rtc.user_time_entry) {
|
if ((Rtc.utc_time > (2 * 60 * 60)) && (last_sync < Rtc.utc_time - (2 * 60 * 60))) { // Every two hours a warning
|
||||||
if (Rtc.time_synced) {
|
// Do not use AddLog_P( here (interrupt routine) if syslog or mqttlog is enabled. UDP/TCP will force exception 9
|
||||||
Rtc.time_synced = false;
|
PrepLog_P(LOG_LEVEL_DEBUG, PSTR("RTC: Not synced"));
|
||||||
last_sync = Rtc.utc_time;
|
last_sync = Rtc.utc_time;
|
||||||
|
|
||||||
if (Rtc.restart_time == 0) {
|
|
||||||
Rtc.restart_time = Rtc.utc_time - TasmotaGlobal.uptime; // save first synced time as restart time
|
|
||||||
}
|
|
||||||
|
|
||||||
TIME_T tmpTime;
|
|
||||||
BreakTime(Rtc.utc_time, tmpTime);
|
|
||||||
RtcTime.year = tmpTime.year + 1970;
|
|
||||||
Rtc.daylight_saving_time = RuleToTime(Settings.tflag[1], RtcTime.year);
|
|
||||||
Rtc.standard_time = RuleToTime(Settings.tflag[0], RtcTime.year);
|
|
||||||
|
|
||||||
// Do not use AddLog_P( here (interrupt routine) if syslog or mqttlog is enabled. UDP/TCP will force exception 9
|
|
||||||
PrepLog_P(LOG_LEVEL_DEBUG, PSTR("RTC: " D_UTC_TIME " %s, " D_DST_TIME " %s, " D_STD_TIME " %s"),
|
|
||||||
GetDateAndTime(DT_UTC).c_str(), GetDateAndTime(DT_DST).c_str(), GetDateAndTime(DT_STD).c_str());
|
|
||||||
|
|
||||||
if (Rtc.local_time < START_VALID_TIME) { // 2016-01-01
|
|
||||||
TasmotaGlobal.rules_flag.time_init = 1;
|
|
||||||
} else {
|
|
||||||
TasmotaGlobal.rules_flag.time_set = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ((Rtc.utc_time > (2 * 60 * 60)) && (last_sync < Rtc.utc_time - (2 * 60 * 60))) { // Every two hours a warning
|
|
||||||
// Do not use AddLog_P( here (interrupt routine) if syslog or mqttlog is enabled. UDP/TCP will force exception 9
|
|
||||||
PrepLog_P(LOG_LEVEL_DEBUG, PSTR("RTC: Not synced"));
|
|
||||||
last_sync = Rtc.utc_time;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Rtc.utc_time++; // Increment every second
|
|
||||||
Rtc.local_time = Rtc.utc_time;
|
Rtc.local_time = Rtc.utc_time;
|
||||||
if (Rtc.local_time > START_VALID_TIME) { // 2016-01-01
|
if (Rtc.local_time > START_VALID_TIME) { // 2016-01-01
|
||||||
int16_t timezone_minutes = Settings.timezone_minutes;
|
int16_t timezone_minutes = Settings.timezone_minutes;
|
||||||
@ -453,10 +457,17 @@ void RtcSecond(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
RtcTime.year += 1970;
|
RtcTime.year += 1970;
|
||||||
|
|
||||||
|
mutex = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void RtcSetTime(uint32_t epoch)
|
void RtcSync(void) {
|
||||||
{
|
Rtc.time_synced = true;
|
||||||
|
RtcSecond();
|
||||||
|
// AddLog_P(LOG_LEVEL_DEBUG, PSTR("RTC: Synced"));
|
||||||
|
}
|
||||||
|
|
||||||
|
void RtcSetTime(uint32_t epoch) {
|
||||||
if (epoch < START_VALID_TIME) { // 2016-01-01
|
if (epoch < START_VALID_TIME) { // 2016-01-01
|
||||||
Rtc.user_time_entry = false;
|
Rtc.user_time_entry = false;
|
||||||
TasmotaGlobal.ntp_force_sync = true;
|
TasmotaGlobal.ntp_force_sync = true;
|
||||||
@ -466,8 +477,7 @@ void RtcSetTime(uint32_t epoch)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void RtcInit(void)
|
void RtcInit(void) {
|
||||||
{
|
|
||||||
Rtc.utc_time = 0;
|
Rtc.utc_time = 0;
|
||||||
BreakTime(Rtc.utc_time, RtcTime);
|
BreakTime(Rtc.utc_time, RtcTime);
|
||||||
TickerRtc.attach(1, RtcSecond);
|
TickerRtc.attach(1, RtcSecond);
|
||||||
|
@ -705,7 +705,7 @@ void wifiKeepAlive(void) {
|
|||||||
void WifiPollNtp() {
|
void WifiPollNtp() {
|
||||||
static uint8_t ntp_sync_minute = 0;
|
static uint8_t ntp_sync_minute = 0;
|
||||||
|
|
||||||
if (TasmotaGlobal.global_state.network_down) { return; }
|
if (TasmotaGlobal.global_state.network_down || Rtc.user_time_entry) { return; }
|
||||||
|
|
||||||
uint8_t uptime_minute = (TasmotaGlobal.uptime / 60) % 60; // 0 .. 59
|
uint8_t uptime_minute = (TasmotaGlobal.uptime / 60) % 60; // 0 .. 59
|
||||||
if ((ntp_sync_minute > 59) && (uptime_minute > 2)) {
|
if ((ntp_sync_minute > 59) && (uptime_minute > 2)) {
|
||||||
@ -722,9 +722,7 @@ void WifiPollNtp() {
|
|||||||
if (ntp_time > START_VALID_TIME) {
|
if (ntp_time > START_VALID_TIME) {
|
||||||
Rtc.utc_time = ntp_time;
|
Rtc.utc_time = ntp_time;
|
||||||
ntp_sync_minute = 60; // Sync so block further requests
|
ntp_sync_minute = 60; // Sync so block further requests
|
||||||
Rtc.time_synced = true;
|
RtcSync();
|
||||||
RtcSecond();
|
|
||||||
// AddLog_P(LOG_LEVEL_DEBUG, PSTR("NTP: Synced"));
|
|
||||||
} else {
|
} else {
|
||||||
ntp_sync_minute++; // Try again in next minute
|
ntp_sync_minute++; // Try again in next minute
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user