diff --git a/esphome/components/wifi/__init__.py b/esphome/components/wifi/__init__.py index c3f70506e2..846a8e1303 100644 --- a/esphome/components/wifi/__init__.py +++ b/esphome/components/wifi/__init__.py @@ -10,6 +10,8 @@ from esphome.const import ( CONF_DNS1, CONF_DNS2, CONF_DOMAIN, + CONF_ENABLE_BTM, + CONF_ENABLE_RRM, CONF_FAST_CONNECT, CONF_GATEWAY, CONF_HIDDEN, @@ -32,10 +34,10 @@ from esphome.const import ( CONF_EAP, ) from esphome.core import CORE, HexInt, coroutine_with_priority +from esphome.components.esp32 import add_idf_sdkconfig_option from esphome.components.network import IPAddress from . import wpa2_eap - AUTO_LOAD = ["network"] wifi_ns = cg.esphome_ns.namespace("wifi") @@ -272,6 +274,12 @@ CONFIG_SCHEMA = cv.All( cv.SplitDefault(CONF_OUTPUT_POWER, esp8266=20.0): cv.All( cv.decibel, cv.float_range(min=8.5, max=20.5) ), + cv.SplitDefault(CONF_ENABLE_BTM, esp32_idf=False): cv.All( + cv.boolean, cv.only_with_esp_idf + ), + cv.SplitDefault(CONF_ENABLE_RRM, esp32_idf=False): cv.All( + cv.boolean, cv.only_with_esp_idf + ), cv.Optional("enable_mdns"): cv.invalid( "This option has been removed. Please use the [disabled] option under the " "new mdns component instead." @@ -373,6 +381,15 @@ async def to_code(config): elif CORE.is_esp32 and CORE.using_arduino: cg.add_library("WiFi", None) + if CORE.is_esp32 and CORE.using_esp_idf: + if config[CONF_ENABLE_BTM] or config[CONF_ENABLE_RRM]: + add_idf_sdkconfig_option("CONFIG_WPA_11KV_SUPPORT", True) + cg.add_define("USE_WIFI_11KV_SUPPORT") + if config[CONF_ENABLE_BTM]: + cg.add(var.set_btm(config[CONF_ENABLE_BTM])) + if config[CONF_ENABLE_RRM]: + cg.add(var.set_rrm(config[CONF_ENABLE_RRM])) + cg.add_define("USE_WIFI") # Register at end for OTA safe mode diff --git a/esphome/components/wifi/wifi_component.cpp b/esphome/components/wifi/wifi_component.cpp index 0ac227cd82..10bf4a8f9c 100644 --- a/esphome/components/wifi/wifi_component.cpp +++ b/esphome/components/wifi/wifi_component.cpp @@ -166,6 +166,10 @@ WiFiComponent::WiFiComponent() { global_wifi_component = this; } bool WiFiComponent::has_ap() const { return this->has_ap_; } bool WiFiComponent::has_sta() const { return !this->sta_.empty(); } void WiFiComponent::set_fast_connect(bool fast_connect) { this->fast_connect_ = fast_connect; } +#ifdef USE_WIFI_11KV_SUPPORT +void WiFiComponent::set_btm(bool btm) { this->btm_ = btm; } +void WiFiComponent::set_rrm(bool rrm) { this->rrm_ = rrm; } +#endif network::IPAddress WiFiComponent::get_ip_address() { if (this->has_sta()) return this->wifi_sta_ip(); @@ -366,6 +370,10 @@ void WiFiComponent::print_connect_params_() { ESP_LOGCONFIG(TAG, " Gateway: %s", wifi_gateway_ip_().str().c_str()); ESP_LOGCONFIG(TAG, " DNS1: %s", wifi_dns_ip_(0).str().c_str()); ESP_LOGCONFIG(TAG, " DNS2: %s", wifi_dns_ip_(1).str().c_str()); +#ifdef USE_WIFI_11KV_SUPPORT + ESP_LOGCONFIG(TAG, " BTM: %s", this->btm_ ? "enabled" : "disabled"); + ESP_LOGCONFIG(TAG, " RRM: %s", this->rrm_ ? "enabled" : "disabled"); +#endif } void WiFiComponent::start_scanning() { diff --git a/esphome/components/wifi/wifi_component.h b/esphome/components/wifi/wifi_component.h index 7941e7f643..6c5202ed7a 100644 --- a/esphome/components/wifi/wifi_component.h +++ b/esphome/components/wifi/wifi_component.h @@ -219,6 +219,11 @@ class WiFiComponent : public Component { bool has_sta() const; bool has_ap() const; +#ifdef USE_WIFI_11KV_SUPPORT + void set_btm(bool btm); + void set_rrm(bool rrm); +#endif + network::IPAddress get_ip_address(); std::string get_use_address() const; void set_use_address(const std::string &use_address); @@ -327,6 +332,10 @@ class WiFiComponent : public Component { optional output_power_; ESPPreferenceObject pref_; bool has_saved_wifi_settings_{false}; +#ifdef USE_WIFI_11KV_SUPPORT + bool btm_{false}; + bool rrm_{false}; +#endif }; extern WiFiComponent *global_wifi_component; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) diff --git a/esphome/components/wifi/wifi_component_esp_idf.cpp b/esphome/components/wifi/wifi_component_esp_idf.cpp index 6d20219c69..2883164495 100644 --- a/esphome/components/wifi/wifi_component_esp_idf.cpp +++ b/esphome/components/wifi/wifi_component_esp_idf.cpp @@ -285,6 +285,11 @@ bool WiFiComponent::wifi_sta_connect_(const WiFiAP &ap) { } #endif +#ifdef USE_WIFI_11KV_SUPPORT + conf.sta.btm_enabled = this->btm_; + conf.sta.rm_enabled = this->rrm_; +#endif + if (ap.get_bssid().has_value()) { conf.sta.bssid_set = true; memcpy(conf.sta.bssid, ap.get_bssid()->data(), 6); diff --git a/esphome/const.py b/esphome/const.py index b3e038fe20..7735e96661 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -197,8 +197,10 @@ CONF_ECO2 = "eco2" CONF_EFFECT = "effect" CONF_EFFECTS = "effects" CONF_ELSE = "else" +CONF_ENABLE_BTM = "enable_btm" CONF_ENABLE_IPV6 = "enable_ipv6" CONF_ENABLE_PIN = "enable_pin" +CONF_ENABLE_RRM = "enable_rrm" CONF_ENABLE_TIME = "enable_time" CONF_ENERGY = "energy" CONF_ENTITY_CATEGORY = "entity_category" diff --git a/esphome/core/defines.h b/esphome/core/defines.h index 5b1d567aa4..727b35e6f9 100644 --- a/esphome/core/defines.h +++ b/esphome/core/defines.h @@ -70,6 +70,7 @@ #define USE_ESP32_IGNORE_EFUSE_MAC_CRC #define USE_IMPROV #define USE_SOCKET_IMPL_BSD_SOCKETS +#define USE_WIFI_11KV_SUPPORT #ifdef USE_ARDUINO #define USE_ARDUINO_VERSION_CODE VERSION_CODE(1, 0, 6)