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