1 """Summary data from Fyta."""
3 from __future__
import annotations
5 from collections.abc
import Callable
6 from dataclasses
import dataclass
7 from datetime
import datetime
8 from typing
import Final
10 from fyta_cli.fyta_models
import Plant
15 SensorEntityDescription,
28 from .
import FytaConfigEntry
29 from .coordinator
import FytaCoordinator
30 from .entity
import FytaPlantEntity
33 @dataclass(frozen=True, kw_only=True)
35 """Describes Fyta sensor entity."""
37 value_fn: Callable[[Plant], StateType | datetime]
40 PLANT_STATUS_LIST: list[str] = [
"deleted",
"doing_great",
"need_attention",
"no_sensor"]
41 PLANT_MEASUREMENT_STATUS_LIST: list[str] = [
51 SENSORS: Final[list[FytaSensorEntityDescription]] = [
53 key=
"scientific_name",
54 translation_key=
"scientific_name",
55 value_fn=
lambda plant: plant.scientific_name,
59 translation_key=
"plant_status",
60 device_class=SensorDeviceClass.ENUM,
61 options=PLANT_STATUS_LIST,
62 value_fn=
lambda plant: plant.status.name.lower(),
65 key=
"temperature_status",
66 translation_key=
"temperature_status",
67 device_class=SensorDeviceClass.ENUM,
68 options=PLANT_MEASUREMENT_STATUS_LIST,
69 value_fn=
lambda plant: plant.temperature_status.name.lower(),
73 translation_key=
"light_status",
74 device_class=SensorDeviceClass.ENUM,
75 options=PLANT_MEASUREMENT_STATUS_LIST,
76 value_fn=
lambda plant: plant.light_status.name.lower(),
79 key=
"moisture_status",
80 translation_key=
"moisture_status",
81 device_class=SensorDeviceClass.ENUM,
82 options=PLANT_MEASUREMENT_STATUS_LIST,
83 value_fn=
lambda plant: plant.moisture_status.name.lower(),
86 key=
"salinity_status",
87 translation_key=
"salinity_status",
88 device_class=SensorDeviceClass.ENUM,
89 options=PLANT_MEASUREMENT_STATUS_LIST,
90 value_fn=
lambda plant: plant.salinity_status.name.lower(),
94 native_unit_of_measurement=UnitOfTemperature.CELSIUS,
95 device_class=SensorDeviceClass.TEMPERATURE,
96 state_class=SensorStateClass.MEASUREMENT,
97 value_fn=
lambda plant: plant.temperature,
101 translation_key=
"light",
102 native_unit_of_measurement=
"μmol/s⋅m²",
103 state_class=SensorStateClass.MEASUREMENT,
104 value_fn=
lambda plant: plant.light,
108 native_unit_of_measurement=PERCENTAGE,
109 device_class=SensorDeviceClass.MOISTURE,
110 state_class=SensorStateClass.MEASUREMENT,
111 value_fn=
lambda plant: plant.moisture,
115 translation_key=
"salinity",
116 native_unit_of_measurement=UnitOfConductivity.MILLISIEMENS_PER_CM,
117 device_class=SensorDeviceClass.CONDUCTIVITY,
118 state_class=SensorStateClass.MEASUREMENT,
119 value_fn=
lambda plant: plant.salinity,
123 device_class=SensorDeviceClass.PH,
124 state_class=SensorStateClass.MEASUREMENT,
125 value_fn=
lambda plant: plant.ph,
129 native_unit_of_measurement=PERCENTAGE,
130 device_class=SensorDeviceClass.BATTERY,
131 state_class=SensorStateClass.MEASUREMENT,
132 entity_category=EntityCategory.DIAGNOSTIC,
133 value_fn=
lambda plant: plant.battery_level,
139 hass: HomeAssistant, entry: FytaConfigEntry, async_add_entities: AddEntitiesCallback
141 """Set up the FYTA sensors."""
142 coordinator: FytaCoordinator = entry.runtime_data
146 for plant_id
in coordinator.fyta.plant_list
147 for sensor
in SENSORS
148 if sensor.key
in dir(coordinator.data.get(plant_id))
153 def _async_add_new_device(plant_id: int) ->
None:
156 for sensor
in SENSORS
157 if sensor.key
in dir(coordinator.data.get(plant_id))
160 coordinator.new_device_callbacks.append(_async_add_new_device)
164 """Represents a Fyta sensor."""
166 entity_description: FytaSensorEntityDescription
170 """Return the state for this sensor."""
StateType|datetime native_value(self)
None async_setup_entry(HomeAssistant hass, FytaConfigEntry entry, AddEntitiesCallback async_add_entities)