Skip to content

Commit

Permalink
fix: fix lan ctrl filter logic (#303)
Browse files Browse the repository at this point in the history
* style: rename devices_filter to homes_select

* fix: fix miot_lan update_devices

* fix: async blocking call
  • Loading branch information
topsworld authored Dec 21, 2024
1 parent f87e746 commit 02ddf8d
Show file tree
Hide file tree
Showing 14 changed files with 45 additions and 42 deletions.
36 changes: 18 additions & 18 deletions custom_components/xiaomi_home/config_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -315,7 +315,7 @@ async def async_step_oauth(self, user_input=None):
_LOGGER.error('task_oauth exception, %s', error)
self._config_error_reason = str(error)
return self.async_show_progress_done(next_step_id='oauth_error')
return self.async_show_progress_done(next_step_id='devices_filter')
return self.async_show_progress_done(next_step_id='homes_select')
return self.async_show_progress(
step_id='oauth',
progress_action='oauth',
Expand Down Expand Up @@ -469,15 +469,15 @@ async def async_step_oauth_error(self, user_input=None):
errors={'base': error_reason},
)

async def async_step_devices_filter(self, user_input=None):
_LOGGER.debug('async_step_devices_filter')
async def async_step_homes_select(self, user_input=None):
_LOGGER.debug('async_step_homes_select')
try:
if user_input is None:
return await self.display_device_filter_form('')
return await self.display_homes_select_form('')

home_selected: list = user_input.get('home_infos', [])
if not home_selected:
return await self.display_device_filter_form(
return await self.display_homes_select_form(
'no_family_selected')
self._ctrl_mode = user_input.get('ctrl_mode')
for home_id, home_info in self._home_info_buffer[
Expand All @@ -495,7 +495,7 @@ async def async_step_devices_filter(self, user_input=None):
for did, dev_info in self._home_info_buffer['devices'].items()
if dev_info['home_id'] in home_selected}
if not devices_list:
return await self.display_device_filter_form('no_devices')
return await self.display_homes_select_form('no_devices')
devices_list_sort = dict(sorted(
devices_list.items(), key=lambda item:
item[1].get('home_id', '')+item[1].get('room_id', '')))
Expand All @@ -506,7 +506,7 @@ async def async_step_devices_filter(self, user_input=None):
_LOGGER.error(
'save devices async failed, %s, %s',
self._uid, self._cloud_server)
return await self.display_device_filter_form(
return await self.display_homes_select_form(
'devices_storage_failed')
if not (await self._miot_storage.update_user_config_async(
uid=self._uid, cloud_server=self._cloud_server, config={
Expand Down Expand Up @@ -535,17 +535,17 @@ async def async_step_devices_filter(self, user_input=None):
})
except Exception as err:
_LOGGER.error(
'async_step_devices_filter, %s, %s',
'async_step_homes_select, %s, %s',
err, traceback.format_exc())
raise AbortFlow(
reason='config_flow_error',
description_placeholders={
'error': f'config_flow error, {err}'}
) from err

async def display_device_filter_form(self, reason: str):
async def display_homes_select_form(self, reason: str):
return self.async_show_form(
step_id='devices_filter',
step_id='homes_select',
data_schema=vol.Schema({
vol.Required('ctrl_mode', default=DEFAULT_CTRL_MODE): vol.In(
self._miot_i18n.translate(key='config.control_mode')),
Expand Down Expand Up @@ -941,7 +941,7 @@ async def async_step_config_options(self, user_input=None):

async def async_step_update_user_info(self, user_input=None):
if not self._update_user_info:
return await self.async_step_devices_filter()
return await self.async_step_homes_select()
if not user_input:
nick_name_new = (
await self._miot_http.get_user_info_async() or {}).get(
Expand All @@ -958,9 +958,9 @@ async def async_step_update_user_info(self, user_input=None):
)

self._nick_name_new = user_input.get('nick_name')
return await self.async_step_devices_filter()
return await self.async_step_homes_select()

async def async_step_devices_filter(self, user_input=None):
async def async_step_homes_select(self, user_input=None):
if not self._update_devices:
return await self.async_step_update_trans_rules()
if not user_input:
Expand Down Expand Up @@ -1012,11 +1012,11 @@ async def async_step_devices_filter(self, user_input=None):
if home_id in home_list]

self._home_list = dict(sorted(home_list.items()))
return await self.display_device_filter_form('')
return await self.display_homes_select_form('')

self._home_selected_list = user_input.get('home_infos', [])
if not self._home_selected_list:
return await self.display_device_filter_form('no_family_selected')
return await self.display_homes_select_form('no_family_selected')
self._ctrl_mode = user_input.get('ctrl_mode')
self._home_selected_dict = {}
for home_id, home_info in self._home_info_buffer[
Expand All @@ -1029,7 +1029,7 @@ async def async_step_devices_filter(self, user_input=None):
for did, dev_info in self._home_info_buffer['devices'].items()
if dev_info['home_id'] in self._home_selected_list}
if not self._device_list:
return await self.display_device_filter_form('no_devices')
return await self.display_homes_select_form('no_devices')
# Statistics devices changed
self._devices_add = []
self._devices_remove = []
Expand All @@ -1047,9 +1047,9 @@ async def async_step_devices_filter(self, user_input=None):
self._devices_add, self._devices_remove)
return await self.async_step_update_trans_rules()

async def display_device_filter_form(self, reason: str):
async def display_homes_select_form(self, reason: str):
return self.async_show_form(
step_id='devices_filter',
step_id='homes_select',
data_schema=vol.Schema({
vol.Required(
'ctrl_mode', default=self._ctrl_mode
Expand Down
2 changes: 2 additions & 0 deletions custom_components/xiaomi_home/miot/miot_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -1028,6 +1028,7 @@ async def __on_miot_lan_state_change(self, state: bool) -> None:
self._miot_lan.update_devices(devices={
did: {
'token': info['token'],
'model': info['model'],
'connect_type': info['connect_type']}
for did, info in self._device_list_cache.items()
if 'token' in info and 'connect_type' in info
Expand Down Expand Up @@ -1291,6 +1292,7 @@ async def __refresh_cloud_devices_async(self) -> None:
self._miot_lan.update_devices(devices={
did: {
'token': info['token'],
'model': info['model'],
'connect_type': info['connect_type']}
for did, info in self._device_list_cache.items()
if 'token' in info and 'connect_type' in info
Expand Down
5 changes: 3 additions & 2 deletions custom_components/xiaomi_home/miot/miot_lan.py
Original file line number Diff line number Diff line change
Expand Up @@ -603,8 +603,9 @@ async def init_async(self) -> None:
_LOGGER.info('no valid net_ifs')
return
try:
self._profile_models = load_yaml_file(
yaml_file=gen_absolute_path(self.PROFILE_MODELS_FILE))
self._profile_models = await self._main_loop.run_in_executor(
None, load_yaml_file,
gen_absolute_path(self.PROFILE_MODELS_FILE))
except Exception as err: # pylint: disable=broad-exception-caught
_LOGGER.error('load profile models error, %s', err)
self._profile_models = {}
Expand Down
4 changes: 2 additions & 2 deletions custom_components/xiaomi_home/translations/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
"title": "Fehler bei der Anmeldung",
"description": "Klicken Sie auf \"Weiter\", um es erneut zu versuchen."
},
"devices_filter": {
"homes_select": {
"title": "Familie und Geräte auswählen",
"description": "## Gebrauchsanweisung\r\n### Steuerungsmodus\r\n- Automatisch: Wenn im lokalen Netzwerk ein verfügbarer Xiaomi-Zentralgateway vorhanden ist, wird Home Assistant bevorzugt Steuerbefehle über den Zentralgateway senden, um eine lokale Steuerung zu ermöglichen. Wenn im lokalen Netzwerk kein Zentralgateway vorhanden ist, wird versucht, Steuerbefehle über das Xiaomi-OT-Protokoll zu senden, um eine lokale Steuerung zu ermöglichen. Nur wenn die oben genannten Bedingungen für die lokale Steuerung nicht erfüllt sind, werden die Steuerbefehle über die Cloud gesendet.\r\n- Cloud: Steuerbefehle werden nur über die Cloud gesendet.\r\n### Familienimport für importierte Geräte\r\nDie Integration fügt Geräte aus den ausgewählten Familien hinzu.\r\n### Raumnamensynchronisationsmodus\r\nWenn Geräte von der Xiaomi Home App zu Home Assistant synchronisiert werden, wird die Bezeichnung des Bereichs, in dem sich die Geräte in Home Assistant befinden, nach folgenden Regeln benannt. Beachten Sie, dass das Synchronisieren von Geräten den von Xiaomi Home App festgelegten Familien- und Raum-Einstellungen nicht ändert.\r\n- Nicht synchronisieren: Das Gerät wird keinem Bereich hinzugefügt.\r\n- Andere Optionen: Der Bereich, in den das Gerät aufgenommen wird, wird nach dem Namen der Familie oder des Raums in der Xiaomi Home App benannt.\r\n### Action-Debug-Modus\r\nFür von MIoT-Spec-V2 definierte Gerätemethoden wird neben der Benachrichtigungs-Entität auch eine Texteingabe-Entität generiert. Damit können Sie bei der Fehlerbehebung Steuerbefehle an das Gerät senden.\r\n### Verstecke Nicht-Standard-Entitäten\r\nVerstecke Entitäten, die von nicht standardmäßigen MIoT-Spec-V2-Instanzen mit einem Namen beginnen, der mit einem \"*\" beginnt.\r\n\r\n \r\n### Hallo {nick_name}! Bitte wählen Sie den Steuerungsmodus der Integration sowie die Familie aus, in der sich die hinzuzufügenden Geräte befinden.",
"data": {
Expand Down Expand Up @@ -87,7 +87,7 @@
"nick_name": "Benutzername"
}
},
"devices_filter": {
"homes_select": {
"title": "Familie und Geräte neu auswählen",
"description": "## Gebrauchsanweisung\r\n### Steuerungsmodus\r\n- Automatisch: Wenn im lokalen Netzwerk ein verfügbarer Xiaomi-Zentralgateway vorhanden ist, wird Home Assistant bevorzugt Steuerbefehle über den Zentralgateway senden, um eine lokale Steuerung zu ermöglichen. Wenn im lokalen Netzwerk kein Zentralgateway vorhanden ist, wird versucht, Steuerbefehle über das Xiaomi-OT-Protokoll zu senden, um eine lokale Steuerung zu ermöglichen. Nur wenn die oben genannten Bedingungen für die lokale Steuerung nicht erfüllt sind, werden die Steuerbefehle über die Cloud gesendet.\r\n- Cloud: Steuerbefehle werden nur über die Cloud gesendet.\r\n### Familienimport für importierte Geräte\r\nDie Integration fügt Geräte aus den ausgewählten Familien hinzu.\r\n \r\n### Hallo {nick_name}! Bitte wählen Sie den Steuerungsmodus der Integration sowie die Familie aus, in der sich die hinzuzufügenden Geräte befinden.",
"data": {
Expand Down
4 changes: 2 additions & 2 deletions custom_components/xiaomi_home/translations/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
"title": "Login Error",
"description": "Click NEXT to try again."
},
"devices_filter": {
"homes_select": {
"title": "Select Home and Devices",
"description": "## Usage Instructions\r\n### Control mode\r\n- Auto: When there is an available Xiaomi central hub gateway in the local area network, Home Assistant will prioritize sending device control commands through the central hub gateway to achieve local control. If there is no central hub gateway in the local area network, it will attempt to send control commands through Xiaomi LAN control function. Only when the above local control conditions are not met, the device control commands will be sent through the cloud.\r\n- Cloud: All control commands are sent through the cloud.\r\n### Import devices from home\r\nThe integration will add devices from the selected homes.\n### Room name synchronizing mode\nWhen importing devices from Xiaomi Home APP to Home Assistant, the naming convention of the area where the device is added to is as follows. Note that the device synchronizing process does not change the home or room settings in Xiaomi Home APP.\r\n- Do not synchronize: The device will not be added to any area.\r\n- Other options: The device will be added to an area named as the home and/or room name that already exists in Xiaomi Home APP.\r\n### Debug mode for action\r\nFor the action defined in MIoT-Spec-V2 of the device, a Text entity along with a Notify entity will be created, in which you can send control commands to the device for debugging.\r\n### Hide non-standard created entities\r\nHide the entities generated from non-standard MIoT-Spec-V2 instances, whose names begin with \"*\".\r\n\r\n \r\n### Hello {nick_name}, please select the integration control mode and the home where the device you want to import.",
"data": {
Expand Down Expand Up @@ -87,7 +87,7 @@
"nick_name": "Nick Name"
}
},
"devices_filter": {
"homes_select": {
"title": "Re-select Home and Devices",
"description": "## Usage Instructions\r\n### Control mode\r\n- Auto: When there is an available Xiaomi central hub gateway in the local area network, Home Assistant will prioritize sending device control commands through the central hub gateway to achieve local control. If there is no central hub gateway in the local area network, it will attempt to send control commands through Xiaomi LAN control function. Only when the above local control conditions are not met, the device control commands will be sent through the cloud.\r\n- Cloud: All control commands are sent through the cloud.\r\n### Import devices from home\r\nThe integration will add devices from the selected homes.\r\n \r\n### Hello {nick_name}, please select the integration control mode and the home where the device you want to import.",
"data": {
Expand Down
4 changes: 2 additions & 2 deletions custom_components/xiaomi_home/translations/es.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
"title": "Error de inicio de sesión",
"description": "Haga clic en \"Siguiente\" para volver a intentarlo"
},
"devices_filter": {
"homes_select": {
"title": "Seleccionar hogares y dispositivos",
"description": "## Instrucciones de uso\r\n### Modo de control\r\n- Automático: Cuando hay un gateway central de Xiaomi disponible en la red local, Home Assistant priorizará el envío de comandos de control de dispositivos a través del gateway central para lograr un control localizado. Si no hay un gateway central en la red local, intentará enviar comandos de control a través del protocolo Xiaomi OT para lograr un control localizado. Solo cuando no se cumplan las condiciones anteriores de control localizado, los comandos de control del dispositivo se enviarán a través de la nube.\r\n- Nube: Los comandos de control solo se envían a través de la nube.\r\n### Hogares de dispositivos importados\r\nLa integración agregará los dispositivos en los hogares seleccionados.\r\n### Modo de sincronización del nombre de la habitación\r\nCuando se sincronizan los dispositivos desde la aplicación Xiaomi Home a Home Assistant, los nombres de las áreas donde se encuentran los dispositivos en Home Assistant seguirán las reglas de nomenclatura a continuación. Tenga en cuenta que el proceso de sincronización de dispositivos no cambiará la configuración de hogares y habitaciones en la aplicación Xiaomi Home.\r\n- Sin sincronización: el dispositivo no se agregará a ninguna área.\r\n- Otras opciones: la zona donde se agrega el dispositivo tendrá el mismo nombre que el hogar o la habitación en la aplicación Xiaomi Home.\r\n### Modo de depuración de Action\r\nPara los métodos definidos por MIoT-Spec-V2, además de generar una entidad de notificación, también se generará una entidad de cuadro de entrada de texto que se puede utilizar para enviar comandos de control al dispositivo durante la depuración.\r\n### Ocultar entidades generadas no estándar\r\nOcultar las entidades generadas por la instancia no estándar MIoT-Spec-V2 que comienzan con \"*\".\r\n\r\n \r\n### ¡Hola, {nick_name}! Seleccione el modo de control de integración y el hogar donde se encuentran los dispositivos que desea agregar.",
"data": {
Expand Down Expand Up @@ -87,7 +87,7 @@
"nick_name": "Apodo de usuario"
}
},
"devices_filter": {
"homes_select": {
"title": "Recomendar hogares y dispositivos",
"description": "## Instrucciones de uso\r\n### Modo de control\r\n- Automático: Cuando hay un gateway central de Xiaomi disponible en la red local, Home Assistant priorizará el envío de comandos de control de dispositivos a través del gateway central para lograr un control localizado. Si no hay un gateway central en la red local, intentará enviar comandos de control a través del protocolo Xiaomi OT para lograr un control localizado. Solo cuando no se cumplan las condiciones anteriores de control localizado, los comandos de control del dispositivo se enviarán a través de la nube.\r\n- Nube: Los comandos de control solo se envían a través de la nube.\r\n### Hogares de dispositivos importados\r\nLa integración agregará los dispositivos en los hogares seleccionados.\r\n \r\n### ¡Hola, {nick_name}! Seleccione el modo de control de integración y el hogar donde se encuentran los dispositivos que desea agregar.",
"data": {
Expand Down
Loading

0 comments on commit 02ddf8d

Please sign in to comment.