Home Assistant Unofficial Reference 2024.12.1
binary_sensor.py
Go to the documentation of this file.
1 """Support for BTHome binary sensors."""
2 
3 from __future__ import annotations
4 
5 from bthome_ble import (
6  BinarySensorDeviceClass as BTHomeBinarySensorDeviceClass,
7  SensorUpdate,
8 )
9 
11  BinarySensorDeviceClass,
12  BinarySensorEntity,
13  BinarySensorEntityDescription,
14 )
16  PassiveBluetoothDataUpdate,
17  PassiveBluetoothProcessorEntity,
18 )
19 from homeassistant.core import HomeAssistant
20 from homeassistant.helpers.entity_platform import AddEntitiesCallback
21 from homeassistant.helpers.sensor import sensor_device_info_to_hass_device_info
22 
23 from .coordinator import BTHomePassiveBluetoothDataProcessor
24 from .device import device_key_to_bluetooth_entity_key
25 from .types import BTHomeConfigEntry
26 
27 BINARY_SENSOR_DESCRIPTIONS = {
28  BTHomeBinarySensorDeviceClass.BATTERY: BinarySensorEntityDescription(
29  key=BTHomeBinarySensorDeviceClass.BATTERY,
30  device_class=BinarySensorDeviceClass.BATTERY,
31  ),
32  BTHomeBinarySensorDeviceClass.BATTERY_CHARGING: BinarySensorEntityDescription(
33  key=BTHomeBinarySensorDeviceClass.BATTERY_CHARGING,
34  device_class=BinarySensorDeviceClass.BATTERY_CHARGING,
35  ),
36  BTHomeBinarySensorDeviceClass.CO: BinarySensorEntityDescription(
37  key=BTHomeBinarySensorDeviceClass.CO,
38  device_class=BinarySensorDeviceClass.CO,
39  ),
40  BTHomeBinarySensorDeviceClass.COLD: BinarySensorEntityDescription(
41  key=BTHomeBinarySensorDeviceClass.COLD,
42  device_class=BinarySensorDeviceClass.COLD,
43  ),
44  BTHomeBinarySensorDeviceClass.CONNECTIVITY: BinarySensorEntityDescription(
45  key=BTHomeBinarySensorDeviceClass.CONNECTIVITY,
46  device_class=BinarySensorDeviceClass.CONNECTIVITY,
47  ),
48  BTHomeBinarySensorDeviceClass.DOOR: BinarySensorEntityDescription(
49  key=BTHomeBinarySensorDeviceClass.DOOR,
50  device_class=BinarySensorDeviceClass.DOOR,
51  ),
52  BTHomeBinarySensorDeviceClass.HEAT: BinarySensorEntityDescription(
53  key=BTHomeBinarySensorDeviceClass.HEAT,
54  device_class=BinarySensorDeviceClass.HEAT,
55  ),
56  BTHomeBinarySensorDeviceClass.GARAGE_DOOR: BinarySensorEntityDescription(
57  key=BTHomeBinarySensorDeviceClass.GARAGE_DOOR,
58  device_class=BinarySensorDeviceClass.GARAGE_DOOR,
59  ),
60  BTHomeBinarySensorDeviceClass.GAS: BinarySensorEntityDescription(
61  key=BTHomeBinarySensorDeviceClass.GAS,
62  device_class=BinarySensorDeviceClass.GAS,
63  ),
64  BTHomeBinarySensorDeviceClass.GENERIC: BinarySensorEntityDescription(
65  key=BTHomeBinarySensorDeviceClass.GENERIC,
66  ),
67  BTHomeBinarySensorDeviceClass.LIGHT: BinarySensorEntityDescription(
68  key=BTHomeBinarySensorDeviceClass.LIGHT,
69  device_class=BinarySensorDeviceClass.LIGHT,
70  ),
71  BTHomeBinarySensorDeviceClass.LOCK: BinarySensorEntityDescription(
72  key=BTHomeBinarySensorDeviceClass.LOCK,
73  device_class=BinarySensorDeviceClass.LOCK,
74  ),
75  BTHomeBinarySensorDeviceClass.MOISTURE: BinarySensorEntityDescription(
76  key=BTHomeBinarySensorDeviceClass.MOISTURE,
77  device_class=BinarySensorDeviceClass.MOISTURE,
78  ),
79  BTHomeBinarySensorDeviceClass.MOTION: BinarySensorEntityDescription(
80  key=BTHomeBinarySensorDeviceClass.MOTION,
81  device_class=BinarySensorDeviceClass.MOTION,
82  ),
83  BTHomeBinarySensorDeviceClass.MOVING: BinarySensorEntityDescription(
84  key=BTHomeBinarySensorDeviceClass.MOVING,
85  device_class=BinarySensorDeviceClass.MOVING,
86  ),
87  BTHomeBinarySensorDeviceClass.OCCUPANCY: BinarySensorEntityDescription(
88  key=BTHomeBinarySensorDeviceClass.OCCUPANCY,
89  device_class=BinarySensorDeviceClass.OCCUPANCY,
90  ),
91  BTHomeBinarySensorDeviceClass.OPENING: BinarySensorEntityDescription(
92  key=BTHomeBinarySensorDeviceClass.OPENING,
93  device_class=BinarySensorDeviceClass.OPENING,
94  ),
95  BTHomeBinarySensorDeviceClass.PLUG: BinarySensorEntityDescription(
96  key=BTHomeBinarySensorDeviceClass.PLUG,
97  device_class=BinarySensorDeviceClass.PLUG,
98  ),
99  BTHomeBinarySensorDeviceClass.POWER: BinarySensorEntityDescription(
100  key=BTHomeBinarySensorDeviceClass.POWER,
101  device_class=BinarySensorDeviceClass.POWER,
102  ),
103  BTHomeBinarySensorDeviceClass.PRESENCE: BinarySensorEntityDescription(
104  key=BTHomeBinarySensorDeviceClass.PRESENCE,
105  device_class=BinarySensorDeviceClass.PRESENCE,
106  ),
107  BTHomeBinarySensorDeviceClass.PROBLEM: BinarySensorEntityDescription(
108  key=BTHomeBinarySensorDeviceClass.PROBLEM,
109  device_class=BinarySensorDeviceClass.PROBLEM,
110  ),
111  BTHomeBinarySensorDeviceClass.RUNNING: BinarySensorEntityDescription(
112  key=BTHomeBinarySensorDeviceClass.RUNNING,
113  device_class=BinarySensorDeviceClass.RUNNING,
114  ),
115  BTHomeBinarySensorDeviceClass.SAFETY: BinarySensorEntityDescription(
116  key=BTHomeBinarySensorDeviceClass.SAFETY,
117  device_class=BinarySensorDeviceClass.SAFETY,
118  ),
119  BTHomeBinarySensorDeviceClass.SMOKE: BinarySensorEntityDescription(
120  key=BTHomeBinarySensorDeviceClass.SMOKE,
121  device_class=BinarySensorDeviceClass.SMOKE,
122  ),
123  BTHomeBinarySensorDeviceClass.SOUND: BinarySensorEntityDescription(
124  key=BTHomeBinarySensorDeviceClass.SOUND,
125  device_class=BinarySensorDeviceClass.SOUND,
126  ),
127  BTHomeBinarySensorDeviceClass.TAMPER: BinarySensorEntityDescription(
128  key=BTHomeBinarySensorDeviceClass.TAMPER,
129  device_class=BinarySensorDeviceClass.TAMPER,
130  ),
131  BTHomeBinarySensorDeviceClass.VIBRATION: BinarySensorEntityDescription(
132  key=BTHomeBinarySensorDeviceClass.VIBRATION,
133  device_class=BinarySensorDeviceClass.VIBRATION,
134  ),
135  BTHomeBinarySensorDeviceClass.WINDOW: BinarySensorEntityDescription(
136  key=BTHomeBinarySensorDeviceClass.WINDOW,
137  device_class=BinarySensorDeviceClass.WINDOW,
138  ),
139 }
140 
141 
143  sensor_update: SensorUpdate,
144 ) -> PassiveBluetoothDataUpdate[bool | None]:
145  """Convert a binary sensor update to a bluetooth data update."""
147  devices={
148  device_id: sensor_device_info_to_hass_device_info(device_info)
149  for device_id, device_info in sensor_update.devices.items()
150  },
151  entity_descriptions={
152  device_key_to_bluetooth_entity_key(device_key): BINARY_SENSOR_DESCRIPTIONS[
153  description.device_class
154  ]
155  for device_key, description in sensor_update.binary_entity_descriptions.items()
156  if description.device_class
157  },
158  entity_data={
159  device_key_to_bluetooth_entity_key(device_key): sensor_values.native_value
160  for device_key, sensor_values in sensor_update.binary_entity_values.items()
161  },
162  entity_names={
163  device_key_to_bluetooth_entity_key(device_key): sensor_values.name
164  for device_key, sensor_values in sensor_update.binary_entity_values.items()
165  },
166  )
167 
168 
170  hass: HomeAssistant,
171  entry: BTHomeConfigEntry,
172  async_add_entities: AddEntitiesCallback,
173 ) -> None:
174  """Set up the BTHome BLE binary sensors."""
175  coordinator = entry.runtime_data
177  sensor_update_to_bluetooth_data_update
178  )
179  entry.async_on_unload(
180  processor.async_add_entities_listener(
181  BTHomeBluetoothBinarySensorEntity, async_add_entities
182  )
183  )
184  entry.async_on_unload(
185  coordinator.async_register_processor(processor, BinarySensorEntityDescription)
186  )
187 
188 
190  PassiveBluetoothProcessorEntity[BTHomePassiveBluetoothDataProcessor[bool | None]],
191  BinarySensorEntity,
192 ):
193  """Representation of a BTHome binary sensor."""
194 
195  @property
196  def is_on(self) -> bool | None:
197  """Return the native value."""
198  return self.processor.entity_data.get(self.entity_key)
199 
200  @property
201  def available(self) -> bool:
202  """Return True if entity is available."""
203  return self.processor.coordinator.sleepy_device or super().available
PassiveBluetoothEntityKey device_key_to_bluetooth_entity_key(DeviceKey device_key)
Definition: device.py:14
None async_setup_entry(HomeAssistant hass, BTHomeConfigEntry entry, AddEntitiesCallback async_add_entities)
PassiveBluetoothDataUpdate[bool|None] sensor_update_to_bluetooth_data_update(SensorUpdate sensor_update)
DeviceInfo sensor_device_info_to_hass_device_info(SensorDeviceInfo sensor_device_info)
Definition: sensor.py:20