Home Assistant Unofficial Reference 2024.12.1
__init__.py
Go to the documentation of this file.
1 """The Flipr integration."""
2 
3 from collections import Counter
4 from dataclasses import dataclass
5 import logging
6 
7 from flipr_api import FliprAPIRestClient
8 
9 from homeassistant.config_entries import ConfigEntry
10 from homeassistant.const import CONF_EMAIL, CONF_PASSWORD, Platform
11 from homeassistant.core import HomeAssistant
12 from homeassistant.exceptions import ConfigEntryError
13 from homeassistant.helpers import issue_registry as ir
14 
15 from .const import DOMAIN
16 from .coordinator import FliprDataUpdateCoordinator, FliprHubDataUpdateCoordinator
17 
18 PLATFORMS = [Platform.BINARY_SENSOR, Platform.SELECT, Platform.SENSOR, Platform.SWITCH]
19 
20 _LOGGER = logging.getLogger(__name__)
21 
22 
23 @dataclass
24 class FliprData:
25  """The Flipr data class."""
26 
27  flipr_coordinators: list[FliprDataUpdateCoordinator]
28  hub_coordinators: list[FliprHubDataUpdateCoordinator]
29 
30 
31 type FliprConfigEntry = ConfigEntry[FliprData]
32 
33 
34 async def async_setup_entry(hass: HomeAssistant, entry: FliprConfigEntry) -> bool:
35  """Set up flipr from a config entry."""
36 
37  # Detect invalid old config entry and raise error if found
39 
40  config = entry.data
41 
42  username = config[CONF_EMAIL]
43  password = config[CONF_PASSWORD]
44 
45  _LOGGER.debug("Initializing Flipr client %s", username)
46  client = FliprAPIRestClient(username, password)
47  ids = await hass.async_add_executor_job(client.search_all_ids)
48 
49  _LOGGER.debug("List of devices ids : %s", ids)
50 
51  flipr_coordinators = []
52  for flipr_id in ids["flipr"]:
53  flipr_coordinator = FliprDataUpdateCoordinator(hass, client, flipr_id)
54  await flipr_coordinator.async_config_entry_first_refresh()
55  flipr_coordinators.append(flipr_coordinator)
56 
57  hub_coordinators = []
58  for hub_id in ids["hub"]:
59  hub_coordinator = FliprHubDataUpdateCoordinator(hass, client, hub_id)
60  await hub_coordinator.async_config_entry_first_refresh()
61  hub_coordinators.append(hub_coordinator)
62 
63  entry.runtime_data = FliprData(flipr_coordinators, hub_coordinators)
64 
65  await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
66 
67  return True
68 
69 
70 async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
71  """Unload a config entry."""
72 
73  return await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
74 
75 
76 def detect_invalid_old_configuration(hass: HomeAssistant, entry: ConfigEntry):
77  """Detect invalid old configuration and raise error if found."""
78 
79  def find_duplicate_entries(entries):
80  values = [e.data["email"] for e in entries]
81  _LOGGER.debug("Detecting duplicates in values : %s", values)
82  return any(count > 1 for count in Counter(values).values())
83 
84  entries = hass.config_entries.async_entries(DOMAIN)
85 
86  if find_duplicate_entries(entries):
87  ir.async_create_issue(
88  hass,
89  DOMAIN,
90  "duplicate_config",
91  breaks_in_ha_version="2025.4.0",
92  is_fixable=False,
93  severity=ir.IssueSeverity.ERROR,
94  translation_key="duplicate_config",
95  )
96 
97  raise ConfigEntryError(
98  "Duplicate entries found for flipr with the same user email. Please remove one of it manually. Multiple fliprs will be automatically detected after restart."
99  )
100 
101 
102 async def async_migrate_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
103  """Migrate config entry."""
104  _LOGGER.debug("Migration of flipr config from version %s", entry.version)
105 
106  if entry.version == 1:
107  # In version 1, we have flipr device as config entry unique id
108  # and one device per config entry.
109  # We need to migrate to a new config entry that may contain multiple devices.
110  # So we change the entry data to match config_flow evolution.
111  login = entry.data[CONF_EMAIL]
112 
113  hass.config_entries.async_update_entry(entry, version=2, unique_id=login)
114 
115  _LOGGER.debug("Migration of flipr config to version 2 successful")
116 
117  return True
bool async_unload_entry(HomeAssistant hass, ConfigEntry entry)
Definition: __init__.py:70
bool async_setup_entry(HomeAssistant hass, FliprConfigEntry entry)
Definition: __init__.py:34
bool async_migrate_entry(HomeAssistant hass, ConfigEntry entry)
Definition: __init__.py:102
def detect_invalid_old_configuration(HomeAssistant hass, ConfigEntry entry)
Definition: __init__.py:76