コード例 #1
0
ファイル: core.py プロジェクト: jbouwh/core
    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")
コード例 #2
0
 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
コード例 #3
0
    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
コード例 #4
0
ファイル: test_init.py プロジェクト: sara0871/-.gitignore-
    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
コード例 #5
0
ファイル: test_init.py プロジェクト: MoshonkaKita/Golovastik
    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()
コード例 #6
0
 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
コード例 #7
0
 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
コード例 #8
0
                    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 = {}