1 """Support for deCONZ binary sensors."""
3 from __future__
import annotations
5 from collections.abc
import Callable
6 from dataclasses
import dataclass
8 from pydeconz.interfaces.sensors
import SensorResources
9 from pydeconz.models.event
import EventType
10 from pydeconz.models.sensor
import SensorBase
as PydeconzSensorBase
11 from pydeconz.models.sensor.alarm
import Alarm
12 from pydeconz.models.sensor.carbon_monoxide
import CarbonMonoxide
13 from pydeconz.models.sensor.fire
import Fire
14 from pydeconz.models.sensor.generic_flag
import GenericFlag
15 from pydeconz.models.sensor.open_close
import OpenClose
16 from pydeconz.models.sensor.presence
import Presence
17 from pydeconz.models.sensor.vibration
import Vibration
18 from pydeconz.models.sensor.water
import Water
21 DOMAIN
as BINARY_SENSOR_DOMAIN,
22 BinarySensorDeviceClass,
24 BinarySensorEntityDescription,
31 from .const
import ATTR_DARK, ATTR_ON
32 from .entity
import DeconzDevice
33 from .hub
import DeconzHub
35 ATTR_ORIENTATION =
"orientation"
36 ATTR_TILTANGLE =
"tiltangle"
37 ATTR_VIBRATIONSTRENGTH =
"vibrationstrength"
39 PROVIDES_EXTRA_ATTRIBUTES = (
51 @dataclass(frozen=True, kw_only=True)
64 ](BinarySensorEntityDescription):
65 """Class describing deCONZ binary sensor entities."""
67 instance_check: type[_T] |
None =
None
69 old_unique_id_suffix: str =
""
71 value_fn: Callable[[_T], bool |
None]
74 ENTITY_DESCRIPTIONS: tuple[DeconzBinarySensorDescription, ...] = (
75 DeconzBinarySensorDescription[Alarm](
78 value_fn=
lambda device: device.alarm,
80 device_class=BinarySensorDeviceClass.SAFETY,
82 DeconzBinarySensorDescription[CarbonMonoxide](
83 key=
"carbon_monoxide",
84 update_key=
"carbonmonoxide",
85 value_fn=
lambda device: device.carbon_monoxide,
86 instance_check=CarbonMonoxide,
87 device_class=BinarySensorDeviceClass.CO,
89 DeconzBinarySensorDescription[Fire](
92 value_fn=
lambda device: device.fire,
94 device_class=BinarySensorDeviceClass.SMOKE,
96 DeconzBinarySensorDescription[Fire](
99 value_fn=
lambda device: device.in_test_mode,
101 name_suffix=
"Test Mode",
102 old_unique_id_suffix=
"test mode",
103 device_class=BinarySensorDeviceClass.SMOKE,
104 entity_category=EntityCategory.DIAGNOSTIC,
106 DeconzBinarySensorDescription[GenericFlag](
109 value_fn=
lambda device: device.flag,
110 instance_check=GenericFlag,
112 DeconzBinarySensorDescription[OpenClose](
115 value_fn=
lambda device: device.open,
116 instance_check=OpenClose,
117 device_class=BinarySensorDeviceClass.OPENING,
119 DeconzBinarySensorDescription[Presence](
121 update_key=
"presence",
122 value_fn=
lambda device: device.presence,
123 instance_check=Presence,
124 device_class=BinarySensorDeviceClass.MOTION,
126 DeconzBinarySensorDescription[Vibration](
128 update_key=
"vibration",
129 value_fn=
lambda device: device.vibration,
130 instance_check=Vibration,
131 device_class=BinarySensorDeviceClass.VIBRATION,
133 DeconzBinarySensorDescription[Water](
136 value_fn=
lambda device: device.water,
137 instance_check=Water,
138 device_class=BinarySensorDeviceClass.MOISTURE,
140 DeconzBinarySensorDescription[SensorResources](
142 update_key=
"tampered",
143 value_fn=
lambda device: device.tampered,
144 name_suffix=
"Tampered",
145 old_unique_id_suffix=
"tampered",
146 device_class=BinarySensorDeviceClass.TAMPER,
147 entity_category=EntityCategory.DIAGNOSTIC,
149 DeconzBinarySensorDescription[SensorResources](
151 update_key=
"lowbattery",
152 value_fn=
lambda device: device.low_battery,
153 name_suffix=
"Low Battery",
154 old_unique_id_suffix=
"low battery",
155 device_class=BinarySensorDeviceClass.BATTERY,
156 entity_category=EntityCategory.DIAGNOSTIC,
163 config_entry: ConfigEntry,
164 async_add_entities: AddEntitiesCallback,
166 """Set up the deCONZ binary sensor."""
167 hub = DeconzHub.get_hub(hass, config_entry)
168 hub.entities[BINARY_SENSOR_DOMAIN] = set()
171 def async_add_sensor(_: EventType, sensor_id: str) ->
None:
172 """Add sensor from deCONZ."""
173 sensor = hub.api.sensors[sensor_id]
175 for description
in ENTITY_DESCRIPTIONS:
177 description.instance_check
178 and not isinstance(sensor, description.instance_check)
179 )
or description.value_fn(sensor)
is None:
183 hub.register_platform_add_device_callback(
190 """Representation of a deCONZ binary sensor."""
192 TYPE = BINARY_SENSOR_DOMAIN
193 entity_description: DeconzBinarySensorDescription
197 device: SensorResources,
199 description: DeconzBinarySensorDescription,
201 """Initialize deCONZ binary sensor."""
205 if description.name_suffix:
211 and self._update_keys
is not None
213 self._update_keys.
update({
"on",
"state"})
217 """Return the state of the sensor."""
222 """Return the state attributes of the sensor."""
223 attr: dict[str, bool | float | int | list |
None] = {}
228 if self._device.on
is not None:
229 attr[ATTR_ON] = self._device.on
231 if self._device.internal_temperature
is not None:
232 attr[ATTR_TEMPERATURE] = self._device.internal_temperature
234 if isinstance(self._device, Presence):
235 if self._device.dark
is not None:
236 attr[ATTR_DARK] = self._device.dark
238 elif isinstance(self._device, Vibration):
239 attr[ATTR_ORIENTATION] = self._device.orientation
240 attr[ATTR_TILTANGLE] = self._device.tilt_angle
241 attr[ATTR_VIBRATIONSTRENGTH] = self._device.vibration_strength
dict[str, bool|float|int|list|None] extra_state_attributes(self)
None __init__(self, SensorResources device, DeconzHub hub, DeconzBinarySensorDescription description)
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
IssData update(pyiss.ISS iss)