async def async_create_miio_device_and_coordinator( hass: core.HomeAssistant, entry: config_entries.ConfigEntry): """Set up a data coordinator and one miio device to service multiple entities.""" model = entry.data[CONF_MODEL] host = entry.data[CONF_HOST] token = entry.data[CONF_TOKEN] name = entry.title device = None migrate = False if model not in MODELS_HUMIDIFIER and model not in MODELS_FAN: return _LOGGER.debug("Initializing with host %s (token %s...)", host, token[:5]) # Humidifiers if model in MODELS_HUMIDIFIER_MIOT: device = AirHumidifierMiot(host, token) migrate = True elif model in MODELS_HUMIDIFIER_MJJSQ: device = AirHumidifierMjjsq(host, token, model=model) migrate = True elif model in MODELS_HUMIDIFIER_MIIO: device = AirHumidifier(host, token, model=model) migrate = True # Airpurifiers and Airfresh elif model in MODEL_AIRPURIFIER_3C: device = AirPurifierMB4(host, token) elif model in MODELS_PURIFIER_MIOT: device = AirPurifierMiot(host, token) elif model.startswith("zhimi.airpurifier."): device = AirPurifier(host, token) elif model.startswith("zhimi.airfresh."): device = AirFresh(host, token) # Pedestal fans elif model == MODEL_FAN_P5: device = FanP5(host, token) elif model in MODELS_FAN_MIIO: device = Fan(host, token, model=model) else: _LOGGER.error( "Unsupported device found! Please create an issue at " "https://github.com/syssi/xiaomi_airpurifier/issues " "and provide the following data: %s", model, ) return if migrate: # Removing fan platform entity for humidifiers and migrate the name to the config entry for migration entity_registry = er.async_get(hass) entity_id = entity_registry.async_get_entity_id( "fan", DOMAIN, entry.unique_id) if entity_id: # This check is entities that have a platform migration only and should be removed in the future if migrate_entity_name := entity_registry.async_get( entity_id).name: hass.config_entries.async_update_entry( entry, title=migrate_entity_name) entity_registry.async_remove(entity_id)
async def async_setup_platform(hass, config, async_add_devices, discovery_info=None): """Set up the miio fan device from config.""" from miio import Device, DeviceException if DATA_KEY not in hass.data: hass.data[DATA_KEY] = {} host = config.get(CONF_HOST) name = config.get(CONF_NAME) token = config.get(CONF_TOKEN) model = config.get(CONF_MODEL) retries = config.get(CONF_RETRIES) _LOGGER.info("Initializing with host %s (token %s...)", host, token[:5]) unique_id = None if model is None: try: miio_device = Device(host, token) device_info = miio_device.info() model = device_info.model unique_id = "{}-{}".format(model, device_info.mac_address) _LOGGER.info( "%s %s %s detected", model, device_info.firmware_version, device_info.hardware_version, ) except DeviceException: raise PlatformNotReady if model in [ MODEL_FAN_V2, MODEL_FAN_V3, MODEL_FAN_SA1, MODEL_FAN_ZA1, MODEL_FAN_ZA3, MODEL_FAN_ZA4, ]: from miio import Fan fan = Fan(host, token, model=model) device = XiaomiFan(name, fan, model, unique_id, retries) elif model == MODEL_FAN_P5: from miio import FanP5 fan = FanP5(host, token, model=model) device = XiaomiFanP5(name, fan, model, unique_id, retries) else: _LOGGER.error( "Unsupported device found! Please create an issue at " "https://github.com/syssi/xiaomi_fan/issues " "and provide the following data: %s", model, ) return False hass.data[DATA_KEY][host] = device async_add_devices([device], update_before_add=True) async def async_service_handler(service): """Map services to methods on XiaomiFan.""" method = SERVICE_TO_METHOD.get(service.service) params = { key: value for key, value in service.data.items() if key != ATTR_ENTITY_ID } entity_ids = service.data.get(ATTR_ENTITY_ID) if entity_ids: devices = [ device for device in hass.data[DATA_KEY].values() if device.entity_id in entity_ids ] else: devices = hass.data[DATA_KEY].values() update_tasks = [] for device in devices: if not hasattr(device, method["method"]): continue await getattr(device, method["method"])(**params) update_tasks.append(device.async_update_ha_state(True)) if update_tasks: await asyncio.wait(update_tasks, loop=hass.loop) for air_purifier_service in SERVICE_TO_METHOD: schema = SERVICE_TO_METHOD[air_purifier_service].get( "schema", AIRPURIFIER_SERVICE_SCHEMA) hass.services.async_register(DOMAIN, air_purifier_service, async_service_handler, schema=schema)
async def async_create_miio_device_and_coordinator( hass: HomeAssistant, entry: ConfigEntry ) -> None: """Set up a data coordinator and one miio device to service multiple entities.""" model: str = entry.data[CONF_MODEL] host = entry.data[CONF_HOST] token = entry.data[CONF_TOKEN] name = entry.title device: MiioDevice | None = None migrate = False update_method = _async_update_data_default coordinator_class: type[DataUpdateCoordinator] = DataUpdateCoordinator if ( model not in MODELS_HUMIDIFIER and model not in MODELS_FAN and model not in MODELS_VACUUM and not model.startswith(ROBOROCK_GENERIC) and not model.startswith(ROCKROBO_GENERIC) ): return _LOGGER.debug("Initializing with host %s (token %s...)", host, token[:5]) # Humidifiers if model in MODELS_HUMIDIFIER_MIOT: device = AirHumidifierMiot(host, token) migrate = True elif model in MODELS_HUMIDIFIER_MJJSQ: device = AirHumidifierMjjsq(host, token, model=model) migrate = True elif model in MODELS_HUMIDIFIER_MIIO: device = AirHumidifier(host, token, model=model) migrate = True # Airpurifiers and Airfresh elif model in MODELS_PURIFIER_MIOT: device = AirPurifierMiot(host, token) elif model.startswith("zhimi.airpurifier."): device = AirPurifier(host, token) elif model.startswith("zhimi.airfresh."): device = AirFresh(host, token) elif model == MODEL_AIRFRESH_A1: device = AirFreshA1(host, token) elif model == MODEL_AIRFRESH_T2017: device = AirFreshT2017(host, token) elif ( model in MODELS_VACUUM or model.startswith(ROBOROCK_GENERIC) or model.startswith(ROCKROBO_GENERIC) ): device = RoborockVacuum(host, token) update_method = _async_update_data_vacuum coordinator_class = DataUpdateCoordinator[VacuumCoordinatorData] # Pedestal fans elif model in MODEL_TO_CLASS_MAP: device = MODEL_TO_CLASS_MAP[model](host, token) elif model in MODELS_FAN_MIIO: device = Fan(host, token, model=model) else: _LOGGER.error( "Unsupported device found! Please create an issue at " "https://github.com/syssi/xiaomi_airpurifier/issues " "and provide the following data: %s", model, ) return if migrate: # Removing fan platform entity for humidifiers and migrate the name to the config entry for migration entity_registry = er.async_get(hass) assert entry.unique_id entity_id = entity_registry.async_get_entity_id("fan", DOMAIN, entry.unique_id) if entity_id: # This check is entities that have a platform migration only and should be removed in the future if (entity := entity_registry.async_get(entity_id)) and ( migrate_entity_name := entity.name ): hass.config_entries.async_update_entry(entry, title=migrate_entity_name)
async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): """Set up the miio fan device from config.""" if DATA_KEY not in hass.data: hass.data[DATA_KEY] = {} host = config[CONF_HOST] token = config[CONF_TOKEN] name = config[CONF_NAME] model = config.get(CONF_MODEL) retries = config[CONF_RETRIES] preset_modes_override = config.get(CONF_PRESET_MODES_OVERRIDE) _LOGGER.info("Initializing with host %s (token %s...)", host, token[:5]) unique_id = None if model is None: try: miio_device = Device(host, token) device_info = await hass.async_add_executor_job(miio_device.info) model = device_info.model unique_id = f"{model}-{device_info.mac_address}" _LOGGER.info( "%s %s %s detected", model, device_info.firmware_version, device_info.hardware_version, ) except DeviceException as ex: raise PlatformNotReady from ex if model in [ MODEL_FAN_V2, MODEL_FAN_V3, MODEL_FAN_SA1, MODEL_FAN_ZA1, MODEL_FAN_ZA3, MODEL_FAN_ZA4, ]: fan = Fan(host, token, model=model) device = XiaomiFan(name, fan, model, unique_id, retries, preset_modes_override) elif model == MODEL_FAN_P5: fan = FanP5(host, token, model=model) device = XiaomiFanP5(name, fan, model, unique_id, retries, preset_modes_override) elif model == MODEL_FAN_P9: fan = FanP9(host, token, model=model) device = XiaomiFanMiot(name, fan, model, unique_id, retries, preset_modes_override) elif model == MODEL_FAN_P10: fan = FanP10(host, token, model=model) device = XiaomiFanMiot(name, fan, model, unique_id, retries, preset_modes_override) elif model in [MODEL_FAN_P11, MODEL_FAN_P15]: fan = FanP11(host, token, model=MODEL_FAN_P11) device = XiaomiFanMiot(name, fan, model, unique_id, retries, preset_modes_override) elif model == MODEL_FAN_LESHOW_SS4: fan = FanLeshow(host, token, model=model) device = XiaomiFanLeshow(name, fan, model, unique_id, retries, preset_modes_override) elif model in [MODEL_FAN_1C, MODEL_FAN_P8]: fan = Fan1C(host, token, model=model) device = XiaomiFan1C(name, fan, model, unique_id, retries, preset_modes_override) elif model == MODEL_FAN_ZA5: fan = Fan1C(host, token, model=model) device = XiaomiFanZA5(name, fan, model, unique_id, retries, preset_modes_override) else: _LOGGER.error( "Unsupported device found! Please create an issue at " "https://github.com/syssi/xiaomi_fan/issues " "and provide the following data: %s", model, ) return False hass.data[DATA_KEY][host] = device async_add_entities([device], update_before_add=True) async def async_service_handler(service): """Map services to methods on XiaomiFan.""" method = SERVICE_TO_METHOD.get(service.service) params = { key: value for key, value in service.data.items() if key != ATTR_ENTITY_ID } entity_ids = service.data.get(ATTR_ENTITY_ID) if entity_ids: devices = [ device for device in hass.data[DATA_KEY].values() if device.entity_id in entity_ids ] else: devices = hass.data[DATA_KEY].values() update_tasks = [] for device in devices: if not hasattr(device, method["method"]): continue await getattr(device, method["method"])(**params) update_tasks.append(device.async_update_ha_state(True)) if update_tasks: await asyncio.wait(update_tasks) for air_purifier_service in SERVICE_TO_METHOD: schema = SERVICE_TO_METHOD[air_purifier_service].get( "schema", AIRPURIFIER_SERVICE_SCHEMA) hass.services.async_register(DOMAIN, air_purifier_service, async_service_handler, schema=schema)
async def async_setup_entry(hass, config, async_add_devices, discovery_info=None): # pylint: disable=unused-argument, too-many-locals """Set up the miio fan device from config.""" if DATA_KEY not in hass.data: hass.data[DATA_KEY] = {} if config.data.get(CONF_HOST, None): host = config.data[CONF_HOST] token = config.data[CONF_TOKEN] else: host = config.options[CONF_HOST] token = config.options[CONF_TOKEN] model = config.options.get(CONF_MODEL) retries = config.options.get(CONF_RETRIES, DEFAULT_RETRIES) name = config.title _LOGGER.info("Initializing with host %s (token %s...)", host, token[:5]) unique_id = None try: miio_device = Device(host, token) device_info = miio_device.info() if device_info.model: model = device_info.model unique_id = "{}-{}".format(model, device_info.mac_address) _LOGGER.info( "%s %s %s detected", model, device_info.firmware_version, device_info.hardware_version, ) except DeviceException: raise PlatformNotReady if model in (MODEL_FAN_FA1, MODEL_FAN_FB1): if unique_id is None: unique_id = "{}-{}".format(model, host) fan = Fan(host, token, model=model) device = XiaomiFanFA1(name, fan, model, unique_id, retries) else: _LOGGER.error( "Unsupported device found! Please create an issue at " "https://github.com/tsunglung/xiaomi_fan_circulator/issues " "and provide the following data: %s", model, ) return False hass.data[DATA_KEY][host] = device async_add_devices([device], update_before_add=True) async def async_service_handler(service): """Map services to methods on XiaomiFan.""" method = SERVICE_TO_METHOD.get(service.service) params = { key: value for key, value in service.data.items() if key != ATTR_ENTITY_ID } entity_ids = service.data.get(ATTR_ENTITY_ID) if entity_ids: devices = [ device for device in hass.data[DATA_KEY].values() if device.entity_id in entity_ids ] else: devices = hass.data[DATA_KEY].values() update_tasks = [] for device in devices: if not hasattr(device, method["method"]): continue await getattr(device, method["method"])(**params) update_tasks.append(device.async_update_ha_state(True)) if update_tasks: await asyncio.wait(update_tasks, loop=hass.loop) for service in SERVICE_TO_METHOD: schema = SERVICE_TO_METHOD[service].get("schema", AIRPURIFIER_SERVICE_SCHEMA) hass.services.async_register(DOMAIN, service, async_service_handler, schema=schema)