From a6ff02a3cf0ae19df13bf669ce8be39cd3516526 Mon Sep 17 00:00:00 2001 From: Joe Date: Thu, 2 Jun 2022 21:53:20 -0400 Subject: [PATCH] Refactor clock syncing (#3503) * Expose `send_local_time()` as public, for use in lambdas. This will send the current time configured in `time_id`. * Add a new `set_clock()` public method, separate from time_id. This allows setting the clock manually, without syncing from a Time Component. Again this can only be called from ESPHome; i.e., generally from a lambda. --- esphome/components/bedjet/bedjet.cpp | 49 ++++++++++++++++------------ esphome/components/bedjet/bedjet.h | 3 +- 2 files changed, 30 insertions(+), 22 deletions(-) diff --git a/esphome/components/bedjet/bedjet.cpp b/esphome/components/bedjet/bedjet.cpp index 493685448c..60eef52334 100644 --- a/esphome/components/bedjet/bedjet.cpp +++ b/esphome/components/bedjet/bedjet.cpp @@ -308,7 +308,7 @@ void Bedjet::gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_t gattc #ifdef USE_TIME if (this->time_id_.has_value()) { - this->send_local_time_(); + this->send_local_time(); } #endif break; @@ -463,40 +463,47 @@ uint8_t Bedjet::write_notify_config_descriptor_(bool enable) { #ifdef USE_TIME /** Attempts to sync the local time (via `time_id`) to the BedJet device. */ -void Bedjet::send_local_time_() { - if (this->node_state != espbt::ClientState::ESTABLISHED) { - ESP_LOGV(TAG, "[%s] Not connected, cannot send time.", this->get_name().c_str()); - return; - } - auto *time_id = *this->time_id_; - time::ESPTime now = time_id->now(); - if (now.is_valid()) { - uint8_t hour = now.hour; - uint8_t minute = now.minute; - BedjetPacket *pkt = this->codec_->get_set_time_request(hour, minute); - auto status = this->write_bedjet_packet_(pkt); - if (status) { - ESP_LOGW(TAG, "Failed setting BedJet clock: %d", status); - } else { - ESP_LOGD(TAG, "[%s] BedJet clock set to: %d:%02d", this->get_name().c_str(), hour, minute); +void Bedjet::send_local_time() { + if (this->time_id_.has_value()) { + auto *time_id = *this->time_id_; + time::ESPTime now = time_id->now(); + if (now.is_valid()) { + this->set_clock(now.hour, now.minute); + ESP_LOGD(TAG, "Using time component to set BedJet clock: %d:%02d", now.hour, now.minute); } + } else { + ESP_LOGI(TAG, "`time_id` is not configured: will not sync BedJet clock."); } } /** Initializes time sync callbacks to support syncing current time to the BedJet. */ void Bedjet::setup_time_() { if (this->time_id_.has_value()) { - this->send_local_time_(); + this->send_local_time(); auto *time_id = *this->time_id_; - time_id->add_on_time_sync_callback([this] { this->send_local_time_(); }); - time::ESPTime now = time_id->now(); - ESP_LOGD(TAG, "Using time component to set BedJet clock: %d:%02d", now.hour, now.minute); + time_id->add_on_time_sync_callback([this] { this->send_local_time(); }); } else { ESP_LOGI(TAG, "`time_id` is not configured: will not sync BedJet clock."); } } #endif +/** Attempt to set the BedJet device's clock to the specified time. */ +void Bedjet::set_clock(uint8_t hour, uint8_t minute) { + if (this->node_state != espbt::ClientState::ESTABLISHED) { + ESP_LOGV(TAG, "[%s] Not connected, cannot send time.", this->get_name().c_str()); + return; + } + + BedjetPacket *pkt = this->codec_->get_set_time_request(hour, minute); + auto status = this->write_bedjet_packet_(pkt); + if (status) { + ESP_LOGW(TAG, "Failed setting BedJet clock: %d", status); + } else { + ESP_LOGD(TAG, "[%s] BedJet clock set to: %d:%02d", this->get_name().c_str(), hour, minute); + } +} + /** Writes one BedjetPacket to the BLE client on the BEDJET_COMMAND_UUID. */ uint8_t Bedjet::write_bedjet_packet_(BedjetPacket *pkt) { if (this->node_state != espbt::ClientState::ESTABLISHED) { diff --git a/esphome/components/bedjet/bedjet.h b/esphome/components/bedjet/bedjet.h index 5d66f6f252..cdb7d21d1a 100644 --- a/esphome/components/bedjet/bedjet.h +++ b/esphome/components/bedjet/bedjet.h @@ -38,7 +38,9 @@ class Bedjet : public climate::Climate, public esphome::ble_client::BLEClientNod #ifdef USE_TIME void set_time_id(time::RealTimeClock *time_id) { this->time_id_ = time_id; } + void send_local_time(); #endif + void set_clock(uint8_t hour, uint8_t minute); void set_status_timeout(uint32_t timeout) { this->timeout_ = timeout; } /** Sets the default strategy to use for climate::CLIMATE_MODE_HEAT. */ void set_heating_mode(BedjetHeatMode mode) { this->heating_mode_ = mode; } @@ -90,7 +92,6 @@ class Bedjet : public climate::Climate, public esphome::ble_client::BLEClientNod #ifdef USE_TIME void setup_time_(); - void send_local_time_(); optional time_id_{}; #endif