mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-31 15:12:06 +00:00 
			
		
		
		
	[wifi] Free scan results memory after successful connection
This commit is contained in:
		| @@ -468,6 +468,27 @@ async def wifi_disable_to_code(config, action_id, template_arg, args): | ||||
|     return cg.new_Pvariable(action_id, template_arg) | ||||
|  | ||||
|  | ||||
| _FLAGS = {"keep_scan_results": False} | ||||
|  | ||||
|  | ||||
| def request_wifi_scan_results(): | ||||
|     """Request that WiFi scan results be kept in memory after connection. | ||||
|  | ||||
|     Components that need access to scan results after WiFi is connected should | ||||
|     call this function during their code generation. This prevents the WiFi component from | ||||
|     freeing scan result memory after successful connection. | ||||
|     """ | ||||
|     _FLAGS["keep_scan_results"] = True | ||||
|  | ||||
|  | ||||
| @coroutine_with_priority(CoroPriority.FINAL) | ||||
| async def final_step(): | ||||
|     """Final code generation step to configure scan result retention.""" | ||||
|     if _FLAGS["keep_scan_results"]: | ||||
|         wifi_var = cg.MockObj(id="global_wifi_component", base="wifi::WiFiComponent *") | ||||
|         cg.add(wifi_var.set_keep_scan_results(True)) | ||||
|  | ||||
|  | ||||
| @automation.register_action( | ||||
|     "wifi.configure", | ||||
|     WiFiConfigureAction, | ||||
|   | ||||
| @@ -716,6 +716,12 @@ void WiFiComponent::check_connecting_finished() { | ||||
|     this->state_ = WIFI_COMPONENT_STATE_STA_CONNECTED; | ||||
|     this->num_retried_ = 0; | ||||
|  | ||||
|     // Free scan results memory unless a component needs them | ||||
|     if (!this->keep_scan_results_) { | ||||
|       this->scan_result_.clear(); | ||||
|       this->scan_result_.shrink_to_fit(); | ||||
|     } | ||||
|  | ||||
|     if (this->fast_connect_) { | ||||
|       this->save_fast_connect_settings_(); | ||||
|     } | ||||
|   | ||||
| @@ -316,6 +316,7 @@ class WiFiComponent : public Component { | ||||
|   int8_t wifi_rssi(); | ||||
|  | ||||
|   void set_enable_on_boot(bool enable_on_boot) { this->enable_on_boot_ = enable_on_boot; } | ||||
|   void set_keep_scan_results(bool keep_scan_results) { this->keep_scan_results_ = keep_scan_results; } | ||||
|  | ||||
|   Trigger<> *get_connect_trigger() const { return this->connect_trigger_; }; | ||||
|   Trigger<> *get_disconnect_trigger() const { return this->disconnect_trigger_; }; | ||||
| @@ -424,6 +425,7 @@ class WiFiComponent : public Component { | ||||
| #endif | ||||
|   bool enable_on_boot_; | ||||
|   bool got_ipv4_address_{false}; | ||||
|   bool keep_scan_results_{false}; | ||||
|  | ||||
|   // Pointers at the end (naturally aligned) | ||||
|   Trigger<> *connect_trigger_{new Trigger<>()}; | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| import esphome.codegen as cg | ||||
| from esphome.components import text_sensor | ||||
| from esphome.components import text_sensor, wifi | ||||
| import esphome.config_validation as cv | ||||
| from esphome.const import ( | ||||
|     CONF_BSSID, | ||||
| @@ -77,6 +77,8 @@ async def to_code(config): | ||||
|     await setup_conf(config, CONF_SSID) | ||||
|     await setup_conf(config, CONF_BSSID) | ||||
|     await setup_conf(config, CONF_MAC_ADDRESS) | ||||
|     if CONF_SCAN_RESULTS in config: | ||||
|         wifi.request_wifi_scan_results() | ||||
|     await setup_conf(config, CONF_SCAN_RESULTS) | ||||
|     await setup_conf(config, CONF_DNS_ADDRESS) | ||||
|     if conf := config.get(CONF_IP_ADDRESS): | ||||
|   | ||||
		Reference in New Issue
	
	Block a user