Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Support for Anova Sensors."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Callable
6 from dataclasses import dataclass
7 
8 from anova_wifi import AnovaMode, AnovaState, APCUpdateSensor
9 
11  SensorDeviceClass,
12  SensorEntity,
13  SensorEntityDescription,
14  SensorStateClass,
15 )
16 from homeassistant.const import UnitOfTemperature, UnitOfTime
17 from homeassistant.core import HomeAssistant
18 from homeassistant.helpers.entity_platform import AddEntitiesCallback
19 from homeassistant.helpers.typing import StateType
20 
21 from .coordinator import AnovaCoordinator
22 from .entity import AnovaDescriptionEntity
23 from .models import AnovaConfigEntry
24 
25 
26 @dataclass(frozen=True, kw_only=True)
28  """Describes a Anova sensor."""
29 
30  value_fn: Callable[[APCUpdateSensor], StateType]
31 
32 
33 SENSOR_DESCRIPTIONS: list[AnovaSensorEntityDescription] = [
35  key="cook_time",
36  state_class=SensorStateClass.TOTAL_INCREASING,
37  native_unit_of_measurement=UnitOfTime.SECONDS,
38  translation_key="cook_time",
39  device_class=SensorDeviceClass.DURATION,
40  value_fn=lambda data: data.cook_time,
41  ),
43  key="state",
44  translation_key="state",
45  device_class=SensorDeviceClass.ENUM,
46  options=[state.name for state in AnovaState],
47  value_fn=lambda data: data.state,
48  ),
50  key="mode",
51  translation_key="mode",
52  device_class=SensorDeviceClass.ENUM,
53  options=[mode.name for mode in AnovaMode],
54  value_fn=lambda data: data.mode,
55  ),
57  key="target_temperature",
58  native_unit_of_measurement=UnitOfTemperature.CELSIUS,
59  device_class=SensorDeviceClass.TEMPERATURE,
60  state_class=SensorStateClass.MEASUREMENT,
61  translation_key="target_temperature",
62  value_fn=lambda data: data.target_temperature,
63  ),
65  key="cook_time_remaining",
66  native_unit_of_measurement=UnitOfTime.SECONDS,
67  translation_key="cook_time_remaining",
68  device_class=SensorDeviceClass.DURATION,
69  value_fn=lambda data: data.cook_time_remaining,
70  ),
72  key="heater_temperature",
73  native_unit_of_measurement=UnitOfTemperature.CELSIUS,
74  device_class=SensorDeviceClass.TEMPERATURE,
75  state_class=SensorStateClass.MEASUREMENT,
76  translation_key="heater_temperature",
77  value_fn=lambda data: data.heater_temperature,
78  ),
80  key="triac_temperature",
81  native_unit_of_measurement=UnitOfTemperature.CELSIUS,
82  device_class=SensorDeviceClass.TEMPERATURE,
83  state_class=SensorStateClass.MEASUREMENT,
84  translation_key="triac_temperature",
85  value_fn=lambda data: data.triac_temperature,
86  ),
88  key="water_temperature",
89  native_unit_of_measurement=UnitOfTemperature.CELSIUS,
90  device_class=SensorDeviceClass.TEMPERATURE,
91  state_class=SensorStateClass.MEASUREMENT,
92  translation_key="water_temperature",
93  value_fn=lambda data: data.water_temperature,
94  ),
95 ]
96 
97 
99  hass: HomeAssistant,
100  entry: AnovaConfigEntry,
101  async_add_entities: AddEntitiesCallback,
102 ) -> None:
103  """Set up Anova device."""
104  anova_data = entry.runtime_data
105 
106  for coordinator in anova_data.coordinators:
107  setup_coordinator(coordinator, async_add_entities)
108 
109 
111  coordinator: AnovaCoordinator,
112  async_add_entities: AddEntitiesCallback,
113 ) -> None:
114  """Set up an individual Anova Coordinator."""
115 
116  def _async_sensor_listener() -> None:
117  """Listen for new sensor data and add sensors if they did not exist."""
118  if not coordinator.sensor_data_set:
119  valid_entities: set[AnovaSensor] = set()
120  for description in SENSOR_DESCRIPTIONS:
121  if description.value_fn(coordinator.data.sensor) is not None:
122  valid_entities.add(AnovaSensor(coordinator, description))
123  async_add_entities(valid_entities)
124  coordinator.sensor_data_set = True
125 
126  if coordinator.data is not None:
127  _async_sensor_listener()
128  # It is possible that we don't have any data, but the device exists,
129  # i.e. slow network, offline device, etc.
130  # We want to set up sensors after the fact as we don't know what sensors
131  # are valid until runtime.
132  coordinator.async_add_listener(_async_sensor_listener)
133 
134 
136  """A sensor using Anova coordinator."""
137 
138  entity_description: AnovaSensorEntityDescription
139 
140  @property
141  def native_value(self) -> StateType:
142  """Return the state."""
143  return self.entity_descriptionentity_description.value_fn(self.coordinator.data.sensor)
None async_setup_entry(HomeAssistant hass, AnovaConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: sensor.py:102
None setup_coordinator(AnovaCoordinator coordinator, AddEntitiesCallback async_add_entities)
Definition: sensor.py:113