Home Assistant Unofficial Reference 2024.12.1
significant_change.py
Go to the documentation of this file.
1 """Helper to test significant Vacuum state changes."""
2 
3 from __future__ import annotations
4 
5 from typing import Any
6 
7 from homeassistant.core import HomeAssistant, callback
9  check_absolute_change,
10  check_valid_float,
11 )
12 
13 from . import ATTR_BATTERY_LEVEL, ATTR_FAN_SPEED
14 
15 SIGNIFICANT_ATTRIBUTES: set[str] = {
16  ATTR_BATTERY_LEVEL,
17  ATTR_FAN_SPEED,
18 }
19 
20 
21 @callback
23  hass: HomeAssistant,
24  old_state: str,
25  old_attrs: dict,
26  new_state: str,
27  new_attrs: dict,
28  **kwargs: Any,
29 ) -> bool | None:
30  """Test if state significantly changed."""
31  if old_state != new_state:
32  return True
33 
34  old_attrs_s = set(
35  {k: v for k, v in old_attrs.items() if k in SIGNIFICANT_ATTRIBUTES}.items()
36  )
37  new_attrs_s = set(
38  {k: v for k, v in new_attrs.items() if k in SIGNIFICANT_ATTRIBUTES}.items()
39  )
40  changed_attrs: set[str] = {item[0] for item in old_attrs_s ^ new_attrs_s}
41 
42  for attr_name in changed_attrs:
43  if attr_name != ATTR_BATTERY_LEVEL:
44  return True
45 
46  old_attr_value = old_attrs.get(attr_name)
47  new_attr_value = new_attrs.get(attr_name)
48  if new_attr_value is None or not check_valid_float(new_attr_value):
49  # New attribute value is invalid, ignore it
50  continue
51 
52  if old_attr_value is None or not check_valid_float(old_attr_value):
53  # Old attribute value was invalid, we should report again
54  return True
55 
56  if check_absolute_change(old_attr_value, new_attr_value, 1.0):
57  return True
58 
59  # no significant attribute change detected
60  return False
bool|None async_check_significant_change(HomeAssistant hass, str old_state, dict old_attrs, str new_state, dict new_attrs, **Any kwargs)
bool check_absolute_change(float|None val1, float|None val2, float change)