Relax NTP poll if no ntpserver can be resolved by DNS (#12838)

This commit is contained in:
Theo Arends 2021-08-08 15:22:44 +02:00
parent 0ce68b1b6b
commit 621a0eff11
4 changed files with 20 additions and 4 deletions

View File

@ -11,6 +11,7 @@ All notable changes to this project will be documented in this file.
### Changed ### Changed
- Make Sonoff L1 MusicSync persistent (#12008) - Make Sonoff L1 MusicSync persistent (#12008)
- Relax NTP poll if no ntpserver can be resolved by DNS
### Fixed ### Fixed
- Neopool communication error (#12813) - Neopool communication error (#12813)

View File

@ -129,6 +129,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo
- Extended supported sensor driver range to 128 - Extended supported sensor driver range to 128
- Disable PSRAM on unsupported hardware - Disable PSRAM on unsupported hardware
- ESP32 remove GPIO initialization to INPUT from not used GPIOs to allow JTAG support - ESP32 remove GPIO initialization to INPUT from not used GPIOs to allow JTAG support
- Relax NTP poll if no ntpserver can be resolved by DNS
- Make Sonoff L1 MusicSync persistent [#12008](https://github.com/arendst/Tasmota/issues/12008) - Make Sonoff L1 MusicSync persistent [#12008](https://github.com/arendst/Tasmota/issues/12008)
- Simplified configuration for ir-full and removal of tasmota-ircustom [#12428](https://github.com/arendst/Tasmota/issues/12428) - Simplified configuration for ir-full and removal of tasmota-ircustom [#12428](https://github.com/arendst/Tasmota/issues/12428)
- Refactor platformio [#12442](https://github.com/arendst/Tasmota/issues/12442) - Refactor platformio [#12442](https://github.com/arendst/Tasmota/issues/12442)

View File

@ -715,6 +715,7 @@ void wifiKeepAlive(void) {
void WifiPollNtp() { void WifiPollNtp() {
static uint8_t ntp_sync_minute = 0; static uint8_t ntp_sync_minute = 0;
static uint32_t ntp_run_time = 0;
if (TasmotaGlobal.global_state.network_down || Rtc.user_time_entry) { return; } if (TasmotaGlobal.global_state.network_down || Rtc.user_time_entry) { return; }
@ -723,13 +724,20 @@ void WifiPollNtp() {
ntp_sync_minute = 1; // If sync prepare for a new cycle ntp_sync_minute = 1; // If sync prepare for a new cycle
} }
// First try ASAP to sync. If fails try once every 60 seconds based on chip id // First try ASAP to sync. If fails try once every 60 seconds based on chip id
uint8_t offset = (TasmotaGlobal.uptime < 30) ? RtcTime.second : (((ESP_getChipId() & 0xF) * 3) + 3) ; uint8_t offset = (TasmotaGlobal.uptime < 30) ? RtcTime.second + ntp_run_time : (((ESP_getChipId() & 0xF) * 3) + 3) ;
if ( (((offset == RtcTime.second) && ( (RtcTime.year < 2016) || // Never synced if ( (((offset == RtcTime.second) && ( (RtcTime.year < 2016) || // Never synced
(ntp_sync_minute == uptime_minute))) || // Re-sync every hour (ntp_sync_minute == uptime_minute))) || // Re-sync every hour
TasmotaGlobal.ntp_force_sync ) ) { // Forced sync TasmotaGlobal.ntp_force_sync ) ) { // Forced sync
TasmotaGlobal.ntp_force_sync = false; TasmotaGlobal.ntp_force_sync = false;
ntp_run_time = millis();
uint32_t ntp_time = WifiGetNtp(); uint32_t ntp_time = WifiGetNtp();
ntp_run_time = (millis() - ntp_run_time) / 1000;
// AddLog(LOG_LEVEL_DEBUG, PSTR("NTP: Runtime %d"), ntp_run_time);
if (ntp_run_time < 5) { ntp_run_time = 0; } // DNS timeout is around 10s
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
@ -758,10 +766,14 @@ uint32_t WifiGetNtp(void) {
ntp_server = fallback_ntp_server; ntp_server = fallback_ntp_server;
} }
if (strlen(ntp_server)) { if (strlen(ntp_server)) {
resolved_ip = (WiFi.hostByName(ntp_server, time_server_ip) == 1); resolved_ip = (WiFi.hostByName(ntp_server, time_server_ip) == 1); // DNS timeout set to (ESP8266) 10s / (ESP32) 14s
if (255 == time_server_ip[0]) { resolved_ip = false; } if ((255 == time_server_ip[0]) || // No valid name resolved (255.255.255.255)
((255 == time_server_ip[1]) && (255 == time_server_ip[2]) && (255 == time_server_ip[3]))) { // No valid name resolved (x.255.255.255)
resolved_ip = false;
}
yield(); yield();
if (resolved_ip) { break; } if (resolved_ip) { break; }
// AddLog(LOG_LEVEL_DEBUG, PSTR("NTP: Unable to resolve '%s'"), ntp_server);
} }
ntp_server_id++; ntp_server_id++;
} }
@ -770,7 +782,7 @@ uint32_t WifiGetNtp(void) {
return 0; return 0;
} }
// AddLog(LOG_LEVEL_DEBUG, PSTR("NTP: Name %s, IP %_I"), ntp_server, (uint32_t)time_server_ip); // AddLog(LOG_LEVEL_DEBUG, PSTR("NTP: Host %s IP %_I"), ntp_server, (uint32_t)time_server_ip);
WiFiUDP udp; WiFiUDP udp;

View File

@ -858,6 +858,8 @@ void MqttDisconnected(int state) {
} }
MqttClient.disconnect(); MqttClient.disconnect();
// Check if this solves intermittent MQTT re-connection failures when broker is restarted
EspClient.stop();
AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_MQTT D_CONNECT_FAILED_TO " %s:%d, rc %d. " D_RETRY_IN " %d " D_UNIT_SECOND), SettingsText(SET_MQTT_HOST), Settings->mqtt_port, state, Mqtt.retry_counter); AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_MQTT D_CONNECT_FAILED_TO " %s:%d, rc %d. " D_RETRY_IN " %d " D_UNIT_SECOND), SettingsText(SET_MQTT_HOST), Settings->mqtt_port, state, Mqtt.retry_counter);
TasmotaGlobal.rules_flag.mqtt_disconnected = 1; TasmotaGlobal.rules_flag.mqtt_disconnected = 1;