7import esphome.codegen
as cg
8import esphome.config_validation
as cv
9from esphome.components
import lock, text_sensor
10from esphome.const
import (
11 CONF_DISABLED_BY_DEFAULT,
14 ENTITY_CATEGORY_DIAGNOSTIC,
16from esphome.core
import CORE, ID
20 IOHomeControlComponent,
21 CONF_HOME_IO_CONTROL_ID,
22 device_type_expression,
25 validate_status_poll_interval,
28DEPENDENCIES = [
"home_io_control"]
30CONF_DEVICE_ID =
"io_device_id"
31CONF_LINKED_REMOTES =
"linked_remotes"
32CONF_DEVICE_TYPE =
"io_device_type"
33CONF_SUBTYPE =
"io_subtype"
34CONF_STATUS_POLL_INTERVAL =
"status_poll_interval"
36IOHomeLock = home_io_control_ns.class_(
"IOHomeLock", lock.Lock, cg.Component)
37IOHomeDeviceNameTextSensor = home_io_control_ns.class_(
38 "IOHomeDeviceNameTextSensor", text_sensor.TextSensor, cg.Component
43 """Generate a unique ID for the diagnostic device-name text sensor."""
45 f
"{parent_id.id}_device_name_sensor",
47 type=IOHomeDeviceNameTextSensor,
52 """Derive the device-name sensor name from the parent entity name."""
53 base_name = config.get(CONF_NAME,
"")
55 return f
"{base_name} Device Name"
60 lock.lock_schema(IOHomeLock)
63 cv.GenerateID(CONF_HOME_IO_CONTROL_ID): cv.use_id(
64 IOHomeControlComponent
66 cv.Required(CONF_DEVICE_ID): validate_device_id,
67 cv.Optional(CONF_DEVICE_TYPE): validate_device_type,
68 cv.Optional(CONF_SUBTYPE): cv.int_range(min=0, max=63),
69 cv.Optional(CONF_LINKED_REMOTES): cv.ensure_list(validate_device_id),
70 cv.Optional(CONF_STATUS_POLL_INTERVAL): validate_status_poll_interval,
73 .extend(cv.COMPONENT_SCHEMA)
78 var = cg.new_Pvariable(config[CONF_ID])
79 await cg.register_component(var, config)
80 await lock.register_lock(var, config)
82 parent = await cg.get_variable(config[CONF_HOME_IO_CONTROL_ID])
83 cg.add(var.set_parent(parent))
84 cg.add(var.set_device_id(config[CONF_DEVICE_ID]))
86 if CONF_DEVICE_TYPE
in config:
88 if CONF_SUBTYPE
in config:
89 cg.add(var.set_subtype(config[CONF_SUBTYPE]))
90 if CONF_STATUS_POLL_INTERVAL
in config:
91 cg.add(var.set_status_poll_interval(config[CONF_STATUS_POLL_INTERVAL].total_milliseconds))
93 if CONF_LINKED_REMOTES
in config:
94 for remote_id
in config[CONF_LINKED_REMOTES]:
95 cg.add(parent.add_linked_remote(remote_id, config[CONF_DEVICE_ID]))
97 device_name_config = {
100 CONF_DISABLED_BY_DEFAULT:
True,
101 "entity_category": ENTITY_CATEGORY_DIAGNOSTIC,
103 device_name = await text_sensor.new_text_sensor(device_name_config)
104 CORE.component_ids.add(str(device_name.base))
105 await cg.register_component(device_name, device_name_config)
106 cg.add(device_name.set_parent(parent))
107 cg.add(device_name.set_device_id(config[CONF_DEVICE_ID]))
device_name_sensor_name(config)
device_name_sensor_id(parent_id)
device_type_expression(value)