1 """Support for Anova Sensors."""
3 from __future__
import annotations
5 from collections.abc
import Callable
6 from dataclasses
import dataclass
8 from anova_wifi
import AnovaMode, AnovaState, APCUpdateSensor
13 SensorEntityDescription,
21 from .coordinator
import AnovaCoordinator
22 from .entity
import AnovaDescriptionEntity
23 from .models
import AnovaConfigEntry
26 @dataclass(frozen=True, kw_only=True)
28 """Describes a Anova sensor."""
30 value_fn: Callable[[APCUpdateSensor], StateType]
33 SENSOR_DESCRIPTIONS: list[AnovaSensorEntityDescription] = [
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,
44 translation_key=
"state",
45 device_class=SensorDeviceClass.ENUM,
46 options=[state.name
for state
in AnovaState],
47 value_fn=
lambda data: data.state,
51 translation_key=
"mode",
52 device_class=SensorDeviceClass.ENUM,
53 options=[mode.name
for mode
in AnovaMode],
54 value_fn=
lambda data: data.mode,
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,
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,
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,
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,
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,
100 entry: AnovaConfigEntry,
101 async_add_entities: AddEntitiesCallback,
103 """Set up Anova device."""
104 anova_data = entry.runtime_data
106 for coordinator
in anova_data.coordinators:
111 coordinator: AnovaCoordinator,
112 async_add_entities: AddEntitiesCallback,
114 """Set up an individual Anova Coordinator."""
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))
124 coordinator.sensor_data_set =
True
126 if coordinator.data
is not None:
127 _async_sensor_listener()
132 coordinator.async_add_listener(_async_sensor_listener)
136 """A sensor using Anova coordinator."""
138 entity_description: AnovaSensorEntityDescription
142 """Return the state."""
StateType native_value(self)
None async_setup_entry(HomeAssistant hass, AnovaConfigEntry entry, AddEntitiesCallback async_add_entities)
None setup_coordinator(AnovaCoordinator coordinator, AddEntitiesCallback async_add_entities)