diff --git a/custom_components/xiaomi_home/config_flow.py b/custom_components/xiaomi_home/config_flow.py index a940b1f..9f54207 100644 --- a/custom_components/xiaomi_home/config_flow.py +++ b/custom_components/xiaomi_home/config_flow.py @@ -121,7 +121,8 @@ class XiaomiMihomeConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): _home_selected: Optional[dict] _home_info_buffer: Optional[dict[str, str | dict[str, dict]]] _home_list: Optional[dict] - _device_list_sorted: Optional[dict] + _device_list_sorted: dict + _device_list_filter: dict _cloud_server: Optional[str] _oauth_redirect_url: Optional[str] @@ -573,25 +574,86 @@ class XiaomiMihomeConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): last_step=False, ) - async def async_step_devices_filter(self, user_input: dict = None): + async def async_step_devices_filter( + self, user_input: Optional[dict] = None + ): if user_input: + # Room filter room_list_in: list = user_input.get('room_list', []) if room_list_in: - room_filter_mode: str = user_input.get('room_filter_mode') - + room_filter_mode: str = user_input.get( + 'room_filter_mode', None) + if room_filter_mode == 'exclude': + self._device_list_filter = { + did: dev_info + for did, dev_info in self._device_list_sorted.items() + if dev_info['room_id'] not in room_list_in} + elif room_filter_mode == 'include': + self._device_list_filter = { + did: dev_info + for did, dev_info in self._device_list_sorted.items() + if dev_info['room_id'] in room_list_in} + # Type filter type_list_in: list = user_input.get('type_list', []) if type_list_in: - type_filter_mode: str = user_input.get('type_filter_mode') - + type_filter_mode: str = user_input.get( + 'type_filter_mode', None) + if type_filter_mode == 'exclude': + self._device_list_filter = { + did: dev_info + for did, dev_info in self._device_list_sorted.items() + if dev_info['connect_type'] not in type_list_in} + elif type_filter_mode == 'include': + self._device_list_filter = { + did: dev_info + for did, dev_info in self._device_list_sorted.items() + if dev_info['connect_type'] in type_list_in} + # Model filter model_list_in: list = user_input.get('model_list', []) if model_list_in: - model_filter_mode: str = user_input.get('model_filter_mode') - + model_filter_mode: str = user_input.get( + 'model_filter_mode', None) + if model_filter_mode == 'exclude': + self._device_list_filter = { + did: dev_info + for did, dev_info in self._device_list_sorted.items() + if dev_info['model'] not in model_list_in} + elif model_filter_mode == 'include': + self._device_list_filter = { + did: dev_info + for did, dev_info in self._device_list_sorted.items() + if dev_info['model'] in model_list_in} + # Device filter device_list_in: list = user_input.get('device_list', []) if device_list_in: devices_filter_mode: str = user_input.get( - 'devices_filter_mode') - + 'devices_filter_mode', None) + if devices_filter_mode == 'exclude': + self._device_list_filter = { + did: dev_info + for did, dev_info in self._device_list_sorted.items() + if did not in device_list_in} + elif devices_filter_mode == 'include': + self._device_list_filter = { + did: dev_info + for did, dev_info in self._device_list_sorted.items() + if did in device_list_in} + else: + raise MIoTError('invalid devices_filter_mode') + self._device_list_sorted = dict(sorted( + self._device_list_filter.items(), key=lambda item: + item[1].get('home_id', '')+item[1].get('room_id', ''))) + if not await self._miot_storage.save_async( + domain='miot_devices', + name=f'{self._uid}_{self._cloud_server}', + data=self._device_list_sorted): + _LOGGER.error( + 'save devices async failed, %s, %s', + self._uid, self._cloud_server) + raise AbortFlow( + reason='config_flow_error', + description_placeholders={ + 'error': 'save devices failed'}) return await self.config_flow_done() tip_devices: str = self._miot_i18n.translate( diff --git a/custom_components/xiaomi_home/translations/de.json b/custom_components/xiaomi_home/translations/de.json index ad1f045..2342d24 100644 --- a/custom_components/xiaomi_home/translations/de.json +++ b/custom_components/xiaomi_home/translations/de.json @@ -33,7 +33,7 @@ }, "advanced_options": { "title": "Erweiterte Einstellungen", - "description": "## Einführung\r\n### Behalten Sie die Standardeinstellungen bei, es sei denn, Sie verstehen die folgenden Optionen vollständig.\r\n### Steuerungsmodus\r\n- Automatisch: Wenn ein verfügbarer Xiaomi-Hub im lokalen Netzwerk vorhanden ist, priorisiert Home Assistant das Senden von Steuerbefehlen über den Hub, um eine lokale Steuerung zu ermöglichen. Wenn kein Hub vorhanden ist, wird versucht, Steuerbefehle über das Xiaomi-OT-Protokoll zu senden. Nur wenn diese Bedingungen für die lokale Steuerung nicht erfüllt sind, werden die Befehle über die Cloud gesendet.\r\n- Cloud: Steuerbefehle werden ausschließlich über die Cloud gesendet.\r\n### Gerätefilterung\r\nFiltern Sie unerwünschte Geräte nach Familien.\r\n### Action-Debug-Modus\r\nFür Methoden, die von MIoT-Spec-V2-Geräten definiert werden, wird neben der Benachrichtigungsentität auch eine Texteingabe-Entität erstellt, mit der Sie während des Debuggens Steuerbefehle an das Gerät senden können.\r\n### Nicht standardmäßige Entitäten ausblenden\r\nBlendet Entitäten aus, die von nicht-standardmäßigen MIoT-Spec-V2-Instanzen generiert werden und deren Name mit „*“ beginnt.", + "description": "## Gebrauchsanweisung\r\n### Behalten Sie die Standardeinstellungen bei, es sei denn, Sie verstehen die folgenden Optionen vollständig.\r\n### Steuerungsmodus\r\n- Automatisch: Wenn ein verfügbarer Xiaomi-Hub im lokalen Netzwerk vorhanden ist, priorisiert Home Assistant das Senden von Steuerbefehlen über den Hub, um eine lokale Steuerung zu ermöglichen. Wenn kein Hub vorhanden ist, wird versucht, Steuerbefehle über das Xiaomi-OT-Protokoll zu senden. Nur wenn diese Bedingungen für die lokale Steuerung nicht erfüllt sind, werden die Befehle über die Cloud gesendet.\r\n- Cloud: Steuerbefehle werden ausschließlich über die Cloud gesendet.\r\n### Gerätefilterung\r\nFiltern Sie unerwünschte Geräte nach Familien.\r\n### Action-Debug-Modus\r\nFür Methoden, die von MIoT-Spec-V2-Geräten definiert werden, wird neben der Benachrichtigungsentität auch eine Texteingabe-Entität erstellt, mit der Sie während des Debuggens Steuerbefehle an das Gerät senden können.\r\n### Nicht standardmäßige Entitäten ausblenden\r\nBlendet Entitäten aus, die von nicht-standardmäßigen MIoT-Spec-V2-Instanzen generiert werden und deren Name mit „*“ beginnt.", "data": { "devices_filter": "Geräte filtern", "ctrl_mode": "Steuerungsmodus", @@ -43,9 +43,16 @@ }, "devices_filter": { "title": "Geräte filtern", - "description": "## Einführung\r\nFiltern Sie unerwünschte Geräte nach Familien.", + "description": "## Gebrauchsanweisung\r\n- Unterstützt das Filtern von Geräten nach Raumnamen und Gerätetypen sowie das Filtern nach Gerätedimensionen.\r\n- Sie können auch die entsprechende Integrationsoption \"Konfiguration> Geräteliste aktualisieren\" aufrufen, um die Filterung erneut durchzuführen.", "data": { - "filter_mode": "Filtermodus" + "room_filter_mode": "Familienraum filtern", + "room_list": "Familienraum", + "type_filter_mode": "Gerätetyp filtern", + "type_list": "Gerätetyp", + "model_filter_mode": "Gerätemodell filtern", + "model_list": "Gerätemodell", + "devices_filter_mode": "Geräte filtern", + "device_list": "Geräteliste" } } }, diff --git a/custom_components/xiaomi_home/translations/en.json b/custom_components/xiaomi_home/translations/en.json index 7e1dcd8..391bd47 100644 --- a/custom_components/xiaomi_home/translations/en.json +++ b/custom_components/xiaomi_home/translations/en.json @@ -43,9 +43,16 @@ }, "devices_filter": { "title": "Filter Devices", - "description": "## Introduction\r\nFilter out unwanted devices by family.", + "description": "## Introduction\r\n- Supports filtering devices by room name and device type, and also supports device dimension filtering.\r\n- You can also re-filter on the corresponding integration page [Configuration>Update Device List].", "data": { - "filter_mode": "Filter Mode" + "room_filter_mode": "Filter Family Rooms", + "room_list": "Family Rooms", + "type_filter_mode": "Filter Device Type", + "type_list": "Device Type", + "model_filter_mode": "Filter Device Model", + "model_list": "Device Model", + "devices_filter_mode": "Filter Devices", + "device_list": "Device List" } } }, diff --git a/custom_components/xiaomi_home/translations/es.json b/custom_components/xiaomi_home/translations/es.json index 4adc364..27b9fdc 100644 --- a/custom_components/xiaomi_home/translations/es.json +++ b/custom_components/xiaomi_home/translations/es.json @@ -43,9 +43,16 @@ }, "devices_filter": { "title": "Filtrar Dispositivos", - "description": "## Introducción\r\nFiltre dispositivos no deseados por familia.", + "description": "## Introducción\r\n- Admite la filtración de dispositivos por nombre de habitación y tipo de dispositivo, y también admite la filtración por familia.\r\n- También puede volver a filtrar en la página correspondiente de la integración [Configuración>Actualizar lista de dispositivos].", "data": { - "filter_mode": "Modo de Filtrado" + "room_filter_mode": "Filtrar Habitaciones de la Familia", + "room_list": "Habitaciones de la Familia", + "type_filter_mode": "Filtrar Tipo de Dispositivo", + "type_list": "Tipo de Dispositivo", + "model_filter_mode": "Filtrar Modelo de Dispositivo", + "model_list": "Modelo de Dispositivo", + "devices_filter_mode": "Filtrar Dispositivos", + "device_list": "Lista de Dispositivos" } } }, diff --git a/custom_components/xiaomi_home/translations/fr.json b/custom_components/xiaomi_home/translations/fr.json index 362968c..ef33855 100644 --- a/custom_components/xiaomi_home/translations/fr.json +++ b/custom_components/xiaomi_home/translations/fr.json @@ -43,9 +43,16 @@ }, "devices_filter": { "title": "Filtrer les Appareils", - "description": "## Introduction\r\nFiltrez les appareils indésirables en fonction de la famille.", + "description": "## Introduction\r\n- Prend en charge le filtrage des appareils en fonction du nom de la pièce et du type d'appareil, ainsi que le filtrage basé sur les appareils.\r\n- Vous pouvez également accéder à la page de filtrage correspondante de l'intégration [Configuration> Mettre à jour la liste des appareils] pour refiltrer.", "data": { - "filter_mode": "Mode de Filtrage" + "room_filter_mode": "Filtrer les Pièces", + "room_list": "Pièces", + "type_filter_mode": "Filtrer les Types d'Appareils", + "type_list": "Types d'Appareils", + "model_filter_mode": "Filtrer les Modèles d'Appareils", + "model_list": "Modèles d'Appareils", + "devices_filter_mode": "Filtrer les Appareils", + "device_list": "Liste des Appareils" } } }, diff --git a/custom_components/xiaomi_home/translations/ja.json b/custom_components/xiaomi_home/translations/ja.json index 8c343c8..88a75c5 100644 --- a/custom_components/xiaomi_home/translations/ja.json +++ b/custom_components/xiaomi_home/translations/ja.json @@ -43,9 +43,16 @@ }, "devices_filter": { "title": "デバイスをフィルタリング", - "description": "## 使い方\r\n不要なデバイスをファミリー単位でフィルタリングします。", + "description": "## 紹介\r\n- 部屋名とデバイスタイプでデバイスをフィルタリングすることができます。デバイスの次元でフィルタリングすることもできます。\r\n- 対応する統合項目【設定>デバイスリストの更新】ページに移動して再度フィルタリングすることもできます。", "data": { - "filter_mode": "フィルターモード" + "room_filter_mode": "家族の部屋をフィルタリング", + "room_list": "家族の部屋", + "type_filter_mode": "デバイスタイプをフィルタリング", + "type_list": "デバイスタイプ", + "model_filter_mode": "デバイスモデルをフィルタリング", + "model_list": "デバイスモデル", + "devices_filter_mode": "デバイスをフィルタリング", + "device_list": "デバイスリスト" } } }, diff --git a/custom_components/xiaomi_home/translations/nl.json b/custom_components/xiaomi_home/translations/nl.json index b67f408..d476be2 100644 --- a/custom_components/xiaomi_home/translations/nl.json +++ b/custom_components/xiaomi_home/translations/nl.json @@ -43,9 +43,16 @@ }, "devices_filter": { "title": "Apparaten filteren", - "description": "## Inleiding\r\nFilter ongewenste apparaten per familie.", + "description": "## Inleiding\r\n- Ondersteunt het filteren van apparaten op basis van kamer- en apparaattypen, en ondersteunt ook apparaatdimensiefiltering.\r\n- U kunt ook naar de overeenkomstige integratie-item [Configuratie>Apparaatlijst bijwerken] pagina gaan om opnieuw te filteren.", "data": { - "filter_mode": "Filtermodus" + "room_filter_mode": "Kamerfiltermodus", + "room_list": "Kamers", + "type_filter_mode": "Apparaattypen filteren", + "type_list": "Apparaattypen", + "model_filter_mode": "Apparaatmodel filteren", + "model_list": "Apparaatmodellen", + "devices_filter_mode": "Apparaten filteren", + "device_list": "Apparaatlijst" } } }, diff --git a/custom_components/xiaomi_home/translations/pt-BR.json b/custom_components/xiaomi_home/translations/pt-BR.json index ceef23f..7d0e237 100644 --- a/custom_components/xiaomi_home/translations/pt-BR.json +++ b/custom_components/xiaomi_home/translations/pt-BR.json @@ -43,9 +43,16 @@ }, "devices_filter": { "title": "Filtrar Dispositivos", - "description": "## Introdução\r\nFiltre dispositivos indesejados por família.", + "description": "## Introdução\r\n- Suporte para filtrar dispositivos por nome da sala e tipo de dispositivo, bem como filtragem por família.\r\n- Você também pode acessar a página correspondente da integração [Configuração>Atualizar Lista de Dispositivos] para refiltrar.", "data": { - "filter_mode": "Modo de Filtro" + "room_filter_mode": "Filtrar por Sala", + "room_list": "Salas", + "type_filter_mode": "Filtrar por Tipo de Dispositivo", + "type_list": "Tipos de Dispositivo", + "model_filter_mode": "Filtrar por Modelo de Dispositivo", + "model_list": "Modelos de Dispositivo", + "devices_filter_mode": "Filtrar Dispositivos", + "device_list": "Lista de Dispositivos" } } }, diff --git a/custom_components/xiaomi_home/translations/pt.json b/custom_components/xiaomi_home/translations/pt.json index 5784a6f..aef3aa5 100644 --- a/custom_components/xiaomi_home/translations/pt.json +++ b/custom_components/xiaomi_home/translations/pt.json @@ -43,9 +43,16 @@ }, "devices_filter": { "title": "Filtrar Dispositivos", - "description": "## Introdução\r\nFiltre dispositivos indesejados por família.", + "description": "## Introdução\r\n- Suporta a filtragem de dispositivos por nome de sala e tipo de dispositivo, bem como a filtragem por família.\r\n- Pode também aceder à página de configuração correspondente da integração [Configuração > Atualizar Lista de Dispositivos] para refazer a filtragem.", "data": { - "filter_mode": "Modo de Filtro" + "room_filter_mode": "Filtrar por Sala", + "room_list": "Salas", + "type_filter_mode": "Filtrar por Tipo de Dispositivo", + "type_list": "Tipos de Dispositivo", + "model_filter_mode": "Filtrar por Modelo de Dispositivo", + "model_list": "Modelos de Dispositivo", + "devices_filter_mode": "Filtrar Dispositivos", + "device_list": "Lista de Dispositivos" } } }, diff --git a/custom_components/xiaomi_home/translations/ru.json b/custom_components/xiaomi_home/translations/ru.json index 32b8def..e26f80e 100644 --- a/custom_components/xiaomi_home/translations/ru.json +++ b/custom_components/xiaomi_home/translations/ru.json @@ -43,9 +43,16 @@ }, "devices_filter": { "title": "Фильтрация устройств", - "description": "## Введение\r\nФильтруйте ненужные устройства по семьям.", + "description": "## Введение\r\n- Поддерживает фильтрацию устройств по названию комнаты и типу устройства, а также фильтрацию по уровню устройства.\r\n- Вы также можете перейти на соответствующую страницу интеграции [Настройки> Обновить список устройств], чтобы перефильтровать.", "data": { - "filter_mode": "Режим фильтрации" + "room_filter_mode": "Фильтрация по комнатам семьи", + "room_list": "Комнаты семьи", + "type_filter_mode": "Фильтрация по типу устройства", + "type_list": "Типы устройств", + "model_filter_mode": "Фильтрация по модели устройства", + "model_list": "Модели устройств", + "devices_filter_mode": "Фильтрация устройств", + "device_list": "Список устройств" } } }, diff --git a/custom_components/xiaomi_home/translations/zh-Hans.json b/custom_components/xiaomi_home/translations/zh-Hans.json index 732bd10..2d85447 100644 --- a/custom_components/xiaomi_home/translations/zh-Hans.json +++ b/custom_components/xiaomi_home/translations/zh-Hans.json @@ -43,7 +43,7 @@ }, "devices_filter": { "title": "筛选设备", - "description": "## 使用介绍\r\n#### 支持按照房间名称和设备类型筛选设备,同时也支持设备维度筛选。您也可以进入对应集成项【配置】页面重新筛选。", + "description": "## 使用介绍\r\n- 支持按照房间名称和设备类型筛选设备,同时也支持设备维度筛选。\r\n- 您也可以进入对应集成项【配置>更新设备列表】页面重新筛选。", "data": { "room_filter_mode": "筛选家庭房间", "room_list": "家庭房间", diff --git a/custom_components/xiaomi_home/translations/zh-Hant.json b/custom_components/xiaomi_home/translations/zh-Hant.json index f05dc1f..3dbc33f 100644 --- a/custom_components/xiaomi_home/translations/zh-Hant.json +++ b/custom_components/xiaomi_home/translations/zh-Hant.json @@ -43,9 +43,16 @@ }, "devices_filter": { "title": "篩選設備", - "description": "## 使用介紹\r\n按照家庭維度,過濾不需要的設備。", + "description": "## 使用介紹\r\n- 支持按照房間名稱和設備類型篩選設備,同時也支持設備維度篩選。\r\n- 您也可以進入對應集成項【配置>更新設備列表】頁面重新篩選。", "data": { - "filter_mode": "過濾模式" + "room_filter_mode": "篩選家庭房間", + "room_list": "家庭房間", + "type_filter_mode": "篩選設備類型", + "type_list": "設備類型", + "model_filter_mode": "篩選設備型號", + "model_list": "設備型號", + "devices_filter_mode": "篩選設備", + "device_list": "設備列表" } } },