Disallow power_save_mode NONE if used together with BLE (#1950)

This commit is contained in:
Otto Winter 2021-06-22 10:53:10 +02:00 committed by Jesse Hills
parent e3f36c033e
commit 6009c7edb4
No known key found for this signature in database
GPG Key ID: BEAAE804EFD8E83A
4 changed files with 66 additions and 15 deletions

View File

@ -7,10 +7,7 @@ from esphome import automation
from esphome.const import ( from esphome.const import (
CONF_ID, CONF_ID,
CONF_TIMEOUT, CONF_TIMEOUT,
CONF_ESPHOME,
CONF_METHOD, CONF_METHOD,
CONF_ARDUINO_VERSION,
ARDUINO_VERSION_ESP8266,
CONF_TRIGGER_ID, CONF_TRIGGER_ID,
CONF_URL, CONF_URL,
) )
@ -78,23 +75,19 @@ CONFIG_SCHEMA = cv.Schema(
).extend(cv.COMPONENT_SCHEMA) ).extend(cv.COMPONENT_SCHEMA)
def validate_framework(config): def validate_framework(value):
if CORE.is_esp32: if not CORE.is_esp8266:
# only for ESP8266
return return
# only for ESP8266 framework_version = fv.get_arduino_framework_version()
path = [CONF_ESPHOME, CONF_ARDUINO_VERSION]
version: str = fv.full_config.get().get_config_for_path(path)
reverse_map = {v: k for k, v in ARDUINO_VERSION_ESP8266.items()}
framework_version = reverse_map.get(version)
if framework_version is None or framework_version == "dev": if framework_version is None or framework_version == "dev":
return return
if framework_version < "2.5.1": if framework_version < "2.5.1":
raise cv.Invalid( raise cv.Invalid(
"This component is not supported on arduino framework version below 2.5.1", "This component is not supported on arduino framework version below 2.5.1, ",
path=[cv.ROOT_CONFIG_PATH] + path, "please check esphome->arduino_version",
) )

View File

@ -148,7 +148,41 @@ def final_validate(config):
) )
FINAL_VALIDATE_SCHEMA = cv.Schema(final_validate) def final_validate_power_esp32_ble(value):
if not CORE.is_esp32:
return
if value != "NONE":
# WiFi should be in modem sleep (!=NONE) with BLE coexistence
# https://docs.espressif.com/projects/esp-idf/en/v3.3.5/api-guides/wifi.html#station-sleep
return
framework_version = fv.get_arduino_framework_version()
if framework_version not in (None, "dev") and framework_version < "1.0.5":
# Only frameworks 1.0.5+ impacted
return
full = fv.full_config.get()
for conflicting in [
"esp32_ble",
"esp32_ble_beacon",
"esp32_ble_server",
"esp32_ble_tracker",
]:
if conflicting in full:
raise cv.Invalid(
f"power_save_mode NONE is incompatible with {conflicting}. "
f"Please remove the power save mode. See also "
f"https://github.com/esphome/issues/issues/2141#issuecomment-865688582"
)
FINAL_VALIDATE_SCHEMA = cv.All(
cv.Schema(
{
cv.Optional(CONF_POWER_SAVE_MODE): final_validate_power_esp32_ble,
},
extra=cv.ALLOW_EXTRA,
),
final_validate,
)
def _validate(config): def _validate(config):

View File

@ -4,6 +4,13 @@ import contextvars
from esphome.types import ConfigFragmentType, ID, ConfigPathType from esphome.types import ConfigFragmentType, ID, ConfigPathType
import esphome.config_validation as cv import esphome.config_validation as cv
from esphome.const import (
ARDUINO_VERSION_ESP32,
ARDUINO_VERSION_ESP8266,
CONF_ESPHOME,
CONF_ARDUINO_VERSION,
)
from esphome.core import CORE
class FinalValidateConfig(ABC): class FinalValidateConfig(ABC):
@ -55,3 +62,20 @@ def id_declaration_match_schema(schema):
return schema(declaration_config) return schema(declaration_config)
return validator return validator
def get_arduino_framework_version():
path = [CONF_ESPHOME, CONF_ARDUINO_VERSION]
# This is run after core validation, so the property is set even if user didn't
version: str = full_config.get().get_config_for_path(path)
if CORE.is_esp32:
version_map = ARDUINO_VERSION_ESP32
elif CORE.is_esp8266:
version_map = ARDUINO_VERSION_ESP8266
else:
raise ValueError("Platform not supported yet for this validator")
reverse_map = {v: k for k, v in version_map.items()}
framework_version = reverse_map.get(version)
return framework_version

View File

@ -80,7 +80,7 @@ wifi:
dns2: 1.2.2.1 dns2: 1.2.2.1
domain: .local domain: .local
reboot_timeout: 120s reboot_timeout: 120s
power_save_mode: none power_save_mode: light
http_request: http_request:
useragent: esphome/device useragent: esphome/device