Home Assistant Unofficial Reference 2024.12.1
manager.py
Go to the documentation of this file.
1 """Entity manager for generic GeoJSON events."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Callable
6 from datetime import datetime
7 import logging
8 
9 from aio_geojson_generic_client import GenericFeedManager
10 from aio_geojson_generic_client.feed_entry import GenericFeedEntry
11 
12 from homeassistant.config_entries import ConfigEntry
13 from homeassistant.const import CONF_LATITUDE, CONF_LONGITUDE, CONF_RADIUS, CONF_URL
14 from homeassistant.core import HomeAssistant
15 from homeassistant.helpers import aiohttp_client
16 from homeassistant.helpers.dispatcher import async_dispatcher_send
17 from homeassistant.helpers.event import async_track_time_interval
18 
19 from .const import (
20  DEFAULT_UPDATE_INTERVAL,
21  DOMAIN,
22  SIGNAL_DELETE_ENTITY,
23  SIGNAL_UPDATE_ENTITY,
24 )
25 
26 _LOGGER = logging.getLogger(__name__)
27 
28 
30  """Feed Entity Manager for GeoJSON feeds."""
31 
32  def __init__(
33  self,
34  hass: HomeAssistant,
35  config_entry: ConfigEntry,
36  ) -> None:
37  """Initialize the GeoJSON Feed Manager."""
38  self._hass: HomeAssistant = hass
39  self.entry_id: str = config_entry.entry_id
40  websession = aiohttp_client.async_get_clientsession(hass)
41  self._feed_manager: GenericFeedManager = GenericFeedManager(
42  websession,
43  self._generate_entity_generate_entity,
44  self._update_entity_update_entity,
45  self._remove_entity_remove_entity,
46  (
47  config_entry.data[CONF_LATITUDE],
48  config_entry.data[CONF_LONGITUDE],
49  ),
50  config_entry.data[CONF_URL],
51  filter_radius=config_entry.data[CONF_RADIUS],
52  )
53  self._track_time_remove_callback_track_time_remove_callback: Callable[[], None] | None = None
54  self.listenerslisteners: list[Callable[[], None]] = []
55  self.signal_new_entity: str = (
56  f"{DOMAIN}_new_geolocation_{config_entry.entry_id}"
57  )
58 
59  async def async_init(self) -> None:
60  """Schedule initial and regular updates based on configured time interval."""
61 
62  async def update(event_time: datetime) -> None:
63  """Update."""
64  await self.async_updateasync_update()
65 
66  # Trigger updates at regular intervals.
67  self._track_time_remove_callback_track_time_remove_callback = async_track_time_interval(
68  self._hass, update, DEFAULT_UPDATE_INTERVAL
69  )
70 
71  _LOGGER.debug("Feed entity manager initialized")
72 
73  async def async_update(self) -> None:
74  """Refresh data."""
75  await self._feed_manager.update()
76  _LOGGER.debug("Feed entity manager updated")
77 
78  async def async_stop(self) -> None:
79  """Stop this feed entity manager from refreshing."""
80  for unsub_dispatcher in self.listenerslisteners:
81  unsub_dispatcher()
82  self.listenerslisteners = []
83  if self._track_time_remove_callback_track_time_remove_callback:
84  self._track_time_remove_callback_track_time_remove_callback()
85  _LOGGER.debug("Feed entity manager stopped")
86 
87  def get_entry(self, external_id: str) -> GenericFeedEntry | None:
88  """Get feed entry by external id."""
89  return self._feed_manager.feed_entries.get(external_id)
90 
91  async def _generate_entity(self, external_id: str) -> None:
92  """Generate new entity."""
94  self._hass,
95  self.signal_new_entity,
96  self,
97  external_id,
98  )
99 
100  async def _update_entity(self, external_id: str) -> None:
101  """Update entity."""
102  async_dispatcher_send(self._hass, SIGNAL_UPDATE_ENTITY.format(external_id))
103 
104  async def _remove_entity(self, external_id: str) -> None:
105  """Remove entity."""
106  async_dispatcher_send(self._hass, SIGNAL_DELETE_ENTITY.format(external_id))
GenericFeedEntry|None get_entry(self, str external_id)
Definition: manager.py:87
None __init__(self, HomeAssistant hass, ConfigEntry config_entry)
Definition: manager.py:36
IssData update(pyiss.ISS iss)
Definition: __init__.py:33
None async_dispatcher_send(HomeAssistant hass, str signal, *Any args)
Definition: dispatcher.py:193
CALLBACK_TYPE async_track_time_interval(HomeAssistant hass, Callable[[datetime], Coroutine[Any, Any, None]|None] action, timedelta interval, *str|None name=None, bool|None cancel_on_shutdown=None)
Definition: event.py:1679