So far the Flo integration only supports shutoff valves. Add support for Flo leak detector pucks, which measure temperature and humidity in addition to providing leak alerts.
227 lines
6.7 KiB
Python
227 lines
6.7 KiB
Python
"""Support for Flo Water Monitor sensors."""
|
|
|
|
from typing import List, Optional
|
|
|
|
from homeassistant.const import (
|
|
DEVICE_CLASS_BATTERY,
|
|
DEVICE_CLASS_HUMIDITY,
|
|
DEVICE_CLASS_PRESSURE,
|
|
DEVICE_CLASS_TEMPERATURE,
|
|
PERCENTAGE,
|
|
PRESSURE_PSI,
|
|
TEMP_FAHRENHEIT,
|
|
VOLUME_GALLONS,
|
|
)
|
|
|
|
from .const import DOMAIN as FLO_DOMAIN
|
|
from .device import FloDeviceDataUpdateCoordinator
|
|
from .entity import FloEntity
|
|
|
|
WATER_ICON = "mdi:water"
|
|
GAUGE_ICON = "mdi:gauge"
|
|
NAME_DAILY_USAGE = "Today's Water Usage"
|
|
NAME_CURRENT_SYSTEM_MODE = "Current System Mode"
|
|
NAME_FLOW_RATE = "Water Flow Rate"
|
|
NAME_WATER_TEMPERATURE = "Water Temperature"
|
|
NAME_AIR_TEMPERATURE = "Temperature"
|
|
NAME_WATER_PRESSURE = "Water Pressure"
|
|
NAME_HUMIDITY = "Humidity"
|
|
NAME_BATTERY = "Battery"
|
|
|
|
|
|
async def async_setup_entry(hass, config_entry, async_add_entities):
|
|
"""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(NAME_AIR_TEMPERATURE, device),
|
|
FloHumiditySensor(device),
|
|
FloBatterySensor(device),
|
|
]
|
|
)
|
|
else:
|
|
entities.extend(
|
|
[
|
|
FloDailyUsageSensor(device),
|
|
FloSystemModeSensor(device),
|
|
FloCurrentFlowRateSensor(device),
|
|
FloTemperatureSensor(NAME_WATER_TEMPERATURE, device),
|
|
FloPressureSensor(device),
|
|
]
|
|
)
|
|
async_add_entities(entities)
|
|
|
|
|
|
class FloDailyUsageSensor(FloEntity):
|
|
"""Monitors the daily water usage."""
|
|
|
|
def __init__(self, device):
|
|
"""Initialize the daily water usage sensor."""
|
|
super().__init__("daily_consumption", NAME_DAILY_USAGE, device)
|
|
self._state: float = None
|
|
|
|
@property
|
|
def icon(self) -> str:
|
|
"""Return the daily usage icon."""
|
|
return WATER_ICON
|
|
|
|
@property
|
|
def state(self) -> Optional[float]:
|
|
"""Return the current daily usage."""
|
|
if self._device.consumption_today is None:
|
|
return None
|
|
return round(self._device.consumption_today, 1)
|
|
|
|
@property
|
|
def unit_of_measurement(self) -> str:
|
|
"""Return gallons as the unit measurement for water."""
|
|
return VOLUME_GALLONS
|
|
|
|
|
|
class FloSystemModeSensor(FloEntity):
|
|
"""Monitors the current Flo system mode."""
|
|
|
|
def __init__(self, device):
|
|
"""Initialize the system mode sensor."""
|
|
super().__init__("current_system_mode", NAME_CURRENT_SYSTEM_MODE, device)
|
|
self._state: str = None
|
|
|
|
@property
|
|
def state(self) -> Optional[str]:
|
|
"""Return the current system mode."""
|
|
if not self._device.current_system_mode:
|
|
return None
|
|
return self._device.current_system_mode
|
|
|
|
|
|
class FloCurrentFlowRateSensor(FloEntity):
|
|
"""Monitors the current water flow rate."""
|
|
|
|
def __init__(self, device):
|
|
"""Initialize the flow rate sensor."""
|
|
super().__init__("current_flow_rate", NAME_FLOW_RATE, device)
|
|
self._state: float = None
|
|
|
|
@property
|
|
def icon(self) -> str:
|
|
"""Return the daily usage icon."""
|
|
return GAUGE_ICON
|
|
|
|
@property
|
|
def state(self) -> Optional[float]:
|
|
"""Return the current flow rate."""
|
|
if self._device.current_flow_rate is None:
|
|
return None
|
|
return round(self._device.current_flow_rate, 1)
|
|
|
|
@property
|
|
def unit_of_measurement(self) -> str:
|
|
"""Return the unit measurement."""
|
|
return "gpm"
|
|
|
|
|
|
class FloTemperatureSensor(FloEntity):
|
|
"""Monitors the temperature."""
|
|
|
|
def __init__(self, name, device):
|
|
"""Initialize the temperature sensor."""
|
|
super().__init__("temperature", name, device)
|
|
self._state: float = None
|
|
|
|
@property
|
|
def state(self) -> Optional[float]:
|
|
"""Return the current temperature."""
|
|
if self._device.temperature is None:
|
|
return None
|
|
return round(self._device.temperature, 1)
|
|
|
|
@property
|
|
def unit_of_measurement(self) -> str:
|
|
"""Return fahrenheit as the unit measurement for temperature."""
|
|
return TEMP_FAHRENHEIT
|
|
|
|
@property
|
|
def device_class(self) -> Optional[str]:
|
|
"""Return the device class for this sensor."""
|
|
return DEVICE_CLASS_TEMPERATURE
|
|
|
|
|
|
class FloHumiditySensor(FloEntity):
|
|
"""Monitors the humidity."""
|
|
|
|
def __init__(self, device):
|
|
"""Initialize the humidity sensor."""
|
|
super().__init__("humidity", NAME_HUMIDITY, device)
|
|
self._state: float = None
|
|
|
|
@property
|
|
def state(self) -> Optional[float]:
|
|
"""Return the current humidity."""
|
|
if self._device.humidity is None:
|
|
return None
|
|
return round(self._device.humidity, 1)
|
|
|
|
@property
|
|
def unit_of_measurement(self) -> str:
|
|
"""Return percent as the unit measurement for humidity."""
|
|
return PERCENTAGE
|
|
|
|
@property
|
|
def device_class(self) -> Optional[str]:
|
|
"""Return the device class for this sensor."""
|
|
return DEVICE_CLASS_HUMIDITY
|
|
|
|
|
|
class FloPressureSensor(FloEntity):
|
|
"""Monitors the water pressure."""
|
|
|
|
def __init__(self, device):
|
|
"""Initialize the pressure sensor."""
|
|
super().__init__("water_pressure", NAME_WATER_PRESSURE, device)
|
|
self._state: float = None
|
|
|
|
@property
|
|
def state(self) -> Optional[float]:
|
|
"""Return the current water pressure."""
|
|
if self._device.current_psi is None:
|
|
return None
|
|
return round(self._device.current_psi, 1)
|
|
|
|
@property
|
|
def unit_of_measurement(self) -> str:
|
|
"""Return gallons as the unit measurement for water."""
|
|
return PRESSURE_PSI
|
|
|
|
@property
|
|
def device_class(self) -> Optional[str]:
|
|
"""Return the device class for this sensor."""
|
|
return DEVICE_CLASS_PRESSURE
|
|
|
|
|
|
class FloBatterySensor(FloEntity):
|
|
"""Monitors the battery level for battery-powered leak detectors."""
|
|
|
|
def __init__(self, device):
|
|
"""Initialize the battery sensor."""
|
|
super().__init__("battery", NAME_BATTERY, device)
|
|
self._state: float = None
|
|
|
|
@property
|
|
def state(self) -> Optional[float]:
|
|
"""Return the current battery level."""
|
|
return self._device.battery_level
|
|
|
|
@property
|
|
def unit_of_measurement(self) -> str:
|
|
"""Return percentage as the unit measurement for battery."""
|
|
return PERCENTAGE
|
|
|
|
@property
|
|
def device_class(self) -> Optional[str]:
|
|
"""Return the device class for this sensor."""
|
|
return DEVICE_CLASS_BATTERY
|