Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Feed Entity Manager Sensor support for GeoNet NZ Quakes Feeds."""
2 
3 from __future__ import annotations
4 
5 import logging
6 
7 from homeassistant.components.sensor import SensorEntity
8 from homeassistant.config_entries import ConfigEntry
9 from homeassistant.core import HomeAssistant, callback
10 from homeassistant.helpers.dispatcher import async_dispatcher_connect
11 from homeassistant.helpers.entity_platform import AddEntitiesCallback
12 from homeassistant.util import dt as dt_util
13 
14 from .const import DOMAIN, FEED
15 
16 _LOGGER = logging.getLogger(__name__)
17 
18 ATTR_STATUS = "status"
19 ATTR_LAST_UPDATE = "last_update"
20 ATTR_LAST_UPDATE_SUCCESSFUL = "last_update_successful"
21 ATTR_LAST_TIMESTAMP = "last_timestamp"
22 ATTR_CREATED = "created"
23 ATTR_UPDATED = "updated"
24 ATTR_REMOVED = "removed"
25 
26 DEFAULT_ICON = "mdi:pulse"
27 DEFAULT_UNIT_OF_MEASUREMENT = "quakes"
28 
29 # An update of this entity is not making a web request, but uses internal data only.
30 PARALLEL_UPDATES = 0
31 
32 
34  hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
35 ) -> None:
36  """Set up the GeoNet NZ Quakes Feed platform."""
37  manager = hass.data[DOMAIN][FEED][entry.entry_id]
38  sensor = GeonetnzQuakesSensor(entry.entry_id, entry.unique_id, entry.title, manager)
39  async_add_entities([sensor])
40  _LOGGER.debug("Sensor setup done")
41 
42 
44  """Status sensor for the GeoNet NZ Quakes integration."""
45 
46  _attr_should_poll = False
47 
48  def __init__(self, config_entry_id, config_unique_id, config_title, manager):
49  """Initialize entity."""
50  self._config_entry_id_config_entry_id = config_entry_id
51  self._config_unique_id_config_unique_id = config_unique_id
52  self._config_title_config_title = config_title
53  self._manager_manager = manager
54  self._status_status = None
55  self._last_update_last_update = None
56  self._last_update_successful_last_update_successful = None
57  self._last_timestamp_last_timestamp = None
58  self._total_total = None
59  self._created_created = None
60  self._updated_updated = None
61  self._removed_removed = None
62  self._remove_signal_status_remove_signal_status = None
63 
64  async def async_added_to_hass(self) -> None:
65  """Call when entity is added to hass."""
66  self._remove_signal_status_remove_signal_status = async_dispatcher_connect(
67  self.hasshass,
68  f"geonetnz_quakes_status_{self._config_entry_id}",
69  self._update_status_callback_update_status_callback,
70  )
71  _LOGGER.debug("Waiting for updates %s", self._config_entry_id_config_entry_id)
72  # First update is manual because of how the feed entity manager is updated.
73  await self.async_updateasync_update()
74 
75  async def async_will_remove_from_hass(self) -> None:
76  """Call when entity will be removed from hass."""
77  if self._remove_signal_status_remove_signal_status:
78  self._remove_signal_status_remove_signal_status()
79 
80  @callback
82  """Call status update method."""
83  _LOGGER.debug("Received status update for %s", self._config_entry_id_config_entry_id)
84  self.async_schedule_update_ha_stateasync_schedule_update_ha_state(True)
85 
86  async def async_update(self) -> None:
87  """Update this entity from the data held in the feed manager."""
88  _LOGGER.debug("Updating %s", self._config_entry_id_config_entry_id)
89  if self._manager_manager:
90  status_info = self._manager_manager.status_info()
91  if status_info:
92  self._update_from_status_info_update_from_status_info(status_info)
93 
94  def _update_from_status_info(self, status_info):
95  """Update the internal state from the provided information."""
96  self._status_status = status_info.status
97  self._last_update_last_update = (
98  dt_util.as_utc(status_info.last_update) if status_info.last_update else None
99  )
100  if status_info.last_update_successful:
101  self._last_update_successful_last_update_successful = dt_util.as_utc(
102  status_info.last_update_successful
103  )
104  else:
105  self._last_update_successful_last_update_successful = None
106  self._last_timestamp_last_timestamp = status_info.last_timestamp
107  self._total_total = status_info.total
108  self._created_created = status_info.created
109  self._updated_updated = status_info.updated
110  self._removed_removed = status_info.removed
111 
112  @property
113  def native_value(self):
114  """Return the state of the sensor."""
115  return self._total_total
116 
117  @property
118  def unique_id(self) -> str:
119  """Return a unique ID containing latitude/longitude."""
120  return self._config_unique_id_config_unique_id
121 
122  @property
123  def name(self) -> str | None:
124  """Return the name of the entity."""
125  return f"GeoNet NZ Quakes ({self._config_title})"
126 
127  @property
128  def icon(self):
129  """Return the icon to use in the frontend, if any."""
130  return DEFAULT_ICON
131 
132  @property
134  """Return the unit of measurement."""
135  return DEFAULT_UNIT_OF_MEASUREMENT
136 
137  @property
139  """Return the device state attributes."""
140  return {
141  key: value
142  for key, value in (
143  (ATTR_STATUS, self._status_status),
144  (ATTR_LAST_UPDATE, self._last_update_last_update),
145  (ATTR_LAST_UPDATE_SUCCESSFUL, self._last_update_successful_last_update_successful),
146  (ATTR_LAST_TIMESTAMP, self._last_timestamp_last_timestamp),
147  (ATTR_CREATED, self._created_created),
148  (ATTR_UPDATED, self._updated_updated),
149  (ATTR_REMOVED, self._removed_removed),
150  )
151  if value or isinstance(value, bool)
152  }
def __init__(self, config_entry_id, config_unique_id, config_title, manager)
Definition: sensor.py:48
None async_schedule_update_ha_state(self, bool force_refresh=False)
Definition: entity.py:1265
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: sensor.py:35
Callable[[], None] async_dispatcher_connect(HomeAssistant hass, str signal, Callable[..., Any] target)
Definition: dispatcher.py:103