Home Assistant Unofficial Reference 2024.12.1
__init__.py
Go to the documentation of this file.
1 """The System Monitor integration."""
2 
3 from dataclasses import dataclass
4 import logging
5 
6 import psutil_home_assistant as ha_psutil
7 
8 from homeassistant.components.binary_sensor import DOMAIN as BINARY_SENSOR_DOMAIN
9 from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN
10 from homeassistant.config_entries import ConfigEntry
11 from homeassistant.const import Platform
12 from homeassistant.core import HomeAssistant
13 
14 from .coordinator import SystemMonitorCoordinator
15 from .util import get_all_disk_mounts
16 
17 _LOGGER = logging.getLogger(__name__)
18 
19 PLATFORMS = [Platform.BINARY_SENSOR, Platform.SENSOR]
20 
21 type SystemMonitorConfigEntry = ConfigEntry[SystemMonitorData]
22 
23 
24 @dataclass
26  """Runtime data definition."""
27 
28  coordinator: SystemMonitorCoordinator
29  psutil_wrapper: ha_psutil.PsutilWrapper
30 
31 
33  hass: HomeAssistant, entry: SystemMonitorConfigEntry
34 ) -> bool:
35  """Set up System Monitor from a config entry."""
36  psutil_wrapper = await hass.async_add_executor_job(ha_psutil.PsutilWrapper)
37 
38  disk_arguments = list(
39  await hass.async_add_executor_job(get_all_disk_mounts, hass, psutil_wrapper)
40  )
41  legacy_resources: set[str] = set(entry.options.get("resources", []))
42  for resource in legacy_resources:
43  if resource.startswith("disk_"):
44  split_index = resource.rfind("_")
45  _type = resource[:split_index]
46  argument = resource[split_index + 1 :]
47  _LOGGER.debug("Loading legacy %s with argument %s", _type, argument)
48  disk_arguments.append(argument)
49 
50  _LOGGER.debug("disk arguments to be added: %s", disk_arguments)
51 
52  coordinator: SystemMonitorCoordinator = SystemMonitorCoordinator(
53  hass, psutil_wrapper, disk_arguments
54  )
55  await coordinator.async_config_entry_first_refresh()
56  entry.runtime_data = SystemMonitorData(coordinator, psutil_wrapper)
57 
58  await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
59  entry.async_on_unload(entry.add_update_listener(update_listener))
60  return True
61 
62 
63 async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
64  """Unload System Monitor config entry."""
65  return await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
66 
67 
68 async def update_listener(hass: HomeAssistant, entry: ConfigEntry) -> None:
69  """Handle options update."""
70  await hass.config_entries.async_reload(entry.entry_id)
71 
72 
73 async def async_migrate_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
74  """Migrate old entry."""
75 
76  if entry.version > 1:
77  # This means the user has downgraded from a future version
78  return False
79 
80  if entry.version == 1 and entry.minor_version < 3:
81  new_options = {**entry.options}
82  if entry.minor_version == 1:
83  # Migration copies process sensors to binary sensors
84  # Repair will remove sensors when user submit the fix
85  if processes := entry.options.get(SENSOR_DOMAIN):
86  new_options[BINARY_SENSOR_DOMAIN] = processes
87  hass.config_entries.async_update_entry(
88  entry, options=new_options, version=1, minor_version=2
89  )
90 
91  if entry.minor_version == 2:
92  new_options = {**entry.options}
93  if SENSOR_DOMAIN in new_options:
94  new_options.pop(SENSOR_DOMAIN)
95  hass.config_entries.async_update_entry(
96  entry, options=new_options, version=1, minor_version=3
97  )
98 
99  _LOGGER.debug(
100  "Migration to version %s.%s successful", entry.version, entry.minor_version
101  )
102 
103  return True
bool async_migrate_entry(HomeAssistant hass, ConfigEntry entry)
Definition: __init__.py:73
bool async_unload_entry(HomeAssistant hass, ConfigEntry entry)
Definition: __init__.py:63
bool async_setup_entry(HomeAssistant hass, SystemMonitorConfigEntry entry)
Definition: __init__.py:34
None update_listener(HomeAssistant hass, ConfigEntry entry)
Definition: __init__.py:68