Home Assistant Unofficial Reference 2024.12.1
__init__.py
Go to the documentation of this file.
1 """Support for Netgear LTE modems."""
2 
3 from typing import Any
4 
5 from aiohttp.cookiejar import CookieJar
6 import eternalegypt
7 from eternalegypt.eternalegypt import SMS
8 
9 from homeassistant.config_entries import ConfigEntry, ConfigEntryState
10 from homeassistant.const import CONF_HOST, CONF_NAME, CONF_PASSWORD, Platform
11 from homeassistant.core import HomeAssistant
12 from homeassistant.exceptions import ConfigEntryNotReady
13 from homeassistant.helpers import config_validation as cv, discovery
14 from homeassistant.helpers.aiohttp_client import async_create_clientsession
15 from homeassistant.helpers.typing import ConfigType
16 
17 from .const import (
18  ATTR_FROM,
19  ATTR_HOST,
20  ATTR_MESSAGE,
21  ATTR_SMS_ID,
22  DATA_HASS_CONFIG,
23  DATA_SESSION,
24  DOMAIN,
25 )
26 from .coordinator import NetgearLTEDataUpdateCoordinator
27 from .services import async_setup_services
28 
29 EVENT_SMS = "netgear_lte_sms"
30 
31 ALL_SENSORS = [
32  "sms",
33  "sms_total",
34  "usage",
35  "radio_quality",
36  "rx_level",
37  "tx_level",
38  "upstream",
39  "connection_text",
40  "connection_type",
41  "current_ps_service_type",
42  "register_network_display",
43  "current_band",
44  "cell_id",
45 ]
46 
47 ALL_BINARY_SENSORS = [
48  "roaming",
49  "wire_connected",
50  "mobile_connected",
51 ]
52 
53 PLATFORMS = [
54  Platform.BINARY_SENSOR,
55  Platform.NOTIFY,
56  Platform.SENSOR,
57 ]
58 type NetgearLTEConfigEntry = ConfigEntry[NetgearLTEDataUpdateCoordinator]
59 
60 CONFIG_SCHEMA = cv.empty_config_schema(DOMAIN)
61 
62 
63 async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
64  """Set up Netgear LTE component."""
65  hass.data[DATA_HASS_CONFIG] = config
66 
67  return True
68 
69 
70 async def async_setup_entry(hass: HomeAssistant, entry: NetgearLTEConfigEntry) -> bool:
71  """Set up Netgear LTE from a config entry."""
72  host = entry.data[CONF_HOST]
73  password = entry.data[CONF_PASSWORD]
74 
75  data: dict[str, Any] = hass.data.setdefault(DOMAIN, {})
76  if not (session := data.get(DATA_SESSION)) or session.closed:
77  session = async_create_clientsession(hass, cookie_jar=CookieJar(unsafe=True))
78  modem = eternalegypt.Modem(hostname=host, websession=session)
79 
80  try:
81  await modem.login(password=password)
82  except eternalegypt.Error as ex:
83  raise ConfigEntryNotReady("Cannot connect/authenticate") from ex
84 
85  def fire_sms_event(sms: SMS) -> None:
86  """Send an SMS event."""
87  data = {
88  ATTR_HOST: modem.hostname,
89  ATTR_SMS_ID: sms.id,
90  ATTR_FROM: sms.sender,
91  ATTR_MESSAGE: sms.message,
92  }
93  hass.bus.async_fire(EVENT_SMS, data)
94 
95  await modem.add_sms_listener(fire_sms_event)
96 
97  coordinator = NetgearLTEDataUpdateCoordinator(hass, modem)
98  await coordinator.async_config_entry_first_refresh()
99  entry.runtime_data = coordinator
100 
101  await async_setup_services(hass, modem)
102 
103  await discovery.async_load_platform(
104  hass,
105  Platform.NOTIFY,
106  DOMAIN,
107  {CONF_NAME: entry.title, "modem": modem},
108  hass.data[DATA_HASS_CONFIG],
109  )
110 
111  await hass.config_entries.async_forward_entry_setups(
112  entry, [platform for platform in PLATFORMS if platform != Platform.NOTIFY]
113  )
114 
115  return True
116 
117 
118 async def async_unload_entry(hass: HomeAssistant, entry: NetgearLTEConfigEntry) -> bool:
119  """Unload a config entry."""
120  unload_ok = await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
121  loaded_entries = [
122  entry
123  for entry in hass.config_entries.async_entries(DOMAIN)
124  if entry.state == ConfigEntryState.LOADED
125  ]
126  if len(loaded_entries) == 1:
127  hass.data.pop(DOMAIN, None)
128  for service_name in hass.services.async_services()[DOMAIN]:
129  hass.services.async_remove(DOMAIN, service_name)
130 
131  return unload_ok
None async_setup_services(HomeAssistant hass)
Definition: __init__.py:72
bool async_unload_entry(HomeAssistant hass, NetgearLTEConfigEntry entry)
Definition: __init__.py:118
bool async_setup(HomeAssistant hass, ConfigType config)
Definition: __init__.py:63
bool async_setup_entry(HomeAssistant hass, NetgearLTEConfigEntry entry)
Definition: __init__.py:70
aiohttp.ClientSession async_create_clientsession()
Definition: coordinator.py:51