1 """Support for Canary sensors."""
3 from __future__
import annotations
5 from typing
import Final
7 from canary.model
import Device, Location, SensorType
13 SIGNAL_STRENGTH_DECIBELS_MILLIWATT,
21 from .const
import DATA_COORDINATOR, DOMAIN, MANUFACTURER
22 from .coordinator
import CanaryDataUpdateCoordinator
24 type SensorTypeItem = tuple[
25 str, str |
None, str |
None, SensorDeviceClass |
None, list[str]
28 SENSOR_VALUE_PRECISION: Final = 2
29 ATTR_AIR_QUALITY: Final =
"air_quality"
35 CANARY_PRO: Final =
"Canary Pro"
36 CANARY_FLEX: Final =
"Canary Flex"
40 SENSOR_TYPES: Final[list[SensorTypeItem]] = [
43 UnitOfTemperature.CELSIUS,
45 SensorDeviceClass.TEMPERATURE,
48 (
"humidity", PERCENTAGE,
None, SensorDeviceClass.HUMIDITY, [CANARY_PRO]),
49 (
"air_quality",
None,
"mdi:weather-windy",
None, [CANARY_PRO]),
52 SIGNAL_STRENGTH_DECIBELS_MILLIWATT,
54 SensorDeviceClass.SIGNAL_STRENGTH,
57 (
"battery", PERCENTAGE,
None, SensorDeviceClass.BATTERY, [CANARY_FLEX]),
60 STATE_AIR_QUALITY_NORMAL: Final =
"normal"
61 STATE_AIR_QUALITY_ABNORMAL: Final =
"abnormal"
62 STATE_AIR_QUALITY_VERY_ABNORMAL: Final =
"very_abnormal"
68 async_add_entities: AddEntitiesCallback,
70 """Set up Canary sensors based on a config entry."""
71 coordinator: CanaryDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id][
74 sensors: list[CanarySensor] = []
76 for location
in coordinator.data[
"locations"].values():
77 for device
in location.devices:
79 device_type = device.device_type
82 for sensor_type
in SENSOR_TYPES
83 if device_type.get(
"name")
in sensor_type[4]
90 """Representation of a Canary sensor."""
94 coordinator: CanaryDataUpdateCoordinator,
95 sensor_type: SensorTypeItem,
99 """Initialize the sensor."""
105 sensor_type_name = sensor_type[0].replace(
"_",
" ").title()
106 self.
_attr_name_attr_name = f
"{location.name} {device.name} {sensor_type_name}"
108 canary_sensor_type =
None
110 canary_sensor_type = SensorType.AIR_QUALITY
112 canary_sensor_type = SensorType.TEMPERATURE
114 canary_sensor_type = SensorType.HUMIDITY
116 canary_sensor_type = SensorType.WIFI
118 canary_sensor_type = SensorType.BATTERY
123 identifiers={(DOMAIN,
str(device.device_id))},
124 model=device.device_type[
"name"],
125 manufacturer=MANUFACTURER,
134 """Return the device sensor reading."""
135 readings = self.coordinator.data[
"readings"][self.
_device_id_device_id]
140 for reading
in readings
146 if value
is not None:
147 return round(
float(value), SENSOR_VALUE_PRECISION)
153 """Return the state of the sensor."""
158 """Return the state attributes."""
161 if self.
_sensor_type_sensor_type[0] ==
"air_quality" and reading
is not None:
164 air_quality = STATE_AIR_QUALITY_VERY_ABNORMAL
165 elif reading <= 0.59:
166 air_quality = STATE_AIR_QUALITY_ABNORMAL
168 air_quality = STATE_AIR_QUALITY_NORMAL
170 return {ATTR_AIR_QUALITY: air_quality}
_attr_native_unit_of_measurement
dict[str, str]|None extra_state_attributes(self)
None __init__(self, CanaryDataUpdateCoordinator coordinator, SensorTypeItem sensor_type, Location location, Device device)
float|None native_value(self)
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)