Home Assistant Unofficial Reference 2024.12.1
binary_sensor.py
Go to the documentation of this file.
1 """Code to handle a Livisi Binary Sensor."""
2 
3 from __future__ import annotations
4 
5 from typing import Any
6 
8  BinarySensorDeviceClass,
9  BinarySensorEntity,
10 )
11 from homeassistant.config_entries import ConfigEntry
12 from homeassistant.core import HomeAssistant, callback
13 from homeassistant.helpers.dispatcher import async_dispatcher_connect
14 from homeassistant.helpers.entity_platform import AddEntitiesCallback
15 
16 from .const import DOMAIN, LIVISI_STATE_CHANGE, LOGGER, WDS_DEVICE_TYPE
17 from .coordinator import LivisiDataUpdateCoordinator
18 from .entity import LivisiEntity
19 
20 
22  hass: HomeAssistant,
23  config_entry: ConfigEntry,
24  async_add_entities: AddEntitiesCallback,
25 ) -> None:
26  """Set up binary_sensor device."""
27  coordinator: LivisiDataUpdateCoordinator = hass.data[DOMAIN][config_entry.entry_id]
28  known_devices = set()
29 
30  @callback
31  def handle_coordinator_update() -> None:
32  """Add Window Sensor."""
33  shc_devices: list[dict[str, Any]] = coordinator.data
34  entities: list[BinarySensorEntity] = []
35  for device in shc_devices:
36  if device["id"] not in known_devices and device["type"] == WDS_DEVICE_TYPE:
37  livisi_binary: BinarySensorEntity = LivisiWindowDoorSensor(
38  config_entry, coordinator, device
39  )
40  LOGGER.debug("Include device type: %s", device["type"])
41  coordinator.devices.add(device["id"])
42  known_devices.add(device["id"])
43  entities.append(livisi_binary)
44  async_add_entities(entities)
45 
46  config_entry.async_on_unload(
47  coordinator.async_add_listener(handle_coordinator_update)
48  )
49 
50 
52  """Represents a Livisi Binary Sensor."""
53 
54  def __init__(
55  self,
56  config_entry: ConfigEntry,
57  coordinator: LivisiDataUpdateCoordinator,
58  device: dict[str, Any],
59  capability_name: str,
60  ) -> None:
61  """Initialize the Livisi sensor."""
62  super().__init__(config_entry, coordinator, device)
63  self._capability_id_capability_id = self.capabilities[capability_name]
64 
65  async def async_added_to_hass(self) -> None:
66  """Register callbacks."""
67  await super().async_added_to_hass()
68 
69  self.async_on_removeasync_on_remove(
71  self.hasshasshasshass,
72  f"{LIVISI_STATE_CHANGE}_{self._capability_id}",
73  self.update_statesupdate_states,
74  )
75  )
76 
77  @callback
78  def update_states(self, state: bool) -> None:
79  """Update the state of the device."""
80  self._attr_is_on_attr_is_on = state
81  self.async_write_ha_stateasync_write_ha_state()
82 
83 
85  """Represents a Livisi Window/Door Sensor as a Binary Sensor Entity."""
86 
87  def __init__(
88  self,
89  config_entry: ConfigEntry,
90  coordinator: LivisiDataUpdateCoordinator,
91  device: dict[str, Any],
92  ) -> None:
93  """Initialize the Livisi window/door sensor."""
94  super().__init__(config_entry, coordinator, device, "WindowDoorSensor")
95 
96  self._attr_device_class_attr_device_class = (
97  BinarySensorDeviceClass.DOOR
98  if (device.get("tags", {}).get("typeCategory") == "TCDoorId")
99  else BinarySensorDeviceClass.WINDOW
100  )
101 
102  async def async_added_to_hass(self) -> None:
103  """Get current state."""
104  await super().async_added_to_hass()
105  response = await self.coordinator.async_get_device_state(
106  self._capability_id_capability_id, "isOpen"
107  )
108  if response is None:
109  self._attr_available_attr_available_attr_available = False
110  else:
111  self._attr_is_on_attr_is_on_attr_is_on = response
None __init__(self, ConfigEntry config_entry, LivisiDataUpdateCoordinator coordinator, dict[str, Any] device, str capability_name)
None __init__(self, ConfigEntry config_entry, LivisiDataUpdateCoordinator coordinator, dict[str, Any] device)
Any|None async_get_device_state(self, str capability, str key)
Definition: coordinator.py:94
None async_on_remove(self, CALLBACK_TYPE func)
Definition: entity.py:1331
web.Response get(self, web.Request request, str config_key)
Definition: view.py:88
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Callable[[], None] async_dispatcher_connect(HomeAssistant hass, str signal, Callable[..., Any] target)
Definition: dispatcher.py:103