mirror of
https://github.com/esphome/esphome.git
synced 2025-10-19 18:23:46 +01:00
[wifi] Free scan results memory after connection (saves up to 1.2KB RAM) (#11205)
This commit is contained in:
@@ -447,6 +447,8 @@ async def to_code(config):
|
|||||||
var.get_disconnect_trigger(), [], on_disconnect_config
|
var.get_disconnect_trigger(), [], on_disconnect_config
|
||||||
)
|
)
|
||||||
|
|
||||||
|
CORE.add_job(final_step)
|
||||||
|
|
||||||
|
|
||||||
@automation.register_condition("wifi.connected", WiFiConnectedCondition, cv.Schema({}))
|
@automation.register_condition("wifi.connected", WiFiConnectedCondition, cv.Schema({}))
|
||||||
async def wifi_connected_to_code(config, condition_id, template_arg, args):
|
async def wifi_connected_to_code(config, condition_id, template_arg, args):
|
||||||
@@ -468,6 +470,28 @@ async def wifi_disable_to_code(config, action_id, template_arg, args):
|
|||||||
return cg.new_Pvariable(action_id, template_arg)
|
return cg.new_Pvariable(action_id, template_arg)
|
||||||
|
|
||||||
|
|
||||||
|
KEEP_SCAN_RESULTS_KEY = "wifi_keep_scan_results"
|
||||||
|
|
||||||
|
|
||||||
|
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.
|
||||||
|
"""
|
||||||
|
CORE.data[KEEP_SCAN_RESULTS_KEY] = True
|
||||||
|
|
||||||
|
|
||||||
|
@coroutine_with_priority(CoroPriority.FINAL)
|
||||||
|
async def final_step():
|
||||||
|
"""Final code generation step to configure scan result retention."""
|
||||||
|
if CORE.data.get(KEEP_SCAN_RESULTS_KEY, False):
|
||||||
|
cg.add(
|
||||||
|
cg.RawExpression("wifi::global_wifi_component->set_keep_scan_results(true)")
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@automation.register_action(
|
@automation.register_action(
|
||||||
"wifi.configure",
|
"wifi.configure",
|
||||||
WiFiConfigureAction,
|
WiFiConfigureAction,
|
||||||
|
@@ -713,6 +713,12 @@ void WiFiComponent::check_connecting_finished() {
|
|||||||
this->state_ = WIFI_COMPONENT_STATE_STA_CONNECTED;
|
this->state_ = WIFI_COMPONENT_STATE_STA_CONNECTED;
|
||||||
this->num_retried_ = 0;
|
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_) {
|
if (this->fast_connect_) {
|
||||||
this->save_fast_connect_settings_();
|
this->save_fast_connect_settings_();
|
||||||
}
|
}
|
||||||
|
@@ -316,6 +316,7 @@ class WiFiComponent : public Component {
|
|||||||
int8_t wifi_rssi();
|
int8_t wifi_rssi();
|
||||||
|
|
||||||
void set_enable_on_boot(bool enable_on_boot) { this->enable_on_boot_ = enable_on_boot; }
|
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_connect_trigger() const { return this->connect_trigger_; };
|
||||||
Trigger<> *get_disconnect_trigger() const { return this->disconnect_trigger_; };
|
Trigger<> *get_disconnect_trigger() const { return this->disconnect_trigger_; };
|
||||||
@@ -424,6 +425,7 @@ class WiFiComponent : public Component {
|
|||||||
#endif
|
#endif
|
||||||
bool enable_on_boot_;
|
bool enable_on_boot_;
|
||||||
bool got_ipv4_address_{false};
|
bool got_ipv4_address_{false};
|
||||||
|
bool keep_scan_results_{false};
|
||||||
|
|
||||||
// Pointers at the end (naturally aligned)
|
// Pointers at the end (naturally aligned)
|
||||||
Trigger<> *connect_trigger_{new Trigger<>()};
|
Trigger<> *connect_trigger_{new Trigger<>()};
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
import esphome.codegen as cg
|
import esphome.codegen as cg
|
||||||
from esphome.components import text_sensor
|
from esphome.components import text_sensor, wifi
|
||||||
import esphome.config_validation as cv
|
import esphome.config_validation as cv
|
||||||
from esphome.const import (
|
from esphome.const import (
|
||||||
CONF_BSSID,
|
CONF_BSSID,
|
||||||
@@ -77,7 +77,9 @@ async def to_code(config):
|
|||||||
await setup_conf(config, CONF_SSID)
|
await setup_conf(config, CONF_SSID)
|
||||||
await setup_conf(config, CONF_BSSID)
|
await setup_conf(config, CONF_BSSID)
|
||||||
await setup_conf(config, CONF_MAC_ADDRESS)
|
await setup_conf(config, CONF_MAC_ADDRESS)
|
||||||
|
if CONF_SCAN_RESULTS in config:
|
||||||
await setup_conf(config, CONF_SCAN_RESULTS)
|
await setup_conf(config, CONF_SCAN_RESULTS)
|
||||||
|
wifi.request_wifi_scan_results()
|
||||||
await setup_conf(config, CONF_DNS_ADDRESS)
|
await setup_conf(config, CONF_DNS_ADDRESS)
|
||||||
if conf := config.get(CONF_IP_ADDRESS):
|
if conf := config.get(CONF_IP_ADDRESS):
|
||||||
wifi_info = await text_sensor.new_text_sensor(config[CONF_IP_ADDRESS])
|
wifi_info = await text_sensor.new_text_sensor(config[CONF_IP_ADDRESS])
|
||||||
|
Reference in New Issue
Block a user