1 """Helper to test significant Weather state changes."""
3 from __future__
import annotations
10 check_absolute_change,
15 ATTR_WEATHER_APPARENT_TEMPERATURE,
16 ATTR_WEATHER_CLOUD_COVERAGE,
17 ATTR_WEATHER_DEW_POINT,
18 ATTR_WEATHER_HUMIDITY,
20 ATTR_WEATHER_PRESSURE,
21 ATTR_WEATHER_PRESSURE_UNIT,
22 ATTR_WEATHER_TEMPERATURE,
23 ATTR_WEATHER_TEMPERATURE_UNIT,
24 ATTR_WEATHER_UV_INDEX,
25 ATTR_WEATHER_VISIBILITY,
26 ATTR_WEATHER_WIND_BEARING,
27 ATTR_WEATHER_WIND_GUST_SPEED,
28 ATTR_WEATHER_WIND_SPEED,
29 ATTR_WEATHER_WIND_SPEED_UNIT,
32 SIGNIFICANT_ATTRIBUTES: set[str] = {
33 ATTR_WEATHER_APPARENT_TEMPERATURE,
34 ATTR_WEATHER_CLOUD_COVERAGE,
35 ATTR_WEATHER_DEW_POINT,
36 ATTR_WEATHER_HUMIDITY,
38 ATTR_WEATHER_PRESSURE,
39 ATTR_WEATHER_TEMPERATURE,
40 ATTR_WEATHER_UV_INDEX,
41 ATTR_WEATHER_VISIBILITY,
42 ATTR_WEATHER_WIND_BEARING,
43 ATTR_WEATHER_WIND_GUST_SPEED,
44 ATTR_WEATHER_WIND_SPEED,
47 VALID_CARDINAL_DIRECTIONS: list[str] = [
68 """Translate a cardinal direction into azimuth angle (degrees)."""
69 if not isinstance(value, str):
73 return float(360 / 16 * VALID_CARDINAL_DIRECTIONS.index(value.lower()))
87 """Test if state significantly changed."""
89 if old_state != new_state:
93 {k: v
for k, v
in old_attrs.items()
if k
in SIGNIFICANT_ATTRIBUTES}.items()
96 {k: v
for k, v
in new_attrs.items()
if k
in SIGNIFICANT_ATTRIBUTES}.items()
98 changed_attrs: set[str] = {item[0]
for item
in old_attrs_s ^ new_attrs_s}
100 for attr_name
in changed_attrs:
101 old_attr_value = old_attrs.get(attr_name)
102 new_attr_value = new_attrs.get(attr_name)
103 absolute_change: float |
None =
None
104 if attr_name == ATTR_WEATHER_WIND_BEARING:
117 ATTR_WEATHER_APPARENT_TEMPERATURE,
118 ATTR_WEATHER_DEW_POINT,
119 ATTR_WEATHER_TEMPERATURE,
122 unit := new_attrs.get(ATTR_WEATHER_TEMPERATURE_UNIT)
123 )
is not None and unit == UnitOfTemperature.FAHRENHEIT:
124 absolute_change = 1.0
126 absolute_change = 0.5
129 ATTR_WEATHER_WIND_GUST_SPEED,
130 ATTR_WEATHER_WIND_SPEED,
133 unit := new_attrs.get(ATTR_WEATHER_WIND_SPEED_UNIT)
134 )
is None or unit
in (
135 UnitOfSpeed.KILOMETERS_PER_HOUR,
136 UnitOfSpeed.MILES_PER_HOUR,
137 UnitOfSpeed.FEET_PER_SECOND,
139 absolute_change = 1.0
140 elif unit == UnitOfSpeed.METERS_PER_SECOND:
141 absolute_change = 0.5
144 ATTR_WEATHER_CLOUD_COVERAGE,
145 ATTR_WEATHER_HUMIDITY,
147 ATTR_WEATHER_VISIBILITY,
148 ATTR_WEATHER_WIND_BEARING,
150 absolute_change = 1.0
152 if attr_name == ATTR_WEATHER_UV_INDEX:
153 absolute_change = 0.1
155 if attr_name == ATTR_WEATHER_PRESSURE:
156 if (unit := new_attrs.get(ATTR_WEATHER_PRESSURE_UNIT))
is None or unit
in (
161 absolute_change = 1.0
162 elif unit == UnitOfPressure.INHG:
163 absolute_change = 0.05
166 if absolute_change
is not None:
bool|None async_check_significant_change(HomeAssistant hass, str old_state, dict old_attrs, str new_state, dict new_attrs, **Any kwargs)
int|float|None _cardinal_to_degrees(str|float|None value)
bool check_absolute_change(float|None val1, float|None val2, float change)
bool check_valid_float(str|float value)