Home Assistant Unofficial Reference 2024.12.1
binary_sensor.py
Go to the documentation of this file.
1 """Support for Sure PetCare Flaps/Pets binary sensors."""
2 
3 from __future__ import annotations
4 
5 from typing import cast
6 
7 from surepy.entities import SurepyEntity
8 from surepy.entities.pet import Pet as SurepyPet
9 from surepy.enums import EntityType, Location
10 
12  BinarySensorDeviceClass,
13  BinarySensorEntity,
14 )
15 from homeassistant.config_entries import ConfigEntry
16 from homeassistant.const import EntityCategory
17 from homeassistant.core import HomeAssistant, callback
18 from homeassistant.helpers.entity_platform import AddEntitiesCallback
19 
20 from .const import DOMAIN
21 from .coordinator import SurePetcareDataCoordinator
22 from .entity import SurePetcareEntity
23 
24 
26  hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
27 ) -> None:
28  """Set up Sure PetCare Flaps binary sensors based on a config entry."""
29 
30  entities: list[SurePetcareBinarySensor] = []
31 
32  coordinator: SurePetcareDataCoordinator = hass.data[DOMAIN][entry.entry_id]
33 
34  for surepy_entity in coordinator.data.values():
35  # connectivity
36  if surepy_entity.type in [
37  EntityType.CAT_FLAP,
38  EntityType.PET_FLAP,
39  EntityType.FEEDER,
40  EntityType.FELAQUA,
41  ]:
42  entities.append(DeviceConnectivity(surepy_entity.id, coordinator))
43  elif surepy_entity.type == EntityType.PET:
44  entities.append(Pet(surepy_entity.id, coordinator))
45  elif surepy_entity.type == EntityType.HUB:
46  entities.append(Hub(surepy_entity.id, coordinator))
47 
48  async_add_entities(entities)
49 
50 
52  """A binary sensor implementation for Sure Petcare Entities."""
53 
54  def __init__(
55  self,
56  surepetcare_id: int,
57  coordinator: SurePetcareDataCoordinator,
58  ) -> None:
59  """Initialize a Sure Petcare binary sensor."""
60  super().__init__(surepetcare_id, coordinator)
61 
62  self._attr_name_attr_name = self._device_name_device_name
63  self._attr_unique_id_attr_unique_id = self._device_id_device_id
64 
65 
67  """Sure Petcare Hub."""
68 
69  _attr_device_class = BinarySensorDeviceClass.CONNECTIVITY
70  _attr_entity_category = EntityCategory.DIAGNOSTIC
71 
72  @property
73  def available(self) -> bool:
74  """Return True if entity is available."""
75  return super().available and bool(self._attr_is_on_attr_is_on)
76 
77  @callback
78  def _update_attr(self, surepy_entity: SurepyEntity) -> None:
79  """Get the latest data and update the state."""
80  state = surepy_entity.raw_data()["status"]
81  self._attr_is_on_attr_is_on = self._attr_available_attr_available = bool(state["online"])
82  if surepy_entity.raw_data():
83  self._attr_extra_state_attributes_attr_extra_state_attributes = {
84  "led_mode": int(surepy_entity.raw_data()["status"]["led_mode"]),
85  "pairing_mode": bool(
86  surepy_entity.raw_data()["status"]["pairing_mode"]
87  ),
88  }
89  else:
90  self._attr_extra_state_attributes_attr_extra_state_attributes = {}
91 
92 
94  """Sure Petcare Pet."""
95 
96  _attr_device_class = BinarySensorDeviceClass.PRESENCE
97 
98  @callback
99  def _update_attr(self, surepy_entity: SurepyEntity) -> None:
100  """Get the latest data and update the state."""
101  surepy_entity = cast(SurepyPet, surepy_entity)
102  state = surepy_entity.location
103  try:
104  self._attr_is_on_attr_is_on = bool(Location(state.where) == Location.INSIDE)
105  except (KeyError, TypeError):
106  self._attr_is_on_attr_is_on = False
107  if state:
108  self._attr_extra_state_attributes_attr_extra_state_attributes = {
109  "since": state.since,
110  "where": state.where,
111  }
112  else:
113  self._attr_extra_state_attributes_attr_extra_state_attributes = {}
114 
115 
117  """Sure Petcare Device."""
118 
119  _attr_device_class = BinarySensorDeviceClass.CONNECTIVITY
120  _attr_entity_category = EntityCategory.DIAGNOSTIC
121 
122  def __init__(
123  self,
124  surepetcare_id: int,
125  coordinator: SurePetcareDataCoordinator,
126  ) -> None:
127  """Initialize a Sure Petcare Device."""
128  super().__init__(surepetcare_id, coordinator)
129  self._attr_name_attr_name_attr_name = f"{self._device_name} Connectivity"
130  self._attr_unique_id_attr_unique_id_attr_unique_id = f"{self._device_id}-connectivity"
131 
132  @callback
133  def _update_attr(self, surepy_entity: SurepyEntity) -> None:
134  state = surepy_entity.raw_data()["status"]
135  self._attr_is_on_attr_is_on = bool(state)
136  if state:
137  self._attr_extra_state_attributes_attr_extra_state_attributes = {
138  "device_rssi": f'{state["signal"]["device_rssi"]:.2f}',
139  "hub_rssi": f'{state["signal"]["hub_rssi"]:.2f}',
140  }
141  else:
142  self._attr_extra_state_attributes_attr_extra_state_attributes = {}
None __init__(self, int surepetcare_id, SurePetcareDataCoordinator coordinator)
None _update_attr(self, SurepyEntity surepy_entity)
None _update_attr(self, SurepyEntity surepy_entity)
None __init__(self, int surepetcare_id, SurePetcareDataCoordinator coordinator)
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)