Files
core/homeassistant/components/webostv/entity.py
T
2026-08-03 23:28:30 +03:00

63 lines
2.2 KiB
Python

"""Base entity for the LG webOS TV integration."""
from collections.abc import Callable, Coroutine
from functools import wraps
from typing import Any, Concatenate, cast
from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers.device_registry import DeviceInfo
from homeassistant.helpers.update_coordinator import CoordinatorEntity
from .const import DOMAIN, WEBOSTV_EXCEPTIONS
from .coordinator import WebOsTvConfigEntry, WebOsTvDataUpdateCoordinator
class WebOsTvEntity(CoordinatorEntity[WebOsTvDataUpdateCoordinator]):
"""Base entity for the LG webOS TV integration."""
_attr_has_entity_name = True
_attr_device_info: DeviceInfo
def __init__(self, entry: WebOsTvConfigEntry) -> None:
"""Initialize the entity."""
super().__init__(entry.runtime_data)
self._client = entry.runtime_data.client
self._attr_device_info = DeviceInfo(
identifiers={(DOMAIN, cast(str, entry.unique_id))},
manufacturer="LG",
name=entry.title,
)
def cmd[_EntityT: WebOsTvEntity, _R, **_P](
func: Callable[Concatenate[_EntityT, _P], Coroutine[Any, Any, _R]],
) -> Callable[Concatenate[_EntityT, _P], Coroutine[Any, Any, _R]]:
"""Catch command exceptions."""
@wraps(func)
async def cmd_wrapper(self: _EntityT, *args: _P.args, **kwargs: _P.kwargs) -> _R:
"""Wrap all command methods."""
if not self._client.tv_state.is_on and func.__name__ != "async_turn_off":
raise HomeAssistantError(
translation_domain=DOMAIN,
translation_key="device_off",
translation_placeholders={
"name": self.coordinator.name,
"func": func.__name__,
},
)
try:
return await func(self, *args, **kwargs)
except WEBOSTV_EXCEPTIONS as error:
raise HomeAssistantError(
translation_domain=DOMAIN,
translation_key="communication_error",
translation_placeholders={
"name": self.coordinator.name,
"func": func.__name__,
"error": str(error),
},
) from error
return cmd_wrapper