1 """Define RainMachine utilities."""
3 from __future__
import annotations
5 from collections.abc
import Iterable
6 from dataclasses
import dataclass
7 from enum
import StrEnum
14 from .const
import LOGGER
18 """Define an enum for program/zone run states."""
20 NOT_RUNNING =
"Not Running"
26 0: RunStates.NOT_RUNNING,
34 """Define an entity replacement."""
38 replacement_entity_id: str
39 breaks_in_ha_version: str
40 remove_old_entity: bool =
True
47 entity_replacement_strategies: Iterable[EntityDomainReplacementStrategy],
49 """Remove old entities and create a repairs issue with info on their replacement."""
50 ent_reg = er.async_get(hass)
51 for strategy
in entity_replacement_strategies:
55 for registry_entry
in ent_reg.entities.get_entries_for_config_entry_id(
58 if registry_entry.domain == strategy.old_domain
59 and registry_entry.unique_id == strategy.old_unique_id
64 old_entity_id = registry_entry.entity_id
65 if strategy.remove_old_entity:
66 LOGGER.debug(
'Removing old entity: "%s"', old_entity_id)
67 ent_reg.async_remove(old_entity_id)
70 def key_exists(data: dict[str, Any], search_key: str) -> bool:
71 """Return whether a key exists in a nested dict."""
72 for key, value
in data.items():
75 if isinstance(value, dict):
bool key_exists(dict[str, Any] data, str search_key)
None async_finish_entity_domain_replacements(HomeAssistant hass, ConfigEntry entry, Iterable[EntityDomainReplacementStrategy] entity_replacement_strategies)