Home Assistant Unofficial Reference 2024.12.1
binary_sensor.py
Go to the documentation of this file.
1 """Support for OpenUV binary sensors."""
2 
4  BinarySensorEntity,
5  BinarySensorEntityDescription,
6 )
7 from homeassistant.config_entries import ConfigEntry
8 from homeassistant.core import HomeAssistant, callback
9 from homeassistant.helpers.entity_platform import AddEntitiesCallback
10 from homeassistant.util.dt import as_local, parse_datetime, utcnow
11 
12 from .const import DATA_PROTECTION_WINDOW, DOMAIN, LOGGER, TYPE_PROTECTION_WINDOW
13 from .coordinator import OpenUvCoordinator
14 from .entity import OpenUvEntity
15 
16 ATTR_PROTECTION_WINDOW_ENDING_TIME = "end_time"
17 ATTR_PROTECTION_WINDOW_ENDING_UV = "end_uv"
18 ATTR_PROTECTION_WINDOW_STARTING_TIME = "start_time"
19 ATTR_PROTECTION_WINDOW_STARTING_UV = "start_uv"
20 
21 BINARY_SENSOR_DESCRIPTION_PROTECTION_WINDOW = BinarySensorEntityDescription(
22  key=TYPE_PROTECTION_WINDOW,
23  translation_key="protection_window",
24 )
25 
26 
28  hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
29 ) -> None:
30  # Once we've successfully authenticated, we re-enable client request retries:
31  """Set up an OpenUV sensor based on a config entry."""
32  coordinators: dict[str, OpenUvCoordinator] = hass.data[DOMAIN][entry.entry_id]
33 
35  [
37  coordinators[DATA_PROTECTION_WINDOW],
38  BINARY_SENSOR_DESCRIPTION_PROTECTION_WINDOW,
39  )
40  ]
41  )
42 
43 
45  """Define a binary sensor for OpenUV."""
46 
47  @callback
48  def _handle_coordinator_update(self) -> None:
49  """Update the entity from the latest data."""
50  data = self.coordinator.data
51 
52  for key in ("from_time", "to_time", "from_uv", "to_uv"):
53  if not data.get(key):
54  LOGGER.warning("Skipping update due to missing data: %s", key)
55  return
56 
57  if self.entity_descriptionentity_description.key == TYPE_PROTECTION_WINDOW:
58  from_dt = parse_datetime(data["from_time"])
59  to_dt = parse_datetime(data["to_time"])
60 
61  if not from_dt or not to_dt:
62  LOGGER.warning(
63  "Unable to parse protection window datetimes: %s, %s",
64  data["from_time"],
65  data["to_time"],
66  )
67  self._attr_is_on_attr_is_on = False
68  return
69 
70  self._attr_is_on_attr_is_on = from_dt <= utcnow() <= to_dt
71  self._attr_extra_state_attributes_attr_extra_state_attributes.update(
72  {
73  ATTR_PROTECTION_WINDOW_ENDING_TIME: as_local(to_dt),
74  ATTR_PROTECTION_WINDOW_ENDING_UV: data["to_uv"],
75  ATTR_PROTECTION_WINDOW_STARTING_UV: data["from_uv"],
76  ATTR_PROTECTION_WINDOW_STARTING_TIME: as_local(from_dt),
77  }
78  )
79 
datetime|None parse_datetime(str|None value)
Definition: sensor.py:138
IssData update(pyiss.ISS iss)
Definition: __init__.py:33
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)
dt.datetime as_local(dt.datetime dattim)
Definition: dt.py:157