Refactor imap coordinator (#89759)
* Warn if the previous push wait task it taking longer than the update interval * refactor * Call _async_fetch_number_of_messages first * Add cleanup in case fetching fails * mypy * Set sensor to unknown if an error occured. * Handling invalid auth an reraise when needed * Handle invalid folder as setup error * Close IMAP stream before logout at cleanup --------- Co-authored-by: J. Nick Koston <nick@koston.org>
This commit is contained in:
parent
469dbec089
commit
5f22796b38
3 changed files with 185 additions and 64 deletions
|
@ -15,7 +15,7 @@ from homeassistant.helpers.issue_registry import IssueSeverity, async_create_iss
|
|||
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
|
||||
from homeassistant.helpers.update_coordinator import CoordinatorEntity
|
||||
|
||||
from . import ImapDataUpdateCoordinator
|
||||
from . import ImapPollingDataUpdateCoordinator, ImapPushDataUpdateCoordinator
|
||||
from .const import (
|
||||
CONF_CHARSET,
|
||||
CONF_FOLDER,
|
||||
|
@ -69,18 +69,26 @@ async def async_setup_entry(
|
|||
) -> None:
|
||||
"""Set up the Imap sensor."""
|
||||
|
||||
coordinator: ImapDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id]
|
||||
coordinator: ImapPushDataUpdateCoordinator | ImapPollingDataUpdateCoordinator = (
|
||||
hass.data[DOMAIN][entry.entry_id]
|
||||
)
|
||||
|
||||
async_add_entities([ImapSensor(coordinator)])
|
||||
|
||||
|
||||
class ImapSensor(CoordinatorEntity[ImapDataUpdateCoordinator], SensorEntity):
|
||||
class ImapSensor(
|
||||
CoordinatorEntity[ImapPushDataUpdateCoordinator | ImapPollingDataUpdateCoordinator],
|
||||
SensorEntity,
|
||||
):
|
||||
"""Representation of an IMAP sensor."""
|
||||
|
||||
_attr_icon = "mdi:email-outline"
|
||||
_attr_has_entity_name = True
|
||||
|
||||
def __init__(self, coordinator: ImapDataUpdateCoordinator) -> None:
|
||||
def __init__(
|
||||
self,
|
||||
coordinator: ImapPushDataUpdateCoordinator | ImapPollingDataUpdateCoordinator,
|
||||
) -> None:
|
||||
"""Initialize the sensor."""
|
||||
super().__init__(coordinator)
|
||||
# To be removed when YAML import is removed
|
||||
|
@ -95,11 +103,6 @@ class ImapSensor(CoordinatorEntity[ImapDataUpdateCoordinator], SensorEntity):
|
|||
)
|
||||
|
||||
@property
|
||||
def native_value(self) -> int:
|
||||
def native_value(self) -> int | None:
|
||||
"""Return the number of emails found."""
|
||||
return self.coordinator.data
|
||||
|
||||
async def async_update(self) -> None:
|
||||
"""Check for idle state before updating."""
|
||||
if not await self.coordinator.imap_client.stop_wait_server_push():
|
||||
await super().async_update()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue