1 """Helpers for LaMetric."""
3 from __future__
import annotations
5 from collections.abc
import Callable, Coroutine
6 from typing
import Any, Concatenate
8 from demetriek
import LaMetricConnectionError, LaMetricError
14 from .const
import DOMAIN
15 from .coordinator
import LaMetricDataUpdateCoordinator
16 from .entity
import LaMetricEntity
19 def lametric_exception_handler[_LaMetricEntityT: LaMetricEntity, **_P](
20 func: Callable[Concatenate[_LaMetricEntityT, _P], Coroutine[Any, Any, Any]],
21 ) -> Callable[Concatenate[_LaMetricEntityT, _P], Coroutine[Any, Any,
None]]:
22 """Decorate LaMetric calls to handle LaMetric exceptions.
24 A decorator that wraps the passed in function, catches LaMetric errors,
25 and handles the availability of the device in the data coordinator.
29 self: _LaMetricEntityT, *args: _P.args, **kwargs: _P.kwargs
32 await func(self, *args, **kwargs)
33 self.coordinator.async_update_listeners()
35 except LaMetricConnectionError
as error:
36 self.coordinator.last_update_success =
False
37 self.coordinator.async_update_listeners()
39 "Error communicating with the LaMetric device"
42 except LaMetricError
as error:
44 "Invalid response from the LaMetric device"
52 hass: HomeAssistant, device_id: str
53 ) -> LaMetricDataUpdateCoordinator:
54 """Get the LaMetric coordinator for this device ID."""
55 device_registry = dr.async_get(hass)
57 if (device_entry := device_registry.async_get(device_id))
is None:
58 raise ValueError(f
"Unknown LaMetric device ID: {device_id}")
60 for entry_id
in device_entry.config_entries:
62 (entry := hass.config_entries.async_get_entry(entry_id))
63 and entry.domain == DOMAIN
64 and entry.entry_id
in hass.data[DOMAIN]
66 coordinator: LaMetricDataUpdateCoordinator = hass.data[DOMAIN][
71 raise ValueError(f
"No coordinator for device ID: {device_id}")
LaMetricDataUpdateCoordinator async_get_coordinator_by_device_id(HomeAssistant hass, str device_id)