Home Assistant Unofficial Reference 2024.12.1
binary_sensor.py
Go to the documentation of this file.
1 """Support for Lutron Homeworks binary sensors."""
2 
3 from __future__ import annotations
4 
5 import logging
6 from typing import Any
7 
8 from pyhomeworks.pyhomeworks import HW_KEYPAD_LED_CHANGED, Homeworks
9 
10 from homeassistant.components.binary_sensor import BinarySensorEntity
11 from homeassistant.config_entries import ConfigEntry
12 from homeassistant.const import CONF_NAME
13 from homeassistant.core import HomeAssistant, callback
14 from homeassistant.helpers.device_registry import DeviceInfo
15 from homeassistant.helpers.dispatcher import async_dispatcher_connect
16 from homeassistant.helpers.entity_platform import AddEntitiesCallback
17 
18 from . import HomeworksData, HomeworksKeypad
19 from .const import (
20  CONF_ADDR,
21  CONF_BUTTONS,
22  CONF_CONTROLLER_ID,
23  CONF_KEYPADS,
24  CONF_LED,
25  CONF_NUMBER,
26  DOMAIN,
27 )
28 from .entity import HomeworksEntity
29 
30 _LOGGER = logging.getLogger(__name__)
31 
32 
34  hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
35 ) -> None:
36  """Set up Homeworks binary sensors."""
37  data: HomeworksData = hass.data[DOMAIN][entry.entry_id]
38  controller = data.controller
39  controller_id = entry.options[CONF_CONTROLLER_ID]
40  entities = []
41  for keypad in entry.options.get(CONF_KEYPADS, []):
42  for button in keypad[CONF_BUTTONS]:
43  if not button[CONF_LED]:
44  continue
45  entity = HomeworksBinarySensor(
46  controller,
47  data.keypads[keypad[CONF_ADDR]],
48  controller_id,
49  keypad[CONF_ADDR],
50  keypad[CONF_NAME],
51  button[CONF_NAME],
52  button[CONF_NUMBER],
53  )
54  entities.append(entity)
55  async_add_entities(entities, True)
56 
57 
59  """Homeworks Binary Sensor."""
60 
61  _attr_has_entity_name = True
62 
63  def __init__(
64  self,
65  controller: Homeworks,
66  keypad: HomeworksKeypad,
67  controller_id: str,
68  addr: str,
69  keypad_name: str,
70  button_name: str,
71  led_number: int,
72  ) -> None:
73  """Create device with Addr, name, and rate."""
74  super().__init__(controller, controller_id, addr, led_number, button_name)
75  self._attr_device_info_attr_device_info = DeviceInfo(
76  identifiers={(DOMAIN, f"{controller_id}.{addr}")}, name=keypad_name
77  )
78  self._keypad_keypad = keypad
79 
80  async def async_added_to_hass(self) -> None:
81  """Call when entity is added to hass."""
82  signal = f"homeworks_entity_{self._controller_id}_{self._addr}"
83  _LOGGER.debug("connecting %s", signal)
84  self.async_on_removeasync_on_remove(
85  async_dispatcher_connect(self.hasshass, signal, self._update_callback_update_callback)
86  )
87  await self._keypad_keypad.request_keypad_led_states()
88 
89  @callback
90  def _update_callback(self, msg_type: str, values: list[Any]) -> None:
91  """Process device specific messages."""
92  if msg_type != HW_KEYPAD_LED_CHANGED or len(values[1]) < self._idx_idx:
93  return
94  self._attr_is_on_attr_is_on = bool(values[1][self._idx_idx - 1])
95  self.async_write_ha_stateasync_write_ha_state()
None __init__(self, Homeworks controller, HomeworksKeypad keypad, str controller_id, str addr, str keypad_name, str button_name, int led_number)
None _update_callback(self, str msg_type, list[Any] values)
None async_on_remove(self, CALLBACK_TYPE func)
Definition: entity.py:1331
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)
Callable[[], None] async_dispatcher_connect(HomeAssistant hass, str signal, Callable[..., Any] target)
Definition: dispatcher.py:103