From f3f419077bb5d1b7d5eea3d735b8b0b4c58678c5 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Tue, 21 Oct 2025 11:29:27 -1000 Subject: [PATCH] [wifi] Optimize WiFi network storage with FixedVector --- esphome/components/wifi/__init__.py | 23 +++++++++++++++------- esphome/components/wifi/wifi_component.cpp | 7 ++----- esphome/components/wifi/wifi_component.h | 4 ++-- 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/esphome/components/wifi/__init__.py b/esphome/components/wifi/__init__.py index 494470cb48..19c1f28f47 100644 --- a/esphome/components/wifi/__init__.py +++ b/esphome/components/wifi/__init__.py @@ -1,6 +1,7 @@ from esphome import automation from esphome.automation import Condition import esphome.codegen as cg +from esphome.codegen import MockObj from esphome.components.const import CONF_USE_PSRAM from esphome.components.esp32 import add_idf_sdkconfig_option, const, get_esp32_variant from esphome.components.network import IPAddress @@ -378,14 +379,22 @@ async def to_code(config): # Track if any network uses Enterprise authentication has_eap = False - def add_sta(ap, network): - ip_config = network.get(CONF_MANUAL_IP, config.get(CONF_MANUAL_IP)) - cg.add(var.add_sta(wifi_network(network, ap, ip_config))) + # Build all WiFiAP objects + networks = config.get(CONF_NETWORKS, []) + if networks: + wifi_aps: list[MockObj] = [] + for network in networks: + if CONF_EAP in network: + has_eap = True + ip_config = network.get(CONF_MANUAL_IP, config.get(CONF_MANUAL_IP)) + # Create a WiFiAP variable for each network + ap_var = cg.new_variable(network[CONF_ID], WiFiAP()) + # Configure the WiFiAP + wifi_network(network, ap_var, ip_config) + wifi_aps.append(ap_var) - for network in config.get(CONF_NETWORKS, []): - if CONF_EAP in network: - has_eap = True - cg.with_local_variable(network[CONF_ID], WiFiAP(), add_sta, network) + # Set all WiFi networks at once + cg.add(var.set_stas(wifi_aps)) if CONF_AP in config: conf = config[CONF_AP] diff --git a/esphome/components/wifi/wifi_component.cpp b/esphome/components/wifi/wifi_component.cpp index c89384d742..a7b66114c8 100644 --- a/esphome/components/wifi/wifi_component.cpp +++ b/esphome/components/wifi/wifi_component.cpp @@ -330,11 +330,8 @@ float WiFiComponent::get_loop_priority() const { return 10.0f; // before other loop components } -void WiFiComponent::add_sta(const WiFiAP &ap) { this->sta_.push_back(ap); } -void WiFiComponent::set_sta(const WiFiAP &ap) { - this->clear_sta(); - this->add_sta(ap); -} +void WiFiComponent::set_stas(const std::initializer_list &aps) { this->sta_ = aps; } +void WiFiComponent::set_sta(const WiFiAP &ap) { this->set_stas({ap}); } void WiFiComponent::clear_sta() { this->sta_.clear(); } void WiFiComponent::save_wifi_sta(const std::string &ssid, const std::string &password) { SavedWifiSettings save{}; // zero-initialized - all bytes set to \0, guaranteeing null termination diff --git a/esphome/components/wifi/wifi_component.h b/esphome/components/wifi/wifi_component.h index 10aa82a065..0bcfd7445a 100644 --- a/esphome/components/wifi/wifi_component.h +++ b/esphome/components/wifi/wifi_component.h @@ -219,7 +219,7 @@ class WiFiComponent : public Component { void set_sta(const WiFiAP &ap); WiFiAP get_sta() { return this->selected_ap_; } - void add_sta(const WiFiAP &ap); + void set_stas(const std::initializer_list &aps); void clear_sta(); #ifdef USE_WIFI_AP @@ -393,7 +393,7 @@ class WiFiComponent : public Component { #endif std::string use_address_; - std::vector sta_; + FixedVector sta_; std::vector sta_priorities_; wifi_scan_vector_t scan_result_; WiFiAP selected_ap_;