Home Assistant Unofficial Reference 2024.12.1
binary_sensor.py
Go to the documentation of this file.
1 """Support for Lutron Caseta Occupancy/Vacancy Sensors."""
2 
3 from pylutron_caseta import OCCUPANCY_GROUP_OCCUPIED
4 
6  BinarySensorDeviceClass,
7  BinarySensorEntity,
8 )
9 from homeassistant.const import ATTR_SUGGESTED_AREA
10 from homeassistant.core import HomeAssistant
11 from homeassistant.helpers.device_registry import DeviceEntryType, DeviceInfo
12 from homeassistant.helpers.entity_platform import AddEntitiesCallback
13 
14 from . import DOMAIN as CASETA_DOMAIN
15 from .const import CONFIG_URL, MANUFACTURER, UNASSIGNED_AREA
16 from .entity import LutronCasetaEntity
17 from .models import LutronCasetaConfigEntry
18 from .util import area_name_from_id
19 
20 
22  hass: HomeAssistant,
23  config_entry: LutronCasetaConfigEntry,
24  async_add_entities: AddEntitiesCallback,
25 ) -> None:
26  """Set up the Lutron Caseta binary_sensor platform.
27 
28  Adds occupancy groups from the Caseta bridge associated with the
29  config_entry as binary_sensor entities.
30  """
31  data = config_entry.runtime_data
32  bridge = data.bridge
33  occupancy_groups = bridge.occupancy_groups
35  LutronOccupancySensor(occupancy_group, data)
36  for occupancy_group in occupancy_groups.values()
37  )
38 
39 
41  """Representation of a Lutron occupancy group."""
42 
43  _attr_device_class = BinarySensorDeviceClass.OCCUPANCY
44 
45  def __init__(self, device, data):
46  """Init an occupancy sensor."""
47  super().__init__(device, data)
48  area = area_name_from_id(self._smartbridge_smartbridge.areas, device["area"])
49  name = f"{area} {device['device_name']}"
50  self._attr_name_attr_name_attr_name = name
52  identifiers={(CASETA_DOMAIN, self.unique_idunique_idunique_idunique_id)},
53  manufacturer=MANUFACTURER,
54  model="Lutron Occupancy",
55  name=self.namename,
56  via_device=(CASETA_DOMAIN, self._bridge_device_bridge_device["serial"]),
57  configuration_url=CONFIG_URL,
58  entry_type=DeviceEntryType.SERVICE,
59  )
60  if area != UNASSIGNED_AREA:
61  self._attr_device_info_attr_device_info_attr_device_info[ATTR_SUGGESTED_AREA] = area
62 
63  @property
64  def is_on(self):
65  """Return the brightness of the light."""
66  return self._device_device["status"] == OCCUPANCY_GROUP_OCCUPIED
67 
68  # pylint: disable-next=hass-missing-super-call
69  async def async_added_to_hass(self) -> None:
70  """Register callbacks."""
71  self._smartbridge_smartbridge.add_occupancy_subscriber(
72  self.device_iddevice_iddevice_id, self.async_write_ha_stateasync_write_ha_state
73  )
74 
75  @property
76  def device_id(self):
77  """Return the device ID used for calling pylutron_caseta."""
78  return self._device_device["occupancy_group_id"]
79 
80  @property
81  def unique_id(self):
82  """Return a unique identifier."""
83  return f"occupancygroup_{self._bridge_unique_id}_{self.device_id}"
84 
85  @property
87  """Return the state attributes."""
88  return {"device_id": self.device_iddevice_iddevice_id}
str|UndefinedType|None name(self)
Definition: entity.py:738
None async_setup_entry(HomeAssistant hass, LutronCasetaConfigEntry config_entry, AddEntitiesCallback async_add_entities)
str area_name_from_id(dict[str, dict] areas, str|None area_id)
Definition: util.py:13