[switch] Fix schema generation (#8774)

This commit is contained in:
Jesse Hills 2025-05-13 18:17:54 +12:00 committed by GitHub
parent a36e1aab8e
commit 410b6353fe
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 65 additions and 62 deletions

View File

@ -2,6 +2,7 @@ import esphome.codegen as cg
from esphome.components import switch from esphome.components import switch
import esphome.config_validation as cv import esphome.config_validation as cv
from esphome.const import CONF_TYPE, ENTITY_CATEGORY_CONFIG from esphome.const import CONF_TYPE, ENTITY_CATEGORY_CONFIG
from esphome.cpp_generator import MockObjClass
from .. import CONF_DFROBOT_SEN0395_ID, DfrobotSen0395Component from .. import CONF_DFROBOT_SEN0395_ID, DfrobotSen0395Component
@ -26,32 +27,30 @@ Sen0395StartAfterBootSwitch = dfrobot_sen0395_ns.class_(
"Sen0395StartAfterBootSwitch", DfrobotSen0395Switch "Sen0395StartAfterBootSwitch", DfrobotSen0395Switch
) )
_SWITCH_SCHEMA = (
switch.switch_schema( def _switch_schema(class_: MockObjClass) -> cv.Schema:
entity_category=ENTITY_CATEGORY_CONFIG, return (
switch.switch_schema(
class_,
entity_category=ENTITY_CATEGORY_CONFIG,
)
.extend(
{
cv.GenerateID(CONF_DFROBOT_SEN0395_ID): cv.use_id(
DfrobotSen0395Component
),
}
)
.extend(cv.COMPONENT_SCHEMA)
) )
.extend(
{
cv.GenerateID(CONF_DFROBOT_SEN0395_ID): cv.use_id(DfrobotSen0395Component),
}
)
.extend(cv.COMPONENT_SCHEMA)
)
CONFIG_SCHEMA = cv.typed_schema( CONFIG_SCHEMA = cv.typed_schema(
{ {
"sensor_active": _SWITCH_SCHEMA.extend( "sensor_active": _switch_schema(Sen0395PowerSwitch),
{cv.GenerateID(): cv.declare_id(Sen0395PowerSwitch)} "turn_on_led": _switch_schema(Sen0395LedSwitch),
), "presence_via_uart": _switch_schema(Sen0395UartPresenceSwitch),
"turn_on_led": _SWITCH_SCHEMA.extend( "start_after_boot": _switch_schema(Sen0395StartAfterBootSwitch),
{cv.GenerateID(): cv.declare_id(Sen0395LedSwitch)}
),
"presence_via_uart": _SWITCH_SCHEMA.extend(
{cv.GenerateID(): cv.declare_id(Sen0395UartPresenceSwitch)}
),
"start_after_boot": _SWITCH_SCHEMA.extend(
{cv.GenerateID(): cv.declare_id(Sen0395StartAfterBootSwitch)}
),
} }
) )

View File

@ -72,6 +72,9 @@ _SWITCH_SCHEMA = (
{ {
cv.OnlyWith(CONF_MQTT_ID, "mqtt"): cv.declare_id(mqtt.MQTTSwitchComponent), cv.OnlyWith(CONF_MQTT_ID, "mqtt"): cv.declare_id(mqtt.MQTTSwitchComponent),
cv.Optional(CONF_INVERTED): cv.boolean, cv.Optional(CONF_INVERTED): cv.boolean,
cv.Optional(CONF_RESTORE_MODE, default="ALWAYS_OFF"): cv.enum(
RESTORE_MODES, upper=True, space="_"
),
cv.Optional(CONF_ON_TURN_ON): automation.validate_automation( cv.Optional(CONF_ON_TURN_ON): automation.validate_automation(
{ {
cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(SwitchTurnOnTrigger), cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(SwitchTurnOnTrigger),
@ -89,54 +92,41 @@ _SWITCH_SCHEMA = (
def switch_schema( def switch_schema(
class_: MockObjClass = cv.UNDEFINED, class_: MockObjClass,
*, *,
entity_category: str = cv.UNDEFINED,
device_class: str = cv.UNDEFINED,
icon: str = cv.UNDEFINED,
block_inverted: bool = False, block_inverted: bool = False,
default_restore_mode: str = "ALWAYS_OFF", default_restore_mode: str = cv.UNDEFINED,
device_class: str = cv.UNDEFINED,
entity_category: str = cv.UNDEFINED,
icon: str = cv.UNDEFINED,
): ):
schema = _SWITCH_SCHEMA.extend( schema = {cv.GenerateID(): cv.declare_id(class_)}
{
cv.Optional(CONF_RESTORE_MODE, default=default_restore_mode): cv.enum( for key, default, validator in [
RESTORE_MODES, upper=True, space="_" (CONF_DEVICE_CLASS, device_class, validate_device_class),
), (CONF_ENTITY_CATEGORY, entity_category, cv.entity_category),
} (CONF_ICON, icon, cv.icon),
) (
if class_ is not cv.UNDEFINED: CONF_RESTORE_MODE,
schema = schema.extend({cv.GenerateID(): cv.declare_id(class_)}) default_restore_mode,
if entity_category is not cv.UNDEFINED: cv.enum(RESTORE_MODES, upper=True, space="_")
schema = schema.extend( if default_restore_mode is not cv.UNDEFINED
{ else cv.UNDEFINED,
cv.Optional( ),
CONF_ENTITY_CATEGORY, default=entity_category ]:
): cv.entity_category if default is not cv.UNDEFINED:
} schema[cv.Optional(key, default=default)] = validator
)
if device_class is not cv.UNDEFINED:
schema = schema.extend(
{
cv.Optional(
CONF_DEVICE_CLASS, default=device_class
): validate_device_class
}
)
if icon is not cv.UNDEFINED:
schema = schema.extend({cv.Optional(CONF_ICON, default=icon): cv.icon})
if block_inverted: if block_inverted:
schema = schema.extend( schema[cv.Optional(CONF_INVERTED)] = cv.invalid(
{ "Inverted is not supported for this platform!"
cv.Optional(CONF_INVERTED): cv.invalid(
"Inverted is not supported for this platform!"
)
}
) )
return schema
return _SWITCH_SCHEMA.extend(schema)
# Remove before 2025.11.0 # Remove before 2025.11.0
SWITCH_SCHEMA = switch_schema() SWITCH_SCHEMA = switch_schema(Switch)
SWITCH_SCHEMA.add_extra(cv.deprecated_schema_constant("switch")) SWITCH_SCHEMA.add_extra(cv.deprecated_schema_constant("switch"))

View File

@ -26,3 +26,17 @@ dfrobot_sen0395:
binary_sensor: binary_sensor:
- platform: dfrobot_sen0395 - platform: dfrobot_sen0395
id: mmwave_detected id: mmwave_detected
switch:
- platform: dfrobot_sen0395
type: sensor_active
id: mmwave_sensor_active
- platform: dfrobot_sen0395
type: turn_on_led
id: mmwave_turn_on_led
- platform: dfrobot_sen0395
type: presence_via_uart
id: mmwave_presence_via_uart
- platform: dfrobot_sen0395
type: start_after_boot
id: mmwave_start_after_boot