core/homeassistant/components/peblar/helpers.py

56 lines
1.8 KiB
Python

"""Helpers for Peblar."""
from __future__ import annotations
from collections.abc import Callable, Coroutine
from typing import Any, Concatenate
from peblar import PeblarAuthenticationError, PeblarConnectionError, PeblarError
from homeassistant.exceptions import HomeAssistantError
from .const import DOMAIN
from .entity import PeblarEntity
def peblar_exception_handler[_PeblarEntityT: PeblarEntity, **_P](
func: Callable[Concatenate[_PeblarEntityT, _P], Coroutine[Any, Any, Any]],
) -> Callable[Concatenate[_PeblarEntityT, _P], Coroutine[Any, Any, None]]:
"""Decorate Peblar calls to handle exceptions.
A decorator that wraps the passed in function, catches Peblar errors.
"""
async def handler(
self: _PeblarEntityT, *args: _P.args, **kwargs: _P.kwargs
) -> None:
try:
await func(self, *args, **kwargs)
self.coordinator.async_update_listeners()
except PeblarAuthenticationError as error:
# Reload the config entry to trigger reauth flow
self.hass.config_entries.async_schedule_reload(
self.coordinator.config_entry.entry_id
)
raise HomeAssistantError(
translation_domain=DOMAIN,
translation_key="authentication_error",
) from error
except PeblarConnectionError as error:
raise HomeAssistantError(
translation_domain=DOMAIN,
translation_key="communication_error",
translation_placeholders={"error": str(error)},
) from error
except PeblarError as error:
raise HomeAssistantError(
translation_domain=DOMAIN,
translation_key="unknown_error",
translation_placeholders={"error": str(error)},
) from error
return handler