mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-31 07:03:55 +00:00 
			
		
		
		
	Merge branch 'integration' into memory_api
This commit is contained in:
		| @@ -18,7 +18,10 @@ static const char *const TAG = "esp32_ble_client"; | |||||||
| // causing disconnections. These medium parameters balance responsiveness with bandwidth usage. | // causing disconnections. These medium parameters balance responsiveness with bandwidth usage. | ||||||
| static const uint16_t MEDIUM_MIN_CONN_INTERVAL = 0x08;  // 8 * 1.25ms = 10ms | static const uint16_t MEDIUM_MIN_CONN_INTERVAL = 0x08;  // 8 * 1.25ms = 10ms | ||||||
| static const uint16_t MEDIUM_MAX_CONN_INTERVAL = 0x0A;  // 10 * 1.25ms = 12.5ms | static const uint16_t MEDIUM_MAX_CONN_INTERVAL = 0x0A;  // 10 * 1.25ms = 12.5ms | ||||||
| static const uint16_t MEDIUM_CONN_TIMEOUT = 800;        // 800 * 10ms = 8s | // The timeout value was increased from 6s to 8s to address stability issues observed | ||||||
|  | // in certain BLE devices when operating through WiFi-based BLE proxies. The longer | ||||||
|  | // timeout reduces the likelihood of disconnections during periods of high latency. | ||||||
|  | static const uint16_t MEDIUM_CONN_TIMEOUT = 800;  // 800 * 10ms = 8s | ||||||
|  |  | ||||||
| // Fastest connection parameters for devices with short discovery timeouts | // Fastest connection parameters for devices with short discovery timeouts | ||||||
| static const uint16_t FAST_MIN_CONN_INTERVAL = 0x06;  // 6 * 1.25ms = 7.5ms (BLE minimum) | static const uint16_t FAST_MIN_CONN_INTERVAL = 0x06;  // 6 * 1.25ms = 7.5ms (BLE minimum) | ||||||
|   | |||||||
| @@ -265,8 +265,6 @@ def _validate(config): | |||||||
|         networks = config.get(CONF_NETWORKS, []) |         networks = config.get(CONF_NETWORKS, []) | ||||||
|         if not networks: |         if not networks: | ||||||
|             raise cv.Invalid("At least one network required for fast_connect!") |             raise cv.Invalid("At least one network required for fast_connect!") | ||||||
|         if len(networks) != 1: |  | ||||||
|             raise cv.Invalid("Fast connect can only be used with one network!") |  | ||||||
|  |  | ||||||
|     if CONF_USE_ADDRESS not in config: |     if CONF_USE_ADDRESS not in config: | ||||||
|         use_address = CORE.name + config[CONF_DOMAIN] |         use_address = CORE.name + config[CONF_DOMAIN] | ||||||
|   | |||||||
| @@ -91,8 +91,11 @@ void WiFiComponent::start() { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (this->fast_connect_) { |     if (this->fast_connect_) { | ||||||
|       this->selected_ap_ = this->sta_[0]; |       this->trying_loaded_ap_ = this->load_fast_connect_settings_(); | ||||||
|       this->load_fast_connect_settings_(); |       if (!this->trying_loaded_ap_) { | ||||||
|  |         this->ap_index_ = 0; | ||||||
|  |         this->selected_ap_ = this->sta_[this->ap_index_]; | ||||||
|  |       } | ||||||
|       this->start_connecting(this->selected_ap_, false); |       this->start_connecting(this->selected_ap_, false); | ||||||
|     } else { |     } else { | ||||||
|       this->start_scanning(); |       this->start_scanning(); | ||||||
| @@ -121,6 +124,14 @@ void WiFiComponent::start() { | |||||||
|   this->wifi_apply_hostname_(); |   this->wifi_apply_hostname_(); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void WiFiComponent::restart_adapter() { | ||||||
|  |   ESP_LOGW(TAG, "Restarting adapter"); | ||||||
|  |   this->wifi_mode_(false, {}); | ||||||
|  |   delay(100);  // NOLINT | ||||||
|  |   this->num_retried_ = 0; | ||||||
|  |   this->retry_hidden_ = false; | ||||||
|  | } | ||||||
|  |  | ||||||
| void WiFiComponent::loop() { | void WiFiComponent::loop() { | ||||||
|   this->wifi_loop_(); |   this->wifi_loop_(); | ||||||
|   const uint32_t now = App.get_loop_component_start_time(); |   const uint32_t now = App.get_loop_component_start_time(); | ||||||
| @@ -140,7 +151,7 @@ void WiFiComponent::loop() { | |||||||
|         this->status_set_warning("waiting to reconnect"); |         this->status_set_warning("waiting to reconnect"); | ||||||
|         if (millis() - this->action_started_ > 5000) { |         if (millis() - this->action_started_ > 5000) { | ||||||
|           if (this->fast_connect_ || this->retry_hidden_) { |           if (this->fast_connect_ || this->retry_hidden_) { | ||||||
|             this->start_connecting(this->sta_[0], false); |             this->start_connecting(this->selected_ap_, false); | ||||||
|           } else { |           } else { | ||||||
|             this->start_scanning(); |             this->start_scanning(); | ||||||
|           } |           } | ||||||
| @@ -703,18 +714,30 @@ void WiFiComponent::retry_connect() { | |||||||
|   delay(10); |   delay(10); | ||||||
|   if (!this->is_captive_portal_active_() && !this->is_esp32_improv_active_() && |   if (!this->is_captive_portal_active_() && !this->is_esp32_improv_active_() && | ||||||
|       (this->num_retried_ > 3 || this->error_from_callback_)) { |       (this->num_retried_ > 3 || this->error_from_callback_)) { | ||||||
|     if (this->num_retried_ > 5) { |     if (this->fast_connect_) { | ||||||
|       // If retry failed for more than 5 times, let's restart STA |       if (this->trying_loaded_ap_) { | ||||||
|       ESP_LOGW(TAG, "Restarting adapter"); |         this->trying_loaded_ap_ = false; | ||||||
|       this->wifi_mode_(false, {}); |         this->ap_index_ = 0;  // Retry from the first configured AP | ||||||
|       delay(100);  // NOLINT |       } else if (this->ap_index_ >= this->sta_.size() - 1) { | ||||||
|  |         ESP_LOGW(TAG, "No more APs to try"); | ||||||
|  |         this->ap_index_ = 0; | ||||||
|  |         this->restart_adapter(); | ||||||
|  |       } else { | ||||||
|  |         // Try next AP | ||||||
|  |         this->ap_index_++; | ||||||
|  |       } | ||||||
|       this->num_retried_ = 0; |       this->num_retried_ = 0; | ||||||
|       this->retry_hidden_ = false; |       this->selected_ap_ = this->sta_[this->ap_index_]; | ||||||
|     } else { |     } else { | ||||||
|       // Try hidden networks after 3 failed retries |       if (this->num_retried_ > 5) { | ||||||
|       ESP_LOGD(TAG, "Retrying with hidden networks"); |         // If retry failed for more than 5 times, let's restart STA | ||||||
|       this->retry_hidden_ = true; |         this->restart_adapter(); | ||||||
|       this->num_retried_++; |       } else { | ||||||
|  |         // Try hidden networks after 3 failed retries | ||||||
|  |         ESP_LOGD(TAG, "Retrying with hidden networks"); | ||||||
|  |         this->retry_hidden_ = true; | ||||||
|  |         this->num_retried_++; | ||||||
|  |       } | ||||||
|     } |     } | ||||||
|   } else { |   } else { | ||||||
|     this->num_retried_++; |     this->num_retried_++; | ||||||
| @@ -761,17 +784,22 @@ bool WiFiComponent::is_esp32_improv_active_() { | |||||||
| #endif | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
| void WiFiComponent::load_fast_connect_settings_() { | bool WiFiComponent::load_fast_connect_settings_() { | ||||||
|   SavedWifiFastConnectSettings fast_connect_save{}; |   SavedWifiFastConnectSettings fast_connect_save{}; | ||||||
|  |  | ||||||
|   if (this->fast_connect_pref_.load(&fast_connect_save)) { |   if (this->fast_connect_pref_.load(&fast_connect_save)) { | ||||||
|     bssid_t bssid{}; |     bssid_t bssid{}; | ||||||
|     std::copy(fast_connect_save.bssid, fast_connect_save.bssid + 6, bssid.begin()); |     std::copy(fast_connect_save.bssid, fast_connect_save.bssid + 6, bssid.begin()); | ||||||
|  |     this->ap_index_ = fast_connect_save.ap_index; | ||||||
|  |     this->selected_ap_ = this->sta_[this->ap_index_]; | ||||||
|     this->selected_ap_.set_bssid(bssid); |     this->selected_ap_.set_bssid(bssid); | ||||||
|     this->selected_ap_.set_channel(fast_connect_save.channel); |     this->selected_ap_.set_channel(fast_connect_save.channel); | ||||||
|  |  | ||||||
|     ESP_LOGD(TAG, "Loaded fast_connect settings"); |     ESP_LOGD(TAG, "Loaded fast_connect settings"); | ||||||
|  |     return true; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   return false; | ||||||
| } | } | ||||||
|  |  | ||||||
| void WiFiComponent::save_fast_connect_settings_() { | void WiFiComponent::save_fast_connect_settings_() { | ||||||
| @@ -783,6 +811,7 @@ void WiFiComponent::save_fast_connect_settings_() { | |||||||
|  |  | ||||||
|     memcpy(fast_connect_save.bssid, bssid.data(), 6); |     memcpy(fast_connect_save.bssid, bssid.data(), 6); | ||||||
|     fast_connect_save.channel = channel; |     fast_connect_save.channel = channel; | ||||||
|  |     fast_connect_save.ap_index = this->ap_index_; | ||||||
|  |  | ||||||
|     this->fast_connect_pref_.save(&fast_connect_save); |     this->fast_connect_pref_.save(&fast_connect_save); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -60,6 +60,7 @@ struct SavedWifiSettings { | |||||||
| struct SavedWifiFastConnectSettings { | struct SavedWifiFastConnectSettings { | ||||||
|   uint8_t bssid[6]; |   uint8_t bssid[6]; | ||||||
|   uint8_t channel; |   uint8_t channel; | ||||||
|  |   int8_t ap_index; | ||||||
| } PACKED;  // NOLINT | } PACKED;  // NOLINT | ||||||
|  |  | ||||||
| enum WiFiComponentState : uint8_t { | enum WiFiComponentState : uint8_t { | ||||||
| @@ -256,6 +257,7 @@ class WiFiComponent : public Component { | |||||||
|   void setup() override; |   void setup() override; | ||||||
|   void start(); |   void start(); | ||||||
|   void dump_config() override; |   void dump_config() override; | ||||||
|  |   void restart_adapter(); | ||||||
|   /// WIFI setup_priority. |   /// WIFI setup_priority. | ||||||
|   float get_setup_priority() const override; |   float get_setup_priority() const override; | ||||||
|   float get_loop_priority() const override; |   float get_loop_priority() const override; | ||||||
| @@ -353,7 +355,7 @@ class WiFiComponent : public Component { | |||||||
|   bool is_captive_portal_active_(); |   bool is_captive_portal_active_(); | ||||||
|   bool is_esp32_improv_active_(); |   bool is_esp32_improv_active_(); | ||||||
|  |  | ||||||
|   void load_fast_connect_settings_(); |   bool load_fast_connect_settings_(); | ||||||
|   void save_fast_connect_settings_(); |   void save_fast_connect_settings_(); | ||||||
|  |  | ||||||
| #ifdef USE_ESP8266 | #ifdef USE_ESP8266 | ||||||
| @@ -400,12 +402,14 @@ class WiFiComponent : public Component { | |||||||
|   WiFiComponentState state_{WIFI_COMPONENT_STATE_OFF}; |   WiFiComponentState state_{WIFI_COMPONENT_STATE_OFF}; | ||||||
|   WiFiPowerSaveMode power_save_{WIFI_POWER_SAVE_NONE}; |   WiFiPowerSaveMode power_save_{WIFI_POWER_SAVE_NONE}; | ||||||
|   uint8_t num_retried_{0}; |   uint8_t num_retried_{0}; | ||||||
|  |   uint8_t ap_index_{0}; | ||||||
| #if USE_NETWORK_IPV6 | #if USE_NETWORK_IPV6 | ||||||
|   uint8_t num_ipv6_addresses_{0}; |   uint8_t num_ipv6_addresses_{0}; | ||||||
| #endif /* USE_NETWORK_IPV6 */ | #endif /* USE_NETWORK_IPV6 */ | ||||||
|  |  | ||||||
|   // Group all boolean values together |   // Group all boolean values together | ||||||
|   bool fast_connect_{false}; |   bool fast_connect_{false}; | ||||||
|  |   bool trying_loaded_ap_{false}; | ||||||
|   bool retry_hidden_{false}; |   bool retry_hidden_{false}; | ||||||
|   bool has_ap_{false}; |   bool has_ap_{false}; | ||||||
|   bool handled_connected_state_{false}; |   bool handled_connected_state_{false}; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user