mirror of
https://github.com/XiaoMi/ha_xiaomi_home.git
synced 2026-01-17 15:41:15 +08:00
feat: improve devices filter
This commit is contained in:
parent
4e8361d18a
commit
b54ec9bff4
@ -121,6 +121,7 @@ class XiaomiMihomeConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
|
|||||||
_home_selected: Optional[dict]
|
_home_selected: Optional[dict]
|
||||||
_home_info_buffer: Optional[dict[str, str | dict[str, dict]]]
|
_home_info_buffer: Optional[dict[str, str | dict[str, dict]]]
|
||||||
_home_list: Optional[dict]
|
_home_list: Optional[dict]
|
||||||
|
_device_list_sorted: Optional[dict]
|
||||||
|
|
||||||
_cloud_server: Optional[str]
|
_cloud_server: Optional[str]
|
||||||
_oauth_redirect_url: Optional[str]
|
_oauth_redirect_url: Optional[str]
|
||||||
@ -155,6 +156,7 @@ class XiaomiMihomeConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
|
|||||||
self._home_selected = {}
|
self._home_selected = {}
|
||||||
self._home_info_buffer = None
|
self._home_info_buffer = None
|
||||||
self._home_list = None
|
self._home_list = None
|
||||||
|
self._device_list_sorted = None
|
||||||
|
|
||||||
self._cloud_server = None
|
self._cloud_server = None
|
||||||
self._oauth_redirect_url = None
|
self._oauth_redirect_url = None
|
||||||
@ -503,23 +505,19 @@ class XiaomiMihomeConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
|
|||||||
if dev_info['home_id'] in home_selected}
|
if dev_info['home_id'] in home_selected}
|
||||||
if not devices_list:
|
if not devices_list:
|
||||||
return await self.display_homes_select_form('no_devices')
|
return await self.display_homes_select_form('no_devices')
|
||||||
devices_list_sort = dict(sorted(
|
self._device_list_sorted = dict(sorted(
|
||||||
devices_list.items(), key=lambda item:
|
devices_list.items(), key=lambda item:
|
||||||
item[1].get('home_id', '')+item[1].get('room_id', '')))
|
item[1].get('home_id', '')+item[1].get('room_id', '')))
|
||||||
|
|
||||||
if not await self._miot_storage.save_async(
|
if not await self._miot_storage.save_async(
|
||||||
domain='miot_devices',
|
domain='miot_devices',
|
||||||
name=f'{self._uid}_{self._cloud_server}',
|
name=f'{self._uid}_{self._cloud_server}',
|
||||||
data=devices_list_sort):
|
data=self._device_list_sorted):
|
||||||
_LOGGER.error(
|
_LOGGER.error(
|
||||||
'save devices async failed, %s, %s',
|
'save devices async failed, %s, %s',
|
||||||
self._uid, self._cloud_server)
|
self._uid, self._cloud_server)
|
||||||
return await self.display_homes_select_form(
|
return await self.display_homes_select_form(
|
||||||
'devices_storage_failed')
|
'devices_storage_failed')
|
||||||
if not (await self._miot_storage.update_user_config_async(
|
|
||||||
uid=self._uid, cloud_server=self._cloud_server, config={
|
|
||||||
'auth_info': self._auth_info
|
|
||||||
})):
|
|
||||||
raise MIoTError('miot_storage.update_user_config_async error')
|
|
||||||
if user_input.get('advanced_options', False):
|
if user_input.get('advanced_options', False):
|
||||||
return await self.async_step_advanced_options()
|
return await self.async_step_advanced_options()
|
||||||
return await self.config_flow_done()
|
return await self.config_flow_done()
|
||||||
@ -563,33 +561,104 @@ class XiaomiMihomeConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
|
|||||||
return self.async_show_form(
|
return self.async_show_form(
|
||||||
step_id='advanced_options',
|
step_id='advanced_options',
|
||||||
data_schema=vol.Schema({
|
data_schema=vol.Schema({
|
||||||
|
vol.Required('devices_filter', default=False): bool,
|
||||||
vol.Required('ctrl_mode', default=DEFAULT_CTRL_MODE): vol.In(
|
vol.Required('ctrl_mode', default=DEFAULT_CTRL_MODE): vol.In(
|
||||||
self._miot_i18n.translate(key='config.control_mode')),
|
self._miot_i18n.translate(key='config.control_mode')),
|
||||||
vol.Required('action_debug', default=self._action_debug): bool,
|
vol.Required('action_debug', default=self._action_debug): bool,
|
||||||
vol.Required(
|
vol.Required(
|
||||||
'hide_non_standard_entities',
|
'hide_non_standard_entities',
|
||||||
default=self._hide_non_standard_entities): bool,
|
default=self._hide_non_standard_entities): bool,
|
||||||
vol.Required('devices_filter', default=False): bool,
|
|
||||||
}),
|
}),
|
||||||
last_step=False,
|
last_step=False,
|
||||||
)
|
)
|
||||||
|
|
||||||
async def async_step_devices_filter(self, user_input: dict = None):
|
async def async_step_devices_filter(self, user_input: dict = None):
|
||||||
if user_input:
|
if user_input:
|
||||||
|
room_list_in: list = user_input.get('room_list', [])
|
||||||
|
if room_list_in:
|
||||||
|
room_filter_mode: str = user_input.get('room_filter_mode')
|
||||||
|
|
||||||
|
type_list_in: list = user_input.get('type_list', [])
|
||||||
|
if type_list_in:
|
||||||
|
type_filter_mode: str = user_input.get('type_filter_mode')
|
||||||
|
|
||||||
|
model_list_in: list = user_input.get('model_list', [])
|
||||||
|
if model_list_in:
|
||||||
|
model_filter_mode: str = user_input.get('model_filter_mode')
|
||||||
|
|
||||||
|
device_list_in: list = user_input.get('device_list', [])
|
||||||
|
if device_list_in:
|
||||||
|
devices_filter_mode: str = user_input.get(
|
||||||
|
'devices_filter_mode')
|
||||||
|
|
||||||
return await self.config_flow_done()
|
return await self.config_flow_done()
|
||||||
|
|
||||||
|
tip_devices: str = self._miot_i18n.translate(
|
||||||
|
key='config.other.devices')
|
||||||
|
tip_filter_mode: str = self._miot_i18n.translate(
|
||||||
|
key='config.filter_mode')
|
||||||
|
tip_connect_type: dict = self._miot_i18n.translate(
|
||||||
|
key='config.connect_type')
|
||||||
|
tip_without_room: str = self._miot_i18n.translate(
|
||||||
|
key='config.other.without_room')
|
||||||
|
|
||||||
|
room_device_count: dict = {}
|
||||||
|
model_device_count: dict = {}
|
||||||
|
device_list: dict = {}
|
||||||
|
for did, info in self._device_list_sorted.items():
|
||||||
|
device_list[did] = (
|
||||||
|
f'{info["home_name"]} {info["room_name"]} - ' +
|
||||||
|
f'{info["name"]} - {did}')
|
||||||
|
room_device_count.setdefault(info['room_id'], 0)
|
||||||
|
room_device_count[info['room_id']] += 1
|
||||||
|
model_device_count.setdefault(info['model'], 0)
|
||||||
|
model_device_count[info['model']] += 1
|
||||||
|
|
||||||
|
model_list: dict = {}
|
||||||
|
for model, count in model_device_count.items():
|
||||||
|
model_list[model] = f'{model} [ {count}{tip_devices} ]'
|
||||||
|
|
||||||
|
room_list: dict = {}
|
||||||
|
for home_id, home_info in self._home_selected.items():
|
||||||
|
for room_id, room_name in home_info['room_info'].items():
|
||||||
|
if room_id not in room_device_count:
|
||||||
|
continue
|
||||||
|
room_list[room_id] = (
|
||||||
|
f'{home_info["home_name"]} {room_name}'
|
||||||
|
f' [ {room_device_count[room_id]}{tip_devices} ]')
|
||||||
|
if home_id in room_device_count:
|
||||||
|
room_list[home_id] = (
|
||||||
|
f'{home_info["home_name"]} {tip_without_room}'
|
||||||
|
f' [ {room_device_count[home_id]}{tip_devices} ]')
|
||||||
|
|
||||||
return self.async_show_form(
|
return self.async_show_form(
|
||||||
step_id='devices_filter',
|
step_id='devices_filter',
|
||||||
data_schema=vol.Schema({
|
data_schema=vol.Schema({
|
||||||
vol.Required('filter_mode', default='include'): vol.In(
|
vol.Required('room_filter_mode', default='exclude'):
|
||||||
self._miot_i18n.translate(key='config.filter_mode')),
|
vol.In(tip_filter_mode),
|
||||||
vol.Required('filter_mode', default='include'): vol.In(
|
vol.Optional('room_list'): cv.multi_select(room_list),
|
||||||
self._miot_i18n.translate(key='config.filter_mode'))
|
vol.Required('type_filter_mode', default='exclude'):
|
||||||
|
vol.In(tip_filter_mode),
|
||||||
|
vol.Optional('type_list'): cv.multi_select(tip_connect_type),
|
||||||
|
vol.Required('model_filter_mode', default='exclude'):
|
||||||
|
vol.In(tip_filter_mode),
|
||||||
|
vol.Optional('model_list'): cv.multi_select(dict(sorted(
|
||||||
|
model_list.items(), key=lambda item: item[0]))),
|
||||||
|
vol.Required('devices_filter_mode', default='exclude'):
|
||||||
|
vol.In(tip_filter_mode),
|
||||||
|
vol.Optional('device_list'): cv.multi_select(dict(sorted(
|
||||||
|
device_list.items(), key=lambda device: device[1])))
|
||||||
}),
|
}),
|
||||||
last_step=False,
|
last_step=False
|
||||||
)
|
)
|
||||||
|
|
||||||
async def config_flow_done(self):
|
async def config_flow_done(self):
|
||||||
|
if not (await self._miot_storage.update_user_config_async(
|
||||||
|
uid=self._uid, cloud_server=self._cloud_server, config={
|
||||||
|
'auth_info': self._auth_info
|
||||||
|
})):
|
||||||
|
raise MIoTError('miot_storage.update_user_config_async error')
|
||||||
return self.async_create_entry(
|
return self.async_create_entry(
|
||||||
title=(
|
title=(
|
||||||
f'{self._nick_name}: {self._uid} '
|
f'{self._nick_name}: {self._uid} '
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user