Home Assistant Unofficial Reference 2024.12.1
significant_change.py
Go to the documentation of this file.
1 """Helper to test significant Humidifier 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_ACTION, ATTR_CURRENT_HUMIDITY, ATTR_HUMIDITY, ATTR_MODE
14 
15 SIGNIFICANT_ATTRIBUTES: set[str] = {
16  ATTR_ACTION,
17  ATTR_CURRENT_HUMIDITY,
18  ATTR_HUMIDITY,
19  ATTR_MODE,
20 }
21 
22 
23 @callback
25  hass: HomeAssistant,
26  old_state: str,
27  old_attrs: dict,
28  new_state: str,
29  new_attrs: dict,
30  **kwargs: Any,
31 ) -> bool | None:
32  """Test if state significantly changed."""
33  if old_state != new_state:
34  return True
35 
36  old_attrs_s = set(
37  {k: v for k, v in old_attrs.items() if k in SIGNIFICANT_ATTRIBUTES}.items()
38  )
39  new_attrs_s = set(
40  {k: v for k, v in new_attrs.items() if k in SIGNIFICANT_ATTRIBUTES}.items()
41  )
42  changed_attrs: set[str] = {item[0] for item in old_attrs_s ^ new_attrs_s}
43 
44  for attr_name in changed_attrs:
45  if attr_name in [ATTR_ACTION, ATTR_MODE]:
46  return True
47 
48  old_attr_value = old_attrs.get(attr_name)
49  new_attr_value = new_attrs.get(attr_name)
50  if new_attr_value is None or not check_valid_float(new_attr_value):
51  # New attribute value is invalid, ignore it
52  continue
53 
54  if old_attr_value is None or not check_valid_float(old_attr_value):
55  # Old attribute value was invalid, we should report again
56  return True
57 
58  if check_absolute_change(old_attr_value, new_attr_value, 1.0):
59  return True
60 
61  # no significant attribute change detected
62  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)