Home Assistant Unofficial Reference 2024.12.1
weather.py
Go to the documentation of this file.
1 """Support for the AccuWeather service."""
2 
3 from __future__ import annotations
4 
5 from typing import cast
6 
8  ATTR_FORECAST_CLOUD_COVERAGE,
9  ATTR_FORECAST_CONDITION,
10  ATTR_FORECAST_HUMIDITY,
11  ATTR_FORECAST_NATIVE_APPARENT_TEMP,
12  ATTR_FORECAST_NATIVE_PRECIPITATION,
13  ATTR_FORECAST_NATIVE_TEMP,
14  ATTR_FORECAST_NATIVE_TEMP_LOW,
15  ATTR_FORECAST_NATIVE_WIND_GUST_SPEED,
16  ATTR_FORECAST_NATIVE_WIND_SPEED,
17  ATTR_FORECAST_PRECIPITATION_PROBABILITY,
18  ATTR_FORECAST_TIME,
19  ATTR_FORECAST_UV_INDEX,
20  ATTR_FORECAST_WIND_BEARING,
21  CoordinatorWeatherEntity,
22  Forecast,
23  WeatherEntityFeature,
24 )
25 from homeassistant.const import (
26  UnitOfLength,
27  UnitOfPrecipitationDepth,
28  UnitOfPressure,
29  UnitOfSpeed,
30  UnitOfTemperature,
31 )
32 from homeassistant.core import HomeAssistant, callback
33 from homeassistant.helpers.entity_platform import AddEntitiesCallback
34 from homeassistant.util.dt import utc_from_timestamp
35 
36 from .const import (
37  API_METRIC,
38  ATTR_DIRECTION,
39  ATTR_SPEED,
40  ATTR_VALUE,
41  ATTRIBUTION,
42  CONDITION_MAP,
43 )
44 from .coordinator import (
45  AccuWeatherConfigEntry,
46  AccuWeatherDailyForecastDataUpdateCoordinator,
47  AccuWeatherData,
48  AccuWeatherObservationDataUpdateCoordinator,
49 )
50 
51 PARALLEL_UPDATES = 1
52 
53 
55  hass: HomeAssistant,
56  entry: AccuWeatherConfigEntry,
57  async_add_entities: AddEntitiesCallback,
58 ) -> None:
59  """Add a AccuWeather weather entity from a config_entry."""
60  async_add_entities([AccuWeatherEntity(entry.runtime_data)])
61 
62 
64  CoordinatorWeatherEntity[
65  AccuWeatherObservationDataUpdateCoordinator,
66  AccuWeatherDailyForecastDataUpdateCoordinator,
67  ]
68 ):
69  """Define an AccuWeather entity."""
70 
71  _attr_has_entity_name = True
72  _attr_name = None
73 
74  def __init__(self, accuweather_data: AccuWeatherData) -> None:
75  """Initialize."""
76  super().__init__(
77  observation_coordinator=accuweather_data.coordinator_observation,
78  daily_coordinator=accuweather_data.coordinator_daily_forecast,
79  )
80 
81  self._attr_native_precipitation_unit_attr_native_precipitation_unit = UnitOfPrecipitationDepth.MILLIMETERS
82  self._attr_native_pressure_unit_attr_native_pressure_unit = UnitOfPressure.HPA
83  self._attr_native_temperature_unit_attr_native_temperature_unit = UnitOfTemperature.CELSIUS
84  self._attr_native_visibility_unit_attr_native_visibility_unit = UnitOfLength.KILOMETERS
85  self._attr_native_wind_speed_unit_attr_native_wind_speed_unit = UnitOfSpeed.KILOMETERS_PER_HOUR
86  self._attr_unique_id_attr_unique_id = accuweather_data.coordinator_observation.location_key
87  self._attr_attribution_attr_attribution = ATTRIBUTION
88  self._attr_device_info_attr_device_info = accuweather_data.coordinator_observation.device_info
89  self._attr_supported_features_attr_supported_features = WeatherEntityFeature.FORECAST_DAILY
90 
91  self.observation_coordinatorobservation_coordinator = accuweather_data.coordinator_observation
92  self.daily_coordinatordaily_coordinator = accuweather_data.coordinator_daily_forecast
93 
94  @property
95  def condition(self) -> str | None:
96  """Return the current condition."""
97  return CONDITION_MAP.get(self.observation_coordinatorobservation_coordinator.data["WeatherIcon"])
98 
99  @property
100  def cloud_coverage(self) -> float:
101  """Return the Cloud coverage in %."""
102  return cast(float, self.observation_coordinatorobservation_coordinator.data["CloudCover"])
103 
104  @property
105  def native_apparent_temperature(self) -> float:
106  """Return the apparent temperature."""
107  return cast(
108  float,
109  self.observation_coordinatorobservation_coordinator.data["ApparentTemperature"][API_METRIC][
110  ATTR_VALUE
111  ],
112  )
113 
114  @property
115  def native_temperature(self) -> float:
116  """Return the temperature."""
117  return cast(
118  float,
119  self.observation_coordinatorobservation_coordinator.data["Temperature"][API_METRIC][ATTR_VALUE],
120  )
121 
122  @property
123  def native_pressure(self) -> float:
124  """Return the pressure."""
125  return cast(
126  float, self.observation_coordinatorobservation_coordinator.data["Pressure"][API_METRIC][ATTR_VALUE]
127  )
128 
129  @property
130  def native_dew_point(self) -> float:
131  """Return the dew point."""
132  return cast(
133  float, self.observation_coordinatorobservation_coordinator.data["DewPoint"][API_METRIC][ATTR_VALUE]
134  )
135 
136  @property
137  def humidity(self) -> int:
138  """Return the humidity."""
139  return cast(int, self.observation_coordinatorobservation_coordinator.data["RelativeHumidity"])
140 
141  @property
142  def native_wind_gust_speed(self) -> float:
143  """Return the wind gust speed."""
144  return cast(
145  float,
146  self.observation_coordinatorobservation_coordinator.data["WindGust"][ATTR_SPEED][API_METRIC][
147  ATTR_VALUE
148  ],
149  )
150 
151  @property
152  def native_wind_speed(self) -> float:
153  """Return the wind speed."""
154  return cast(
155  float,
156  self.observation_coordinatorobservation_coordinator.data["Wind"][ATTR_SPEED][API_METRIC][
157  ATTR_VALUE
158  ],
159  )
160 
161  @property
162  def wind_bearing(self) -> int:
163  """Return the wind bearing."""
164  return cast(
165  int, self.observation_coordinatorobservation_coordinator.data["Wind"][ATTR_DIRECTION]["Degrees"]
166  )
167 
168  @property
169  def native_visibility(self) -> float:
170  """Return the visibility."""
171  return cast(
172  float,
173  self.observation_coordinatorobservation_coordinator.data["Visibility"][API_METRIC][ATTR_VALUE],
174  )
175 
176  @property
177  def uv_index(self) -> float:
178  """Return the UV index."""
179  return cast(float, self.observation_coordinatorobservation_coordinator.data["UVIndex"])
180 
181  @callback
182  def _async_forecast_daily(self) -> list[Forecast] | None:
183  """Return the daily forecast in native units."""
184  return [
185  {
186  ATTR_FORECAST_TIME: utc_from_timestamp(item["EpochDate"]).isoformat(),
187  ATTR_FORECAST_CLOUD_COVERAGE: item["CloudCoverDay"],
188  ATTR_FORECAST_HUMIDITY: item["RelativeHumidityDay"]["Average"],
189  ATTR_FORECAST_NATIVE_TEMP: item["TemperatureMax"][ATTR_VALUE],
190  ATTR_FORECAST_NATIVE_TEMP_LOW: item["TemperatureMin"][ATTR_VALUE],
191  ATTR_FORECAST_NATIVE_APPARENT_TEMP: item["RealFeelTemperatureMax"][
192  ATTR_VALUE
193  ],
194  ATTR_FORECAST_NATIVE_PRECIPITATION: item["TotalLiquidDay"][ATTR_VALUE],
195  ATTR_FORECAST_PRECIPITATION_PROBABILITY: item[
196  "PrecipitationProbabilityDay"
197  ],
198  ATTR_FORECAST_NATIVE_WIND_SPEED: item["WindDay"][ATTR_SPEED][
199  ATTR_VALUE
200  ],
201  ATTR_FORECAST_NATIVE_WIND_GUST_SPEED: item["WindGustDay"][ATTR_SPEED][
202  ATTR_VALUE
203  ],
204  ATTR_FORECAST_UV_INDEX: item["UVIndex"][ATTR_VALUE],
205  ATTR_FORECAST_WIND_BEARING: item["WindDay"][ATTR_DIRECTION]["Degrees"],
206  ATTR_FORECAST_CONDITION: CONDITION_MAP.get(item["IconDay"]),
207  }
208  for item in self.daily_coordinatordaily_coordinator.data
209  ]
None __init__(self, AccuWeatherData accuweather_data)
Definition: weather.py:74
None async_setup_entry(HomeAssistant hass, AccuWeatherConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: weather.py:58