mirror of
https://github.com/esphome/esphome.git
synced 2026-05-22 18:56:40 +08:00
[api] Fix clock conflicts when multiple clients connected to homeassistant time (#13253)
This commit is contained in:
@@ -558,8 +558,10 @@ bool APIServer::clear_noise_psk(bool make_active) {
|
||||
#ifdef USE_HOMEASSISTANT_TIME
|
||||
void APIServer::request_time() {
|
||||
for (auto &client : this->clients_) {
|
||||
if (!client->flags_.remove && client->is_authenticated())
|
||||
if (!client->flags_.remove && client->is_authenticated()) {
|
||||
client->send_time_request();
|
||||
return; // Only request from one client to avoid clock conflicts
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -31,6 +31,18 @@ void RealTimeClock::dump_config() {
|
||||
|
||||
void RealTimeClock::synchronize_epoch_(uint32_t epoch) {
|
||||
ESP_LOGVV(TAG, "Got epoch %" PRIu32, epoch);
|
||||
// Skip if time is already synchronized to avoid unnecessary writes, log spam,
|
||||
// and prevent clock jumping backwards due to network latency
|
||||
constexpr time_t min_valid_epoch = 1546300800; // January 1, 2019
|
||||
time_t current_time = this->timestamp_now();
|
||||
// Check if time is valid (year >= 2019) before comparing
|
||||
if (current_time >= min_valid_epoch) {
|
||||
// Unsigned subtraction handles wraparound correctly, then cast to signed
|
||||
int32_t diff = static_cast<int32_t>(epoch - static_cast<uint32_t>(current_time));
|
||||
if (diff >= -1 && diff <= 1) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
// Update UTC epoch time.
|
||||
#ifdef USE_ZEPHYR
|
||||
struct timespec ts;
|
||||
|
||||
Reference in New Issue
Block a user