def _migrate_schema_and_setup_run(self, current_version: int) -> bool: """Migrate schema to the latest version.""" persistent_notification.create( self.hass, "System performance will temporarily degrade during the database upgrade. Do not power down or restart the system until the upgrade completes. Integrations that read the database, such as logbook and history, may return inconsistent results until the upgrade completes.", "Database upgrade in progress", "recorder_database_migration", ) self.hass.add_job(self._async_migration_started) try: migration.migrate_schema(self, self.hass, self.engine, self.get_session, current_version) except exc.DatabaseError as err: if self._handle_database_error(err): return True _LOGGER.exception("Database error during schema migration") return False except Exception: # pylint: disable=broad-except _LOGGER.exception("Error during schema migration") return False else: self._setup_run() return True finally: self.migration_in_progress = False persistent_notification.dismiss(self.hass, "recorder_database_migration")
def check_auth(self, notify=False): rdt = self.get_user_device_data('1', 'power') or {} nid = f'xiaomi-miot-auth-warning-{self.user_id}' eno = rdt.get('code', 0) if eno == 3: # auth err if notify: persistent_notification.create( self.hass, f'Xiaomi cloud: {self.user_id} auth failed, ' 'Please update option for this integration to refresh token.\n' f'小米账号:{self.user_id} 登陆失效,请重新保存集成选项以更新登陆信息。', 'Xiaomi Miot Warning', nid, ) _LOGGER.error( 'Xiaomi cloud: %s auth failed, Please update option for this integration to refresh token.\n%s', self.user_id, rdt, ) self.user_id = None self.service_token = None self.ssecurity = None if self.login(): persistent_notification.dismiss(self.hass, nid) return True _LOGGER.warning('Retry login xiaomi cloud failed: %s', self.username) return False return True
def test_dismiss_notification(self): """Ensure removal of specific notification.""" assert len(self.hass.states.entity_ids(pn.DOMAIN)) == 0 pn.create(self.hass, 'test', notification_id='Beer 2') self.hass.block_till_done() assert len(self.hass.states.entity_ids(pn.DOMAIN)) == 1 pn.dismiss(self.hass, notification_id='Beer 2') self.hass.block_till_done() assert len(self.hass.states.entity_ids(pn.DOMAIN)) == 0
def test_dismiss_notification(self): """Ensure removal of specific notification.""" notifications = self.hass.data[pn.DOMAIN]['notifications'] assert len(self.hass.states.entity_ids(pn.DOMAIN)) == 0 assert len(notifications) == 0 pn.create(self.hass, 'test', notification_id='Beer 2') self.hass.block_till_done() assert len(self.hass.states.entity_ids(pn.DOMAIN)) == 1 assert len(notifications) == 1 pn.dismiss(self.hass, notification_id='Beer 2') self.hass.block_till_done() assert len(self.hass.states.entity_ids(pn.DOMAIN)) == 0 assert len(notifications) == 0 notifications.clear()
async def async_check_auth(self, notify=False): rdt = None try: rdt = await self.hass.async_add_executor_job( partial(self.get_user_device_data, '1', 'check_auth', raw=True, timeout=30)) or {} nid = f'xiaomi-miot-auth-warning-{self.user_id}' eno = rdt.get('code', 0) if eno != 3: return True except requests.exceptions.ConnectionError: return None # auth err self.service_token = None self.ssecurity = None if await self.async_login(): await self.async_stored_auth(self.user_id, save=True) persistent_notification.dismiss(self.hass, nid) return True if notify: persistent_notification.create( self.hass, f'Xiaomi account: {self.user_id} auth failed, ' 'Please update option for this integration to refresh token.\n' f'小米账号:{self.user_id} 登陆失效,请重新保存集成选项以更新登陆信息。', 'Xiaomi Miot Warning', nid, ) _LOGGER.error( 'Xiaomi account: %s auth failed, Please update option for this integration to refresh token.\n%s', self.user_id, rdt, ) else: _LOGGER.warning('Retry login xiaomi account failed: %s', self.username) return False
async def async_check_auth(self, notify=False): api = 'v2/message/v2/check_new_msg' dat = { 'begin_at': int(time.time()) - 60, } try: rdt = await self.async_request_api(api, dat, method='POST') or {} nid = f'xiaomi-miot-auth-warning-{self.user_id}' eno = rdt.get('code', 0) if eno != 3: return True except requests.exceptions.ConnectionError: return None except requests.exceptions.Timeout: return None # auth err if await self.async_relogin(): persistent_notification.dismiss(self.hass, nid) return True if notify: persistent_notification.create( self.hass, f'Xiaomi account: {self.user_id} auth failed, ' 'Please update option for this integration to refresh token.\n' f'小米账号:{self.user_id} 登陆失效,请重新保存集成选项以更新登陆信息。', 'Xiaomi Miot Warning', nid, ) _LOGGER.error( 'Xiaomi account: %s auth failed, Please update option for this integration to refresh token.\n%s', self.user_id, rdt, ) else: _LOGGER.warning('Retry login xiaomi account failed: %s', self.username) return False
f'{DOMAIN}-login', ) elif url := mic.attrs.pop('captchaImg', None): err = f'Captcha:\n![captcha](data:image/jpeg;base64,{url})' user_input['xiaomi_cloud'] = mic user_input['captchaIck'] = mic.attrs.get('captchaIck') if isinstance(exc, requests.exceptions.ConnectionError): errors['base'] = 'cannot_reach' elif 'ZoneInfoNotFoundError' in err: errors['base'] = 'tzinfo_error' hass.data[DOMAIN]['placeholders'] = {'tip': f'⚠️ {err}'} unm = mic.username if mic else user_input.get(CONF_USERNAME) _LOGGER.error('Setup xiaomi cloud for user: %s failed: %s', unm, exc) if not errors: user_input['devices'] = dvs persistent_notification.dismiss(hass, f'{DOMAIN}-login') return user_input async def get_cloud_filter_schema(hass, user_input, errors, schema=None, via_did=False): if not schema: schema = vol.Schema({}) dvs = user_input.get('devices') or [] if not dvs: errors['base'] = 'none_devices' else: grp = {}