async def async_setup_entry( hass: HomeAssistantType, config_entry: ConfigEntry, async_add_entities: Callable[[List[Entity], bool], None], ) -> None: """Set up a Vizio media player entry.""" host = config_entry.data[CONF_HOST] token = config_entry.data.get(CONF_ACCESS_TOKEN) name = config_entry.data[CONF_NAME] device_class = config_entry.data[CONF_DEVICE_CLASS] # If config entry options not set up, set them up, otherwise assign values managed in options volume_step = config_entry.options.get( CONF_VOLUME_STEP, config_entry.data.get(CONF_VOLUME_STEP, DEFAULT_VOLUME_STEP)) params = {} if not config_entry.options: params["options"] = {CONF_VOLUME_STEP: volume_step} include_or_exclude_key = next( (key for key in config_entry.data.get(CONF_APPS, {}) if key in [CONF_INCLUDE, CONF_EXCLUDE]), None, ) if include_or_exclude_key: params["options"][CONF_APPS] = { include_or_exclude_key: config_entry.data[CONF_APPS][include_or_exclude_key].copy() } if not config_entry.data.get(CONF_VOLUME_STEP): new_data = config_entry.data.copy() new_data.update({CONF_VOLUME_STEP: volume_step}) params["data"] = new_data if params: hass.config_entries.async_update_entry(config_entry, **params) device = VizioAsync( DEVICE_ID, host, name, auth_token=token, device_type=VIZIO_DEVICE_CLASSES[device_class], session=async_get_clientsession(hass, False), timeout=DEFAULT_TIMEOUT, ) if not await device.can_connect_with_auth_check(): _LOGGER.warning("Failed to connect to %s", host) raise PlatformNotReady entity = VizioDevice( config_entry, device, name, device_class, ) async_add_entities([entity], update_before_add=True)
async def async_setup_entry( hass: HomeAssistant, config_entry: ConfigEntry, async_add_entities: AddEntitiesCallback, ) -> None: """Set up a Vizio media player entry.""" host = config_entry.data[CONF_HOST] token = config_entry.data.get(CONF_ACCESS_TOKEN) name = config_entry.data[CONF_NAME] device_class = config_entry.data[CONF_DEVICE_CLASS] # If config entry options not set up, set them up, otherwise assign values managed in options volume_step = config_entry.options.get( CONF_VOLUME_STEP, config_entry.data.get(CONF_VOLUME_STEP, DEFAULT_VOLUME_STEP)) params = {} if not config_entry.options: params["options"] = {CONF_VOLUME_STEP: volume_step} include_or_exclude_key = next( (key for key in config_entry.data.get(CONF_APPS, {}) if key in (CONF_INCLUDE, CONF_EXCLUDE)), None, ) if include_or_exclude_key: params["options"][CONF_APPS] = { include_or_exclude_key: config_entry.data[CONF_APPS][include_or_exclude_key].copy() } if not config_entry.data.get(CONF_VOLUME_STEP): new_data = config_entry.data.copy() new_data.update({CONF_VOLUME_STEP: volume_step}) params["data"] = new_data if params: hass.config_entries.async_update_entry(config_entry, **params) device = VizioAsync( DEVICE_ID, host, name, auth_token=token, device_type=VIZIO_DEVICE_CLASSES[device_class], session=async_get_clientsession(hass, False), timeout=DEFAULT_TIMEOUT, ) apps_coordinator = hass.data[DOMAIN].get(CONF_APPS) entity = VizioDevice(config_entry, device, name, device_class, apps_coordinator) async_add_entities([entity], update_before_add=True) platform = entity_platform.async_get_current_platform() platform.async_register_entity_service(SERVICE_UPDATE_SETTING, UPDATE_SETTING_SCHEMA, "async_update_setting")
async def async_setup_entry( hass: HomeAssistantType, config_entry: ConfigEntry, async_add_entities: Callable[[List[Entity], bool], None], ) -> None: """Set up a Vizio media player entry.""" host = config_entry.data[CONF_HOST] token = config_entry.data.get(CONF_ACCESS_TOKEN) name = config_entry.data[CONF_NAME] device_class = config_entry.data[CONF_DEVICE_CLASS] # If config entry options not set up, set them up, otherwise assign values managed in options if not config_entry.options: volume_step = config_entry.data.get(CONF_VOLUME_STEP, DEFAULT_VOLUME_STEP) hass.config_entries.async_update_entry( config_entry, options={CONF_VOLUME_STEP: volume_step}) else: volume_step = config_entry.options[CONF_VOLUME_STEP] device = VizioAsync( DEVICE_ID, host, name, auth_token=token, device_type=VIZIO_DEVICE_CLASSES[device_class], session=async_get_clientsession(hass, False), timeout=DEFAULT_TIMEOUT, ) if not await device.can_connect(): fail_auth_msg = "" if token: fail_auth_msg = f"and auth token '{token}' are correct." else: fail_auth_msg = "is correct." _LOGGER.warning( "Failed to connect to Vizio device, please check if host '%s' " "is valid and available. Also check if device class '%s' %s", host, device_class, fail_auth_msg, ) raise PlatformNotReady entity = VizioDevice(config_entry, device, name, volume_step, device_class) async_add_entities([entity], update_before_add=True)
async def async_step_pair_tv( self, user_input: Dict[str, Any] = None ) -> Dict[str, Any]: """Start pairing process and ask user for PIN to complete pairing process.""" errors = {} # Start pairing process if it hasn't already started if not self._ch_type and not self._pairing_token: dev = VizioAsync( DEVICE_ID, self._data[CONF_HOST], self._data[CONF_NAME], None, self._data[CONF_DEVICE_CLASS], session=async_get_clientsession(self.hass, False), ) pair_data = await dev.start_pair() if pair_data: self._ch_type = pair_data.ch_type self._pairing_token = pair_data.token return await self.async_step_pair_tv() return self.async_show_form( step_id="user", data_schema=_get_config_schema(self._data), errors={"base": "cant_connect"}, ) # Complete pairing process if PIN has been provided if user_input and user_input.get(CONF_PIN): dev = VizioAsync( DEVICE_ID, self._data[CONF_HOST], self._data[CONF_NAME], None, self._data[CONF_DEVICE_CLASS], session=async_get_clientsession(self.hass, False), ) pair_data = await dev.pair( self._ch_type, self._pairing_token, user_input[CONF_PIN] ) if pair_data: self._data[CONF_ACCESS_TOKEN] = pair_data.auth_token self._must_show_form = True unique_id = await VizioAsync.get_unique_id( self._data[CONF_HOST], self._data[CONF_ACCESS_TOKEN], self._data[CONF_DEVICE_CLASS], session=async_get_clientsession(self.hass, False), ) # Set unique ID and abort if unique ID is already configured on an entry or a flow # with the unique ID is already in progress await self.async_set_unique_id( unique_id=unique_id, raise_on_progress=True ) self._abort_if_unique_id_configured() # pylint: disable=no-member # https://github.com/PyCQA/pylint/issues/3167 if self.context["source"] == SOURCE_IMPORT: # If user is pairing via config import, show different message return await self.async_step_pairing_complete_import() return await self.async_step_tv_apps() # If no data was retrieved, it's assumed that the pairing attempt was not # successful errors[CONF_PIN] = "complete_pairing_failed" return self.async_show_form( step_id="pair_tv", data_schema=_get_pairing_schema(user_input), errors=errors, )
def cli(ctx, ip: str, auth: str, device_type: str) -> None: logging.basicConfig(level=logging.INFO) ctx.obj = VizioAsync(DEFAULT_DEVICE_ID, ip, DEFAULT_DEVICE_NAME, auth, device_type)
async def async_step_pair_tv(self, user_input: dict[str, Any] = None) -> FlowResult: """ Start pairing process for TV. Ask user for PIN to complete pairing process. """ errors = {} # Start pairing process if it hasn't already started if not self._ch_type and not self._pairing_token: dev = VizioAsync( DEVICE_ID, self._data[CONF_HOST], self._data[CONF_NAME], None, self._data[CONF_DEVICE_CLASS], session=async_get_clientsession(self.hass, False), ) pair_data = await dev.start_pair() if pair_data: self._ch_type = pair_data.ch_type self._pairing_token = pair_data.token return await self.async_step_pair_tv() return self.async_show_form( step_id="user", data_schema=_get_config_schema(self._data), errors={"base": "cannot_connect"}, ) # Complete pairing process if PIN has been provided if user_input and user_input.get(CONF_PIN): dev = VizioAsync( DEVICE_ID, self._data[CONF_HOST], self._data[CONF_NAME], None, self._data[CONF_DEVICE_CLASS], session=async_get_clientsession(self.hass, False), ) pair_data = await dev.pair(self._ch_type, self._pairing_token, user_input[CONF_PIN]) if pair_data: self._data[CONF_ACCESS_TOKEN] = pair_data.auth_token self._must_show_form = True if self.context["source"] == SOURCE_IMPORT: # If user is pairing via config import, show different message return await self.async_step_pairing_complete_import() return await self.async_step_pairing_complete() # If no data was retrieved, it's assumed that the pairing attempt was not # successful errors[CONF_PIN] = "complete_pairing_failed" return self.async_show_form( step_id="pair_tv", data_schema=_get_pairing_schema(user_input), errors=errors, )