diff --git a/homeassistant/components/rainmachine/__init__.py b/homeassistant/components/rainmachine/__init__.py index ef2713cc192..c29154a941c 100644 --- a/homeassistant/components/rainmachine/__init__.py +++ b/homeassistant/components/rainmachine/__init__.py @@ -219,10 +219,11 @@ async def async_setup_entry( # noqa: C901 """Set up RainMachine as config entry.""" websession = aiohttp_client.async_get_clientsession(hass) client = Client(session=websession) + ip_address = entry.data[CONF_IP_ADDRESS] try: await client.load_local( - entry.data[CONF_IP_ADDRESS], + ip_address, entry.data[CONF_PASSWORD], port=entry.data[CONF_PORT], use_ssl=entry.data.get(CONF_SSL, DEFAULT_SSL), @@ -238,6 +239,7 @@ async def async_setup_entry( # noqa: C901 if not entry.unique_id or is_ip_address(entry.unique_id): # If the config entry doesn't already have a unique ID, set one: entry_updates["unique_id"] = controller.mac + if CONF_DEFAULT_ZONE_RUN_TIME in entry.data: # If a zone run time exists in the config entry's data, pop it and move it to # options: @@ -252,6 +254,17 @@ async def async_setup_entry( # noqa: C901 if entry_updates: hass.config_entries.async_update_entry(entry, **entry_updates) + if entry.unique_id and controller.mac != entry.unique_id: + # If the mac address of the device does not match the unique_id + # of the config entry, it likely means the DHCP lease has expired + # and the device has been assigned a new IP address. We need to + # wait for the next discovery to find the device at its new address + # and update the config entry so we do not mix up devices. + raise ConfigEntryNotReady( + f"Unexpected device found at {ip_address}; expected {entry.unique_id}, " + f"found {controller.mac}" + ) + async def async_update(api_category: str) -> dict: """Update the appropriate API data based on a category.""" data: dict = {}