1 """Support for Canary devices."""
3 from __future__
import annotations
5 from datetime
import timedelta
7 from typing
import Final
9 from canary.api
import Api
10 from requests.exceptions
import ConnectTimeout, HTTPError
11 import voluptuous
as vol
22 CONF_FFMPEG_ARGUMENTS,
24 DATA_UNDO_UPDATE_LISTENER,
25 DEFAULT_FFMPEG_ARGUMENTS,
29 from .coordinator
import CanaryDataUpdateCoordinator
31 _LOGGER: Final = logging.getLogger(__name__)
33 MIN_TIME_BETWEEN_UPDATES: Final =
timedelta(seconds=30)
35 CONFIG_SCHEMA: Final = vol.Schema(
37 cv.deprecated(DOMAIN),
41 vol.Required(CONF_USERNAME): cv.string,
42 vol.Required(CONF_PASSWORD): cv.string,
44 CONF_TIMEOUT, default=DEFAULT_TIMEOUT
50 extra=vol.ALLOW_EXTRA,
53 PLATFORMS: Final[list[Platform]] = [
54 Platform.ALARM_CONTROL_PANEL,
60 async
def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
61 """Set up the Canary integration."""
62 hass.data.setdefault(DOMAIN, {})
64 if hass.config_entries.async_entries(DOMAIN):
67 ffmpeg_arguments = DEFAULT_FFMPEG_ARGUMENTS
68 if CAMERA_DOMAIN
in config:
70 (item
for item
in config[CAMERA_DOMAIN]
if item[
"platform"] == DOMAIN),
75 ffmpeg_arguments = camera_config.get(
76 CONF_FFMPEG_ARGUMENTS, DEFAULT_FFMPEG_ARGUMENTS
80 if ffmpeg_arguments != DEFAULT_FFMPEG_ARGUMENTS:
81 config[DOMAIN][CONF_FFMPEG_ARGUMENTS] = ffmpeg_arguments
83 hass.async_create_task(
84 hass.config_entries.flow.async_init(
86 context={
"source": SOURCE_IMPORT},
94 """Set up Canary from a config entry."""
97 CONF_FFMPEG_ARGUMENTS: entry.data.get(
98 CONF_FFMPEG_ARGUMENTS, DEFAULT_FFMPEG_ARGUMENTS
100 CONF_TIMEOUT: entry.data.get(CONF_TIMEOUT, DEFAULT_TIMEOUT),
102 hass.config_entries.async_update_entry(entry, options=options)
105 canary_api = await hass.async_add_executor_job(_get_canary_api_instance, entry)
106 except (ConnectTimeout, HTTPError)
as error:
107 _LOGGER.error(
"Unable to connect to Canary service: %s",
str(error))
108 raise ConfigEntryNotReady
from error
111 await coordinator.async_config_entry_first_refresh()
113 undo_listener = entry.add_update_listener(_async_update_listener)
115 hass.data[DOMAIN][entry.entry_id] = {
116 DATA_COORDINATOR: coordinator,
117 DATA_UNDO_UPDATE_LISTENER: undo_listener,
120 await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
126 """Unload a config entry."""
127 unload_ok = await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
130 hass.data[DOMAIN][entry.entry_id][DATA_UNDO_UPDATE_LISTENER]()
131 hass.data[DOMAIN].pop(entry.entry_id)
137 """Handle options update."""
138 await hass.config_entries.async_reload(entry.entry_id)
142 """Initialize a new instance of CanaryApi."""
144 entry.data[CONF_USERNAME],
145 entry.data[CONF_PASSWORD],
146 entry.options.get(CONF_TIMEOUT, DEFAULT_TIMEOUT),
None _async_update_listener(HomeAssistant hass, ConfigEntry entry)
bool async_setup_entry(HomeAssistant hass, ConfigEntry entry)
bool async_unload_entry(HomeAssistant hass, ConfigEntry entry)
bool async_setup(HomeAssistant hass, ConfigType config)
Api _get_canary_api_instance(ConfigEntry entry)