11import esphome.codegen
as cg
12import esphome.config_validation
as cv
13from esphome
import pins
14from esphome.components
import spi
15from esphome.const
import CONF_ID
17from .
import tuning
as tuning_module
18from .hub_names
import (
19 CONF_ACCEPT_FOREIGN_PAIRING,
20 CONF_ACCEPT_FOREIGN_PAIRING_SWITCH_ID,
22 CONF_DIAGNOSTIC_PROBES,
26 CONF_DISCOVER_AND_PAIR_BUTTON,
31 CONF_LR1121_FIRMWARE_UPDATE,
33 CONF_ONEWAY_CONTROLLERS,
36 CONF_RECOVER_ONEWAY_KEY,
37 CONF_RECOVER_ONEWAY_KEY_SWITCH_ID,
39 CONF_SCAN_PAIRED_DEVICES_BUTTON,
44 IOHomeAcceptForeignPairingSwitch,
45 IOHomeControlComponent,
46 IOHomeRecoverOneWayKeySwitch,
48from .hub_validators
import (
55 validate_radio_transport,
60from .lr1121_update_codegen
import (
61 LR1121_FIRMWARE_UPDATE_SCHEMA,
62 create_lr1121_firmware_update,
63 validate_lr1121_firmware_update,
65from .oneway_controllers
import (
66 ONEWAY_CONTROLLER_SCHEMA,
67 create_oneway_controller_entities,
68 final_validate_oneway_controller_addresses,
69 validate_oneway_controllers,
70 oneway_controller_expression,
72from .hub_entities
import (
73 create_discover_and_pair_button,
74 create_hub_arming_switch,
75 create_scan_paired_devices_button,
76 inject_accept_foreign_pairing_switch_id,
77 inject_discover_and_pair_button_id,
78 inject_discover_and_pair_result_sensor_id,
79 inject_recover_oneway_key_switch_id,
80 inject_scan_paired_devices_button_id,
87from .hub_names
import (
88 CONF_HOME_IO_CONTROL_ID,
91 IOHomePairingResultTextSensor,
94from .hub_validators
import (
95 device_type_expression,
96 inherit_esphome_device,
98 validate_linked_remote_entry,
99 validate_status_poll_interval,
102DEPENDENCIES = [
"api",
"spi"]
103AUTO_LOAD = [
"binary_sensor",
"button",
"climate",
"cover",
"fan",
"light",
"lock",
"number",
"select",
"sensor",
"switch",
"text_sensor"]
107FINAL_VALIDATE_SCHEMA = final_validate_oneway_controller_addresses
110CONFIG_SCHEMA = cv.All(
113 cv.GenerateID(): cv.declare_id(IOHomeControlComponent),
114 cv.Required(CONF_RST_PIN): pins.internal_gpio_output_pin_schema,
115 cv.Optional(CONF_DIO0_PIN): pins.internal_gpio_input_pin_schema,
116 cv.Optional(CONF_DIO4_PIN): pins.internal_gpio_input_pin_schema,
118 cv.Optional(CONF_DIO1_PIN): pins.internal_gpio_input_pin_schema,
119 cv.Optional(CONF_BUSY_PIN): pins.internal_gpio_input_pin_schema,
120 cv.Required(CONF_NODE_ID): validate_node_id,
121 cv.Required(CONF_SYSTEM_KEY): cv.sensitive(validate_system_key),
122 cv.Optional(CONF_TX_POWER, default=17): cv.int_range(min=0, max=22),
123 cv.Optional(CONF_PA_PIN, default=
"BOOST"): cv.enum(
124 PA_PIN_OPTIONS, upper=
True
126 cv.Required(CONF_RADIO_TYPE): cv.enum(RADIO_TYPE_OPTIONS, lower=
True),
127 cv.Optional(CONF_FEM_EN_PIN): pins.internal_gpio_output_pin_schema,
128 cv.Optional(CONF_VFEM_PIN): pins.internal_gpio_output_pin_schema,
129 cv.Optional(CONF_FEM_PA_PIN): pins.internal_gpio_output_pin_schema,
130 cv.Optional(CONF_FEM, default=
"none"): cv.one_of(*FEM_PROFILES, lower=
True),
131 cv.Optional(CONF_TCXO_VOLTAGE, default=
"1_8V"): cv.enum(
132 TCXO_VOLTAGE_OPTIONS, upper=
True
134 cv.Optional(CONF_EXPOSED_SENDERS, default=[]): cv.ensure_list(
137 cv.Optional(CONF_ACCEPT_FOREIGN_PAIRING, default=
False): cv.boolean,
138 cv.Optional(CONF_RECOVER_ONEWAY_KEY, default=
False): cv.boolean,
139 cv.Optional(CONF_SCAN_PAIRED_DEVICES_BUTTON, default=
False): cv.boolean,
140 cv.Optional(CONF_DISCOVER_AND_PAIR_BUTTON, default=
False): cv.boolean,
141 cv.Optional(CONF_ONEWAY_CONTROLLERS, default=[]): cv.ensure_list(
142 ONEWAY_CONTROLLER_SCHEMA
144 cv.Optional(CONF_DIAGNOSTIC_PROBES, default=
False): cv.boolean,
145 cv.Optional(CONF_LR1121_FIRMWARE_UPDATE): LR1121_FIRMWARE_UPDATE_SCHEMA,
146 cv.Optional(tuning_module.CONF_TUNING): tuning_module.TUNING_CONFIG_SCHEMA,
149 .extend(cv.COMPONENT_SCHEMA)
150 .extend(spi.spi_device_schema(
False, 8e6,
"mode0")),
151 inject_accept_foreign_pairing_switch_id,
152 inject_recover_oneway_key_switch_id,
153 inject_scan_paired_devices_button_id,
154 inject_discover_and_pair_button_id,
155 inject_discover_and_pair_result_sensor_id,
156 validate_oneway_controllers,
157 validate_lr1121_firmware_update,
158 validate_radio_transport,
169 cg.add_define(
"USE_API_USER_DEFINED_ACTIONS")
170 cg.add_define(
"USE_API_CUSTOM_SERVICES")
171 cg.add_define(
"USE_API_HOMEASSISTANT_SERVICES")
173 var = cg.new_Pvariable(config[CONF_ID])
174 await cg.register_component(var, config)
175 if config[CONF_RADIO_TYPE]
in SPI_RADIO_TYPES:
176 await spi.register_spi_device(var, config)
178 rst_pin = await cg.gpio_pin_expression(config[CONF_RST_PIN])
179 cg.add(var.set_rst_pin(rst_pin))
181 if CONF_DIO0_PIN
in config:
182 dio0_pin = await cg.gpio_pin_expression(config[CONF_DIO0_PIN])
183 cg.add(var.set_dio0_pin(dio0_pin))
185 if CONF_DIO4_PIN
in config:
186 dio4_pin = await cg.gpio_pin_expression(config[CONF_DIO4_PIN])
187 cg.add(var.set_dio4_pin(dio4_pin))
189 if CONF_DIO1_PIN
in config:
190 dio1_pin = await cg.gpio_pin_expression(config[CONF_DIO1_PIN])
191 cg.add(var.set_dio1_pin(dio1_pin))
193 if CONF_BUSY_PIN
in config:
194 busy_pin = await cg.gpio_pin_expression(config[CONF_BUSY_PIN])
195 cg.add(var.set_busy_pin(busy_pin))
197 if CONF_FEM_EN_PIN
in config:
198 fem_en_pin = await cg.gpio_pin_expression(config[CONF_FEM_EN_PIN])
199 cg.add(var.set_fem_en_pin(fem_en_pin))
201 if CONF_VFEM_PIN
in config:
202 vfem_pin = await cg.gpio_pin_expression(config[CONF_VFEM_PIN])
203 cg.add(var.set_vfem_pin(vfem_pin))
205 if CONF_FEM_PA_PIN
in config:
206 fem_pa_pin = await cg.gpio_pin_expression(config[CONF_FEM_PA_PIN])
207 cg.add(var.set_fem_pa_pin(fem_pa_pin))
209 cg.add(var.set_fem_profile(FEM_PROFILES[config[CONF_FEM]]))
211 cg.add(var.set_node_id(config[CONF_NODE_ID]))
212 cg.add(var.set_system_key(config[CONF_SYSTEM_KEY]))
213 cg.add(var.set_tx_power(config[CONF_TX_POWER]))
214 cg.add(var.set_pa_pin(config[CONF_PA_PIN]))
216 cg.add(var.set_radio_type(config[CONF_RADIO_TYPE]))
218 cg.add(var.set_tcxo_voltage(config[CONF_TCXO_VOLTAGE]))
220 for sender_id
in config[CONF_EXPOSED_SENDERS]:
221 cg.add(var.add_exposed_sender(sender_id))
223 for identity
in config[CONF_ONEWAY_CONTROLLERS]:
225 var.add_oneway_controller(
226 oneway_controller_expression(identity, config[CONF_NODE_ID])
229 await create_oneway_controller_entities(identity, var)
231 if config[CONF_ACCEPT_FOREIGN_PAIRING]:
232 await create_hub_arming_switch(
235 cls=IOHomeAcceptForeignPairingSwitch,
236 id_key=CONF_ACCEPT_FOREIGN_PAIRING_SWITCH_ID,
237 name=
"Recover System Key",
240 if config[CONF_RECOVER_ONEWAY_KEY]:
241 await create_hub_arming_switch(
244 cls=IOHomeRecoverOneWayKeySwitch,
245 id_key=CONF_RECOVER_ONEWAY_KEY_SWITCH_ID,
246 name=
"Recover 1W Controller Key",
249 if config[CONF_SCAN_PAIRED_DEVICES_BUTTON]:
250 await create_scan_paired_devices_button(config, var)
252 if config[CONF_DISCOVER_AND_PAIR_BUTTON]:
253 await create_discover_and_pair_button(config, var)
255 cg.add(var.set_diagnostic_probes_enabled(config[CONF_DIAGNOSTIC_PROBES]))
257 if CONF_LR1121_FIRMWARE_UPDATE
in config:
258 await create_lr1121_firmware_update(config, var)
260 if tuning_module.CONF_TUNING
in config:
261 await tuning_module.to_code(config[tuning_module.CONF_TUNING], var)