async def _async_try_automatic_configure(self) -> None: """Try to auto configure the device. Failure is acceptable here since the device may have been online longer then the allowed setup period, and we will instead ask them to manually enter the token. """ bond = Bond(self._discovered[CONF_HOST], "") try: response = await bond.token() except ClientConnectionError: return token = response.get("token") if token is None: return self._discovered[CONF_ACCESS_TOKEN] = token _, hub_name = await _validate_input(self._discovered) self._discovered[CONF_NAME] = hub_name
async def _validate_input(data: Dict[str, Any]) -> Tuple[str, str]: """Validate the user input allows us to connect.""" bond = Bond(data[CONF_HOST], data[CONF_ACCESS_TOKEN]) try: hub = BondHub(bond) await hub.setup(max_devices=1) except ClientConnectionError as error: raise InputValidationError("cannot_connect") from error except ClientResponseError as error: if error.status == HTTP_UNAUTHORIZED: raise InputValidationError("invalid_auth") from error raise InputValidationError("unknown") from error except Exception as error: _LOGGER.exception("Unexpected exception") raise InputValidationError("unknown") from error # Return unique ID from the hub to be stored in the config entry. if not hub.bond_id: raise InputValidationError("old_firmware") return hub.bond_id, hub.name
async def _validate_input(data: Dict[str, Any]) -> str: """Validate the user input allows us to connect.""" try: bond = Bond(data[CONF_HOST], data[CONF_ACCESS_TOKEN]) version = await bond.version() # call to non-version API is needed to validate authentication await bond.devices() except ClientConnectionError as error: raise InputValidationError("cannot_connect") from error except ClientResponseError as error: if error.status == 401: raise InputValidationError("invalid_auth") from error raise InputValidationError("unknown") from error except Exception as error: _LOGGER.exception("Unexpected exception") raise InputValidationError("unknown") from error # Return unique ID from the hub to be stored in the config entry. bond_id = version.get("bondid") if not bond_id: raise InputValidationError("old_firmware") return bond_id
def bond_fixture(): """Creates Bond fixture.""" return Bond("test-host", "test-token")
async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up Bond from a config entry.""" host = entry.data[CONF_HOST] token = entry.data[CONF_ACCESS_TOKEN] config_entry_id = entry.entry_id bond = Bond( host=host, token=token, timeout=ClientTimeout(total=_API_TIMEOUT), session=async_get_clientsession(hass), ) hub = BondHub(bond, host) try: await hub.setup() except ClientResponseError as ex: if ex.status == HTTPStatus.UNAUTHORIZED: _LOGGER.error("Bond token no longer valid: %s", ex) return False raise ConfigEntryNotReady from ex except (ClientError, AsyncIOTimeoutError, OSError) as error: raise ConfigEntryNotReady from error bpup_subs = BPUPSubscriptions() stop_bpup = await start_bpup(host, bpup_subs) @callback def _async_stop_event(*_: Any) -> None: stop_bpup() entry.async_on_unload(_async_stop_event) entry.async_on_unload( hass.bus.async_listen(EVENT_HOMEASSISTANT_STOP, _async_stop_event)) hass.data.setdefault(DOMAIN, {}) hass.data[DOMAIN][entry.entry_id] = { HUB: hub, BPUP_SUBS: bpup_subs, } if not entry.unique_id: hass.config_entries.async_update_entry(entry, unique_id=hub.bond_id) assert hub.bond_id is not None hub_name = hub.name or hub.bond_id device_registry = dr.async_get(hass) device_registry.async_get_or_create( config_entry_id=config_entry_id, identifiers={(DOMAIN, hub.bond_id)}, manufacturer=BRIDGE_MAKE, name=hub_name, model=hub.target, sw_version=hub.fw_ver, hw_version=hub.mcu_ver, suggested_area=hub.location, configuration_url=f"http://{host}", ) _async_remove_old_device_identifiers(config_entry_id, device_registry, hub) hass.config_entries.async_setup_platforms(entry, PLATFORMS) return True