Home Assistant Unofficial Reference 2024.12.1
binary_sensor.py
Go to the documentation of this file.
1 """Support for Blink system camera control."""
2 
3 from __future__ import annotations
4 
5 import logging
6 
8  BinarySensorDeviceClass,
9  BinarySensorEntity,
10  BinarySensorEntityDescription,
11 )
12 from homeassistant.const import EntityCategory
13 from homeassistant.core import HomeAssistant, callback
14 from homeassistant.helpers.device_registry import DeviceInfo
15 from homeassistant.helpers.entity_platform import AddEntitiesCallback
16 from homeassistant.helpers.update_coordinator import CoordinatorEntity
17 
18 from .const import (
19  DEFAULT_BRAND,
20  DOMAIN,
21  TYPE_BATTERY,
22  TYPE_CAMERA_ARMED,
23  TYPE_MOTION_DETECTED,
24 )
25 from .coordinator import BlinkConfigEntry, BlinkUpdateCoordinator
26 
27 _LOGGER = logging.getLogger(__name__)
28 
29 BINARY_SENSORS_TYPES: tuple[BinarySensorEntityDescription, ...] = (
31  key=TYPE_BATTERY,
32  device_class=BinarySensorDeviceClass.BATTERY,
33  entity_category=EntityCategory.DIAGNOSTIC,
34  ),
35  # Camera Armed sensor is deprecated covered by switch and will be removed in 2023.6.
37  key=TYPE_CAMERA_ARMED,
38  translation_key="camera_armed",
39  entity_registry_enabled_default=False,
40  ),
42  key=TYPE_MOTION_DETECTED,
43  device_class=BinarySensorDeviceClass.MOTION,
44  ),
45 )
46 
47 
49  hass: HomeAssistant,
50  config_entry: BlinkConfigEntry,
51  async_add_entities: AddEntitiesCallback,
52 ) -> None:
53  """Set up the blink binary sensors."""
54 
55  coordinator = config_entry.runtime_data
56 
57  entities = [
58  BlinkBinarySensor(coordinator, camera, description)
59  for camera in coordinator.api.cameras
60  for description in BINARY_SENSORS_TYPES
61  ]
62  async_add_entities(entities)
63 
64 
65 class BlinkBinarySensor(CoordinatorEntity[BlinkUpdateCoordinator], BinarySensorEntity):
66  """Representation of a Blink binary sensor."""
67 
68  _attr_has_entity_name = True
69 
70  def __init__(
71  self,
72  coordinator: BlinkUpdateCoordinator,
73  camera,
74  description: BinarySensorEntityDescription,
75  ) -> None:
76  """Initialize the sensor."""
77  super().__init__(coordinator)
78  self.entity_descriptionentity_description = description
79  self._camera_camera = coordinator.api.cameras[camera]
80  serial = self._camera_camera.serial
81  self._attr_unique_id_attr_unique_id = f"{serial}-{description.key}"
82  self._attr_device_info_attr_device_info = DeviceInfo(
83  identifiers={(DOMAIN, serial)},
84  serial_number=serial,
85  name=camera,
86  manufacturer=DEFAULT_BRAND,
87  model=self._camera_camera.camera_type,
88  )
89  self._update_attrs_update_attrs()
90 
91  @callback
92  def _handle_coordinator_update(self) -> None:
93  """Handle update from data coordinator."""
94  self._update_attrs_update_attrs()
96 
97  @callback
98  def _update_attrs(self) -> None:
99  """Update attributes for binary sensor."""
100  is_on = self._camera_camera.attributes[self.entity_descriptionentity_description.key]
101  _LOGGER.debug(
102  "'%s' %s = %s",
103  self._camera_camera.attributes["name"],
104  self.entity_descriptionentity_description.key,
105  is_on,
106  )
107  if self.entity_descriptionentity_description.key == TYPE_BATTERY:
108  is_on = is_on != "ok"
109  self._attr_is_on_attr_is_on = is_on