CONF_MODADDR = 'modaddr' CONF_CONNADDR = 'connaddr' CONF_COMMANDS = 'commands' CONF_DATA = 'data' PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Optional(CONF_MAC): cv.string, vol.Required(CONF_HOST): cv.string, vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, vol.Required(CONF_DEVICES): vol.All(cv.ensure_list, [{ vol.Optional(CONF_NAME): cv.string, vol.Optional(CONF_MODADDR): vol.Coerce(int), vol.Required(CONF_CONNADDR): vol.Coerce(int), vol.Required(CONF_COMMANDS): vol.All(cv.ensure_list, [{ vol.Required(CONF_NAME): cv.string, vol.Required(CONF_DATA): cv.string, }]) }]) }) def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the ITach connection and devices.""" import pyitachip2ir
DEFAULT_PORT = 4998 CONNECT_TIMEOUT = 5000 CONF_MODADDR = 'modaddr' CONF_CONNADDR = 'connaddr' CONF_COMMANDS = 'commands' CONF_DATA = 'data' PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Optional(CONF_MAC): cv.string, vol.Required(CONF_HOST): cv.string, vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, vol.Required(CONF_DEVICES): vol.All(cv.ensure_list, [{ vol.Optional(CONF_NAME): cv.string, vol.Optional(CONF_MODADDR): vol.Coerce(int), vol.Required(CONF_CONNADDR): vol.Coerce(int), vol.Required(CONF_COMMANDS): vol.All(cv.ensure_list, [{ vol.Required(CONF_NAME): cv.string, vol.Required(CONF_DATA): cv.string }]) }]) }) # pylint: disable=unused-argument def setup_platform(hass, config, add_devices, discovery_info=None): """Set up the ITach connection and devices.""" import pyitachip2ir itachip2ir = pyitachip2ir.ITachIP2IR( config.get(CONF_MAC), config.get(CONF_HOST), int(config.get(CONF_PORT)))
vol.Optional(CONF_TIMEOUT, default=10): vol.All(int, vol.Range(min=0)), vol.Optional(CONF_SLOT, default=1): vol.All(int, vol.Range(min=1, max=1000000)), }) COMMAND_SCHEMA = vol.Schema({ vol.Required(CONF_COMMAND): vol.All(cv.ensure_list, [cv.string]) }) PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Optional(CONF_NAME): cv.string, vol.Required(CONF_HOST): cv.string, vol.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): vol.All(int, vol.Range(min=0)), vol.Optional(CONF_SLOT, default=DEFAULT_SLOT): vol.All(int, vol.Range(min=1, max=1000000)), vol.Optional(ATTR_HIDDEN, default=True): cv.boolean, vol.Required(CONF_TOKEN): vol.All(str, vol.Length(min=32, max=32)), vol.Optional(CONF_COMMANDS, default={}): vol.Schema({cv.slug: COMMAND_SCHEMA}), }, extra=vol.ALLOW_EXTRA) @asyncio.coroutine def async_setup_platform(hass, config, async_add_devices, discovery_info=None): """Set up the Xiaomi IR Remote (Chuangmi IR) platform.""" from miio import ChuangmiIr, DeviceException host = config.get(CONF_HOST) token = config.get(CONF_TOKEN)
_CONFIGURING: Dict[str, str] = {} _LOGGER = logging.getLogger(__name__) DEFAULT_NAME = "LG webOS Smart TV" WEBOSTV_CONFIG_FILE = "webostv.conf" MIN_TIME_BETWEEN_SCANS = timedelta(seconds=10) MIN_TIME_BETWEEN_FORCED_SCANS = timedelta(seconds=1) PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Optional(CONF_FILENAME, default=WEBOSTV_CONFIG_FILE): cv.string, vol.Optional(CONF_HOST): cv.string, vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, vol.Optional(CONF_TIMEOUT, default=8): cv.positive_int, }) def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the LG WebOS TV platform.""" #if discovery_info is not None: # host = urlparse(discovery_info[1]).hostname #else: host = config.get(CONF_HOST) if host is None: _LOGGER.error("No TV found in configuration file or with discovery")
import voluptuous as vol REQUIREMENTS = ['pyharmony==1.0.12'] _LOGGER = logging.getLogger(__name__) ATTR_DEVICE = 'device' ATTR_COMMAND = 'command' ATTR_ACTIVITY = 'activity' SERVICE_SYNC = 'harmony_sync' PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_NAME): cv.string, vol.Required(CONF_HOST): cv.string, vol.Required(CONF_PORT): cv.string, vol.Required(ATTR_ACTIVITY, default=None): cv.string, }) HARMONY_SYNC_SCHEMA = vol.Schema({ vol.Optional(ATTR_ENTITY_ID): cv.entity_ids, }) # List of devices that have been registered DEVICES = [] def setup_platform(hass, config, add_devices, discovery_info=None): """Setup Harmony platform."""
from homeassistant.util import slugify REQUIREMENTS = ['pyharmony==1.0.20'] _LOGGER = logging.getLogger(__name__) DEFAULT_PORT = 5222 DEVICES = [] CONF_DEVICE_CACHE = 'harmony_device_cache' SERVICE_SYNC = 'harmony_sync' PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Optional(ATTR_ACTIVITY): cv.string, vol.Required(CONF_NAME): cv.string, vol.Optional(ATTR_DELAY_SECS, default=DEFAULT_DELAY_SECS): vol.Coerce(float), vol.Optional(CONF_HOST): cv.string, vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, }) HARMONY_SYNC_SCHEMA = vol.Schema({ vol.Optional(ATTR_ENTITY_ID): cv.entity_ids, }) def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the Harmony platform.""" host = None activity = None if CONF_DEVICE_CACHE not in hass.data:
vol.Optional(CONF_TIMEOUT, default=0): vol.All(int, vol.Range(min=0)), vol.Optional(CONF_PARAMS, default={}): cv.schema_with_slug_keys(PARAMS_SCHEMA) }, conf_validator_url_or_part)) PLATFORM_SCHEMA = vol.Schema( vol.All( PLATFORM_SCHEMA.extend( { vol.Required(CONF_NAME): cv.slug, vol.Optional(CONF_LOGRESP, default='DEBUG'): vol.In(('DEBUG', 'INFO')), vol.Optional(CONF_BASEURL, default=''): vol.Any(None, '', vol.Url()), vol.Optional(CONF_METHOD, default='GET'): vol.In(('GET', 'POSTFORM', 'POSTJSON', 'POSTBIN')), vol.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): vol.All(int, vol.Range(min=1)), vol.Required(CONF_KEYS): cv.schema_with_slug_keys(KEY_SCHEMA) }, extra=vol.ALLOW_EXTRA), conf_validator_baseurl_or_url)) async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): friendly_name = config.get(CONF_NAME) base_url = config.get(CONF_BASEURL)
vol.Optional(ATTR_DELAY_SECS, default=DEFAULT_DELAY_SECS): vol.Coerce(float) }) SERVICE_LEARN_SCHEMA = MINIMUM_SERVICE_SCHEMA.extend({ vol.Optional(ATTR_ALTERNATIVE, default=False): cv.boolean, vol.Optional(ATTR_TIMEOUT, default=DEFAULT_LEARNING_TIMEOUT): cv.positive_int, }) PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_HOST): vol.All(vol.Any(hostname, ip_address), cv.string), vol.Required(CONF_MAC): mac_address, vol.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): cv.positive_int, vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, }) async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): """Set up the Broadlink remote.""" host = config[CONF_HOST] mac_addr = config[CONF_MAC] timeout = config[CONF_TIMEOUT] name = config[CONF_NAME]
find_unique_id_for_remote, get_harmony_client_if_available, ) _LOGGER = logging.getLogger(__name__) ATTR_CHANNEL = "channel" ATTR_CURRENT_ACTIVITY = "current_activity" PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( { vol.Optional(ATTR_ACTIVITY): cv.string, vol.Required(CONF_NAME): cv.string, vol.Optional(ATTR_DELAY_SECS, default=DEFAULT_DELAY_SECS): vol.Coerce(float), vol.Required(CONF_HOST): cv.string, # The client ignores port so lets not confuse the user by pretenting we do anything with this }, extra=vol.ALLOW_EXTRA, ) HARMONY_SYNC_SCHEMA = vol.Schema({vol.Optional(ATTR_ENTITY_ID): cv.entity_ids}) HARMONY_CHANGE_CHANNEL_SCHEMA = vol.Schema({ vol.Required(ATTR_ENTITY_ID): cv.entity_ids, vol.Required(ATTR_CHANNEL): cv.positive_int, })
CONF_NAME, CONF_PORT, DEVICE_DEFAULT_NAME, ) import homeassistant.helpers.config_validation as cv _LOGGER = logging.getLogger(__name__) DEFAULT_PORT = 6091 CONNECT_TIMEOUT = 5000 PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( { vol.Required(CONF_HOST): cv.string, vol.Optional(CONF_NAME): cv.string, vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port } ) """ tcp hex code for xiaomi tv """ comm_home = "040041010000000b003a0100000000020000000003000000030400000000050000000006000000000700000000000000000800000000000000000affffffff0b00000000" comm_back = "040041010000000b003a0100000000020000000003000000040400000000050000000006000000000700000000000000000800000000000000000affffffff0b00000000" comm_menu = "040041010000000b003a0100000000020000000003000000520400000000050000000006000000000700000000000000000800000000000000000affffffff0b00000000" comm_off = "040041010000000b003a01000000000200000000030000001a0400000000050000000006000000000700000000000000000800000000000000000affffffff0b00000000" comm_up = "040041010000000b003a0100000000020000000003000000130400000000050000000006000000000700000000000000000800000000000000000affffffff0b00000000" comm_down = "040041010000000b003a0100000000020000000003000000140400000000050000000006000000000700000000000000000800000000000000000affffffff0b00000000" comm_left = "040041010000000b003a0100000000020000000003000000150400000000050000000006000000000700000000000000000800000000000000000affffffff0b00000000" comm_right = "040041010000000b003a0100000000020000000003000000160400000000050000000006000000000700000000000000000800000000000000000affffffff0b00000000" comm_enter = "040041010000000b003a0100000000020000000003000000170400000000050000000006000000000700000000000000000800000000000000000affffffff0b00000000" comm_volup = "040041010000000b003a0100000000020000000003000000180400000000050000000006000000000700000000000000000800000000000000000affffffff0b00000000"
ENTITIES = [] LEARN_COMMAND_SCHEMA = vol.Schema({ vol.Required(ATTR_ENTITY_ID): vol.All(str), vol.Required(CONF_SLOT): vol.All(int, vol.Range(**SOLT_RANGE)), vol.Optional(CONF_TIMEOUT, default=10): vol.All(int, vol.Range(min=0)), }) PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( { vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, vol.Required(CONF_HOST): cv.string, vol.Optional(CONF_TYPE, default=TYPE_IR): vol.In((TYPE_IR, TYPE_RF)), vol.Optional(CONF_HIDDEN, default=True): cv.boolean, vol.Required(CONF_MODEL): vol.In(MODEL_K2 + MODEL_MINIK), }, extra=vol.ALLOW_EXTRA) async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): """Set up the Konke Remote platform.""" from pykonkeio.manager import get_device name = config[CONF_NAME] host = config[CONF_HOST]
DEFAULT_TIMEOUT = 5 MIN_TIME_BETWEEN_UPDATES = timedelta(minutes=1) CONF_DEFAULT_SHARPNESS = "d_sharpness" CONF_DEFAULT_BRIGHTNESS = "d_brightness" CONF_DEFAULT_VOLUME = "d_volume" CONF_DEFAULT_CONTRAST = "d_contrast" PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_NAME): cv.string, vol.Required(CONF_URL): cv.string, vol.Optional(CONF_DEFAULT_SHARPNESS, default=50): vol.All(int, vol.Range(min=0, max=100)), vol.Optional(CONF_DEFAULT_VOLUME, default=50): vol.All(int, vol.Range(min=0, max=100)), vol.Optional(CONF_DEFAULT_CONTRAST, default=50): vol.All(int, vol.Range(min=0, max=100)), vol.Optional(CONF_DEFAULT_BRIGHTNESS, default=50): vol.All(int, vol.Range(min=0, max=100)), vol.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): vol.All(int, vol.Range(min=0)), }, extra=vol.ALLOW_EXTRA) async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): """Set up the Xiaomi IR Remote (Chuangmi IR) platform.""" friendly_name = config.get(CONF_NAME) url = config.get(CONF_URL) # Create handler
DEVICE_DEFAULT_NAME, ) import homeassistant.helpers.config_validation as cv _LOGGER = logging.getLogger(__name__) CONNECT_TIMEOUT = 5000 CONF_PSK = 'psk' PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( { vol.Required(CONF_DEVICES): vol.All( cv.ensure_list, [ { vol.Optional(CONF_HOST): cv.string, vol.Optional(CONF_NAME): cv.string, vol.Optional(CONF_PSK): cv.string, } ], ), } ) COMMANDS = { 'num1': 'AAAAAQAAAAEAAAAAAw==', 'num2': 'AAAAAQAAAAEAAAABAw==', 'num3': 'AAAAAQAAAAEAAAACAw==', 'num4': 'AAAAAQAAAAEAAAADAw==', 'num5': 'AAAAAQAAAAEAAAAEAw==', 'num6': 'AAAAAQAAAAEAAAAFAw==', 'num7': 'AAAAAQAAAAEAAAAGAw==', 'num8': 'AAAAAQAAAAEAAAAHAw==',
CONF_NAME, CONF_FILE_PATH ) import homeassistant.helpers.config_validation as cv import traceback from homeassistant.util import Throttle _LOGGER = logging.getLogger(__name__) DATA_KEY = 'samsungctl_remote' MIN_TIME_BETWEEN_UPDATES = timedelta(minutes=1) PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_NAME): cv.string, vol.Optional(CONF_FILE_PATH, os.path.join( os.path.dirname(__file__), 'samsungctl.conf')): cv.string, }, extra=vol.ALLOW_EXTRA) async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): """Set up the Xiaomi IR Remote (Chuangmi IR) platform.""" friendly_name = config.get(CONF_NAME) fname = config.get(CONF_FILE_PATH) # Create handler _LOGGER.info("Initializing %s with url %s", friendly_name, fname) # The Chuang Mi IR Remote Controller wants to be re-discovered every # 5 minutes. As long as polling is disabled the device should be # re-discovered (lazy_discover=False) in front of every command.
vol.Optional(CONF_SLOT, default=1): vol.All(int, vol.Range(min=1, max=1000000)), }) COMMAND_SCHEMA = vol.Schema( {vol.Required(CONF_COMMAND): vol.All(cv.ensure_list, [cv.string])}) PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( { vol.Optional(CONF_NAME): cv.string, vol.Required(CONF_HOST): cv.string, vol.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): vol.All(int, vol.Range(min=0)), vol.Optional(CONF_SLOT, default=DEFAULT_SLOT): vol.All(int, vol.Range(min=1, max=1000000)), vol.Optional(ATTR_HIDDEN, default=True): cv.boolean, vol.Required(CONF_TOKEN): vol.All(str, vol.Length(min=32, max=32)), vol.Optional(CONF_COMMANDS, default={}): vol.Schema({cv.slug: COMMAND_SCHEMA}), }, extra=vol.ALLOW_EXTRA) @asyncio.coroutine def async_setup_platform(hass, config, async_add_devices, discovery_info=None): """Set up the Xiaomi IR Remote (Chuangmi IR) platform.""" from miio import ChuangmiIr, DeviceException
vol.Optional(CONF_KEYS, default=["NA_1"]): vol.All(cv.ensure_list, [cv.slug]) }) COMMAND_SCHEMA = vol.All(cv.ensure_list, [cv.string]) KEYS_SCHEMA = cv.schema_with_slug_keys(COMMAND_SCHEMA) PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( { vol.Required(CONF_NAME): cv.slug, vol.Required(CONF_HOST): cv.string, vol.Required(CONF_ID): cv.string, vol.Required(CONF_KEY): cv.string, vol.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): vol.All(int, vol.Range(min=0)), vol.Optional(CONF_REMOTES, default={}): cv.schema_with_slug_keys(KEYS_SCHEMA), }, extra=vol.ALLOW_EXTRA) async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): """Set up the Xiaomi IR Remote (Chuangmi IR) platform.""" from pygocomma.r9 import (R9, DEFAULT_PORT)
PLATFORM_SCHEMA, DOMAIN, ATTR_DEVICE, ATTR_COMMAND, ATTR_ACTIVITY) from homeassistant.util import slugify from homeassistant.config import load_yaml_config_file REQUIREMENTS = ['pyharmony==1.0.12'] _LOGGER = logging.getLogger(__name__) DEFAULT_PORT = 5222 DEVICES = [] SERVICE_SYNC = 'harmony_sync' PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_NAME): cv.string, vol.Required(CONF_HOST): cv.string, vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, vol.Required(ATTR_ACTIVITY, default=None): cv.string, }) HARMONY_SYNC_SCHEMA = vol.Schema({ vol.Optional(ATTR_ENTITY_ID): cv.entity_ids, }) def setup_platform(hass, config, add_devices, discovery_info=None): """Set up the Harmony platform.""" import pyharmony global DEVICES name = config.get(CONF_NAME) host = config.get(CONF_HOST)
from homeassistant.components.remote import RemoteDevice from homeassistant.const import DEVICE_DEFAULT_NAME import voluptuous as vol import homeassistant.components.remote as remote import homeassistant.helpers.config_validation as cv from homeassistant.const import (CONF_NAME, CONF_HOST, CONF_PORT, ATTR_ENTITY_ID) from homeassistant.components.remote import (PLATFORM_SCHEMA, DOMAIN, ATTR_DEVICE, ATTR_ACTIVITY, ATTR_NUM_REPEATS, ATTR_DELAY_SECS) import logging import requests PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_NAME): cv.string, vol.Required(CONF_HOST): cv.string, }) _Log = logging.getLogger(__name__) COMMANDS = { 'isalive': '/request?action=isalive', 'power': '/controller?action=keyevent&keycode=power', 'enter': '/controller?action=keyevent&keycode=enter', 'back': '/controller?action=keyevent&keycode=back', 'home': '/controller?action=keyevent&keycode=home', 'menu': '/controller?action=keyevent&keycode=menu', 'right': '/controller?action=keyevent&keycode=right', 'left': '/controller?action=keyevent&keycode=left', 'up': '/controller?action=keyevent&keycode=up', 'down': '/controller?action=keyevent&keycode=down', 'volumedown': '/controller?action=keyevent&keycode=volumedown', 'volumeup': '/controller?action=keyevent&keycode=volumeup',
vol.Coerce(float), }) SERVICE_LEARN_SCHEMA = COMMAND_SCHEMA.extend({ vol.Required(ATTR_DEVICE): vol.All(cv.string, vol.Length(min=1)), vol.Optional(ATTR_COMMAND_TYPE, default=COMMAND_TYPE_IR): vol.In(COMMAND_TYPES), vol.Optional(ATTR_ALTERNATIVE, default=False): cv.boolean, }) SERVICE_DELETE_SCHEMA = COMMAND_SCHEMA.extend( {vol.Required(ATTR_DEVICE): vol.All(cv.string, vol.Length(min=1))}) PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({vol.Required(CONF_HOST): cv.string}, extra=vol.ALLOW_EXTRA) async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): """Import the device and discontinue platform. This is for backward compatibility. Do not use this method. """ import_device(hass, config[CONF_HOST]) _LOGGER.warning( "The remote platform is deprecated, please remove it from your configuration" )
DEFAULT_TIMEOUT = 10 DEFAULT_SLOT = 1 COMMAND_SCHEMA = vol.Schema( {vol.Required(CONF_COMMAND): vol.All(cv.ensure_list, [cv.string])}) PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( { vol.Optional(CONF_NAME): cv.string, vol.Required(CONF_HOST): cv.string, vol.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): cv.positive_int, vol.Optional(CONF_SLOT, default=DEFAULT_SLOT): vol.All(int, vol.Range(min=1, max=1000000)), vol.Required(CONF_TOKEN): vol.All(str, vol.Length(min=32, max=32)), vol.Optional(CONF_COMMANDS, default={}): cv.schema_with_slug_keys(COMMAND_SCHEMA), }, extra=vol.ALLOW_EXTRA, ) async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): """Set up the Xiaomi IR Remote (Chuangmi IR) platform."""
REQUIREMENTS = ['pyharmony==1.0.20'] _LOGGER = logging.getLogger(__name__) DEFAULT_PORT = 5222 DEVICES = [] CONF_DEVICE_CACHE = 'harmony_device_cache' SERVICE_SYNC = 'harmony_sync' PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Optional(ATTR_ACTIVITY): cv.string, vol.Required(CONF_NAME): cv.string, vol.Optional(ATTR_DELAY_SECS, default=DEFAULT_DELAY_SECS): vol.Coerce(float), vol.Optional(CONF_HOST): cv.string, vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, }) HARMONY_SYNC_SCHEMA = vol.Schema({ vol.Optional(ATTR_ENTITY_ID): cv.entity_ids, }) def setup_platform(hass, config, add_devices, discovery_info=None): """Set up the Harmony platform.""" host = None activity = None
import homeassistant.helpers.config_validation as cv from homeassistant.util import (Throttle, slugify) import traceback REQUIREMENTS = ['async-upnp-client==0.14.8'] _LOGGER = logging.getLogger(__name__) DATA_KEY = 'upnp_maintvagent2_remote' DEFAULT_TIMEOUT = 5 MIN_TIME_BETWEEN_UPDATES = timedelta(minutes=1) PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( { vol.Required(CONF_NAME): cv.string, vol.Required(CONF_URL): cv.string, vol.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): vol.All(int, vol.Range(min=0)) }, extra=vol.ALLOW_EXTRA) async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): """Set up the Xiaomi IR Remote (Chuangmi IR) platform.""" friendly_name = config.get(CONF_NAME) url = config.get(CONF_URL) # Create handler