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:
Jan Bouwhuis 2023-03-17 22:45:15 +01:00 committed by GitHub
parent 469dbec089
commit 5f22796b38
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 185 additions and 64 deletions

View file

@ -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()