1 """Demo platform that offers fake meteorological data."""
3 from __future__
import annotations
5 from datetime
import datetime, timedelta
9 ATTR_CONDITION_EXCEPTIONAL,
12 ATTR_CONDITION_LIGHTNING,
13 ATTR_CONDITION_LIGHTNING_RAINY,
14 ATTR_CONDITION_PARTLYCLOUDY,
15 ATTR_CONDITION_POURING,
18 ATTR_CONDITION_SNOWY_RAINY,
21 ATTR_CONDITION_WINDY_VARIANT,
33 CONDITION_CLASSES: dict[str, list[str]] = {
34 ATTR_CONDITION_CLOUDY: [],
35 ATTR_CONDITION_FOG: [],
36 ATTR_CONDITION_HAIL: [],
37 ATTR_CONDITION_LIGHTNING: [],
38 ATTR_CONDITION_LIGHTNING_RAINY: [],
39 ATTR_CONDITION_PARTLYCLOUDY: [],
40 ATTR_CONDITION_POURING: [],
41 ATTR_CONDITION_RAINY: [
"shower rain"],
42 ATTR_CONDITION_SNOWY: [],
43 ATTR_CONDITION_SNOWY_RAINY: [],
44 ATTR_CONDITION_SUNNY: [
"sunshine"],
45 ATTR_CONDITION_WINDY: [],
46 ATTR_CONDITION_WINDY_VARIANT: [],
47 ATTR_CONDITION_EXCEPTIONAL: [],
51 for cond_ha, cond_codes
in CONDITION_CLASSES.items()
52 for cond_code
in cond_codes
60 config_entry: ConfigEntry,
61 async_add_entities: AddEntitiesCallback,
63 """Set up the Demo config entry."""
73 UnitOfTemperature.CELSIUS,
75 UnitOfSpeed.METERS_PER_SECOND,
77 [ATTR_CONDITION_RAINY, 1, 22, 15, 60],
78 [ATTR_CONDITION_RAINY, 5, 19, 8, 30],
79 [ATTR_CONDITION_CLOUDY, 0, 15, 9, 10],
80 [ATTR_CONDITION_SUNNY, 0, 12, 6, 0],
81 [ATTR_CONDITION_PARTLYCLOUDY, 2, 14, 7, 20],
82 [ATTR_CONDITION_RAINY, 15, 18, 7, 0],
83 [ATTR_CONDITION_FOG, 0.2, 21, 12, 100],
95 UnitOfTemperature.FAHRENHEIT,
97 UnitOfSpeed.MILES_PER_HOUR,
99 [ATTR_CONDITION_SNOWY, 2, -10, -15, 60],
100 [ATTR_CONDITION_PARTLYCLOUDY, 1, -13, -14, 25],
101 [ATTR_CONDITION_SUNNY, 0, -18, -22, 70],
102 [ATTR_CONDITION_SUNNY, 0.1, -23, -23, 90],
103 [ATTR_CONDITION_SNOWY, 4, -19, -20, 40],
104 [ATTR_CONDITION_SUNNY, 0.3, -14, -19, 0],
105 [ATTR_CONDITION_SUNNY, 0, -9, -12, 0],
108 [ATTR_CONDITION_SUNNY, 2, -10, -15, 60],
109 [ATTR_CONDITION_SUNNY, 1, -13, -14, 25],
110 [ATTR_CONDITION_SUNNY, 0, -18, -22, 70],
111 [ATTR_CONDITION_SUNNY, 0.1, -23, -23, 90],
112 [ATTR_CONDITION_SUNNY, 4, -19, -20, 40],
113 [ATTR_CONDITION_SUNNY, 0.3, -14, -19, 0],
114 [ATTR_CONDITION_SUNNY, 0, -9, -12, 0],
117 [ATTR_CONDITION_SNOWY, 2, -10, -15, 60,
True],
118 [ATTR_CONDITION_PARTLYCLOUDY, 1, -13, -14, 25,
False],
119 [ATTR_CONDITION_SUNNY, 0, -18, -22, 70,
True],
120 [ATTR_CONDITION_SUNNY, 0.1, -23, -23, 90,
False],
121 [ATTR_CONDITION_SNOWY, 4, -19, -20, 40,
True],
122 [ATTR_CONDITION_SUNNY, 0.3, -14, -19, 0,
False],
123 [ATTR_CONDITION_SUNNY, 0, -9, -12, 0,
True],
131 """Representation of a weather condition."""
133 _attr_attribution =
"Powered by Home Assistant"
134 _attr_should_poll =
False
144 temperature_unit: str,
146 wind_speed_unit: str,
147 forecast_daily: list[list] |
None,
148 forecast_hourly: list[list] |
None,
149 forecast_twice_daily: list[list] |
None,
151 """Initialize the Demo weather."""
174 """Set up a timer updating the forecasts."""
176 async
def update_forecasts(_: datetime) ->
None:
193 self.
hasshass, update_forecasts, WEATHER_UPDATE_INTERVAL
199 """Return the temperature."""
204 """Return the unit of measurement."""
209 """Return the humidity."""
214 """Return the wind speed."""
219 """Return the wind speed."""
224 """Return the pressure."""
229 """Return the pressure."""
234 """Return the weather condition."""
235 return CONDITION_MAP[self.
_condition_condition.lower()]
238 """Return the daily forecast."""
239 reftime = dt_util.now().replace(hour=16, minute=00)
245 datetime=reftime.isoformat(),
247 precipitation=entry[1],
248 temperature=entry[2],
250 precipitation_probability=entry[4],
253 forecast_data.append(data_dict)
258 """Return the hourly forecast."""
259 reftime = dt_util.now().replace(hour=16, minute=00)
265 datetime=reftime.isoformat(),
267 precipitation=entry[1],
268 temperature=entry[2],
270 precipitation_probability=entry[4],
273 forecast_data.append(data_dict)
278 """Return the twice daily forecast."""
279 reftime = dt_util.now().replace(hour=11, minute=00)
285 datetime=reftime.isoformat(),
287 precipitation=entry[1],
288 temperature=entry[2],
290 precipitation_probability=entry[4],
294 forecast_data.append(data_dict)
list[Forecast] async_forecast_hourly(self)
list[Forecast] async_forecast_daily(self)
None async_added_to_hass(self)
None __init__(self, str name, str condition, float temperature, float humidity, float pressure, float wind_speed, str temperature_unit, str pressure_unit, str wind_speed_unit, list[list]|None forecast_daily, list[list]|None forecast_hourly, list[list]|None forecast_twice_daily)
list[Forecast] async_forecast_twice_daily(self)
str native_temperature_unit(self)
str native_pressure_unit(self)
float native_pressure(self)
float native_temperature(self)
float native_wind_speed(self)
str native_wind_speed_unit(self)
None async_update_listeners(self, Iterable[Literal["daily", "hourly", "twice_daily"]]|None forecast_types)
None async_on_remove(self, CALLBACK_TYPE func)
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
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)