mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-31 15:12:06 +00:00 
			
		
		
		
	[config] Deprecate more *_SCHEMA constants (#8763)
This commit is contained in:
		| @@ -5,6 +5,8 @@ from esphome.components import mqtt, web_server | |||||||
| import esphome.config_validation as cv | import esphome.config_validation as cv | ||||||
| from esphome.const import ( | from esphome.const import ( | ||||||
|     CONF_CODE, |     CONF_CODE, | ||||||
|  |     CONF_ENTITY_CATEGORY, | ||||||
|  |     CONF_ICON, | ||||||
|     CONF_ID, |     CONF_ID, | ||||||
|     CONF_MQTT_ID, |     CONF_MQTT_ID, | ||||||
|     CONF_ON_STATE, |     CONF_ON_STATE, | ||||||
| @@ -12,6 +14,7 @@ from esphome.const import ( | |||||||
|     CONF_WEB_SERVER, |     CONF_WEB_SERVER, | ||||||
| ) | ) | ||||||
| from esphome.core import CORE, coroutine_with_priority | from esphome.core import CORE, coroutine_with_priority | ||||||
|  | from esphome.cpp_generator import MockObjClass | ||||||
| from esphome.cpp_helpers import setup_entity | from esphome.cpp_helpers import setup_entity | ||||||
|  |  | ||||||
| CODEOWNERS = ["@grahambrown11", "@hwstar"] | CODEOWNERS = ["@grahambrown11", "@hwstar"] | ||||||
| @@ -78,12 +81,11 @@ AlarmControlPanelCondition = alarm_control_panel_ns.class_( | |||||||
|     "AlarmControlPanelCondition", automation.Condition |     "AlarmControlPanelCondition", automation.Condition | ||||||
| ) | ) | ||||||
|  |  | ||||||
| ALARM_CONTROL_PANEL_SCHEMA = ( | _ALARM_CONTROL_PANEL_SCHEMA = ( | ||||||
|     cv.ENTITY_BASE_SCHEMA.extend(web_server.WEBSERVER_SORTING_SCHEMA) |     cv.ENTITY_BASE_SCHEMA.extend(web_server.WEBSERVER_SORTING_SCHEMA) | ||||||
|     .extend(cv.MQTT_COMMAND_COMPONENT_SCHEMA) |     .extend(cv.MQTT_COMMAND_COMPONENT_SCHEMA) | ||||||
|     .extend( |     .extend( | ||||||
|         { |         { | ||||||
|             cv.GenerateID(): cv.declare_id(AlarmControlPanel), |  | ||||||
|             cv.OnlyWith(CONF_MQTT_ID, "mqtt"): cv.declare_id( |             cv.OnlyWith(CONF_MQTT_ID, "mqtt"): cv.declare_id( | ||||||
|                 mqtt.MQTTAlarmControlPanelComponent |                 mqtt.MQTTAlarmControlPanelComponent | ||||||
|             ), |             ), | ||||||
| @@ -146,6 +148,33 @@ ALARM_CONTROL_PANEL_SCHEMA = ( | |||||||
|     ) |     ) | ||||||
| ) | ) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def alarm_control_panel_schema( | ||||||
|  |     class_: MockObjClass, | ||||||
|  |     *, | ||||||
|  |     entity_category: str = cv.UNDEFINED, | ||||||
|  |     icon: str = cv.UNDEFINED, | ||||||
|  | ) -> cv.Schema: | ||||||
|  |     schema = { | ||||||
|  |         cv.GenerateID(): cv.declare_id(class_), | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     for key, default, validator in [ | ||||||
|  |         (CONF_ENTITY_CATEGORY, entity_category, cv.entity_category), | ||||||
|  |         (CONF_ICON, icon, cv.icon), | ||||||
|  |     ]: | ||||||
|  |         if default is not cv.UNDEFINED: | ||||||
|  |             schema[cv.Optional(key, default=default)] = validator | ||||||
|  |  | ||||||
|  |     return _ALARM_CONTROL_PANEL_SCHEMA.extend(schema) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # Remove before 2025.11.0 | ||||||
|  | ALARM_CONTROL_PANEL_SCHEMA = alarm_control_panel_schema(AlarmControlPanel) | ||||||
|  | ALARM_CONTROL_PANEL_SCHEMA.add_extra( | ||||||
|  |     cv.deprecated_schema_constant("alarm_control_panel") | ||||||
|  | ) | ||||||
|  |  | ||||||
| ALARM_CONTROL_PANEL_ACTION_SCHEMA = maybe_simple_id( | ALARM_CONTROL_PANEL_ACTION_SCHEMA = maybe_simple_id( | ||||||
|     { |     { | ||||||
|         cv.GenerateID(): cv.use_id(AlarmControlPanel), |         cv.GenerateID(): cv.use_id(AlarmControlPanel), | ||||||
| @@ -209,6 +238,12 @@ async def register_alarm_control_panel(var, config): | |||||||
|     await setup_alarm_control_panel_core_(var, config) |     await setup_alarm_control_panel_core_(var, config) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | async def new_alarm_control_panel(config, *args): | ||||||
|  |     var = cg.new_Pvariable(config[CONF_ID], *args) | ||||||
|  |     await register_alarm_control_panel(var, config) | ||||||
|  |     return var | ||||||
|  |  | ||||||
|  |  | ||||||
| @automation.register_action( | @automation.register_action( | ||||||
|     "alarm_control_panel.arm_away", ArmAwayAction, ALARM_CONTROL_PANEL_ACTION_SCHEMA |     "alarm_control_panel.arm_away", ArmAwayAction, ALARM_CONTROL_PANEL_ACTION_SCHEMA | ||||||
| ) | ) | ||||||
|   | |||||||
| @@ -11,9 +11,11 @@ from esphome.const import ( | |||||||
|     CONF_CURRENT_TEMPERATURE_STATE_TOPIC, |     CONF_CURRENT_TEMPERATURE_STATE_TOPIC, | ||||||
|     CONF_CUSTOM_FAN_MODE, |     CONF_CUSTOM_FAN_MODE, | ||||||
|     CONF_CUSTOM_PRESET, |     CONF_CUSTOM_PRESET, | ||||||
|  |     CONF_ENTITY_CATEGORY, | ||||||
|     CONF_FAN_MODE, |     CONF_FAN_MODE, | ||||||
|     CONF_FAN_MODE_COMMAND_TOPIC, |     CONF_FAN_MODE_COMMAND_TOPIC, | ||||||
|     CONF_FAN_MODE_STATE_TOPIC, |     CONF_FAN_MODE_STATE_TOPIC, | ||||||
|  |     CONF_ICON, | ||||||
|     CONF_ID, |     CONF_ID, | ||||||
|     CONF_MAX_TEMPERATURE, |     CONF_MAX_TEMPERATURE, | ||||||
|     CONF_MIN_TEMPERATURE, |     CONF_MIN_TEMPERATURE, | ||||||
| @@ -46,6 +48,7 @@ from esphome.const import ( | |||||||
|     CONF_WEB_SERVER, |     CONF_WEB_SERVER, | ||||||
| ) | ) | ||||||
| from esphome.core import CORE, coroutine_with_priority | from esphome.core import CORE, coroutine_with_priority | ||||||
|  | from esphome.cpp_generator import MockObjClass | ||||||
| from esphome.cpp_helpers import setup_entity | from esphome.cpp_helpers import setup_entity | ||||||
|  |  | ||||||
| IS_PLATFORM_COMPONENT = True | IS_PLATFORM_COMPONENT = True | ||||||
| @@ -151,12 +154,11 @@ ControlTrigger = climate_ns.class_( | |||||||
|     "ControlTrigger", automation.Trigger.template(ClimateCall.operator("ref")) |     "ControlTrigger", automation.Trigger.template(ClimateCall.operator("ref")) | ||||||
| ) | ) | ||||||
|  |  | ||||||
| CLIMATE_SCHEMA = ( | _CLIMATE_SCHEMA = ( | ||||||
|     cv.ENTITY_BASE_SCHEMA.extend(web_server.WEBSERVER_SORTING_SCHEMA) |     cv.ENTITY_BASE_SCHEMA.extend(web_server.WEBSERVER_SORTING_SCHEMA) | ||||||
|     .extend(cv.MQTT_COMMAND_COMPONENT_SCHEMA) |     .extend(cv.MQTT_COMMAND_COMPONENT_SCHEMA) | ||||||
|     .extend( |     .extend( | ||||||
|         { |         { | ||||||
|             cv.GenerateID(): cv.declare_id(Climate), |  | ||||||
|             cv.OnlyWith(CONF_MQTT_ID, "mqtt"): cv.declare_id(mqtt.MQTTClimateComponent), |             cv.OnlyWith(CONF_MQTT_ID, "mqtt"): cv.declare_id(mqtt.MQTTClimateComponent), | ||||||
|             cv.Optional(CONF_VISUAL, default={}): cv.Schema( |             cv.Optional(CONF_VISUAL, default={}): cv.Schema( | ||||||
|                 { |                 { | ||||||
| @@ -245,6 +247,31 @@ CLIMATE_SCHEMA = ( | |||||||
| ) | ) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def climate_schema( | ||||||
|  |     class_: MockObjClass, | ||||||
|  |     *, | ||||||
|  |     entity_category: str = cv.UNDEFINED, | ||||||
|  |     icon: str = cv.UNDEFINED, | ||||||
|  | ) -> cv.Schema: | ||||||
|  |     schema = { | ||||||
|  |         cv.GenerateID(): cv.declare_id(Climate), | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     for key, default, validator in [ | ||||||
|  |         (CONF_ENTITY_CATEGORY, entity_category, cv.entity_category), | ||||||
|  |         (CONF_ICON, icon, cv.icon), | ||||||
|  |     ]: | ||||||
|  |         if default is not cv.UNDEFINED: | ||||||
|  |             schema[cv.Optional(key, default=default)] = validator | ||||||
|  |  | ||||||
|  |     return _CLIMATE_SCHEMA.extend(schema) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # Remove before 2025.11.0 | ||||||
|  | CLIMATE_SCHEMA = climate_schema(Climate) | ||||||
|  | CLIMATE_SCHEMA.add_extra(cv.deprecated_schema_constant("climate")) | ||||||
|  |  | ||||||
|  |  | ||||||
| async def setup_climate_core_(var, config): | async def setup_climate_core_(var, config): | ||||||
|     await setup_entity(var, config) |     await setup_entity(var, config) | ||||||
|  |  | ||||||
| @@ -419,6 +446,12 @@ async def register_climate(var, config): | |||||||
|     await setup_climate_core_(var, config) |     await setup_climate_core_(var, config) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | async def new_climate(config, *args): | ||||||
|  |     var = cg.new_Pvariable(config[CONF_ID], *args) | ||||||
|  |     await register_climate(var, config) | ||||||
|  |     return var | ||||||
|  |  | ||||||
|  |  | ||||||
| CLIMATE_CONTROL_ACTION_SCHEMA = cv.Schema( | CLIMATE_CONTROL_ACTION_SCHEMA = cv.Schema( | ||||||
|     { |     { | ||||||
|         cv.Required(CONF_ID): cv.use_id(Climate), |         cv.Required(CONF_ID): cv.use_id(Climate), | ||||||
|   | |||||||
| @@ -5,6 +5,8 @@ from esphome.components import mqtt, web_server | |||||||
| import esphome.config_validation as cv | import esphome.config_validation as cv | ||||||
| from esphome.const import ( | from esphome.const import ( | ||||||
|     CONF_DEVICE_CLASS, |     CONF_DEVICE_CLASS, | ||||||
|  |     CONF_ENTITY_CATEGORY, | ||||||
|  |     CONF_ICON, | ||||||
|     CONF_ID, |     CONF_ID, | ||||||
|     CONF_MQTT_ID, |     CONF_MQTT_ID, | ||||||
|     CONF_ON_OPEN, |     CONF_ON_OPEN, | ||||||
| @@ -31,6 +33,7 @@ from esphome.const import ( | |||||||
|     DEVICE_CLASS_WINDOW, |     DEVICE_CLASS_WINDOW, | ||||||
| ) | ) | ||||||
| from esphome.core import CORE, coroutine_with_priority | from esphome.core import CORE, coroutine_with_priority | ||||||
|  | from esphome.cpp_generator import MockObjClass | ||||||
| from esphome.cpp_helpers import setup_entity | from esphome.cpp_helpers import setup_entity | ||||||
|  |  | ||||||
| IS_PLATFORM_COMPONENT = True | IS_PLATFORM_COMPONENT = True | ||||||
| @@ -89,12 +92,11 @@ CoverClosedTrigger = cover_ns.class_( | |||||||
|  |  | ||||||
| CONF_ON_CLOSED = "on_closed" | CONF_ON_CLOSED = "on_closed" | ||||||
|  |  | ||||||
| COVER_SCHEMA = ( | _COVER_SCHEMA = ( | ||||||
|     cv.ENTITY_BASE_SCHEMA.extend(web_server.WEBSERVER_SORTING_SCHEMA) |     cv.ENTITY_BASE_SCHEMA.extend(web_server.WEBSERVER_SORTING_SCHEMA) | ||||||
|     .extend(cv.MQTT_COMMAND_COMPONENT_SCHEMA) |     .extend(cv.MQTT_COMMAND_COMPONENT_SCHEMA) | ||||||
|     .extend( |     .extend( | ||||||
|         { |         { | ||||||
|             cv.GenerateID(): cv.declare_id(Cover), |  | ||||||
|             cv.OnlyWith(CONF_MQTT_ID, "mqtt"): cv.declare_id(mqtt.MQTTCoverComponent), |             cv.OnlyWith(CONF_MQTT_ID, "mqtt"): cv.declare_id(mqtt.MQTTCoverComponent), | ||||||
|             cv.Optional(CONF_DEVICE_CLASS): cv.one_of(*DEVICE_CLASSES, lower=True), |             cv.Optional(CONF_DEVICE_CLASS): cv.one_of(*DEVICE_CLASSES, lower=True), | ||||||
|             cv.Optional(CONF_POSITION_COMMAND_TOPIC): cv.All( |             cv.Optional(CONF_POSITION_COMMAND_TOPIC): cv.All( | ||||||
| @@ -124,6 +126,33 @@ COVER_SCHEMA = ( | |||||||
| ) | ) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def cover_schema( | ||||||
|  |     class_: MockObjClass, | ||||||
|  |     *, | ||||||
|  |     device_class: str = cv.UNDEFINED, | ||||||
|  |     entity_category: str = cv.UNDEFINED, | ||||||
|  |     icon: str = cv.UNDEFINED, | ||||||
|  | ) -> cv.Schema: | ||||||
|  |     schema = { | ||||||
|  |         cv.GenerateID(): cv.declare_id(class_), | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     for key, default, validator in [ | ||||||
|  |         (CONF_DEVICE_CLASS, device_class, cv.one_of(*DEVICE_CLASSES, lower=True)), | ||||||
|  |         (CONF_ENTITY_CATEGORY, entity_category, cv.entity_category), | ||||||
|  |         (CONF_ICON, icon, cv.icon), | ||||||
|  |     ]: | ||||||
|  |         if default is not cv.UNDEFINED: | ||||||
|  |             schema[cv.Optional(key, default=default)] = validator | ||||||
|  |  | ||||||
|  |     return _COVER_SCHEMA.extend(schema) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # Remove before 2025.11.0 | ||||||
|  | COVER_SCHEMA = cover_schema(Cover) | ||||||
|  | COVER_SCHEMA.add_extra(cv.deprecated_schema_constant("cover")) | ||||||
|  |  | ||||||
|  |  | ||||||
| async def setup_cover_core_(var, config): | async def setup_cover_core_(var, config): | ||||||
|     await setup_entity(var, config) |     await setup_entity(var, config) | ||||||
|  |  | ||||||
| @@ -163,6 +192,12 @@ async def register_cover(var, config): | |||||||
|     await setup_cover_core_(var, config) |     await setup_cover_core_(var, config) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | async def new_cover(config, *args): | ||||||
|  |     var = cg.new_Pvariable(config[CONF_ID], *args) | ||||||
|  |     await register_cover(var, config) | ||||||
|  |     return var | ||||||
|  |  | ||||||
|  |  | ||||||
| COVER_ACTION_SCHEMA = maybe_simple_id( | COVER_ACTION_SCHEMA = maybe_simple_id( | ||||||
|     { |     { | ||||||
|         cv.Required(CONF_ID): cv.use_id(Cover), |         cv.Required(CONF_ID): cv.use_id(Cover), | ||||||
|   | |||||||
| @@ -7,6 +7,8 @@ from esphome.const import ( | |||||||
|     CONF_DIRECTION, |     CONF_DIRECTION, | ||||||
|     CONF_DIRECTION_COMMAND_TOPIC, |     CONF_DIRECTION_COMMAND_TOPIC, | ||||||
|     CONF_DIRECTION_STATE_TOPIC, |     CONF_DIRECTION_STATE_TOPIC, | ||||||
|  |     CONF_ENTITY_CATEGORY, | ||||||
|  |     CONF_ICON, | ||||||
|     CONF_ID, |     CONF_ID, | ||||||
|     CONF_MQTT_ID, |     CONF_MQTT_ID, | ||||||
|     CONF_OFF_SPEED_CYCLE, |     CONF_OFF_SPEED_CYCLE, | ||||||
| @@ -82,12 +84,11 @@ FanPresetSetTrigger = fan_ns.class_( | |||||||
| FanIsOnCondition = fan_ns.class_("FanIsOnCondition", automation.Condition.template()) | FanIsOnCondition = fan_ns.class_("FanIsOnCondition", automation.Condition.template()) | ||||||
| FanIsOffCondition = fan_ns.class_("FanIsOffCondition", automation.Condition.template()) | FanIsOffCondition = fan_ns.class_("FanIsOffCondition", automation.Condition.template()) | ||||||
|  |  | ||||||
| FAN_SCHEMA = ( | _FAN_SCHEMA = ( | ||||||
|     cv.ENTITY_BASE_SCHEMA.extend(web_server.WEBSERVER_SORTING_SCHEMA) |     cv.ENTITY_BASE_SCHEMA.extend(web_server.WEBSERVER_SORTING_SCHEMA) | ||||||
|     .extend(cv.MQTT_COMMAND_COMPONENT_SCHEMA) |     .extend(cv.MQTT_COMMAND_COMPONENT_SCHEMA) | ||||||
|     .extend( |     .extend( | ||||||
|         { |         { | ||||||
|             cv.GenerateID(): cv.declare_id(Fan), |  | ||||||
|             cv.Optional(CONF_RESTORE_MODE, default="ALWAYS_OFF"): cv.enum( |             cv.Optional(CONF_RESTORE_MODE, default="ALWAYS_OFF"): cv.enum( | ||||||
|                 RESTORE_MODES, upper=True, space="_" |                 RESTORE_MODES, upper=True, space="_" | ||||||
|             ), |             ), | ||||||
| @@ -159,6 +160,37 @@ FAN_SCHEMA = ( | |||||||
|     ) |     ) | ||||||
| ) | ) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def fan_schema( | ||||||
|  |     class_: cg.Pvariable, | ||||||
|  |     *, | ||||||
|  |     entity_category: str = cv.UNDEFINED, | ||||||
|  |     icon: str = cv.UNDEFINED, | ||||||
|  |     default_restore_mode: str = cv.UNDEFINED, | ||||||
|  | ) -> cv.Schema: | ||||||
|  |     schema = { | ||||||
|  |         cv.GenerateID(): cv.declare_id(class_), | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     for key, default, validator in [ | ||||||
|  |         (CONF_ENTITY_CATEGORY, entity_category, cv.entity_category), | ||||||
|  |         (CONF_ICON, icon, cv.icon), | ||||||
|  |         ( | ||||||
|  |             CONF_RESTORE_MODE, | ||||||
|  |             default_restore_mode, | ||||||
|  |             cv.enum(RESTORE_MODES, upper=True, space="_"), | ||||||
|  |         ), | ||||||
|  |     ]: | ||||||
|  |         if default is not cv.UNDEFINED: | ||||||
|  |             schema[cv.Optional(key, default=default)] = validator | ||||||
|  |  | ||||||
|  |     return _FAN_SCHEMA.extend(schema) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # Remove before 2025.11.0 | ||||||
|  | FAN_SCHEMA = fan_schema(Fan) | ||||||
|  | FAN_SCHEMA.add_extra(cv.deprecated_schema_constant("fan")) | ||||||
|  |  | ||||||
| _PRESET_MODES_SCHEMA = cv.All( | _PRESET_MODES_SCHEMA = cv.All( | ||||||
|     cv.ensure_list(cv.string_strict), |     cv.ensure_list(cv.string_strict), | ||||||
|     cv.Length(min=1), |     cv.Length(min=1), | ||||||
| @@ -267,10 +299,9 @@ async def register_fan(var, config): | |||||||
|     await setup_fan_core_(var, config) |     await setup_fan_core_(var, config) | ||||||
|  |  | ||||||
|  |  | ||||||
| async def create_fan_state(config): | async def new_fan(config, *args): | ||||||
|     var = cg.new_Pvariable(config[CONF_ID]) |     var = cg.new_Pvariable(config[CONF_ID], *args) | ||||||
|     await register_fan(var, config) |     await register_fan(var, config) | ||||||
|     await cg.register_component(var, config) |  | ||||||
|     return var |     return var | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,3 +1,5 @@ | |||||||
|  | import enum | ||||||
|  |  | ||||||
| import esphome.automation as auto | import esphome.automation as auto | ||||||
| import esphome.codegen as cg | import esphome.codegen as cg | ||||||
| from esphome.components import mqtt, power_supply, web_server | from esphome.components import mqtt, power_supply, web_server | ||||||
| @@ -13,15 +15,18 @@ from esphome.const import ( | |||||||
|     CONF_COLOR_TEMPERATURE, |     CONF_COLOR_TEMPERATURE, | ||||||
|     CONF_DEFAULT_TRANSITION_LENGTH, |     CONF_DEFAULT_TRANSITION_LENGTH, | ||||||
|     CONF_EFFECTS, |     CONF_EFFECTS, | ||||||
|  |     CONF_ENTITY_CATEGORY, | ||||||
|     CONF_FLASH_TRANSITION_LENGTH, |     CONF_FLASH_TRANSITION_LENGTH, | ||||||
|     CONF_GAMMA_CORRECT, |     CONF_GAMMA_CORRECT, | ||||||
|     CONF_GREEN, |     CONF_GREEN, | ||||||
|  |     CONF_ICON, | ||||||
|     CONF_ID, |     CONF_ID, | ||||||
|     CONF_INITIAL_STATE, |     CONF_INITIAL_STATE, | ||||||
|     CONF_MQTT_ID, |     CONF_MQTT_ID, | ||||||
|     CONF_ON_STATE, |     CONF_ON_STATE, | ||||||
|     CONF_ON_TURN_OFF, |     CONF_ON_TURN_OFF, | ||||||
|     CONF_ON_TURN_ON, |     CONF_ON_TURN_ON, | ||||||
|  |     CONF_OUTPUT_ID, | ||||||
|     CONF_POWER_SUPPLY, |     CONF_POWER_SUPPLY, | ||||||
|     CONF_RED, |     CONF_RED, | ||||||
|     CONF_RESTORE_MODE, |     CONF_RESTORE_MODE, | ||||||
| @@ -33,6 +38,7 @@ from esphome.const import ( | |||||||
|     CONF_WHITE, |     CONF_WHITE, | ||||||
| ) | ) | ||||||
| from esphome.core import coroutine_with_priority | from esphome.core import coroutine_with_priority | ||||||
|  | from esphome.cpp_generator import MockObjClass | ||||||
| from esphome.cpp_helpers import setup_entity | from esphome.cpp_helpers import setup_entity | ||||||
|  |  | ||||||
| from .automation import LIGHT_STATE_SCHEMA | from .automation import LIGHT_STATE_SCHEMA | ||||||
| @@ -141,6 +147,51 @@ ADDRESSABLE_LIGHT_SCHEMA = RGB_LIGHT_SCHEMA.extend( | |||||||
| ) | ) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class LightType(enum.IntEnum): | ||||||
|  |     """Light type enum.""" | ||||||
|  |  | ||||||
|  |     BINARY = 0 | ||||||
|  |     BRIGHTNESS_ONLY = 1 | ||||||
|  |     RGB = 2 | ||||||
|  |     ADDRESSABLE = 3 | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def light_schema( | ||||||
|  |     class_: MockObjClass, | ||||||
|  |     type_: LightType, | ||||||
|  |     *, | ||||||
|  |     entity_category: str = cv.UNDEFINED, | ||||||
|  |     icon: str = cv.UNDEFINED, | ||||||
|  |     default_restore_mode: str = cv.UNDEFINED, | ||||||
|  | ) -> cv.Schema: | ||||||
|  |     schema = { | ||||||
|  |         cv.GenerateID(CONF_OUTPUT_ID): cv.declare_id(class_), | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     for key, default, validator in [ | ||||||
|  |         (CONF_ENTITY_CATEGORY, entity_category, cv.entity_category), | ||||||
|  |         (CONF_ICON, icon, cv.icon), | ||||||
|  |         ( | ||||||
|  |             CONF_RESTORE_MODE, | ||||||
|  |             default_restore_mode, | ||||||
|  |             cv.enum(RESTORE_MODES, upper=True, space="_"), | ||||||
|  |         ), | ||||||
|  |     ]: | ||||||
|  |         if default is not cv.UNDEFINED: | ||||||
|  |             schema[cv.Optional(key, default=default)] = validator | ||||||
|  |  | ||||||
|  |     if type_ == LightType.BINARY: | ||||||
|  |         return BINARY_LIGHT_SCHEMA.extend(schema) | ||||||
|  |     if type_ == LightType.BRIGHTNESS_ONLY: | ||||||
|  |         return BRIGHTNESS_ONLY_LIGHT_SCHEMA.extend(schema) | ||||||
|  |     if type_ == LightType.RGB: | ||||||
|  |         return RGB_LIGHT_SCHEMA.extend(schema) | ||||||
|  |     if type_ == LightType.ADDRESSABLE: | ||||||
|  |         return ADDRESSABLE_LIGHT_SCHEMA.extend(schema) | ||||||
|  |  | ||||||
|  |     raise ValueError(f"Invalid light type: {type_}") | ||||||
|  |  | ||||||
|  |  | ||||||
| def validate_color_temperature_channels(value): | def validate_color_temperature_channels(value): | ||||||
|     if ( |     if ( | ||||||
|         CONF_COLD_WHITE_COLOR_TEMPERATURE in value |         CONF_COLD_WHITE_COLOR_TEMPERATURE in value | ||||||
| @@ -223,6 +274,12 @@ async def register_light(output_var, config): | |||||||
|     await setup_light_core_(light_var, output_var, config) |     await setup_light_core_(light_var, output_var, config) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | async def new_light(config, *args): | ||||||
|  |     output_var = cg.new_Pvariable(config[CONF_OUTPUT_ID], *args) | ||||||
|  |     await register_light(output_var, config) | ||||||
|  |     return output_var | ||||||
|  |  | ||||||
|  |  | ||||||
| @coroutine_with_priority(100.0) | @coroutine_with_priority(100.0) | ||||||
| async def to_code(config): | async def to_code(config): | ||||||
|     cg.add_define("USE_LIGHT") |     cg.add_define("USE_LIGHT") | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user