1 """Sensor component for LaCrosse View."""
3 from __future__
import annotations
5 from collections.abc
import Callable
6 from dataclasses
import dataclass, replace
9 from lacrosse_view
import Sensor
14 SensorEntityDescription,
21 UnitOfPrecipitationDepth,
31 DataUpdateCoordinator,
34 from .const
import DOMAIN
36 _LOGGER = logging.getLogger(__name__)
39 @dataclass(frozen=True, kw_only=True)
41 """Description for LaCrosse View sensor."""
43 value_fn: Callable[[Sensor, str], float | int | str |
None]
46 def get_value(sensor: Sensor, field: str) -> float | int | str |
None:
47 """Get the value of a sensor field."""
48 field_data = sensor.data.get(field)
49 if field_data
is None:
51 value = field_data[
"values"][-1][
"s"]
56 return int(value)
if value.is_integer()
else value
60 SENSOR_DESCRIPTIONS = {
63 device_class=SensorDeviceClass.TEMPERATURE,
64 state_class=SensorStateClass.MEASUREMENT,
66 native_unit_of_measurement=UnitOfTemperature.CELSIUS,
70 device_class=SensorDeviceClass.HUMIDITY,
71 state_class=SensorStateClass.MEASUREMENT,
73 native_unit_of_measurement=PERCENTAGE,
77 translation_key=
"heat_index",
78 device_class=SensorDeviceClass.TEMPERATURE,
79 state_class=SensorStateClass.MEASUREMENT,
81 native_unit_of_measurement=UnitOfTemperature.FAHRENHEIT,
85 state_class=SensorStateClass.MEASUREMENT,
87 native_unit_of_measurement=UnitOfSpeed.KILOMETERS_PER_HOUR,
88 device_class=SensorDeviceClass.WIND_SPEED,
92 state_class=SensorStateClass.MEASUREMENT,
94 native_unit_of_measurement=UnitOfPrecipitationDepth.MILLIMETERS,
95 device_class=SensorDeviceClass.PRECIPITATION,
99 translation_key=
"wind_heading",
101 native_unit_of_measurement=DEGREE,
105 translation_key=
"wet_dry",
110 translation_key=
"flex",
114 key=
"BarometricPressure",
115 translation_key=
"barometric_pressure",
116 state_class=SensorStateClass.MEASUREMENT,
118 device_class=SensorDeviceClass.ATMOSPHERIC_PRESSURE,
119 native_unit_of_measurement=UnitOfPressure.HPA,
123 translation_key=
"feels_like",
124 state_class=SensorStateClass.MEASUREMENT,
126 device_class=SensorDeviceClass.TEMPERATURE,
127 native_unit_of_measurement=UnitOfTemperature.FAHRENHEIT,
131 translation_key=
"wind_chill",
132 state_class=SensorStateClass.MEASUREMENT,
134 device_class=SensorDeviceClass.TEMPERATURE,
135 native_unit_of_measurement=UnitOfTemperature.FAHRENHEIT,
139 UNIT_OF_MEASUREMENT_MAP = {
140 "degrees_celsius": UnitOfTemperature.CELSIUS,
141 "degrees_fahrenheit": UnitOfTemperature.FAHRENHEIT,
142 "inches": UnitOfPrecipitationDepth.INCHES,
143 "millimeters": UnitOfPrecipitationDepth.MILLIMETERS,
144 "kilometers_per_hour": UnitOfSpeed.KILOMETERS_PER_HOUR,
145 "miles_per_hour": UnitOfSpeed.MILES_PER_HOUR,
152 async_add_entities: AddEntitiesCallback,
154 """Set up LaCrosse View from a config entry."""
155 coordinator: DataUpdateCoordinator[list[Sensor]] = hass.data[DOMAIN][
158 sensors: list[Sensor] = coordinator.data
161 for i, sensor
in enumerate(sensors):
162 for field
in sensor.sensor_field_names:
163 description = SENSOR_DESCRIPTIONS.get(field)
164 if description
is None:
166 f
"Unsupported sensor field: {field}\nPlease create an issue on "
168 " https://github.com/home-assistant/core/issues/new?assignees="
169 "&labels=&template=bug_report.yml&integration_name=LaCrosse%20View"
171 "https://www.home-assistant.io/integrations/lacrosse_view/"
172 "&additional_information="
173 f
"Field:%20{field}%0ASensor%20Model:%20{sensor.model}"
174 f
"&title=LaCrosse%20View%20Unsupported%20sensor%20field:%20{field}"
177 _LOGGER.warning(message)
181 if sensor.data.get(field)
is not None:
182 native_unit_of_measurement = UNIT_OF_MEASUREMENT_MAP.get(
183 sensor.data[field].
get(
"unit")
186 if native_unit_of_measurement
is not None:
187 description = replace(
189 native_unit_of_measurement=native_unit_of_measurement,
194 coordinator=coordinator,
195 description=description,
205 CoordinatorEntity[DataUpdateCoordinator[list[Sensor]]], SensorEntity
207 """LaCrosse View sensor."""
209 entity_description: LaCrosseSensorEntityDescription
210 _attr_has_entity_name =
True
214 description: LaCrosseSensorEntityDescription,
215 coordinator: DataUpdateCoordinator[list[Sensor]],
225 identifiers={(DOMAIN, sensor.sensor_id)},
227 manufacturer=
"LaCrosse Technology",
229 via_device=(DOMAIN, sensor.location.id),
235 """Return the sensor value."""
242 """Return True if entity is available."""
None __init__(self, LaCrosseSensorEntityDescription description, DataUpdateCoordinator[list[Sensor]] coordinator, Sensor sensor, int index)
int|float|str|None native_value(self)
web.Response get(self, web.Request request, str config_key)
float|int|str|None get_value(Sensor sensor, str field)
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)