[core] Add type annotations to component Python (7/11) (#18344)

This commit is contained in:
Jesse Hills
2026-08-20 12:07:10 -04:00
committed by GitHub
parent b6a9761dae
commit e83439eaae
21 changed files with 261 additions and 77 deletions
+14 -10
View File
@@ -1,3 +1,6 @@
from collections.abc import Callable
from typing import Any
from esphome import pins
import esphome.codegen as cg
from esphome.components import i2c
@@ -11,6 +14,7 @@ from esphome.const import (
CONF_RANGE,
CONF_WATCHDOG,
)
from esphome.types import ConfigType
CODEOWNERS = ["@ammmze"]
DEPENDENCIES = ["i2c"]
@@ -72,13 +76,13 @@ POSITION_TO_ANGLE = 360 / RESOLUTION
MIN_RANGE = round(18 * ANGLE_TO_POSITION)
def angle(min=-360, max=360):
def angle(min: float = -360, max: float = 360) -> Callable[[Any], Any]:
return cv.All(
cv.float_with_unit("angle", "(°|deg)"), cv.float_range(min=min, max=max)
)
def angle_to_position(value, min=-360, max=360):
def angle_to_position(value: Any, min: float = -360, max: float = 360) -> int:
try:
value = angle(min=min, max=max)(value)
return (RESOLUTION + round(value * ANGLE_TO_POSITION)) % RESOLUTION
@@ -86,17 +90,17 @@ def angle_to_position(value, min=-360, max=360):
raise cv.Invalid(f"When using angle, {e.error_message}") from e
def percent_to_position(value):
def percent_to_position(value: Any) -> int:
value = cv.possibly_negative_percentage(value)
return (RESOLUTION + round(value * RESOLUTION)) % RESOLUTION
def position(min=-MAX_POSITION, max=MAX_POSITION):
def position(min: int = -MAX_POSITION, max: int = MAX_POSITION) -> Callable[[Any], Any]:
"""Validate that the config option is a position.
Accepts integers, degrees, or percentage (of 360 degrees).
"""
def validator(value):
def validator(value: Any) -> int:
if isinstance(value, str) and value.endswith("%"):
value = percent_to_position(value)
@@ -112,7 +116,7 @@ def position(min=-MAX_POSITION, max=MAX_POSITION):
return validator
def position_range():
def position_range() -> Callable[[Any], Any]:
"""Validate that value given is a valid range for the device.
A valid range is one of the following:
- a value of 0 (meaning full range)
@@ -129,7 +133,7 @@ def position_range():
zero_validator,
)
def validator(value):
def validator(value: Any) -> Any:
is_negative_str = isinstance(value, str) and value.startswith("-")
is_negative_num = isinstance(value, (float, int)) and value < 0
if is_negative_str or is_negative_num:
@@ -139,13 +143,13 @@ def position_range():
return validator
def has_valid_range_config():
def has_valid_range_config() -> Callable[[ConfigType], ConfigType]:
"""Validate that that the config start + end position results in a valid
positional range, which must be >= 18degrees
"""
range_validator = position_range()
def validator(config):
def validator(config: ConfigType) -> ConfigType:
# if we don't have an end position, then there is nothing to do
if CONF_END_POSITION not in config:
return config
@@ -203,7 +207,7 @@ CONFIG_SCHEMA = cv.All(
)
async def to_code(config):
async def to_code(config: ConfigType) -> None:
var = cg.new_Pvariable(config[CONF_ID])
await cg.register_component(var, config)
await i2c.register_i2c_device(var, config)
+2 -1
View File
@@ -11,6 +11,7 @@ from esphome.const import (
ICON_ROTATE_RIGHT,
STATE_CLASS_MEASUREMENT,
)
from esphome.types import ConfigType
from .. import AS5600Component, as5600_ns
@@ -77,7 +78,7 @@ CONFIG_SCHEMA = (
)
async def to_code(config):
async def to_code(config: ConfigType) -> None:
var = cg.new_Pvariable(config[CONF_ID])
await cg.register_parented(var, config[CONF_AS5600_ID])
await cg.register_component(var, config)
+10 -7
View File
@@ -1,4 +1,6 @@
from collections.abc import Callable
from dataclasses import dataclass, field
from typing import Any
import esphome.codegen as cg
from esphome.components.esp32 import (
@@ -15,6 +17,7 @@ from esphome.const import (
)
from esphome.core import CORE
import esphome.final_validate as fv
from esphome.types import ConfigType
AUTO_LOAD = ["ring_buffer"]
CODEOWNERS = ["@kahrendt"]
@@ -125,10 +128,10 @@ CONF_THREADSAFE = "threadsafe"
_MEMORY_LOCATION_VALIDATOR = cv.one_of(*MEMORY_LOCATIONS, lower=True)
def _maybe_empty_codec(schema):
def _maybe_empty_codec(schema: cv.Schema) -> Callable[[Any], Any]:
"""Wrap a codec dict schema so that a bare key (None value) is treated as an empty dict."""
def validator(value):
def validator(value: Any) -> Any:
if value is None:
value = {}
return schema(value)
@@ -200,14 +203,14 @@ def set_stream_limits(
max_channels: int = cv.UNDEFINED,
min_sample_rate: int = cv.UNDEFINED,
max_sample_rate: int = cv.UNDEFINED,
):
) -> Callable[[ConfigType], None]:
"""Sets the limits for the audio stream that audio component can handle
When the component sinks audio (e.g., a speaker), these indicate the limits to the audio it can receive.
When the component sources audio (e.g., a microphone), these indicate the limits to the audio it can send.
"""
def set_limits_in_config(config):
def set_limits_in_config(config: ConfigType) -> None:
if min_bits_per_sample is not cv.UNDEFINED:
config[CONF_MIN_BITS_PER_SAMPLE] = min_bits_per_sample
if max_bits_per_sample is not cv.UNDEFINED:
@@ -233,7 +236,7 @@ def final_validate_audio_schema(
sample_rate: int = cv.UNDEFINED,
enabled_channels: list[int] = cv.UNDEFINED,
audio_device_issue: bool = False,
):
) -> cv.Schema:
"""Validates audio compatibility when passed between different components.
The component derived from ``AUDIO_COMPONENT_SCHEMA`` should call ``set_stream_limits`` in a validator to specify its compatible settings
@@ -251,7 +254,7 @@ def final_validate_audio_schema(
audio_device_issue (bool, optional): Format the error message to indicate the problem is in the configuration for the ``audio_device`` component. Defaults to False.
"""
def validate_audio_compatiblity(audio_config):
def validate_audio_compatiblity(audio_config: ConfigType) -> ConfigType:
audio_schema = {}
if bits_per_sample is not cv.UNDEFINED:
@@ -329,7 +332,7 @@ def _emit_memory_pair(value: str | None, psram_key: str, internal_key: str) -> N
add_idf_sdkconfig_option(internal_key, True)
async def to_code(config):
async def to_code(config: ConfigType) -> None:
# Re-enable ESP-IDF's HTTP client (excluded by default to save compile time)
include_builtin_idf_component("esp_http_client")
+34 -6
View File
@@ -19,6 +19,9 @@ from esphome.const import (
STATE_CLASS_TOTAL_INCREASING,
UNIT_SECOND,
)
from esphome.core import ID
from esphome.cpp_generator import MockObj, TemplateArgsType
from esphome.types import ConfigType
CONF_LAST_TIME = "last_time"
@@ -66,7 +69,7 @@ CONFIG_SCHEMA = cv.All(
)
async def to_code(config):
async def to_code(config: ConfigType) -> None:
var = await sensor.new_sensor(config)
await cg.register_component(var, config)
cg.add(var.set_restore(config[CONF_RESTORE]))
@@ -93,7 +96,12 @@ DUTY_TIME_ID_SCHEMA = maybe_simple_id(
@register_action(
"sensor.duty_time.start", StartAction, DUTY_TIME_ID_SCHEMA, synchronous=True
)
async def sensor_runtime_start_to_code(config, action_id, template_arg, args):
async def sensor_runtime_start_to_code(
config: ConfigType,
action_id: ID,
template_arg: cg.TemplateArguments,
args: TemplateArgsType,
) -> MockObj:
var = cg.new_Pvariable(action_id, template_arg)
await cg.register_parented(var, config[CONF_ID])
return var
@@ -102,7 +110,12 @@ async def sensor_runtime_start_to_code(config, action_id, template_arg, args):
@register_action(
"sensor.duty_time.stop", StopAction, DUTY_TIME_ID_SCHEMA, synchronous=True
)
async def sensor_runtime_stop_to_code(config, action_id, template_arg, args):
async def sensor_runtime_stop_to_code(
config: ConfigType,
action_id: ID,
template_arg: cg.TemplateArguments,
args: TemplateArgsType,
) -> MockObj:
var = cg.new_Pvariable(action_id, template_arg)
await cg.register_parented(var, config[CONF_ID])
return var
@@ -111,7 +124,12 @@ async def sensor_runtime_stop_to_code(config, action_id, template_arg, args):
@register_action(
"sensor.duty_time.reset", ResetAction, DUTY_TIME_ID_SCHEMA, synchronous=True
)
async def sensor_runtime_reset_to_code(config, action_id, template_arg, args):
async def sensor_runtime_reset_to_code(
config: ConfigType,
action_id: ID,
template_arg: cg.TemplateArguments,
args: TemplateArgsType,
) -> MockObj:
var = cg.new_Pvariable(action_id, template_arg)
await cg.register_parented(var, config[CONF_ID])
return var
@@ -120,7 +138,12 @@ async def sensor_runtime_reset_to_code(config, action_id, template_arg, args):
@register_condition(
"sensor.duty_time.is_running", RunningCondition, DUTY_TIME_ID_SCHEMA
)
async def duty_time_is_running_to_code(config, condition_id, template_arg, args):
async def duty_time_is_running_to_code(
config: ConfigType,
condition_id: ID,
template_arg: cg.TemplateArguments,
args: TemplateArgsType,
) -> MockObj:
paren = await cg.get_variable(config[CONF_ID])
return cg.new_Pvariable(condition_id, template_arg, paren, True)
@@ -128,6 +151,11 @@ async def duty_time_is_running_to_code(config, condition_id, template_arg, args)
@register_condition(
"sensor.duty_time.is_not_running", RunningCondition, DUTY_TIME_ID_SCHEMA
)
async def duty_time_is_not_running_to_code(config, condition_id, template_arg, args):
async def duty_time_is_not_running_to_code(
config: ConfigType,
condition_id: ID,
template_arg: cg.TemplateArguments,
args: TemplateArgsType,
) -> MockObj:
paren = await cg.get_variable(config[CONF_ID])
return cg.new_Pvariable(condition_id, template_arg, paren, False)
+5 -5
View File
@@ -64,7 +64,7 @@ SDIO_SCHEMA = BASE_SCHEMA.extend(
)
def _validate_sdio(config):
def _validate_sdio(config: ConfigType) -> ConfigType:
if config[CONF_BUS_WIDTH] == 4:
for pin in (CONF_D1_PIN, CONF_D2_PIN, CONF_D3_PIN):
if pin not in config:
@@ -98,7 +98,7 @@ SPI_SCHEMA = BASE_SCHEMA.extend(
)
def _validate_spi(config):
def _validate_spi(config: ConfigType) -> ConfigType:
variant = config[CONF_VARIANT]
defaults = _SPI_VARIANT_DEFAULTS.get(variant, _SPI_DEFAULT)
@@ -141,7 +141,7 @@ def _final_validate(config: ConfigType) -> None:
FINAL_VALIDATE_SCHEMA = _final_validate
def _configure_sdio(config):
def _configure_sdio(config: ConfigType) -> None:
slot = config[CONF_SLOT]
esp32.add_idf_sdkconfig_option(
f"CONFIG_ESP_HOSTED_SDIO_SLOT_{slot}",
@@ -183,7 +183,7 @@ def _configure_sdio(config):
)
def _configure_spi(config):
def _configure_spi(config: ConfigType) -> None:
esp32.add_idf_sdkconfig_option("CONFIG_ESP_HOSTED_SPI_HOST_INTERFACE", True)
# SPI mode is set via per-variant choice options
variant = config[CONF_VARIANT]
@@ -231,7 +231,7 @@ def _configure_spi(config):
esp32.add_idf_sdkconfig_option("CONFIG_ESP_HOSTED_DR_ACTIVE_LOW", True)
async def to_code(config):
async def to_code(config: ConfigType) -> None:
add_define("USE_ESP32_HOSTED")
transport = config[CONF_TYPE]
transport_prefix = "SDIO" if transport == "sdio" else "SPI"
+12 -4
View File
@@ -15,8 +15,11 @@ from esphome.const import (
CONF_TIMEOUT,
PLATFORM_ESP32,
)
from esphome.core import ID
from esphome.core.entity_helpers import inherit_property_from
from esphome.cpp_generator import MockObj, TemplateArgsType
import esphome.final_validate as fv
from esphome.types import ConfigType
AUTO_LOAD = ["audio"]
CODEOWNERS = ["@kahrendt"]
@@ -48,7 +51,7 @@ SOURCE_SPEAKER_SCHEMA = speaker.SPEAKER_SCHEMA.extend(
)
def _validate_source_speaker(config):
def _validate_source_speaker(config: ConfigType) -> ConfigType:
fconf = fv.full_config.get()
# Get ID for the output speaker and add it to the source speakers config to easily inherit properties
@@ -70,7 +73,7 @@ def _validate_source_speaker(config):
return config
def _validate_output_speaker(config):
def _validate_output_speaker(config: ConfigType) -> ConfigType:
audio.final_validate_audio_schema(
"mixer",
audio_device=CONF_OUTPUT_SPEAKER,
@@ -112,7 +115,7 @@ FINAL_VALIDATE_SCHEMA = cv.All(
)
async def to_code(config):
async def to_code(config: ConfigType) -> None:
var = cg.new_Pvariable(config[CONF_ID])
await cg.register_component(var, config)
@@ -161,7 +164,12 @@ async def to_code(config):
),
synchronous=True,
)
async def ducking_set_to_code(config, action_id, template_arg, args):
async def ducking_set_to_code(
config: ConfigType,
action_id: ID,
template_arg: cg.TemplateArguments,
args: TemplateArgsType,
) -> MockObj:
var = cg.new_Pvariable(action_id, template_arg)
await cg.register_parented(var, config[CONF_ID])
decibel_reduction = await cg.templatable(
+3 -1
View File
@@ -8,6 +8,8 @@ from esphome.const import (
CONF_RESET_PIN,
CONF_TRIGGER_ID,
)
from esphome.cpp_generator import MockObj
from esphome.types import ConfigType
CODEOWNERS = ["@glmnet"]
AUTO_LOAD = ["binary_sensor"]
@@ -38,7 +40,7 @@ RC522_SCHEMA = cv.Schema(
).extend(cv.polling_component_schema("1s"))
async def setup_rc522(var, config):
async def setup_rc522(var: MockObj, config: ConfigType) -> None:
await cg.register_component(var, config)
if CONF_RESET_PIN in config:
+5 -2
View File
@@ -1,15 +1,18 @@
from typing import Any
import esphome.codegen as cg
from esphome.components import binary_sensor
import esphome.config_validation as cv
from esphome.const import CONF_UID
from esphome.core import HexInt
from esphome.types import ConfigType
from . import CONF_RC522_ID, RC522, rc522_ns
DEPENDENCIES = ["rc522"]
def validate_uid(value):
def validate_uid(value: Any) -> str:
value = cv.string_strict(value)
for x in value.split("-"):
if len(x) != 2:
@@ -39,7 +42,7 @@ CONFIG_SCHEMA = binary_sensor.binary_sensor_schema(RC522BinarySensor).extend(
)
async def to_code(config):
async def to_code(config: ConfigType) -> None:
var = await binary_sensor.new_binary_sensor(config)
hub = await cg.get_variable(config[CONF_RC522_ID])
@@ -1,3 +1,5 @@
from typing import Any
import esphome.codegen as cg
from esphome.components import audio, psram, speaker
import esphome.config_validation as cv
@@ -13,6 +15,7 @@ from esphome.const import (
PLATFORM_ESP32,
)
from esphome.core.entity_helpers import inherit_property_from
from esphome.types import ConfigType
AUTO_LOAD = ["audio"]
CODEOWNERS = ["@kahrendt"]
@@ -27,7 +30,7 @@ CONF_TAPS = "taps"
PASSTHROUGH = "passthrough"
def _set_stream_limits(config):
def _set_stream_limits(config: ConfigType) -> ConfigType:
audio.set_stream_limits(
min_bits_per_sample=16,
max_bits_per_sample=32,
@@ -36,7 +39,7 @@ def _set_stream_limits(config):
return config
def _validate_audio_compatibility(config):
def _validate_audio_compatibility(config: ConfigType) -> None:
inherit_property_from(CONF_NUM_CHANNELS, CONF_OUTPUT_SPEAKER)(config)
inherit_property_from(CONF_SAMPLE_RATE, CONF_OUTPUT_SPEAKER)(config)
@@ -57,7 +60,7 @@ def _validate_audio_compatibility(config):
)(config)
def _validate_taps(taps):
def _validate_taps(taps: Any) -> int:
value = cv.int_range(min=16, max=128)(taps)
if value % 4 != 0:
raise cv.Invalid("Number of taps must be divisible by 4")
@@ -88,7 +91,7 @@ CONFIG_SCHEMA = cv.All(
FINAL_VALIDATE_SCHEMA = _validate_audio_compatibility
async def to_code(config):
async def to_code(config: ConfigType) -> None:
var = cg.new_Pvariable(config[CONF_ID])
await cg.register_component(var, config)
await speaker.register_speaker(var, config)
+23 -5
View File
@@ -6,7 +6,10 @@ from esphome.components.output import FloatOutput
from esphome.components.speaker import Speaker
import esphome.config_validation as cv
from esphome.const import CONF_GAIN, CONF_ID, CONF_OUTPUT, CONF_PLATFORM, CONF_SPEAKER
from esphome.core import ID
from esphome.cpp_generator import MockObj, TemplateArgsType
import esphome.final_validate as fv
from esphome.types import ConfigType
_LOGGER = logging.getLogger(__name__)
@@ -37,7 +40,7 @@ CONFIG_SCHEMA = cv.All(
)
def validate_parent_output_config(value):
def validate_parent_output_config(value: ConfigType) -> None:
platform = value.get(CONF_PLATFORM)
PWM_GOOD = ["esp8266_pwm", "ledc"]
PWM_BAD = [
@@ -78,7 +81,7 @@ _CALLBACK_AUTOMATIONS = (
)
async def to_code(config):
async def to_code(config: ConfigType) -> None:
var = cg.new_Pvariable(config[CONF_ID])
await cg.register_component(var, config)
@@ -110,7 +113,12 @@ async def to_code(config):
),
synchronous=True,
)
async def rtttl_play_to_code(config, action_id, template_arg, args):
async def rtttl_play_to_code(
config: ConfigType,
action_id: ID,
template_arg: cg.TemplateArguments,
args: TemplateArgsType,
) -> MockObj:
paren = await cg.get_variable(config[CONF_ID])
var = cg.new_Pvariable(action_id, template_arg, paren)
template_ = await cg.templatable(config[CONF_RTTTL], args, cg.std_string)
@@ -128,7 +136,12 @@ async def rtttl_play_to_code(config, action_id, template_arg, args):
),
synchronous=True,
)
async def rtttl_stop_to_code(config, action_id, template_arg, args):
async def rtttl_stop_to_code(
config: ConfigType,
action_id: ID,
template_arg: cg.TemplateArguments,
args: TemplateArgsType,
) -> MockObj:
var = cg.new_Pvariable(action_id, template_arg)
await cg.register_parented(var, config[CONF_ID])
return var
@@ -143,7 +156,12 @@ async def rtttl_stop_to_code(config, action_id, template_arg, args):
}
),
)
async def rtttl_is_playing_to_code(config, condition_id, template_arg, args):
async def rtttl_is_playing_to_code(
config: ConfigType,
condition_id: ID,
template_arg: cg.TemplateArguments,
args: TemplateArgsType,
) -> MockObj:
var = cg.new_Pvariable(condition_id, template_arg)
await cg.register_parented(var, config[CONF_ID])
return var
+16 -3
View File
@@ -26,6 +26,9 @@ from esphome.const import (
UNIT_PARTS_PER_MILLION,
UNIT_PERCENT,
)
from esphome.core import ID
from esphome.cpp_generator import MockObj, TemplateArgsType
from esphome.types import ConfigType
CODEOWNERS = ["@sjtrny", "@martgras"]
DEPENDENCIES = ["i2c"]
@@ -108,7 +111,7 @@ SETTING_MAP = {
}
async def to_code(config):
async def to_code(config: ConfigType) -> None:
var = cg.new_Pvariable(config[CONF_ID])
await cg.register_component(var, config)
await i2c.register_i2c_device(var, config)
@@ -143,7 +146,12 @@ SCD4X_ACTION_SCHEMA = maybe_simple_id(
SCD4X_ACTION_SCHEMA,
synchronous=True,
)
async def scd4x_frc_to_code(config, action_id, template_arg, args):
async def scd4x_frc_to_code(
config: ConfigType,
action_id: ID,
template_arg: cg.TemplateArguments,
args: TemplateArgsType,
) -> MockObj:
var = cg.new_Pvariable(action_id, template_arg)
await cg.register_parented(var, config[CONF_ID])
template_ = await cg.templatable(config[CONF_VALUE], args, cg.uint16)
@@ -164,7 +172,12 @@ SCD4X_RESET_ACTION_SCHEMA = maybe_simple_id(
SCD4X_RESET_ACTION_SCHEMA,
synchronous=True,
)
async def scd4x_reset_to_code(config, action_id, template_arg, args):
async def scd4x_reset_to_code(
config: ConfigType,
action_id: ID,
template_arg: cg.TemplateArguments,
args: TemplateArgsType,
) -> MockObj:
var = cg.new_Pvariable(action_id, template_arg)
await cg.register_parented(var, config[CONF_ID])
return var
+11 -2
View File
@@ -1,3 +1,5 @@
from typing import Any
from esphome import automation
from esphome.automation import maybe_simple_id
import esphome.codegen as cg
@@ -41,6 +43,8 @@ from esphome.const import (
UNIT_MICROGRAMS_PER_CUBIC_METER,
UNIT_PERCENT,
)
from esphome.core import ID
from esphome.cpp_generator import MockObj, TemplateArgsType
from esphome.types import ConfigType
CODEOWNERS = ["@martgras"]
@@ -115,7 +119,7 @@ def _gas_sensor(
)
def float_previously_pct(value):
def float_previously_pct(value: Any) -> Any:
if isinstance(value, str) and "%" in value:
raise cv.Invalid(
f"The value '{value}' is a percentage. Suggested value: {float(value.strip('%')) / 100}"
@@ -284,6 +288,11 @@ SEN5X_ACTION_SCHEMA = maybe_simple_id(
SEN5X_ACTION_SCHEMA,
synchronous=True,
)
async def sen54_fan_to_code(config, action_id, template_arg, args):
async def sen54_fan_to_code(
config: ConfigType,
action_id: ID,
template_arg: cg.TemplateArguments,
args: TemplateArgsType,
) -> MockObj:
paren = await cg.get_variable(config[CONF_ID])
return cg.new_Pvariable(action_id, template_arg, paren)
+3 -3
View File
@@ -15,7 +15,7 @@ from esphome.const import (
CONF_WIDTH,
)
from esphome.core import CORE, ID
from esphome.cpp_generator import TemplateArgsType
from esphome.cpp_generator import MockObj, TemplateArgsType
from esphome.types import ConfigType
# mdns for autodiscovery
@@ -219,7 +219,7 @@ async def sendspin_switch_to_code(
action_id: ID,
template_arg: cg.TemplateArguments,
args: TemplateArgsType,
):
) -> MockObj:
var = cg.new_Pvariable(action_id, template_arg)
await cg.register_parented(var, config[CONF_ID])
return var
@@ -297,7 +297,7 @@ async def to_code(config: ConfigType) -> None:
codecs.append(CODEC_FORMAT_OPUS)
codecs.append(CODEC_FORMAT_PCM)
def _audio_format(codec, channels):
def _audio_format(codec: MockObj, channels: int) -> cg.StructInitializer:
return cg.StructInitializer(
AudioSupportedFormatObject,
("codec", codec),
@@ -1,3 +1,5 @@
from typing import Any
import esphome.codegen as cg
from esphome.components import sensor
import esphome.config_validation as cv
@@ -50,7 +52,7 @@ def _request_roles(config: ConfigType) -> ConfigType:
_HUB_ID_SCHEMA = cv.Schema({cv.GenerateID(CONF_SENDSPIN_ID): cv.use_id(SendspinHub)})
def _metadata_schema(**sensor_kwargs):
def _metadata_schema(**sensor_kwargs: Any) -> cv.Schema:
"""Schema for event-driven numeric metadata sensors (duration/year/track)."""
return (
sensor.sensor_schema(
+10 -2
View File
@@ -11,6 +11,9 @@ from esphome.const import (
STATE_CLASS_MEASUREMENT,
UNIT_DECIBEL,
)
from esphome.core import ID
from esphome.cpp_generator import MockObj, TemplateArgsType
from esphome.types import ConfigType
AUTO_LOAD = ["audio"]
CODEOWNERS = ["@kahrendt"]
@@ -63,7 +66,7 @@ CONFIG_SCHEMA = cv.All(
)
async def to_code(config):
async def to_code(config: ConfigType) -> None:
var = cg.new_Pvariable(config[CONF_ID])
await cg.register_component(var, config)
@@ -95,7 +98,12 @@ SOUND_LEVEL_ACTION_SCHEMA = automation.maybe_simple_id(
@automation.register_action(
"sound_level.stop", StopAction, SOUND_LEVEL_ACTION_SCHEMA, synchronous=True
)
async def sound_level_action_to_code(config, action_id, template_arg, args):
async def sound_level_action_to_code(
config: ConfigType,
action_id: ID,
template_arg: cg.TemplateArguments,
args: TemplateArgsType,
) -> MockObj:
var = cg.new_Pvariable(action_id, template_arg)
await cg.register_parented(var, config[CONF_ID])
return var
+10 -2
View File
@@ -26,6 +26,9 @@ from esphome.const import (
UNIT_MICROGRAMS_PER_CUBIC_METER,
UNIT_MICROMETER,
)
from esphome.core import ID
from esphome.cpp_generator import MockObj, TemplateArgsType
from esphome.types import ConfigType
CODEOWNERS = ["@martgras"]
DEPENDENCIES = ["i2c"]
@@ -120,7 +123,7 @@ CONFIG_SCHEMA = (
)
async def to_code(config):
async def to_code(config: ConfigType) -> None:
var = cg.new_Pvariable(config[CONF_ID])
await cg.register_component(var, config)
await i2c.register_i2c_device(var, config)
@@ -197,7 +200,12 @@ SPS30_ACTION_SCHEMA = maybe_simple_id(
SPS30_ACTION_SCHEMA,
synchronous=True,
)
async def sps30_action_to_code(config, action_id, template_arg, args):
async def sps30_action_to_code(
config: ConfigType,
action_id: ID,
template_arg: cg.TemplateArguments,
args: TemplateArgsType,
) -> MockObj:
var = cg.new_Pvariable(action_id, template_arg)
await cg.register_parented(var, config[CONF_ID])
return var
+19 -5
View File
@@ -1,3 +1,5 @@
from typing import Any
from esphome import automation, pins
import esphome.codegen as cg
from esphome.components import spi
@@ -5,6 +7,8 @@ from esphome.components.const import CONF_CRC_ENABLE, CONF_ON_PACKET
import esphome.config_validation as cv
from esphome.const import CONF_DATA, CONF_FREQUENCY, CONF_ID
from esphome.core import ID
from esphome.cpp_generator import MockObj, TemplateArgsType
from esphome.types import ConfigType
MULTI_CONF = True
CODEOWNERS = ["@swoboda1337"]
@@ -136,7 +140,7 @@ SetModeStandbyAction = sx127x_ns.class_(
)
def validate_raw_data(value):
def validate_raw_data(value: Any) -> bytes | list[int]:
if isinstance(value, str):
return value.encode("utf-8")
if isinstance(value, list):
@@ -146,7 +150,7 @@ def validate_raw_data(value):
)
def validate_config(config):
def validate_config(config: ConfigType) -> ConfigType:
if config[CONF_MODULATION] == "LORA":
bws = [
"7_8kHz",
@@ -230,7 +234,7 @@ CONFIG_SCHEMA = (
)
async def to_code(config):
async def to_code(config: ConfigType) -> None:
var = cg.new_Pvariable(config[CONF_ID])
await cg.register_component(var, config)
await spi.register_spi_device(var, config)
@@ -312,7 +316,12 @@ NO_ARGS_ACTION_SCHEMA = automation.maybe_simple_id(
NO_ARGS_ACTION_SCHEMA,
synchronous=True,
)
async def no_args_action_to_code(config, action_id, template_arg, args):
async def no_args_action_to_code(
config: ConfigType,
action_id: ID,
template_arg: cg.TemplateArguments,
args: TemplateArgsType,
) -> MockObj:
var = cg.new_Pvariable(action_id, template_arg)
await cg.register_parented(var, config[CONF_ID])
return var
@@ -333,7 +342,12 @@ SEND_PACKET_ACTION_SCHEMA = cv.maybe_simple_value(
SEND_PACKET_ACTION_SCHEMA,
synchronous=True,
)
async def send_packet_action_to_code(config, action_id, template_arg, args):
async def send_packet_action_to_code(
config: ConfigType,
action_id: ID,
template_arg: cg.TemplateArguments,
args: TemplateArgsType,
) -> MockObj:
var = cg.new_Pvariable(action_id, template_arg)
await cg.register_parented(var, config[CONF_ID])
data = config[CONF_DATA]
@@ -6,6 +6,7 @@ from esphome.components.packet_transport import (
)
import esphome.config_validation as cv
from esphome.cpp_types import PollingComponent
from esphome.types import ConfigType
from .. import CONF_SX127X_ID, SX127x, SX127xListener, sx127x_ns
@@ -20,7 +21,7 @@ CONFIG_SCHEMA = transport_schema(SX127xTransport).extend(
)
async def to_code(config):
async def to_code(config: ConfigType) -> None:
var, _ = await new_packet_transport(config)
sx127x = await cg.get_variable(config[CONF_SX127X_ID])
cg.add(var.set_parent(sx127x))
+34 -6
View File
@@ -9,6 +9,9 @@ from esphome.const import (
CONF_ID,
CONF_LEVEL,
)
from esphome.core import ID
from esphome.cpp_generator import MockObj, TemplateArgsType
from esphome.types import ConfigType
CODEOWNERS = ["@mrtoy-me"]
@@ -43,7 +46,7 @@ CONFIG_SCHEMA = cv.All(
)
async def to_code(config):
async def to_code(config: ConfigType) -> None:
var = cg.new_Pvariable(config[CONF_ID])
await cg.register_component(var, config)
clk_pin = await cg.gpio_pin_expression(config[CONF_CLK_PIN])
@@ -75,7 +78,12 @@ BINARY_OUTPUT_ACTION_SCHEMA = maybe_simple_id(
),
synchronous=True,
)
async def tm1651_set_brightness_to_code(config, action_id, template_arg, args):
async def tm1651_set_brightness_to_code(
config: ConfigType,
action_id: ID,
template_arg: cg.TemplateArguments,
args: TemplateArgsType,
) -> MockObj:
var = cg.new_Pvariable(action_id, template_arg)
await cg.register_parented(var, config[CONF_ID])
template_ = await cg.templatable(config[CONF_BRIGHTNESS], args, cg.uint8)
@@ -95,7 +103,12 @@ async def tm1651_set_brightness_to_code(config, action_id, template_arg, args):
),
synchronous=True,
)
async def tm1651_set_level_to_code(config, action_id, template_arg, args):
async def tm1651_set_level_to_code(
config: ConfigType,
action_id: ID,
template_arg: cg.TemplateArguments,
args: TemplateArgsType,
) -> MockObj:
var = cg.new_Pvariable(action_id, template_arg)
await cg.register_parented(var, config[CONF_ID])
template_ = await cg.templatable(config[CONF_LEVEL], args, cg.uint8)
@@ -115,7 +128,12 @@ async def tm1651_set_level_to_code(config, action_id, template_arg, args):
),
synchronous=True,
)
async def tm1651_set_level_percent_to_code(config, action_id, template_arg, args):
async def tm1651_set_level_percent_to_code(
config: ConfigType,
action_id: ID,
template_arg: cg.TemplateArguments,
args: TemplateArgsType,
) -> MockObj:
var = cg.new_Pvariable(action_id, template_arg)
await cg.register_parented(var, config[CONF_ID])
template_ = await cg.templatable(config[CONF_LEVEL_PERCENT], args, cg.uint8)
@@ -129,7 +147,12 @@ async def tm1651_set_level_percent_to_code(config, action_id, template_arg, args
BINARY_OUTPUT_ACTION_SCHEMA,
synchronous=True,
)
async def output_turn_off_to_code(config, action_id, template_arg, args):
async def output_turn_off_to_code(
config: ConfigType,
action_id: ID,
template_arg: cg.TemplateArguments,
args: TemplateArgsType,
) -> MockObj:
var = cg.new_Pvariable(action_id, template_arg)
await cg.register_parented(var, config[CONF_ID])
return var
@@ -138,7 +161,12 @@ async def output_turn_off_to_code(config, action_id, template_arg, args):
@automation.register_action(
"tm1651.turn_on", TurnOnAction, BINARY_OUTPUT_ACTION_SCHEMA, synchronous=True
)
async def output_turn_on_to_code(config, action_id, template_arg, args):
async def output_turn_on_to_code(
config: ConfigType,
action_id: ID,
template_arg: cg.TemplateArguments,
args: TemplateArgsType,
) -> MockObj:
var = cg.new_Pvariable(action_id, template_arg)
await cg.register_parented(var, config[CONF_ID])
return var
+16 -3
View File
@@ -14,6 +14,9 @@ from esphome.const import (
UNIT_CELSIUS,
UNIT_MILLISIEMENS_PER_CENTIMETER,
)
from esphome.core import ID
from esphome.cpp_generator import MockObj, TemplateArgsType
from esphome.types import ConfigType
DEPENDENCIES = ["i2c"]
@@ -63,7 +66,7 @@ CONFIG_SCHEMA = (
)
async def to_code(config):
async def to_code(config: ConfigType) -> None:
var = cg.new_Pvariable(config[CONF_ID])
await cg.register_component(var, config)
cg.add(var.set_temperature_compensation(config[CONF_TEMPERATURE_COMPENSATION]))
@@ -99,7 +102,12 @@ UFIRE_EC_CALIBRATE_PROBE_SCHEMA = cv.Schema(
UFIRE_EC_CALIBRATE_PROBE_SCHEMA,
synchronous=True,
)
async def ufire_ec_calibrate_probe_to_code(config, action_id, template_arg, args):
async def ufire_ec_calibrate_probe_to_code(
config: ConfigType,
action_id: ID,
template_arg: cg.TemplateArguments,
args: TemplateArgsType,
) -> MockObj:
paren = await cg.get_variable(config[CONF_ID])
var = cg.new_Pvariable(action_id, template_arg, paren)
solution_ = await cg.templatable(config[CONF_SOLUTION], args, cg.float_)
@@ -122,6 +130,11 @@ UFIRE_EC_RESET_SCHEMA = cv.Schema(
UFIRE_EC_RESET_SCHEMA,
synchronous=True,
)
async def ufire_ec_reset_to_code(config, action_id, template_arg, args):
async def ufire_ec_reset_to_code(
config: ConfigType,
action_id: ID,
template_arg: cg.TemplateArguments,
args: TemplateArgsType,
) -> MockObj:
paren = await cg.get_variable(config[CONF_ID])
return cg.new_Pvariable(action_id, template_arg, paren)
+22 -4
View File
@@ -13,6 +13,9 @@ from esphome.const import (
UNIT_CELSIUS,
UNIT_PH,
)
from esphome.core import ID
from esphome.cpp_generator import MockObj, TemplateArgsType
from esphome.types import ConfigType
DEPENDENCIES = ["i2c"]
@@ -60,7 +63,7 @@ CONFIG_SCHEMA = (
)
async def to_code(config):
async def to_code(config: ConfigType) -> None:
var = cg.new_Pvariable(config[CONF_ID])
await cg.register_component(var, config)
@@ -93,7 +96,12 @@ UFIRE_ISE_CALIBRATE_PROBE_SCHEMA = cv.Schema(
UFIRE_ISE_CALIBRATE_PROBE_SCHEMA,
synchronous=True,
)
async def ufire_ise_calibrate_probe_low_to_code(config, action_id, template_arg, args):
async def ufire_ise_calibrate_probe_low_to_code(
config: ConfigType,
action_id: ID,
template_arg: cg.TemplateArguments,
args: TemplateArgsType,
) -> MockObj:
paren = await cg.get_variable(config[CONF_ID])
var = cg.new_Pvariable(action_id, template_arg, paren)
template_ = await cg.templatable(config[CONF_SOLUTION], args, cg.float_)
@@ -107,7 +115,12 @@ async def ufire_ise_calibrate_probe_low_to_code(config, action_id, template_arg,
UFIRE_ISE_CALIBRATE_PROBE_SCHEMA,
synchronous=True,
)
async def ufire_ise_calibrate_probe_high_to_code(config, action_id, template_arg, args):
async def ufire_ise_calibrate_probe_high_to_code(
config: ConfigType,
action_id: ID,
template_arg: cg.TemplateArguments,
args: TemplateArgsType,
) -> MockObj:
paren = await cg.get_variable(config[CONF_ID])
var = cg.new_Pvariable(action_id, template_arg, paren)
template_ = await cg.templatable(config[CONF_SOLUTION], args, cg.float_)
@@ -124,6 +137,11 @@ UFIRE_ISE_RESET_SCHEMA = cv.Schema({cv.GenerateID(): cv.use_id(UFireISEComponent
UFIRE_ISE_RESET_SCHEMA,
synchronous=True,
)
async def ufire_ise_reset_to_code(config, action_id, template_arg, args):
async def ufire_ise_reset_to_code(
config: ConfigType,
action_id: ID,
template_arg: cg.TemplateArguments,
args: TemplateArgsType,
) -> MockObj:
paren = await cg.get_variable(config[CONF_ID])
return cg.new_Pvariable(action_id, template_arg, paren)