1 """Sensors for National Weather Service (NWS)."""
3 from __future__
import annotations
5 from dataclasses
import dataclass
6 from datetime
import datetime
7 from types
import MappingProxyType
13 SensorEntityDescription,
30 TimestampDataUpdateCoordinator,
40 from .
import NWSConfigEntry, NWSData, base_unique_id, device_info
41 from .const
import ATTRIBUTION, CONF_STATION
46 @dataclass(frozen=True)
48 """Class describing NWSSensor entities."""
50 unit_convert: str |
None =
None
53 SENSOR_TYPES: tuple[NWSSensorEntityDescription, ...] = (
57 device_class=SensorDeviceClass.TEMPERATURE,
58 state_class=SensorStateClass.MEASUREMENT,
59 native_unit_of_measurement=UnitOfTemperature.CELSIUS,
60 unit_convert=UnitOfTemperature.CELSIUS,
65 device_class=SensorDeviceClass.TEMPERATURE,
66 state_class=SensorStateClass.MEASUREMENT,
67 native_unit_of_measurement=UnitOfTemperature.CELSIUS,
68 unit_convert=UnitOfTemperature.CELSIUS,
73 device_class=SensorDeviceClass.TEMPERATURE,
74 state_class=SensorStateClass.MEASUREMENT,
75 native_unit_of_measurement=UnitOfTemperature.CELSIUS,
76 unit_convert=UnitOfTemperature.CELSIUS,
81 device_class=SensorDeviceClass.TEMPERATURE,
82 state_class=SensorStateClass.MEASUREMENT,
83 native_unit_of_measurement=UnitOfTemperature.CELSIUS,
84 unit_convert=UnitOfTemperature.CELSIUS,
87 key=
"relativeHumidity",
88 name=
"Relative Humidity",
89 device_class=SensorDeviceClass.HUMIDITY,
90 state_class=SensorStateClass.MEASUREMENT,
91 native_unit_of_measurement=PERCENTAGE,
92 unit_convert=PERCENTAGE,
97 device_class=SensorDeviceClass.WIND_SPEED,
98 state_class=SensorStateClass.MEASUREMENT,
99 native_unit_of_measurement=UnitOfSpeed.KILOMETERS_PER_HOUR,
100 unit_convert=UnitOfSpeed.MILES_PER_HOUR,
105 device_class=SensorDeviceClass.WIND_SPEED,
106 state_class=SensorStateClass.MEASUREMENT,
107 native_unit_of_measurement=UnitOfSpeed.KILOMETERS_PER_HOUR,
108 unit_convert=UnitOfSpeed.MILES_PER_HOUR,
113 name=
"Wind Direction",
114 icon=
"mdi:compass-rose",
115 native_unit_of_measurement=DEGREE,
119 key=
"barometricPressure",
120 name=
"Barometric Pressure",
121 device_class=SensorDeviceClass.PRESSURE,
122 state_class=SensorStateClass.MEASUREMENT,
123 native_unit_of_measurement=UnitOfPressure.PA,
124 unit_convert=UnitOfPressure.INHG,
127 key=
"seaLevelPressure",
128 name=
"Sea Level Pressure",
129 device_class=SensorDeviceClass.PRESSURE,
130 state_class=SensorStateClass.MEASUREMENT,
131 native_unit_of_measurement=UnitOfPressure.PA,
132 unit_convert=UnitOfPressure.INHG,
138 state_class=SensorStateClass.MEASUREMENT,
139 native_unit_of_measurement=UnitOfLength.METERS,
140 unit_convert=UnitOfLength.MILES,
144 name=
"Latest Observation Time",
145 device_class=SensorDeviceClass.TIMESTAMP,
151 hass: HomeAssistant, entry: NWSConfigEntry, async_add_entities: AddEntitiesCallback
153 """Set up the NWS weather platform."""
154 nws_data = entry.runtime_data
155 station = entry.data[CONF_STATION]
160 entry_data=entry.data,
162 description=description,
165 for description
in SENSOR_TYPES
170 """An NWS Sensor Entity."""
172 entity_description: NWSSensorEntityDescription
173 _attr_attribution = ATTRIBUTION
174 _attr_entity_registry_enabled_default =
False
179 entry_data: MappingProxyType[str, Any],
181 description: NWSSensorEntityDescription,
184 """Initialise the platform with a data instance."""
185 super().
__init__(nws_data.coordinator_observation)
187 latitude = entry_data[CONF_LATITUDE]
188 longitude = entry_data[CONF_LONGITUDE]
192 if hass.config.units
is US_CUSTOMARY_SYSTEM:
196 f
"{base_unique_id(latitude, longitude)}_{description.key}"
201 """Return the state."""
203 not (observation := self.
_nws_nws.observation)
210 if unit_of_measurement == UnitOfSpeed.MILES_PER_HOUR:
212 SpeedConverter.convert(
213 value, UnitOfSpeed.KILOMETERS_PER_HOUR, UnitOfSpeed.MILES_PER_HOUR
216 if unit_of_measurement == UnitOfLength.MILES:
218 DistanceConverter.convert(
219 value, UnitOfLength.METERS, UnitOfLength.MILES
222 if unit_of_measurement == UnitOfPressure.INHG:
224 PressureConverter.convert(
225 value, UnitOfPressure.PA, UnitOfPressure.INHG
229 if unit_of_measurement == UnitOfTemperature.CELSIUS:
230 return round(value, 1)
231 if unit_of_measurement == PERCENTAGE:
_attr_native_unit_of_measurement
float|datetime|None native_value(self)
None __init__(self, HomeAssistant hass, MappingProxyType[str, Any] entry_data, NWSData nws_data, NWSSensorEntityDescription description, str station)
SensorDeviceClass|None device_class(self)
str|None native_unit_of_measurement(self)
str|None device_class(self)
DeviceInfo|None device_info(self)
datetime|None parse_datetime(str|None value)
None async_setup_entry(HomeAssistant hass, NWSConfigEntry entry, AddEntitiesCallback async_add_entities)