1 """The elmax-cloud integration."""
3 from __future__
import annotations
5 from datetime
import timedelta
8 from elmax_api.exceptions
import ElmaxBadLoginError
9 from elmax_api.http
import Elmax, ElmaxLocal, GenericElmax
10 from elmax_api.model.panel
import PanelEntry
17 from .common
import DirectPanel, build_direct_ssl_context, get_direct_api_url
20 CONF_ELMAX_MODE_CLOUD,
21 CONF_ELMAX_MODE_DIRECT,
22 CONF_ELMAX_MODE_DIRECT_HOST,
23 CONF_ELMAX_MODE_DIRECT_PORT,
24 CONF_ELMAX_MODE_DIRECT_SSL,
25 CONF_ELMAX_MODE_DIRECT_SSL_CERT,
34 from .coordinator
import ElmaxCoordinator
36 _LOGGER = logging.getLogger(__name__)
41 ) -> tuple[GenericElmax, PanelEntry]:
43 mode = entry.data.get(CONF_ELMAX_MODE, CONF_ELMAX_MODE_CLOUD)
44 if mode == CONF_ELMAX_MODE_DIRECT:
46 host=entry.data[CONF_ELMAX_MODE_DIRECT_HOST],
47 port=entry.data[CONF_ELMAX_MODE_DIRECT_PORT],
48 use_ssl=entry.data[CONF_ELMAX_MODE_DIRECT_SSL],
50 custom_ssl_context =
None
51 custom_ssl_cert = entry.data.get(CONF_ELMAX_MODE_DIRECT_SSL_CERT)
56 panel_api_url=client_api_url,
57 panel_code=entry.data[CONF_ELMAX_PANEL_PIN],
58 ssl_context=custom_ssl_context,
63 username=entry.data[CONF_ELMAX_USERNAME],
64 password=entry.data[CONF_ELMAX_PASSWORD],
66 client.set_current_panel(
67 entry.data[CONF_ELMAX_PANEL_ID], entry.data[CONF_ELMAX_PANEL_PIN]
76 """Perform integrity checks against the cloud for panel-user association."""
78 panels = await client.list_control_panels()
79 panel = next((panel
for panel
in panels
if panel.hash == panel_id),
None)
85 f
"Panel ID {panel_id} is no longer linked to this user account"
91 """Set up elmax-cloud from a config entry."""
94 except ElmaxBadLoginError
as err:
95 raise ConfigEntryAuthFailed
from err
102 elmax_api_client=client,
104 name=f
"Elmax Cloud {entry.entry_id}",
105 update_interval=
timedelta(seconds=POLLING_SECONDS),
108 async
def _async_on_hass_stop(_: Event) ->
None:
109 """Close connection when hass stops."""
110 await coordinator.async_shutdown()
112 entry.async_on_unload(
113 hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, _async_on_hass_stop)
117 await coordinator.async_config_entry_first_refresh()
120 hass.data.setdefault(DOMAIN, {})[entry.entry_id] = coordinator
122 entry.async_on_unload(entry.add_update_listener(async_reload_entry))
125 await hass.config_entries.async_forward_entry_setups(entry, ELMAX_PLATFORMS)
130 """Handle an options update."""
131 await hass.config_entries.async_reload(entry.entry_id)
135 """Unload a config entry."""
136 unload_ok = await hass.config_entries.async_unload_platforms(entry, ELMAX_PLATFORMS)
138 hass.data[DOMAIN].pop(entry.entry_id)
ssl.SSLContext build_direct_ssl_context(str cadata)
str get_direct_api_url(str host, int port, bool use_ssl)
None async_reload_entry(HomeAssistant hass, ConfigEntry entry)
tuple[GenericElmax, PanelEntry] _load_elmax_panel_client(ConfigEntry entry)
PanelEntry _check_cloud_panel_status(Elmax client, str panel_id)
bool async_unload_entry(HomeAssistant hass, ConfigEntry entry)
bool async_setup_entry(HomeAssistant hass, ConfigEntry entry)