1 """Support for Xiaomi binary sensors."""
3 from __future__
import annotations
5 from xiaomi_ble.parser
import (
6 BinarySensorDeviceClass
as XiaomiBinarySensorDeviceClass,
7 ExtendedBinarySensorDeviceClass,
12 BinarySensorDeviceClass,
14 BinarySensorEntityDescription,
17 PassiveBluetoothDataUpdate,
18 PassiveBluetoothProcessorEntity,
24 from .coordinator
import XiaomiPassiveBluetoothDataProcessor
25 from .device
import device_key_to_bluetooth_entity_key
26 from .types
import XiaomiBLEConfigEntry
28 BINARY_SENSOR_DESCRIPTIONS = {
30 key=XiaomiBinarySensorDeviceClass.BATTERY,
31 device_class=BinarySensorDeviceClass.BATTERY,
34 key=XiaomiBinarySensorDeviceClass.DOOR,
35 device_class=BinarySensorDeviceClass.DOOR,
38 key=XiaomiBinarySensorDeviceClass.LIGHT,
39 device_class=BinarySensorDeviceClass.LIGHT,
42 key=XiaomiBinarySensorDeviceClass.LOCK,
43 device_class=BinarySensorDeviceClass.LOCK,
46 key=XiaomiBinarySensorDeviceClass.MOISTURE,
47 device_class=BinarySensorDeviceClass.MOISTURE,
50 key=XiaomiBinarySensorDeviceClass.MOTION,
51 device_class=BinarySensorDeviceClass.MOTION,
54 key=XiaomiBinarySensorDeviceClass.OCCUPANCY,
55 device_class=BinarySensorDeviceClass.OCCUPANCY,
58 key=XiaomiBinarySensorDeviceClass.OPENING,
59 device_class=BinarySensorDeviceClass.OPENING,
62 key=XiaomiBinarySensorDeviceClass.POWER,
63 device_class=BinarySensorDeviceClass.POWER,
66 key=XiaomiBinarySensorDeviceClass.SMOKE,
67 device_class=BinarySensorDeviceClass.SMOKE,
70 key=ExtendedBinarySensorDeviceClass.ANTILOCK,
73 key=ExtendedBinarySensorDeviceClass.ARMED,
74 icon=
"mdi:shield-check",
77 key=ExtendedBinarySensorDeviceClass.CHILDLOCK,
80 key=ExtendedBinarySensorDeviceClass.DEVICE_FORCIBLY_REMOVED,
81 device_class=BinarySensorDeviceClass.PROBLEM,
84 key=ExtendedBinarySensorDeviceClass.DOOR_LEFT_OPEN,
85 device_class=BinarySensorDeviceClass.PROBLEM,
88 key=ExtendedBinarySensorDeviceClass.DOOR_STUCK,
89 device_class=BinarySensorDeviceClass.PROBLEM,
92 key=ExtendedBinarySensorDeviceClass.FINGERPRINT,
93 icon=
"mdi:fingerprint",
96 key=ExtendedBinarySensorDeviceClass.KNOCK_ON_THE_DOOR,
99 key=ExtendedBinarySensorDeviceClass.PRY_THE_DOOR,
100 device_class=BinarySensorDeviceClass.TAMPER,
103 key=ExtendedBinarySensorDeviceClass.TOOTHBRUSH,
109 sensor_update: SensorUpdate,
110 ) -> PassiveBluetoothDataUpdate[bool |
None]:
111 """Convert a sensor update to a bluetooth data update."""
115 for device_id, device_info
in sensor_update.devices.items()
117 entity_descriptions={
119 description.device_class
121 for device_key, description
in sensor_update.binary_entity_descriptions.items()
122 if description.device_class
126 for device_key, sensor_values
in sensor_update.binary_entity_values.items()
130 for device_key, sensor_values
in sensor_update.binary_entity_values.items()
137 entry: XiaomiBLEConfigEntry,
138 async_add_entities: AddEntitiesCallback,
140 """Set up the Xiaomi BLE sensors."""
141 coordinator = entry.runtime_data
143 sensor_update_to_bluetooth_data_update
145 entry.async_on_unload(
146 processor.async_add_entities_listener(
147 XiaomiBluetoothSensorEntity, async_add_entities
150 entry.async_on_unload(
151 coordinator.async_register_processor(processor, BinarySensorEntityDescription)
156 PassiveBluetoothProcessorEntity[XiaomiPassiveBluetoothDataProcessor[bool |
None]],
159 """Representation of a Xiaomi binary sensor."""
163 """Return the native value."""
164 return self.processor.entity_data.get(self.entity_key)
168 """Return True if entity is available."""
169 return self.processor.coordinator.sleepy_device
or super().available
PassiveBluetoothEntityKey device_key_to_bluetooth_entity_key(DeviceKey device_key)
PassiveBluetoothDataUpdate[bool|None] sensor_update_to_bluetooth_data_update(SensorUpdate sensor_update)
None async_setup_entry(HomeAssistant hass, XiaomiBLEConfigEntry entry, AddEntitiesCallback async_add_entities)
DeviceInfo sensor_device_info_to_hass_device_info(SensorDeviceInfo sensor_device_info)