Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Support for Sure PetCare Flaps/Pets sensors."""
2 
3 from __future__ import annotations
4 
5 from typing import cast
6 
7 from surepy.entities import SurepyEntity
8 from surepy.entities.devices import Felaqua as SurepyFelaqua
9 from surepy.enums import EntityType
10 
11 from homeassistant.components.sensor import SensorDeviceClass, SensorEntity
12 from homeassistant.config_entries import ConfigEntry
13 from homeassistant.const import ATTR_VOLTAGE, PERCENTAGE, EntityCategory, UnitOfVolume
14 from homeassistant.core import HomeAssistant, callback
15 from homeassistant.helpers.entity_platform import AddEntitiesCallback
16 
17 from .const import DOMAIN, SURE_BATT_VOLTAGE_DIFF, SURE_BATT_VOLTAGE_LOW
18 from .coordinator import SurePetcareDataCoordinator
19 from .entity import SurePetcareEntity
20 
21 
23  hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
24 ) -> None:
25  """Set up Sure PetCare Flaps sensors."""
26 
27  entities: list[SurePetcareEntity] = []
28 
29  coordinator: SurePetcareDataCoordinator = hass.data[DOMAIN][entry.entry_id]
30 
31  for surepy_entity in coordinator.data.values():
32  if surepy_entity.type in [
33  EntityType.CAT_FLAP,
34  EntityType.PET_FLAP,
35  EntityType.FEEDER,
36  EntityType.FELAQUA,
37  ]:
38  entities.append(SureBattery(surepy_entity.id, coordinator))
39 
40  if surepy_entity.type == EntityType.FELAQUA:
41  entities.append(Felaqua(surepy_entity.id, coordinator))
42 
43  async_add_entities(entities)
44 
45 
47  """A sensor implementation for Sure Petcare batteries."""
48 
49  _attr_device_class = SensorDeviceClass.BATTERY
50  _attr_entity_category = EntityCategory.DIAGNOSTIC
51  _attr_native_unit_of_measurement = PERCENTAGE
52 
53  def __init__(
54  self, surepetcare_id: int, coordinator: SurePetcareDataCoordinator
55  ) -> None:
56  """Initialize a Sure Petcare battery sensor."""
57  super().__init__(surepetcare_id, coordinator)
58 
59  self._attr_name_attr_name = f"{self._device_name} Battery Level"
60  self._attr_unique_id_attr_unique_id = f"{self._device_id}-battery"
61 
62  @callback
63  def _update_attr(self, surepy_entity: SurepyEntity) -> None:
64  """Update the state and attributes."""
65  state = surepy_entity.raw_data()["status"]
66 
67  try:
68  per_battery_voltage = state["battery"] / 4
69  voltage_diff = per_battery_voltage - SURE_BATT_VOLTAGE_LOW
70  self._attr_native_value_attr_native_value = min(
71  int(voltage_diff / SURE_BATT_VOLTAGE_DIFF * 100), 100
72  )
73  except (KeyError, TypeError):
74  self._attr_native_value_attr_native_value = None
75 
76  if state:
77  voltage_per_battery = float(state["battery"]) / 4
78  self._attr_extra_state_attributes_attr_extra_state_attributes = {
79  ATTR_VOLTAGE: f"{float(state['battery']):.2f}",
80  f"{ATTR_VOLTAGE}_per_battery": f"{voltage_per_battery:.2f}",
81  }
82  else:
83  self._attr_extra_state_attributes_attr_extra_state_attributes = {}
84 
85 
87  """Sure Petcare Felaqua."""
88 
89  _attr_device_class = SensorDeviceClass.VOLUME
90  _attr_native_unit_of_measurement = UnitOfVolume.MILLILITERS
91 
92  def __init__(
93  self, surepetcare_id: int, coordinator: SurePetcareDataCoordinator
94  ) -> None:
95  """Initialize a Sure Petcare Felaqua sensor."""
96  super().__init__(surepetcare_id, coordinator)
97 
98  surepy_entity = cast(SurepyFelaqua, coordinator.data[surepetcare_id])
99 
100  self._attr_name_attr_name = self._device_name_device_name
101  self._attr_unique_id_attr_unique_id = self._device_id_device_id
102  self._attr_entity_picture_attr_entity_picture = surepy_entity.icon
103 
104  @callback
105  def _update_attr(self, surepy_entity: SurepyEntity) -> None:
106  """Update the state."""
107  surepy_entity = cast(SurepyFelaqua, surepy_entity)
108  self._attr_native_value_attr_native_value = surepy_entity.water_remaining
None __init__(self, int surepetcare_id, SurePetcareDataCoordinator coordinator)
Definition: sensor.py:94
None _update_attr(self, SurepyEntity surepy_entity)
Definition: sensor.py:105
None __init__(self, int surepetcare_id, SurePetcareDataCoordinator coordinator)
Definition: sensor.py:55
None _update_attr(self, SurepyEntity surepy_entity)
Definition: sensor.py:63
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: sensor.py:24