1 """Demo platform that offers fake meteorological data."""
3 from __future__
import annotations
5 from datetime
import 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
58 config_entry: ConfigEntry,
59 async_add_entities: AddEntitiesCallback,
61 """Set up the Demo config entry."""
65 "Legacy + daily weather",
71 UnitOfTemperature.CELSIUS,
73 UnitOfSpeed.METERS_PER_SECOND,
75 [ATTR_CONDITION_RAINY, 1, 22, 15, 60],
76 [ATTR_CONDITION_RAINY, 5, 19, 8, 30],
77 [ATTR_CONDITION_CLOUDY, 0, 15, 9, 10],
78 [ATTR_CONDITION_SUNNY, 0, 12, 6, 0],
79 [ATTR_CONDITION_PARTLYCLOUDY, 2, 14, 7, 20],
80 [ATTR_CONDITION_RAINY, 15, 18, 7, 0],
81 [ATTR_CONDITION_FOG, 0.2, 21, 12, 100],
87 "Daily + hourly weather",
93 UnitOfTemperature.FAHRENHEIT,
95 UnitOfSpeed.MILES_PER_HOUR,
97 [ATTR_CONDITION_SNOWY, 2, -10, -15, 60],
98 [ATTR_CONDITION_PARTLYCLOUDY, 1, -13, -14, 25],
99 [ATTR_CONDITION_SUNNY, 0, -18, -22, 70],
100 [ATTR_CONDITION_SUNNY, 0.1, -23, -23, 90],
101 [ATTR_CONDITION_SNOWY, 4, -19, -20, 40],
102 [ATTR_CONDITION_SUNNY, 0.3, -14, -19, 0],
103 [ATTR_CONDITION_SUNNY, 0, -9, -12, 0],
106 [ATTR_CONDITION_SUNNY, 2, -10, -15, 60],
107 [ATTR_CONDITION_SUNNY, 1, -13, -14, 25],
108 [ATTR_CONDITION_SUNNY, 0, -18, -22, 70],
109 [ATTR_CONDITION_SUNNY, 0.1, -23, -23, 90],
110 [ATTR_CONDITION_SUNNY, 4, -19, -20, 40],
111 [ATTR_CONDITION_SUNNY, 0.3, -14, -19, 0],
112 [ATTR_CONDITION_SUNNY, 0, -9, -12, 0],
117 "Daily + bi-daily + hourly weather",
123 UnitOfTemperature.CELSIUS,
125 UnitOfSpeed.METERS_PER_SECOND,
127 [ATTR_CONDITION_RAINY, 1, 22, 15, 60],
128 [ATTR_CONDITION_RAINY, 5, 19, 8, 30],
129 [ATTR_CONDITION_RAINY, 0, 15, 9, 10],
130 [ATTR_CONDITION_RAINY, 0, 12, 6, 0],
131 [ATTR_CONDITION_RAINY, 2, 14, 7, 20],
132 [ATTR_CONDITION_RAINY, 15, 18, 7, 0],
133 [ATTR_CONDITION_RAINY, 0.2, 21, 12, 100],
136 [ATTR_CONDITION_CLOUDY, 1, 22, 15, 60],
137 [ATTR_CONDITION_CLOUDY, 5, 19, 8, 30],
138 [ATTR_CONDITION_CLOUDY, 0, 15, 9, 10],
139 [ATTR_CONDITION_CLOUDY, 0, 12, 6, 0],
140 [ATTR_CONDITION_CLOUDY, 2, 14, 7, 20],
141 [ATTR_CONDITION_CLOUDY, 15, 18, 7, 0],
142 [ATTR_CONDITION_CLOUDY, 0.2, 21, 12, 100],
145 [ATTR_CONDITION_RAINY, 1, 22, 15, 60,
True],
146 [ATTR_CONDITION_RAINY, 5, 19, 8, 30,
False],
147 [ATTR_CONDITION_CLOUDY, 0, 15, 9, 10,
True],
148 [ATTR_CONDITION_SUNNY, 0, 12, 6, 0,
False],
149 [ATTR_CONDITION_PARTLYCLOUDY, 2, 14, 7, 20,
True],
150 [ATTR_CONDITION_RAINY, 15, 18, 7, 0,
False],
151 [ATTR_CONDITION_FOG, 0.2, 21, 12, 100,
True],
155 "Hourly + bi-daily weather",
161 UnitOfTemperature.CELSIUS,
163 UnitOfSpeed.METERS_PER_SECOND,
166 [ATTR_CONDITION_CLOUDY, 1, 22, 15, 60],
167 [ATTR_CONDITION_CLOUDY, 5, 19, 8, 30],
168 [ATTR_CONDITION_CLOUDY, 0, 15, 9, 10],
169 [ATTR_CONDITION_CLOUDY, 0, 12, 6, 0],
170 [ATTR_CONDITION_CLOUDY, 2, 14, 7, 20],
171 [ATTR_CONDITION_CLOUDY, 15, 18, 7, 0],
172 [ATTR_CONDITION_CLOUDY, 0.2, 21, 12, 100],
175 [ATTR_CONDITION_RAINY, 1, 22, 15, 60,
True],
176 [ATTR_CONDITION_RAINY, 5, 19, 8, 30,
False],
177 [ATTR_CONDITION_CLOUDY, 0, 15, 9, 10,
True],
178 [ATTR_CONDITION_SUNNY, 0, 12, 6, 0,
False],
179 [ATTR_CONDITION_PARTLYCLOUDY, 2, 14, 7, 20,
True],
180 [ATTR_CONDITION_RAINY, 15, 18, 7, 0,
False],
181 [ATTR_CONDITION_FOG, 0.2, 21, 12, 100,
True],
185 "Daily + broken bi-daily weather",
191 UnitOfTemperature.CELSIUS,
193 UnitOfSpeed.METERS_PER_SECOND,
195 [ATTR_CONDITION_RAINY, 1, 22, 15, 60],
196 [ATTR_CONDITION_RAINY, 5, 19, 8, 30],
197 [ATTR_CONDITION_RAINY, 0, 15, 9, 10],
198 [ATTR_CONDITION_RAINY, 0, 12, 6, 0],
199 [ATTR_CONDITION_RAINY, 2, 14, 7, 20],
200 [ATTR_CONDITION_RAINY, 15, 18, 7, 0],
201 [ATTR_CONDITION_RAINY, 0.2, 21, 12, 100],
205 [ATTR_CONDITION_RAINY, 1, 22, 15, 60],
206 [ATTR_CONDITION_RAINY, 5, 19, 8, 30],
207 [ATTR_CONDITION_CLOUDY, 0, 15, 9, 10],
208 [ATTR_CONDITION_SUNNY, 0, 12, 6, 0],
209 [ATTR_CONDITION_PARTLYCLOUDY, 2, 14, 7, 20],
210 [ATTR_CONDITION_RAINY, 15, 18, 7, 0],
211 [ATTR_CONDITION_FOG, 0.2, 21, 12, 100],
219 """Representation of a weather condition."""
221 _attr_attribution =
"Powered by Home Assistant"
222 _attr_should_poll =
False
232 temperature_unit: str,
234 wind_speed_unit: str,
235 forecast_daily: list[list] |
None,
236 forecast_hourly: list[list] |
None,
237 forecast_twice_daily: list[list] |
None,
239 """Initialize the Demo weather."""
262 """Set up a timer updating the forecasts."""
264 async
def update_forecasts(_) -> None:
287 """Return the temperature."""
292 """Return the unit of measurement."""
297 """Return the humidity."""
302 """Return the wind speed."""
307 """Return the wind speed."""
312 """Return the pressure."""
317 """Return the pressure."""
322 """Return the weather condition."""
323 return CONDITION_MAP[self.
_condition_condition.lower()]
326 """Return the daily forecast."""
329 reftime = dt_util.now().replace(hour=16, minute=00)
334 datetime=reftime.isoformat(),
336 precipitation=entry[1],
337 temperature=entry[2],
339 precipitation_probability=entry[4],
342 forecast_data.append(data_dict)
347 """Return the hourly forecast."""
350 reftime = dt_util.now().replace(hour=16, minute=00)
355 datetime=reftime.isoformat(),
357 precipitation=entry[1],
358 temperature=entry[2],
360 precipitation_probability=entry[4],
363 forecast_data.append(data_dict)
368 """Return the twice daily forecast."""
371 reftime = dt_util.now().replace(hour=11, minute=00)
377 datetime=reftime.isoformat(),
379 precipitation=entry[1],
380 temperature=entry[2],
382 precipitation_probability=entry[4],
386 forecast_data.append(data_dict)
str native_temperature_unit(self)
float native_pressure(self)
list[Forecast] async_forecast_twice_daily(self)
list[Forecast] async_forecast_daily(self)
float native_temperature(self)
None async_added_to_hass(self)
float native_wind_speed(self)
list[Forecast] async_forecast_hourly(self)
str native_pressure_unit(self)
str native_wind_speed_unit(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)
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)