"""Services for Tuya Local integration.""" import asyncio import logging import voluptuous as vol from homeassistant.components import infrared from homeassistant.components.remote import ( ATTR_DELAY_SECS, DEFAULT_DELAY_SECS, ) from homeassistant.components.remote import DOMAIN as REMOTE_DOMAIN from homeassistant.core import HomeAssistant, ServiceCall from homeassistant.helpers import config_validation as cv from homeassistant.helpers import service from .const import DOMAIN from .infrared import TuyaRemoteCommand from .remote import TuyaLocalRemote REMOTE_SEND_IR_COMMAND_SCHEMA = { vol.Required("emitter_entity_id"): cv.entity_id, vol.Required("command"): str, vol.Optional("device"): str, } _LOGGER = logging.getLogger(__name__) async def async_setup_services(hass: HomeAssistant, entities: list[str]): """Set up services for the Tuya Local integration.""" if "remote" in entities: service.async_register_platform_entity_service( hass, DOMAIN, "send_learned_ir_command", entity_domain=REMOTE_DOMAIN, schema=REMOTE_SEND_IR_COMMAND_SCHEMA, func=async_handle_send_ir_command, ) return True async def async_handle_send_ir_command(entity, call: ServiceCall): """Action to send a saved remote command.""" _LOGGER.info("Sending saved remote command: %s", call.data) if not isinstance(entity, TuyaLocalRemote): raise ValueError("Entity must be a tuya-local remote") if not entity._storage_loaded: await entity._async_load_storage() emitter = call.data.get("emitter") device = call.data.get("device") command = call.data.get("command") delay = call.data.get(ATTR_DELAY_SECS, DEFAULT_DELAY_SECS) code_list = entity._extract_codes( [command], subdevice=device ) # Validate command and get code at_least_one_sent = False for _, codes in code_list: if at_least_one_sent: await asyncio.sleep(delay) if len(codes) > 1: code = codes[entity._flags[device]] entity._flags[device] ^= 1 else: code = codes[0] if code.startswith("rf:"): _LOGGER.error("RF emitters are not yet supported by this service") continue await infrared.async_send_command( entity.hass, emitter, cmd=TuyaRemoteCommand(code=code) ) at_least_one_sent = True