1 """DataUpdateCoordinator for the Verisure integration."""
3 from __future__
import annotations
5 from datetime
import timedelta
9 Error
as VerisureError,
10 LoginError
as VerisureLoginError,
22 from .const
import CONF_GIID, DEFAULT_SCAN_INTERVAL, DOMAIN, LOGGER
26 """A Verisure Data Update Coordinator."""
28 def __init__(self, hass: HomeAssistant, entry: ConfigEntry) ->
None:
29 """Initialize the Verisure hub."""
30 self.
imageseriesimageseries: list[dict[str, str]] = []
35 username=entry.data[CONF_EMAIL],
36 password=entry.data[CONF_PASSWORD],
37 cookie_file_name=hass.config.path(
38 STORAGE_DIR, f
"verisure_{entry.data[CONF_EMAIL]}"
43 hass, LOGGER, name=DOMAIN, update_interval=DEFAULT_SCAN_INTERVAL
47 """Login to Verisure."""
49 await self.
hasshass.async_add_executor_job(self.
verisureverisure.login_cookie)
50 except VerisureLoginError
as ex:
51 LOGGER.error(
"Credentials expired for Verisure, %s", ex)
53 except VerisureError
as ex:
54 LOGGER.error(
"Could not log in to verisure, %s", ex)
57 await self.
hasshass.async_add_executor_job(
58 self.
verisureverisure.set_giid, self.
entryentry.data[CONF_GIID]
64 """Fetch data from Verisure."""
66 await self.
hasshass.async_add_executor_job(self.
verisureverisure.update_cookie)
67 except VerisureLoginError:
68 LOGGER.debug(
"Cookie expired, acquiring new cookies")
70 await self.
hasshass.async_add_executor_job(self.
verisureverisure.login_cookie)
71 except VerisureLoginError
as ex:
72 LOGGER.error(
"Credentials expired for Verisure, %s", ex)
74 except VerisureError
as ex:
75 LOGGER.error(
"Could not log in to verisure, %s", ex)
77 except VerisureError
as ex:
80 overview = await self.
hasshass.async_add_executor_job(
90 except VerisureError
as err:
91 LOGGER.error(
"Could not read overview, %s", err)
94 def unpack(overview: list, value: str) -> dict | list:
95 unpacked: dict | list |
None = next(
97 item[
"data"][
"installation"][value]
99 if value
in item.get(
"data", {}).
get(
"installation", {})
103 return unpacked
or []
108 "alarm": unpack(overview,
"armState"),
109 "broadband": unpack(overview,
"broadband"),
111 device[
"device"][
"deviceLabel"]: device
112 for device
in unpack(overview,
"cameras")
115 device[
"device"][
"deviceLabel"]: device
116 for device
in unpack(overview,
"climates")
119 device[
"device"][
"deviceLabel"]: device
120 for device
in unpack(overview,
"doorWindows")
123 device[
"device"][
"deviceLabel"]: device
124 for device
in unpack(overview,
"smartLocks")
127 device[
"device"][
"deviceLabel"]: device
128 for device
in unpack(overview,
"smartplugs")
132 @Throttle(timedelta(seconds=60))
134 """Update the image series."""
135 image_data = self.
verisureverisure.request(self.
verisureverisure.cameras_image_series())
139 image_data.get(
"data", {})
140 .
get(
"ContentProviderMediaSearch", {})
141 .
get(
"mediaSeriesList", [])
143 for content
in series.get(
"deviceMediaList", [])
144 if content.get(
"contentType") ==
"IMAGE_JPEG"
147 @Throttle(timedelta(seconds=30))
149 """Capture a new image from a smartcam."""
150 capture_request = self.
verisureverisure.request(
151 self.
verisureverisure.camera_get_request_id(device_id)
154 capture_request.get(
"data", {})
155 .
get(
"ContentProviderCaptureImageRequest", {})
158 capture_status =
None
160 while capture_status !=
"AVAILABLE":
166 capture_data = self.
verisureverisure.request(
167 self.
verisureverisure.camera_capture(device_id, request_id)
170 capture_data.get(
"data", {})
171 .
get(
"installation", {})
172 .
get(
"cameraContentProvider", {})
173 .
get(
"captureImageRequestStatus", {})
174 .
get(
"mediaRequestStatus")
dict _async_update_data(self)
None __init__(self, HomeAssistant hass, ConfigEntry entry)
None update_smartcam_imageseries(self)
None smartcam_capture(self, str device_id)
web.Response get(self, web.Request request, str config_key)