mirror of
https://github.com/esphome/esphome.git
synced 2025-08-02 00:17:48 +00:00
Merge remote-tracking branch 'upstream/dev' into scheduler_empty_names
This commit is contained in:
commit
c2d55e186c
1
.github/PULL_REQUEST_TEMPLATE.md
vendored
1
.github/PULL_REQUEST_TEMPLATE.md
vendored
@ -26,6 +26,7 @@
|
|||||||
- [ ] RP2040
|
- [ ] RP2040
|
||||||
- [ ] BK72xx
|
- [ ] BK72xx
|
||||||
- [ ] RTL87xx
|
- [ ] RTL87xx
|
||||||
|
- [ ] nRF52840
|
||||||
|
|
||||||
## Example entry for `config.yaml`:
|
## Example entry for `config.yaml`:
|
||||||
|
|
||||||
|
@ -17,6 +17,7 @@ from esphome.const import (
|
|||||||
CONF_MODE,
|
CONF_MODE,
|
||||||
CONF_NUMBER,
|
CONF_NUMBER,
|
||||||
CONF_ON_VALUE,
|
CONF_ON_VALUE,
|
||||||
|
CONF_SWITCH,
|
||||||
CONF_TEXT,
|
CONF_TEXT,
|
||||||
CONF_TRIGGER_ID,
|
CONF_TRIGGER_ID,
|
||||||
CONF_TYPE,
|
CONF_TYPE,
|
||||||
@ -33,7 +34,6 @@ CONF_LABEL = "label"
|
|||||||
CONF_MENU = "menu"
|
CONF_MENU = "menu"
|
||||||
CONF_BACK = "back"
|
CONF_BACK = "back"
|
||||||
CONF_SELECT = "select"
|
CONF_SELECT = "select"
|
||||||
CONF_SWITCH = "switch"
|
|
||||||
CONF_ON_TEXT = "on_text"
|
CONF_ON_TEXT = "on_text"
|
||||||
CONF_OFF_TEXT = "off_text"
|
CONF_OFF_TEXT = "off_text"
|
||||||
CONF_VALUE_LAMBDA = "value_lambda"
|
CONF_VALUE_LAMBDA = "value_lambda"
|
||||||
|
@ -39,7 +39,7 @@ import esphome.final_validate as fv
|
|||||||
from esphome.helpers import copy_file_if_changed, mkdir_p, write_file_if_changed
|
from esphome.helpers import copy_file_if_changed, mkdir_p, write_file_if_changed
|
||||||
from esphome.types import ConfigType
|
from esphome.types import ConfigType
|
||||||
|
|
||||||
from .boards import BOARDS
|
from .boards import BOARDS, STANDARD_BOARDS
|
||||||
from .const import ( # noqa
|
from .const import ( # noqa
|
||||||
KEY_BOARD,
|
KEY_BOARD,
|
||||||
KEY_COMPONENTS,
|
KEY_COMPONENTS,
|
||||||
@ -487,25 +487,32 @@ def _platform_is_platformio(value):
|
|||||||
|
|
||||||
|
|
||||||
def _detect_variant(value):
|
def _detect_variant(value):
|
||||||
board = value[CONF_BOARD]
|
board = value.get(CONF_BOARD)
|
||||||
if board in BOARDS:
|
variant = value.get(CONF_VARIANT)
|
||||||
variant = BOARDS[board][KEY_VARIANT]
|
if variant and board is None:
|
||||||
if CONF_VARIANT in value and variant != value[CONF_VARIANT]:
|
# If variant is set, we can derive the board from it
|
||||||
|
# variant has already been validated against the known set
|
||||||
|
value = value.copy()
|
||||||
|
value[CONF_BOARD] = STANDARD_BOARDS[variant]
|
||||||
|
elif board in BOARDS:
|
||||||
|
variant = variant or BOARDS[board][KEY_VARIANT]
|
||||||
|
if variant != BOARDS[board][KEY_VARIANT]:
|
||||||
raise cv.Invalid(
|
raise cv.Invalid(
|
||||||
f"Option '{CONF_VARIANT}' does not match selected board.",
|
f"Option '{CONF_VARIANT}' does not match selected board.",
|
||||||
path=[CONF_VARIANT],
|
path=[CONF_VARIANT],
|
||||||
)
|
)
|
||||||
value = value.copy()
|
value = value.copy()
|
||||||
value[CONF_VARIANT] = variant
|
value[CONF_VARIANT] = variant
|
||||||
|
elif not variant:
|
||||||
|
raise cv.Invalid(
|
||||||
|
"This board is unknown, if you are sure you want to compile with this board selection, "
|
||||||
|
f"override with option '{CONF_VARIANT}'",
|
||||||
|
path=[CONF_BOARD],
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
if CONF_VARIANT not in value:
|
|
||||||
raise cv.Invalid(
|
|
||||||
"This board is unknown, if you are sure you want to compile with this board selection, "
|
|
||||||
f"override with option '{CONF_VARIANT}'",
|
|
||||||
path=[CONF_BOARD],
|
|
||||||
)
|
|
||||||
_LOGGER.warning(
|
_LOGGER.warning(
|
||||||
"This board is unknown. Make sure the chosen chip component is correct.",
|
"This board is unknown; the specified variant '%s' will be used but this may not work as expected.",
|
||||||
|
variant,
|
||||||
)
|
)
|
||||||
return value
|
return value
|
||||||
|
|
||||||
@ -676,7 +683,7 @@ CONF_PARTITIONS = "partitions"
|
|||||||
CONFIG_SCHEMA = cv.All(
|
CONFIG_SCHEMA = cv.All(
|
||||||
cv.Schema(
|
cv.Schema(
|
||||||
{
|
{
|
||||||
cv.Required(CONF_BOARD): cv.string_strict,
|
cv.Optional(CONF_BOARD): cv.string_strict,
|
||||||
cv.Optional(CONF_CPU_FREQUENCY): cv.one_of(
|
cv.Optional(CONF_CPU_FREQUENCY): cv.one_of(
|
||||||
*FULL_CPU_FREQUENCIES, upper=True
|
*FULL_CPU_FREQUENCIES, upper=True
|
||||||
),
|
),
|
||||||
@ -691,6 +698,7 @@ CONFIG_SCHEMA = cv.All(
|
|||||||
_detect_variant,
|
_detect_variant,
|
||||||
_set_default_framework,
|
_set_default_framework,
|
||||||
set_core_data,
|
set_core_data,
|
||||||
|
cv.has_at_least_one_key(CONF_BOARD, CONF_VARIANT),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -2,13 +2,30 @@ from .const import (
|
|||||||
VARIANT_ESP32,
|
VARIANT_ESP32,
|
||||||
VARIANT_ESP32C2,
|
VARIANT_ESP32C2,
|
||||||
VARIANT_ESP32C3,
|
VARIANT_ESP32C3,
|
||||||
|
VARIANT_ESP32C5,
|
||||||
VARIANT_ESP32C6,
|
VARIANT_ESP32C6,
|
||||||
VARIANT_ESP32H2,
|
VARIANT_ESP32H2,
|
||||||
VARIANT_ESP32P4,
|
VARIANT_ESP32P4,
|
||||||
VARIANT_ESP32S2,
|
VARIANT_ESP32S2,
|
||||||
VARIANT_ESP32S3,
|
VARIANT_ESP32S3,
|
||||||
|
VARIANTS,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
STANDARD_BOARDS = {
|
||||||
|
VARIANT_ESP32: "esp32dev",
|
||||||
|
VARIANT_ESP32C2: "esp32-c2-devkitm-1",
|
||||||
|
VARIANT_ESP32C3: "esp32-c3-devkitm-1",
|
||||||
|
VARIANT_ESP32C5: "esp32-c5-devkitc-1",
|
||||||
|
VARIANT_ESP32C6: "esp32-c6-devkitm-1",
|
||||||
|
VARIANT_ESP32H2: "esp32-h2-devkitm-1",
|
||||||
|
VARIANT_ESP32P4: "esp32-p4-evboard",
|
||||||
|
VARIANT_ESP32S2: "esp32-s2-kaluga-1",
|
||||||
|
VARIANT_ESP32S3: "esp32-s3-devkitc-1",
|
||||||
|
}
|
||||||
|
|
||||||
|
# Make sure not missed here if a new variant added.
|
||||||
|
assert all(v in STANDARD_BOARDS for v in VARIANTS)
|
||||||
|
|
||||||
ESP32_BASE_PINS = {
|
ESP32_BASE_PINS = {
|
||||||
"TX": 1,
|
"TX": 1,
|
||||||
"RX": 3,
|
"RX": 3,
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
|
from esphome.const import CONF_SWITCH
|
||||||
|
|
||||||
from ..defines import CONF_INDICATOR, CONF_KNOB, CONF_MAIN
|
from ..defines import CONF_INDICATOR, CONF_KNOB, CONF_MAIN
|
||||||
from ..types import LvBoolean
|
from ..types import LvBoolean
|
||||||
from . import WidgetType
|
from . import WidgetType
|
||||||
|
|
||||||
CONF_SWITCH = "switch"
|
|
||||||
|
|
||||||
|
|
||||||
class SwitchType(WidgetType):
|
class SwitchType(WidgetType):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
@ -922,6 +922,7 @@ CONF_SWING_MODE_COMMAND_TOPIC = "swing_mode_command_topic"
|
|||||||
CONF_SWING_MODE_STATE_TOPIC = "swing_mode_state_topic"
|
CONF_SWING_MODE_STATE_TOPIC = "swing_mode_state_topic"
|
||||||
CONF_SWING_OFF_ACTION = "swing_off_action"
|
CONF_SWING_OFF_ACTION = "swing_off_action"
|
||||||
CONF_SWING_VERTICAL_ACTION = "swing_vertical_action"
|
CONF_SWING_VERTICAL_ACTION = "swing_vertical_action"
|
||||||
|
CONF_SWITCH = "switch"
|
||||||
CONF_SWITCH_DATAPOINT = "switch_datapoint"
|
CONF_SWITCH_DATAPOINT = "switch_datapoint"
|
||||||
CONF_SWITCHES = "switches"
|
CONF_SWITCHES = "switches"
|
||||||
CONF_SYNC = "sync"
|
CONF_SYNC = "sync"
|
||||||
|
73
tests/component_tests/esp32/test_esp32.py
Normal file
73
tests/component_tests/esp32/test_esp32.py
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
"""
|
||||||
|
Test ESP32 configuration
|
||||||
|
"""
|
||||||
|
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
from esphome.components.esp32 import VARIANTS
|
||||||
|
import esphome.config_validation as cv
|
||||||
|
from esphome.const import PlatformFramework
|
||||||
|
|
||||||
|
|
||||||
|
def test_esp32_config(set_core_config) -> None:
|
||||||
|
set_core_config(PlatformFramework.ESP32_IDF)
|
||||||
|
|
||||||
|
from esphome.components.esp32 import CONFIG_SCHEMA
|
||||||
|
from esphome.components.esp32.const import VARIANT_ESP32, VARIANT_FRIENDLY
|
||||||
|
|
||||||
|
# Example ESP32 configuration
|
||||||
|
config = {
|
||||||
|
"board": "esp32dev",
|
||||||
|
"variant": VARIANT_ESP32,
|
||||||
|
"cpu_frequency": "240MHz",
|
||||||
|
"flash_size": "4MB",
|
||||||
|
"framework": {
|
||||||
|
"type": "esp-idf",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check if the variant is valid
|
||||||
|
config = CONFIG_SCHEMA(config)
|
||||||
|
assert config["variant"] == VARIANT_ESP32
|
||||||
|
|
||||||
|
# Check that defining a variant sets the board name correctly
|
||||||
|
for variant in VARIANTS:
|
||||||
|
config = CONFIG_SCHEMA(
|
||||||
|
{
|
||||||
|
"variant": variant,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
assert VARIANT_FRIENDLY[variant].lower() in config["board"]
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
("config", "error_match"),
|
||||||
|
[
|
||||||
|
pytest.param(
|
||||||
|
{"flash_size": "4MB"},
|
||||||
|
r"This board is unknown, if you are sure you want to compile with this board selection, override with option 'variant' @ data\['board'\]",
|
||||||
|
id="unknown_board_config",
|
||||||
|
),
|
||||||
|
pytest.param(
|
||||||
|
{"variant": "esp32xx"},
|
||||||
|
r"Unknown value 'ESP32XX', did you mean 'ESP32', 'ESP32S3', 'ESP32S2'\? for dictionary value @ data\['variant'\]",
|
||||||
|
id="unknown_variant_config",
|
||||||
|
),
|
||||||
|
pytest.param(
|
||||||
|
{"variant": "esp32s3", "board": "esp32dev"},
|
||||||
|
r"Option 'variant' does not match selected board. @ data\['variant'\]",
|
||||||
|
id="mismatched_board_variant_config",
|
||||||
|
),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
def test_esp32_configuration_errors(
|
||||||
|
config: Any,
|
||||||
|
error_match: str,
|
||||||
|
) -> None:
|
||||||
|
"""Test detection of invalid configuration."""
|
||||||
|
from esphome.components.esp32 import CONFIG_SCHEMA
|
||||||
|
|
||||||
|
with pytest.raises(cv.Invalid, match=error_match):
|
||||||
|
CONFIG_SCHEMA(config)
|
Loading…
x
Reference in New Issue
Block a user