hass-core/homeassistant/components/epion/coordinator.py
Leendert Gravendeel 5011a25ea6
Add Epion integration (#107570)
* Adding initial Epion Air integration logic

* Skipping sensors with missing data

* Patching Epion integration

* Adding additional Epion measurement types

* Cleaning up logging

* Cleaning up code

* Fixing error handling for invalid Epion keys

* Adding tests and improving error handling

* Patching Epion tests

* Cleaning up Epion integration code

* Bumping Epion package and including missing files

* Moving data updates to coordinator and addressing feedback

* Improve exception handling

* Exposing model name and firmware version

* Cleaning up code according to review

* Cleaning up code according to review

* Adding check to prevent duplicate account setup

* Refactoring tests and checking for duplicates

* Cleaning up test code according to review

* Cleaning up test code

* Removing entity name overrides

* Fix code format for tests

* Adding missing newlines in JSON files

* Fixing formatting

* Updating device method to always return a device

* Updating coordinator
2024-01-16 06:39:50 +01:00

45 lines
1.6 KiB
Python

"""The Epion data coordinator."""
import logging
from typing import Any
from epion import Epion, EpionAuthenticationError, EpionConnectionError
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import ConfigEntryAuthFailed
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
from .const import REFRESH_INTERVAL
_LOGGER = logging.getLogger(__name__)
class EpionCoordinator(DataUpdateCoordinator[dict[str, Any]]):
"""Epion data update coordinator."""
def __init__(self, hass: HomeAssistant, epion_api: Epion) -> None:
"""Initialize the Epion coordinator."""
super().__init__(
hass,
_LOGGER,
name="Epion",
update_interval=REFRESH_INTERVAL,
)
self.epion_api = epion_api
async def _async_update_data(self) -> dict[str, Any]:
"""Fetch data from Epion API and construct a dictionary with device IDs as keys."""
try:
response = await self.hass.async_add_executor_job(
self.epion_api.get_current
)
except EpionAuthenticationError as err:
_LOGGER.error("Authentication error with Epion API")
raise ConfigEntryAuthFailed from err
except EpionConnectionError as err:
_LOGGER.error("Epion API connection problem")
raise UpdateFailed(f"Error communicating with API: {err}") from err
device_data = {}
for epion_device in response["devices"]:
device_data[epion_device["deviceId"]] = epion_device
return device_data