1 """Support for the OpenWeatherMap (OWM) service."""
3 from __future__
import annotations
8 SensorEntityDescription,
28 from .
import OpenweathermapConfigEntry
34 ATTR_API_FEELS_LIKE_TEMPERATURE,
36 ATTR_API_PRECIPITATION_KIND,
42 ATTR_API_VISIBILITY_DISTANCE,
44 ATTR_API_WEATHER_CODE,
45 ATTR_API_WIND_BEARING,
51 OWM_MODE_FREE_FORECAST,
53 from .coordinator
import WeatherUpdateCoordinator
55 WEATHER_SENSOR_TYPES: tuple[SensorEntityDescription, ...] = (
61 key=ATTR_API_DEW_POINT,
63 native_unit_of_measurement=UnitOfTemperature.CELSIUS,
64 device_class=SensorDeviceClass.TEMPERATURE,
65 state_class=SensorStateClass.MEASUREMENT,
68 key=ATTR_API_TEMPERATURE,
70 native_unit_of_measurement=UnitOfTemperature.CELSIUS,
71 device_class=SensorDeviceClass.TEMPERATURE,
72 state_class=SensorStateClass.MEASUREMENT,
75 key=ATTR_API_FEELS_LIKE_TEMPERATURE,
76 name=
"Feels like temperature",
77 native_unit_of_measurement=UnitOfTemperature.CELSIUS,
78 device_class=SensorDeviceClass.TEMPERATURE,
79 state_class=SensorStateClass.MEASUREMENT,
82 key=ATTR_API_WIND_SPEED,
84 native_unit_of_measurement=UnitOfSpeed.METERS_PER_SECOND,
85 device_class=SensorDeviceClass.WIND_SPEED,
86 state_class=SensorStateClass.MEASUREMENT,
89 key=ATTR_API_WIND_BEARING,
91 native_unit_of_measurement=DEGREE,
92 state_class=SensorStateClass.MEASUREMENT,
95 key=ATTR_API_HUMIDITY,
97 native_unit_of_measurement=PERCENTAGE,
98 device_class=SensorDeviceClass.HUMIDITY,
99 state_class=SensorStateClass.MEASUREMENT,
102 key=ATTR_API_PRESSURE,
104 native_unit_of_measurement=UnitOfPressure.HPA,
105 device_class=SensorDeviceClass.PRESSURE,
106 state_class=SensorStateClass.MEASUREMENT,
110 name=
"Cloud coverage",
111 native_unit_of_measurement=PERCENTAGE,
112 state_class=SensorStateClass.MEASUREMENT,
117 native_unit_of_measurement=UnitOfVolumetricFlux.MILLIMETERS_PER_HOUR,
118 device_class=SensorDeviceClass.PRECIPITATION_INTENSITY,
119 state_class=SensorStateClass.MEASUREMENT,
124 native_unit_of_measurement=UnitOfVolumetricFlux.MILLIMETERS_PER_HOUR,
125 device_class=SensorDeviceClass.PRECIPITATION_INTENSITY,
126 state_class=SensorStateClass.MEASUREMENT,
129 key=ATTR_API_PRECIPITATION_KIND,
130 name=
"Precipitation kind",
133 key=ATTR_API_UV_INDEX,
135 native_unit_of_measurement=UV_INDEX,
136 state_class=SensorStateClass.MEASUREMENT,
139 key=ATTR_API_VISIBILITY_DISTANCE,
141 native_unit_of_measurement=UnitOfLength.METERS,
142 device_class=SensorDeviceClass.DISTANCE,
143 state_class=SensorStateClass.MEASUREMENT,
146 key=ATTR_API_CONDITION,
150 key=ATTR_API_WEATHER_CODE,
158 config_entry: OpenweathermapConfigEntry,
159 async_add_entities: AddEntitiesCallback,
161 """Set up OpenWeatherMap sensor entities based on a config entry."""
162 domain_data = config_entry.runtime_data
163 name = domain_data.name
164 weather_coordinator = domain_data.coordinator
166 if domain_data.mode == OWM_MODE_FREE_FORECAST:
167 entity_registry = er.async_get(hass)
168 entries = er.async_entries_for_config_entry(
169 entity_registry, config_entry.entry_id
171 for entry
in entries:
172 entity_registry.async_remove(entry.entity_id)
177 f
"{config_entry.unique_id}-{description.key}",
181 for description
in WEATHER_SENSOR_TYPES
186 """Abstract class for an OpenWeatherMap sensor."""
188 _attr_should_poll =
False
189 _attr_attribution = ATTRIBUTION
195 description: SensorEntityDescription,
196 coordinator: DataUpdateCoordinator,
198 """Initialize the sensor."""
204 split_unique_id = unique_id.split(
"-")
206 entry_type=DeviceEntryType.SERVICE,
207 identifiers={(DOMAIN, f
"{split_unique_id[0]}-{split_unique_id[1]}")},
208 manufacturer=MANUFACTURER,
214 """Return True if entity is available."""
215 return self.
_coordinator_coordinator.last_update_success
218 """Connect to dispatcher listening for entity data notifications."""
224 """Get the latest data from OWM and updates the states."""
225 await self.
_coordinator_coordinator.async_request_refresh()
229 """Implementation of an OpenWeatherMap sensor."""
235 description: SensorEntityDescription,
236 weather_coordinator: WeatherUpdateCoordinator,
238 """Initialize the sensor."""
239 super().
__init__(name, unique_id, description, weather_coordinator)
244 """Return the state of the device."""
None __init__(self, str name, str unique_id, SensorEntityDescription description, DataUpdateCoordinator coordinator)
None async_added_to_hass(self)
None __init__(self, str name, str unique_id, SensorEntityDescription description, WeatherUpdateCoordinator weather_coordinator)
StateType native_value(self)
None async_write_ha_state(self)
None async_on_remove(self, CALLBACK_TYPE func)
web.Response get(self, web.Request request, str config_key)
None async_add_listener(HomeAssistant hass, Callable[[], None] listener)
None async_setup_entry(HomeAssistant hass, OpenweathermapConfigEntry config_entry, AddEntitiesCallback async_add_entities)