Home IO Control
ESPHome add-on for IO-Homecontrol devices
Loading...
Searching...
No Matches
switch.py
Go to the documentation of this file.
1## @file
2## @brief ESPHome binary switch platform schema and code generation.
3## @ingroup hioc_codegen
4##
5## Defines the experimental on/off switch integration and wires it to the shared hub.
6
7import esphome.codegen as cg
8import esphome.config_validation as cv
9from esphome.components import switch, text_sensor
10from esphome.const import (
11 CONF_DISABLED_BY_DEFAULT,
12 CONF_ID,
13 CONF_NAME,
14 ENTITY_CATEGORY_DIAGNOSTIC,
15)
16from esphome.core import CORE, ID
17
18from . import (
19 home_io_control_ns,
20 IOHomeControlComponent,
21 CONF_HOME_IO_CONTROL_ID,
22 validate_device_id,
23 validate_status_poll_interval,
24 validate_device_type,
25 device_type_expression,
26)
27
28DEPENDENCIES = ["home_io_control"]
29
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"
35
36IOHomeSwitch = home_io_control_ns.class_("IOHomeSwitch", switch.Switch, cg.Component)
37IOHomeDeviceNameTextSensor = home_io_control_ns.class_(
38 "IOHomeDeviceNameTextSensor", text_sensor.TextSensor, cg.Component
39)
40
41
42def device_name_sensor_id(parent_id):
43 """Generate a unique ID for the diagnostic device-name text sensor."""
44 return ID(
45 f"{parent_id.id}_device_name_sensor",
46 is_declaration=True,
47 type=IOHomeDeviceNameTextSensor,
48 )
49
50
52 """Derive the device-name sensor name from the parent entity name."""
53 base_name = config.get(CONF_NAME, "")
54 if base_name:
55 return f"{base_name} Device Name"
56 return "Device Name"
57
58CONFIG_SCHEMA = (
59 # Switches are exposed as binary entities; a richer state model needs real-device evidence
60 # before it should be surfaced in the YAML schema.
61 switch.switch_schema(IOHomeSwitch)
62 .extend(
63 {
64 cv.GenerateID(CONF_HOME_IO_CONTROL_ID): cv.use_id(
65 IOHomeControlComponent
66 ),
67 cv.Required(CONF_DEVICE_ID): validate_device_id,
68 cv.Optional(CONF_DEVICE_TYPE): validate_device_type,
69 cv.Optional(CONF_SUBTYPE): cv.int_range(min=0, max=63),
70 cv.Optional(CONF_LINKED_REMOTES): cv.ensure_list(validate_device_id),
71 cv.Optional(CONF_STATUS_POLL_INTERVAL): validate_status_poll_interval,
72 }
73 )
74 .extend(cv.COMPONENT_SCHEMA)
75)
76
77
78async def to_code(config):
79 var = cg.new_Pvariable(config[CONF_ID])
80 await cg.register_component(var, config)
81 await switch.register_switch(var, config)
82
83 parent = await cg.get_variable(config[CONF_HOME_IO_CONTROL_ID])
84 # The runtime entity stays small: Python codegen only wires it to the shared controller and
85 # provides the validated IO-homecontrol device ID.
86 cg.add(var.set_parent(parent))
87 cg.add(var.set_device_id(config[CONF_DEVICE_ID]))
88
89 if CONF_DEVICE_TYPE in config:
90 cg.add(var.set_device_type(device_type_expression(config[CONF_DEVICE_TYPE])))
91 if CONF_SUBTYPE in config:
92 cg.add(var.set_subtype(config[CONF_SUBTYPE]))
93 if CONF_STATUS_POLL_INTERVAL in config:
94 cg.add(var.set_status_poll_interval(config[CONF_STATUS_POLL_INTERVAL].total_milliseconds))
95
96 if CONF_LINKED_REMOTES in config:
97 for remote_id in config[CONF_LINKED_REMOTES]:
98 cg.add(parent.add_linked_remote(remote_id, config[CONF_DEVICE_ID]))
99
100 device_name_config = {
101 CONF_ID: device_name_sensor_id(config[CONF_ID]),
102 CONF_NAME: device_name_sensor_name(config),
103 CONF_DISABLED_BY_DEFAULT: True,
104 "entity_category": ENTITY_CATEGORY_DIAGNOSTIC,
105 }
106 device_name = await text_sensor.new_text_sensor(device_name_config)
107 CORE.component_ids.add(str(device_name.base))
108 await cg.register_component(device_name, device_name_config)
109 cg.add(device_name.set_parent(parent))
110 cg.add(device_name.set_device_id(config[CONF_DEVICE_ID]))
device_name_sensor_id(parent_id)
Definition switch.py:42
device_name_sensor_name(config)
Definition switch.py:51
device_type_expression(value)
Definition __init__.py:107