Home Assistant Unofficial Reference 2024.12.1
binary_sensor.py
Go to the documentation of this file.
1 """Platform for FAA Delays sensor component."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Callable, Mapping
6 from dataclasses import dataclass
7 from typing import Any
8 
9 from faadelays import Airport
10 
12  BinarySensorEntity,
13  BinarySensorEntityDescription,
14 )
15 from homeassistant.config_entries import ConfigEntry
16 from homeassistant.core import HomeAssistant
17 from homeassistant.helpers.device_registry import DeviceEntryType, DeviceInfo
18 from homeassistant.helpers.entity_platform import AddEntitiesCallback
19 from homeassistant.helpers.update_coordinator import CoordinatorEntity
20 
21 from . import FAADataUpdateCoordinator
22 from .const import DOMAIN
23 
24 
25 @dataclass(frozen=True, kw_only=True)
27  """Mixin for required keys."""
28 
29  is_on_fn: Callable[[Airport], bool | None]
30  extra_state_attributes_fn: Callable[[Airport], Mapping[str, Any]]
31 
32 
33 FAA_BINARY_SENSORS: tuple[FaaDelaysBinarySensorEntityDescription, ...] = (
35  key="GROUND_DELAY",
36  translation_key="ground_delay",
37  is_on_fn=lambda airport: airport.ground_delay.status,
38  extra_state_attributes_fn=lambda airport: {
39  "average": airport.ground_delay.average,
40  "reason": airport.ground_delay.reason,
41  },
42  ),
44  key="GROUND_STOP",
45  translation_key="ground_stop",
46  is_on_fn=lambda airport: airport.ground_stop.status,
47  extra_state_attributes_fn=lambda airport: {
48  "endtime": airport.ground_stop.endtime,
49  "reason": airport.ground_stop.reason,
50  },
51  ),
53  key="DEPART_DELAY",
54  translation_key="depart_delay",
55  is_on_fn=lambda airport: airport.depart_delay.status,
56  extra_state_attributes_fn=lambda airport: {
57  "minimum": airport.depart_delay.minimum,
58  "maximum": airport.depart_delay.maximum,
59  "trend": airport.depart_delay.trend,
60  "reason": airport.depart_delay.reason,
61  },
62  ),
64  key="ARRIVE_DELAY",
65  translation_key="arrive_delay",
66  is_on_fn=lambda airport: airport.arrive_delay.status,
67  extra_state_attributes_fn=lambda airport: {
68  "minimum": airport.arrive_delay.minimum,
69  "maximum": airport.arrive_delay.maximum,
70  "trend": airport.arrive_delay.trend,
71  "reason": airport.arrive_delay.reason,
72  },
73  ),
75  key="CLOSURE",
76  translation_key="closure",
77  is_on_fn=lambda airport: airport.closure.status,
78  extra_state_attributes_fn=lambda airport: {
79  "begin": airport.closure.start,
80  "end": airport.closure.end,
81  },
82  ),
83 )
84 
85 
87  hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
88 ) -> None:
89  """Set up a FAA sensor based on a config entry."""
90  coordinator = hass.data[DOMAIN][entry.entry_id]
91 
92  entities = [
93  FAABinarySensor(coordinator, entry.entry_id, description)
94  for description in FAA_BINARY_SENSORS
95  ]
96 
97  async_add_entities(entities)
98 
99 
100 class FAABinarySensor(CoordinatorEntity[FAADataUpdateCoordinator], BinarySensorEntity):
101  """Define a binary sensor for FAA Delays."""
102 
103  _attr_has_entity_name = True
104 
105  entity_description: FaaDelaysBinarySensorEntityDescription
106 
107  def __init__(
108  self,
109  coordinator: FAADataUpdateCoordinator,
110  entry_id: str,
111  description: FaaDelaysBinarySensorEntityDescription,
112  ) -> None:
113  """Initialize the sensor."""
114  super().__init__(coordinator)
115  self.entity_descriptionentity_description = description
116  _id = coordinator.data.code
117  self._attr_unique_id_attr_unique_id = f"{_id}_{description.key}"
118  self._attr_device_info_attr_device_info = DeviceInfo(
119  identifiers={(DOMAIN, _id)},
120  name=_id,
121  manufacturer="Federal Aviation Administration",
122  entry_type=DeviceEntryType.SERVICE,
123  )
124 
125  @property
126  def is_on(self) -> bool | None:
127  """Return the status of the sensor."""
128  return self.entity_descriptionentity_description.is_on_fn(self.coordinator.data)
129 
130  @property
131  def extra_state_attributes(self) -> Mapping[str, Any]:
132  """Return attributes for sensor."""
133  return self.entity_descriptionentity_description.extra_state_attributes_fn(self.coordinator.data)
None __init__(self, FAADataUpdateCoordinator coordinator, str entry_id, FaaDelaysBinarySensorEntityDescription description)
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)