1 """Support for U.S. Geological Survey Earthquake Hazards Program Feeds."""
3 from __future__
import annotations
5 from collections.abc
import Callable
6 from datetime
import datetime, timedelta
10 from aio_geojson_usgs_earthquakes
import UsgsEarthquakeHazardsProgramFeedManager
11 from aio_geojson_usgs_earthquakes.feed_entry
import (
12 UsgsEarthquakeHazardsProgramFeedEntry,
14 import voluptuous
as vol
17 PLATFORM_SCHEMA
as GEO_LOCATION_PLATFORM_SCHEMA,
26 EVENT_HOMEASSISTANT_START,
33 async_dispatcher_connect,
34 async_dispatcher_send,
40 _LOGGER = logging.getLogger(__name__)
43 ATTR_EXTERNAL_ID =
"external_id"
44 ATTR_MAGNITUDE =
"magnitude"
46 ATTR_STATUS =
"status"
48 ATTR_UPDATED =
"updated"
50 CONF_FEED_TYPE =
"feed_type"
51 CONF_MINIMUM_MAGNITUDE =
"minimum_magnitude"
53 DEFAULT_MINIMUM_MAGNITUDE = 0.0
54 DEFAULT_RADIUS_IN_KM = 50.0
55 DEFAULT_UNIT_OF_MEASUREMENT = UnitOfLength.KILOMETERS
59 SIGNAL_DELETE_ENTITY =
"usgs_earthquakes_feed_delete_{}"
60 SIGNAL_UPDATE_ENTITY =
"usgs_earthquakes_feed_update_{}"
62 SOURCE =
"usgs_earthquakes_feed"
65 "past_hour_significant_earthquakes",
66 "past_hour_m45_earthquakes",
67 "past_hour_m25_earthquakes",
68 "past_hour_m10_earthquakes",
69 "past_hour_all_earthquakes",
70 "past_day_significant_earthquakes",
71 "past_day_m45_earthquakes",
72 "past_day_m25_earthquakes",
73 "past_day_m10_earthquakes",
74 "past_day_all_earthquakes",
75 "past_week_significant_earthquakes",
76 "past_week_m45_earthquakes",
77 "past_week_m25_earthquakes",
78 "past_week_m10_earthquakes",
79 "past_week_all_earthquakes",
80 "past_month_significant_earthquakes",
81 "past_month_m45_earthquakes",
82 "past_month_m25_earthquakes",
83 "past_month_m10_earthquakes",
84 "past_month_all_earthquakes",
87 PLATFORM_SCHEMA = GEO_LOCATION_PLATFORM_SCHEMA.extend(
89 vol.Required(CONF_FEED_TYPE): vol.In(VALID_FEED_TYPES),
90 vol.Optional(CONF_LATITUDE): cv.latitude,
91 vol.Optional(CONF_LONGITUDE): cv.longitude,
92 vol.Optional(CONF_RADIUS, default=DEFAULT_RADIUS_IN_KM): vol.Coerce(float),
94 CONF_MINIMUM_MAGNITUDE, default=DEFAULT_MINIMUM_MAGNITUDE
103 async_add_entities: AddEntitiesCallback,
104 discovery_info: DiscoveryInfoType |
None =
None,
106 """Set up the USGS Earthquake Hazards Program Feed platform."""
107 scan_interval: timedelta = config.get(CONF_SCAN_INTERVAL, SCAN_INTERVAL)
108 feed_type: str = config[CONF_FEED_TYPE]
109 coordinates: tuple[float, float] = (
110 config.get(CONF_LATITUDE, hass.config.latitude),
111 config.get(CONF_LONGITUDE, hass.config.longitude),
113 radius_in_km: float = config[CONF_RADIUS]
114 minimum_magnitude: float = config[CONF_MINIMUM_MAGNITUDE]
125 await manager.async_init()
127 async
def start_feed_manager(event=None):
128 """Start feed manager."""
129 await manager.async_update()
131 hass.bus.async_listen_once(EVENT_HOMEASSISTANT_START, start_feed_manager)
135 """Feed Entity Manager for USGS Earthquake Hazards Program feed."""
140 async_add_entities: AddEntitiesCallback,
141 scan_interval: timedelta,
142 coordinates: tuple[float, float],
145 minimum_magnitude: float,
147 """Initialize the Feed Entity Manager."""
150 websession = aiohttp_client.async_get_clientsession(hass)
158 filter_radius=radius_in_km,
159 filter_minimum_magnitude=minimum_magnitude,
165 """Schedule initial and regular updates based on configured time interval."""
167 async
def update(event_time: datetime) ->
None:
175 _LOGGER.debug(
"Feed entity manager initialized")
180 _LOGGER.debug(
"Feed entity manager updated")
183 self, external_id: str
184 ) -> UsgsEarthquakeHazardsProgramFeedEntry |
None:
185 """Get feed entry by external id."""
186 return self.
_feed_manager_feed_manager.feed_entries.get(external_id)
189 """Generate new entity."""
204 """Represents an external event with USGS Earthquake data."""
206 _attr_icon =
"mdi:pulse"
207 _attr_should_poll =
False
208 _attr_source = SOURCE
209 _attr_unit_of_measurement = DEFAULT_UNIT_OF_MEASUREMENT
212 self, feed_manager: UsgsEarthquakesFeedEntityManager, external_id: str
214 """Initialize entity with data from feed entry."""
228 """Call when entity is added to hass."""
231 SIGNAL_DELETE_ENTITY.format(self.
_external_id_external_id),
236 SIGNAL_UPDATE_ENTITY.format(self.
_external_id_external_id),
242 """Remove this entity."""
245 self.
hasshass.async_create_task(self.
async_removeasync_remove(force_remove=
True))
249 """Call update method."""
253 """Update this entity from the data held in the feed manager."""
254 _LOGGER.debug(
"Updating %s", self.
_external_id_external_id)
260 self, feed_entry: UsgsEarthquakeHazardsProgramFeedEntry
262 """Update the internal state from the provided feed entry."""
268 self.
_place_place = feed_entry.place
269 self.
_magnitude_magnitude = feed_entry.magnitude
270 self.
_time_time = feed_entry.time
271 self.
_updated_updated = feed_entry.updated
272 self.
_status_status = feed_entry.status
273 self.
_type_type = feed_entry.type
274 self.
_alert_alert = feed_entry.alert
278 """Return the device state attributes."""
283 (ATTR_PLACE, self.
_place_place),
285 (ATTR_TIME, self.
_time_time),
286 (ATTR_UPDATED, self.
_updated_updated),
287 (ATTR_STATUS, self.
_status_status),
288 (ATTR_TYPE, self.
_type_type),
289 (ATTR_ALERT, self.
_alert_alert),
291 if value
or isinstance(value, bool)
None _delete_callback(self)
None _update_callback(self)
None __init__(self, UsgsEarthquakesFeedEntityManager feed_manager, str external_id)
None async_added_to_hass(self)
None _update_from_feed(self, UsgsEarthquakeHazardsProgramFeedEntry feed_entry)
dict[str, Any] extra_state_attributes(self)
None _generate_entity(self, str external_id)
None __init__(self, HomeAssistant hass, AddEntitiesCallback async_add_entities, timedelta scan_interval, tuple[float, float] coordinates, str feed_type, float radius_in_km, float minimum_magnitude)
None _update_entity(self, str external_id)
None _remove_entity(self, str external_id)
UsgsEarthquakeHazardsProgramFeedEntry|None get_entry(self, str external_id)
None async_schedule_update_ha_state(self, bool force_refresh=False)
None async_remove(self, *bool force_remove=False)
config_entries.ConfigEntry|None get_entry(HomeAssistant hass, websocket_api.ActiveConnection connection, str entry_id, int msg_id)
IssData update(pyiss.ISS iss)
None async_setup_platform(HomeAssistant hass, ConfigType config, AddEntitiesCallback async_add_entities, DiscoveryInfoType|None discovery_info=None)
Callable[[], None] async_dispatcher_connect(HomeAssistant hass, str signal, Callable[..., Any] target)
None async_dispatcher_send(HomeAssistant hass, str signal, *Any args)
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)