| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- """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
|