Home Assistant Unofficial Reference 2024.12.1
__init__.py
Go to the documentation of this file.
1 """The Mastodon integration."""
2 
3 from __future__ import annotations
4 
5 from dataclasses import dataclass
6 
7 from mastodon.Mastodon import Mastodon, MastodonError
8 
9 from homeassistant.config_entries import ConfigEntry
10 from homeassistant.const import (
11  CONF_ACCESS_TOKEN,
12  CONF_CLIENT_ID,
13  CONF_CLIENT_SECRET,
14  CONF_NAME,
15  Platform,
16 )
17 from homeassistant.core import HomeAssistant
18 from homeassistant.exceptions import ConfigEntryNotReady
19 from homeassistant.helpers import discovery
20 from homeassistant.util import slugify
21 
22 from .const import CONF_BASE_URL, DOMAIN, LOGGER
23 from .coordinator import MastodonCoordinator
24 from .utils import construct_mastodon_username, create_mastodon_client
25 
26 PLATFORMS: list[Platform] = [Platform.NOTIFY, Platform.SENSOR]
27 
28 
29 @dataclass
31  """Mastodon data type."""
32 
33  client: Mastodon
34  instance: dict
35  account: dict
36  coordinator: MastodonCoordinator
37 
38 
39 type MastodonConfigEntry = ConfigEntry[MastodonData]
40 
41 
42 async def async_setup_entry(hass: HomeAssistant, entry: MastodonConfigEntry) -> bool:
43  """Set up Mastodon from a config entry."""
44 
45  try:
46  client, instance, account = await hass.async_add_executor_job(
47  setup_mastodon,
48  entry,
49  )
50 
51  except MastodonError as ex:
52  raise ConfigEntryNotReady("Failed to connect") from ex
53 
54  assert entry.unique_id
55 
56  coordinator = MastodonCoordinator(hass, client)
57 
58  await coordinator.async_config_entry_first_refresh()
59 
60  entry.runtime_data = MastodonData(client, instance, account, coordinator)
61 
62  await discovery.async_load_platform(
63  hass,
64  Platform.NOTIFY,
65  DOMAIN,
66  {CONF_NAME: entry.title, "client": client},
67  {},
68  )
69 
70  await hass.config_entries.async_forward_entry_setups(
71  entry, [platform for platform in PLATFORMS if platform != Platform.NOTIFY]
72  )
73 
74  return True
75 
76 
77 async def async_unload_entry(hass: HomeAssistant, entry: MastodonConfigEntry) -> bool:
78  """Unload a config entry."""
79  return await hass.config_entries.async_unload_platforms(
80  entry, [platform for platform in PLATFORMS if platform != Platform.NOTIFY]
81  )
82 
83 
84 async def async_migrate_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
85  """Migrate old config."""
86 
87  if entry.version == 1 and entry.minor_version == 1:
88  # Version 1.1 had the unique_id as client_id, this isn't necessarily unique
89  LOGGER.debug("Migrating config entry from version %s", entry.version)
90 
91  try:
92  _, instance, account = await hass.async_add_executor_job(
93  setup_mastodon,
94  entry,
95  )
96  except MastodonError as ex:
97  LOGGER.error("Migration failed with error %s", ex)
98  return False
99 
100  hass.config_entries.async_update_entry(
101  entry,
102  minor_version=2,
103  unique_id=slugify(construct_mastodon_username(instance, account)),
104  )
105 
106  LOGGER.debug(
107  "Entry %s successfully migrated to version %s.%s",
108  entry.entry_id,
109  entry.version,
110  entry.minor_version,
111  )
112 
113  return True
114 
115 
116 def setup_mastodon(entry: ConfigEntry) -> tuple[Mastodon, dict, dict]:
117  """Get mastodon details."""
118  client = create_mastodon_client(
119  entry.data[CONF_BASE_URL],
120  entry.data[CONF_CLIENT_ID],
121  entry.data[CONF_CLIENT_SECRET],
122  entry.data[CONF_ACCESS_TOKEN],
123  )
124 
125  instance = client.instance()
126  account = client.account_verify_credentials()
127 
128  return client, instance, account
Mastodon create_mastodon_client(str base_url, str client_id, str client_secret, str access_token)
Definition: utils.py:12
str construct_mastodon_username(dict[str, str]|None instance, dict[str, str]|None account)
Definition: utils.py:24
bool async_setup_entry(HomeAssistant hass, MastodonConfigEntry entry)
Definition: __init__.py:42
tuple[Mastodon, dict, dict] setup_mastodon(ConfigEntry entry)
Definition: __init__.py:116
bool async_unload_entry(HomeAssistant hass, MastodonConfigEntry entry)
Definition: __init__.py:77
bool async_migrate_entry(HomeAssistant hass, ConfigEntry entry)
Definition: __init__.py:84
str slugify(str|None text, *str separator="_")
Definition: __init__.py:41