mirror of https://github.com/home-assistant/core
190 lines
6.0 KiB
Python
190 lines
6.0 KiB
Python
"""Support for Flo Water Monitor sensors."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from homeassistant.components.sensor import (
|
|
SensorDeviceClass,
|
|
SensorEntity,
|
|
SensorStateClass,
|
|
)
|
|
from homeassistant.config_entries import ConfigEntry
|
|
from homeassistant.const import (
|
|
PERCENTAGE,
|
|
UnitOfPressure,
|
|
UnitOfTemperature,
|
|
UnitOfVolume,
|
|
UnitOfVolumeFlowRate,
|
|
)
|
|
from homeassistant.core import HomeAssistant
|
|
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
|
|
|
from .const import DOMAIN as FLO_DOMAIN
|
|
from .coordinator import FloDeviceDataUpdateCoordinator
|
|
from .entity import FloEntity
|
|
|
|
|
|
async def async_setup_entry(
|
|
hass: HomeAssistant,
|
|
config_entry: ConfigEntry,
|
|
async_add_entities: AddEntitiesCallback,
|
|
) -> None:
|
|
"""Set up the Flo sensors from config entry."""
|
|
devices: list[FloDeviceDataUpdateCoordinator] = hass.data[FLO_DOMAIN][
|
|
config_entry.entry_id
|
|
]["devices"]
|
|
entities = []
|
|
for device in devices:
|
|
if device.device_type == "puck_oem":
|
|
entities.extend(
|
|
[
|
|
FloTemperatureSensor(device, False),
|
|
FloHumiditySensor(device),
|
|
FloBatterySensor(device),
|
|
]
|
|
)
|
|
else:
|
|
entities.extend(
|
|
[
|
|
FloDailyUsageSensor(device),
|
|
FloSystemModeSensor(device),
|
|
FloCurrentFlowRateSensor(device),
|
|
FloTemperatureSensor(device, True),
|
|
FloPressureSensor(device),
|
|
]
|
|
)
|
|
async_add_entities(entities)
|
|
|
|
|
|
class FloDailyUsageSensor(FloEntity, SensorEntity):
|
|
"""Monitors the daily water usage."""
|
|
|
|
_attr_native_unit_of_measurement = UnitOfVolume.GALLONS
|
|
_attr_state_class: SensorStateClass = SensorStateClass.TOTAL_INCREASING
|
|
_attr_device_class = SensorDeviceClass.WATER
|
|
_attr_translation_key = "daily_consumption"
|
|
|
|
def __init__(self, device):
|
|
"""Initialize the daily water usage sensor."""
|
|
super().__init__("daily_consumption", device)
|
|
|
|
@property
|
|
def native_value(self) -> float | None:
|
|
"""Return the current daily usage."""
|
|
if self._device.consumption_today is None:
|
|
return None
|
|
return round(self._device.consumption_today, 1)
|
|
|
|
|
|
class FloSystemModeSensor(FloEntity, SensorEntity):
|
|
"""Monitors the current Flo system mode."""
|
|
|
|
_attr_translation_key = "current_system_mode"
|
|
|
|
def __init__(self, device):
|
|
"""Initialize the system mode sensor."""
|
|
super().__init__("current_system_mode", device)
|
|
|
|
@property
|
|
def native_value(self) -> str | None:
|
|
"""Return the current system mode."""
|
|
if not self._device.current_system_mode:
|
|
return None
|
|
return self._device.current_system_mode
|
|
|
|
|
|
class FloCurrentFlowRateSensor(FloEntity, SensorEntity):
|
|
"""Monitors the current water flow rate."""
|
|
|
|
_attr_native_unit_of_measurement = UnitOfVolumeFlowRate.GALLONS_PER_MINUTE
|
|
_attr_state_class: SensorStateClass = SensorStateClass.MEASUREMENT
|
|
_attr_device_class = SensorDeviceClass.VOLUME_FLOW_RATE
|
|
_attr_translation_key = "current_flow_rate"
|
|
|
|
def __init__(self, device):
|
|
"""Initialize the flow rate sensor."""
|
|
super().__init__("current_flow_rate", device)
|
|
|
|
@property
|
|
def native_value(self) -> float | None:
|
|
"""Return the current flow rate."""
|
|
if self._device.current_flow_rate is None:
|
|
return None
|
|
return round(self._device.current_flow_rate, 1)
|
|
|
|
|
|
class FloTemperatureSensor(FloEntity, SensorEntity):
|
|
"""Monitors the temperature."""
|
|
|
|
_attr_device_class = SensorDeviceClass.TEMPERATURE
|
|
_attr_native_unit_of_measurement = UnitOfTemperature.FAHRENHEIT
|
|
_attr_state_class: SensorStateClass = SensorStateClass.MEASUREMENT
|
|
|
|
def __init__(self, device, is_water):
|
|
"""Initialize the temperature sensor."""
|
|
super().__init__("temperature", device)
|
|
if is_water:
|
|
self._attr_translation_key = "water_temperature"
|
|
|
|
@property
|
|
def native_value(self) -> float | None:
|
|
"""Return the current temperature."""
|
|
if self._device.temperature is None:
|
|
return None
|
|
return round(self._device.temperature, 1)
|
|
|
|
|
|
class FloHumiditySensor(FloEntity, SensorEntity):
|
|
"""Monitors the humidity."""
|
|
|
|
_attr_device_class = SensorDeviceClass.HUMIDITY
|
|
_attr_native_unit_of_measurement = PERCENTAGE
|
|
_attr_state_class: SensorStateClass = SensorStateClass.MEASUREMENT
|
|
|
|
def __init__(self, device):
|
|
"""Initialize the humidity sensor."""
|
|
super().__init__("humidity", device)
|
|
|
|
@property
|
|
def native_value(self) -> float | None:
|
|
"""Return the current humidity."""
|
|
if self._device.humidity is None:
|
|
return None
|
|
return round(self._device.humidity, 1)
|
|
|
|
|
|
class FloPressureSensor(FloEntity, SensorEntity):
|
|
"""Monitors the water pressure."""
|
|
|
|
_attr_device_class = SensorDeviceClass.PRESSURE
|
|
_attr_native_unit_of_measurement = UnitOfPressure.PSI
|
|
_attr_state_class: SensorStateClass = SensorStateClass.MEASUREMENT
|
|
_attr_translation_key = "water_pressure"
|
|
|
|
def __init__(self, device):
|
|
"""Initialize the pressure sensor."""
|
|
super().__init__("water_pressure", device)
|
|
|
|
@property
|
|
def native_value(self) -> float | None:
|
|
"""Return the current water pressure."""
|
|
if self._device.current_psi is None:
|
|
return None
|
|
return round(self._device.current_psi, 1)
|
|
|
|
|
|
class FloBatterySensor(FloEntity, SensorEntity):
|
|
"""Monitors the battery level for battery-powered leak detectors."""
|
|
|
|
_attr_device_class = SensorDeviceClass.BATTERY
|
|
_attr_native_unit_of_measurement = PERCENTAGE
|
|
_attr_state_class: SensorStateClass = SensorStateClass.MEASUREMENT
|
|
|
|
def __init__(self, device):
|
|
"""Initialize the battery sensor."""
|
|
super().__init__("battery", device)
|
|
|
|
@property
|
|
def native_value(self) -> float | None:
|
|
"""Return the current battery level."""
|
|
return self._device.battery_level
|