1 """The Risco integration."""
3 from __future__
import annotations
5 from collections.abc
import Callable
6 from dataclasses
import dataclass, field
10 from pyrisco
import CannotConnectError, RiscoCloud, RiscoLocal, UnauthorizedError
11 from pyrisco.common
import Partition, System, Zone
33 DEFAULT_SCAN_INTERVAL,
39 from .coordinator
import RiscoDataUpdateCoordinator, RiscoEventsDataUpdateCoordinator
42 Platform.ALARM_CONTROL_PANEL,
43 Platform.BINARY_SENSOR,
47 _LOGGER = logging.getLogger(__name__)
52 """A data class for local data passed to the platforms."""
55 partition_updates: dict[int, Callable[[], Any]] = field(default_factory=dict)
59 """Return whether the entry represents an instance with local communication."""
60 return entry.data.get(CONF_TYPE) == TYPE_LOCAL
64 """Return a signal for the dispatch of a zone update."""
65 return f
"risco_zone_update_{zone_id}"
69 """Set up Risco from a config entry."""
78 concurrency = entry.options.get(CONF_CONCURRENCY, DEFAULT_CONCURRENCY)
80 data[CONF_HOST], data[CONF_PORT], data[CONF_PIN], concurrency=concurrency
85 except CannotConnectError
as error:
86 raise ConfigEntryNotReady
from error
87 except UnauthorizedError:
88 _LOGGER.exception(
"Failed to login to Risco cloud")
91 async
def _error(error: Exception) ->
None:
92 _LOGGER.error(
"Error in Risco library", exc_info=error)
93 if isinstance(error, ConnectionResetError)
and not hass.is_stopping:
94 _LOGGER.debug(
"Disconnected from panel. Reloading integration")
95 hass.async_create_task(hass.config_entries.async_reload(entry.entry_id))
97 entry.async_on_unload(risco.add_error_handler(_error))
99 async
def _default(command: str, result: str, *params: list[str]) ->
None:
101 "Unhandled update from Risco library: %s, %s, %s", command, result, params
104 entry.async_on_unload(risco.add_default_handler(_default))
108 async
def _zone(zone_id: int, zone: Zone) ->
None:
109 _LOGGER.debug(
"Risco zone update for %d", zone_id)
112 entry.async_on_unload(risco.add_zone_handler(_zone))
114 async
def _partition(partition_id: int, partition: Partition) ->
None:
115 _LOGGER.debug(
"Risco partition update for %d", partition_id)
116 callback = local_data.partition_updates.get(partition_id)
120 entry.async_on_unload(risco.add_partition_handler(_partition))
122 async
def _system(system: System) ->
None:
123 _LOGGER.debug(
"Risco system update")
126 entry.async_on_unload(risco.add_system_handler(_system))
128 entry.async_on_unload(entry.add_update_listener(_update_listener))
130 hass.data.setdefault(DOMAIN, {})
131 hass.data[DOMAIN][entry.entry_id] = local_data
132 await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
139 risco = RiscoCloud(data[CONF_USERNAME], data[CONF_PASSWORD], data[CONF_PIN])
142 except CannotConnectError
as error:
143 raise ConfigEntryNotReady
from error
144 except UnauthorizedError
as error:
145 raise ConfigEntryAuthFailed
from error
147 scan_interval = entry.options.get(CONF_SCAN_INTERVAL, DEFAULT_SCAN_INTERVAL)
149 await coordinator.async_config_entry_first_refresh()
151 hass, risco, entry.entry_id, 60
154 entry.async_on_unload(entry.add_update_listener(_update_listener))
156 hass.data.setdefault(DOMAIN, {})
157 hass.data[DOMAIN][entry.entry_id] = {
158 DATA_COORDINATOR: coordinator,
159 EVENTS_COORDINATOR: events_coordinator,
162 await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
163 await events_coordinator.async_refresh()
169 """Unload a config entry."""
170 unload_ok = await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
173 local_data: LocalData = hass.data[DOMAIN][entry.entry_id]
174 await local_data.system.disconnect()
176 hass.data[DOMAIN].pop(entry.entry_id)
182 """Handle options update."""
183 await hass.config_entries.async_reload(entry.entry_id)
None _update_listener(HomeAssistant hass, ConfigEntry entry)
bool _async_setup_local_entry(HomeAssistant hass, ConfigEntry entry)
bool async_unload_entry(HomeAssistant hass, ConfigEntry entry)
bool async_setup_entry(HomeAssistant hass, ConfigEntry entry)
str zone_update_signal(int zone_id)
bool _async_setup_cloud_entry(HomeAssistant hass, ConfigEntry entry)
bool is_local(ConfigEntry entry)
aiohttp.ClientSession async_get_clientsession(HomeAssistant hass, bool verify_ssl=True, socket.AddressFamily family=socket.AF_UNSPEC, ssl_util.SSLCipherList ssl_cipher=ssl_util.SSLCipherList.PYTHON_DEFAULT)
None async_dispatcher_send(HomeAssistant hass, str signal, *Any args)