From 64bf80dd4f36de552611112967876257e4feb851 Mon Sep 17 00:00:00 2001 From: Florent Thoumie Date: Mon, 2 Sep 2019 00:30:16 +0000 Subject: [PATCH 1/2] Add sensor platform to iaqualink component --- .coveragerc | 1 + .../components/iaqualink/__init__.py | 10 +++ homeassistant/components/iaqualink/sensor.py | 66 +++++++++++++++++++ 3 files changed, 77 insertions(+) create mode 100644 homeassistant/components/iaqualink/sensor.py diff --git a/.coveragerc b/.coveragerc index 7a51a591780878..b63b5c4615d81d 100644 --- a/.coveragerc +++ b/.coveragerc @@ -289,6 +289,7 @@ omit = homeassistant/components/ialarm/alarm_control_panel.py homeassistant/components/iaqualink/climate.py homeassistant/components/iaqualink/light.py + homeassistant/components/iaqualink/sensor.py homeassistant/components/icloud/device_tracker.py homeassistant/components/idteck_prox/* homeassistant/components/ifttt/* diff --git a/homeassistant/components/iaqualink/__init__.py b/homeassistant/components/iaqualink/__init__.py index c7b7bc472dd544..7f471ca9a2c86b 100644 --- a/homeassistant/components/iaqualink/__init__.py +++ b/homeassistant/components/iaqualink/__init__.py @@ -10,12 +10,14 @@ AqualinkClient, AqualinkLight, AqualinkLoginException, + AqualinkSensor, AqualinkThermostat, ) from homeassistant import config_entries from homeassistant.components.climate import DOMAIN as CLIMATE_DOMAIN from homeassistant.components.light import DOMAIN as LIGHT_DOMAIN +from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN from homeassistant.config_entries import ConfigEntry from homeassistant.const import CONF_PASSWORD, CONF_USERNAME from homeassistant.core import callback @@ -74,6 +76,7 @@ async def async_setup_entry(hass: HomeAssistantType, entry: ConfigEntry) -> None # These will contain the initialized devices climates = hass.data[DOMAIN][CLIMATE_DOMAIN] = [] lights = hass.data[DOMAIN][LIGHT_DOMAIN] = [] + sensors = hass.data[DOMAIN][SENSOR_DOMAIN] = [] session = async_create_clientsession(hass, cookie_jar=CookieJar(unsafe=True)) aqualink = AqualinkClient(username, password, session) @@ -97,6 +100,8 @@ async def async_setup_entry(hass: HomeAssistantType, entry: ConfigEntry) -> None climates += [dev] elif isinstance(dev, AqualinkLight): lights += [dev] + elif isinstance(dev, AqualinkSensor): + sensors += [dev] forward_setup = hass.config_entries.async_forward_entry_setup if climates: @@ -105,6 +110,9 @@ async def async_setup_entry(hass: HomeAssistantType, entry: ConfigEntry) -> None if lights: _LOGGER.debug("Got %s lights: %s", len(lights), lights) hass.async_create_task(forward_setup(entry, LIGHT_DOMAIN)) + if sensors: + _LOGGER.debug("Got %s sensors: %s", len(sensors), sensors) + hass.async_create_task(forward_setup(entry, SENSOR_DOMAIN)) async def _async_systems_update(now): """Refresh internal state for all systems.""" @@ -126,6 +134,8 @@ async def async_unload_entry(hass: HomeAssistantType, entry: ConfigEntry) -> boo tasks += [forward_unload(entry, CLIMATE_DOMAIN)] if hass.data[DOMAIN][LIGHT_DOMAIN]: tasks += [forward_unload(entry, LIGHT_DOMAIN)] + if hass.data[DOMAIN][SENSOR_DOMAIN]: + tasks += [forward_unload(entry, SENSOR_DOMAIN)] hass.data[DOMAIN].clear() diff --git a/homeassistant/components/iaqualink/sensor.py b/homeassistant/components/iaqualink/sensor.py new file mode 100644 index 00000000000000..07ea593100c728 --- /dev/null +++ b/homeassistant/components/iaqualink/sensor.py @@ -0,0 +1,66 @@ +"""Support for Aqualink temperature sensors.""" +import logging +from typing import Optional + +from iaqualink import AqualinkSensor + +from homeassistant.components.sensor import DOMAIN +from homeassistant.config_entries import ConfigEntry +from homeassistant.const import DEVICE_CLASS_TEMPERATURE, TEMP_CELSIUS, TEMP_FAHRENHEIT +from homeassistant.helpers.typing import HomeAssistantType + +from . import AqualinkEntity +from .const import DOMAIN as AQUALINK_DOMAIN + +_LOGGER = logging.getLogger(__name__) + +PARALLEL_UPDATES = 0 + + +async def async_setup_entry( + hass: HomeAssistantType, config_entry: ConfigEntry, async_add_entities +) -> None: + """Set up discovered sensors.""" + devs = [] + for dev in hass.data[AQUALINK_DOMAIN][DOMAIN]: + devs.append(HassAqualinkSensor(dev)) + async_add_entities(devs, True) + + +class HassAqualinkSensor(AqualinkEntity): + """Representation of a sensor.""" + + def __init__(self, dev: AqualinkSensor): + """Initialize the sensor.""" + self.dev = dev + + @property + def name(self) -> str: + """Return the name of the sensor.""" + return self.dev.label + + @property + def unit_of_measurement(self) -> str: + """Return the measurement unit for the sensor.""" + if self.dev.system.temp_unit == "F": + return TEMP_FAHRENHEIT + return TEMP_CELSIUS + + @property + def state(self) -> str: + """Return the state of the sensor.""" + return int(self.dev.state) if self.dev.state else None + + @property + def device_class(self) -> Optional[str]: + """Return the class of the sensor.""" + if self.dev.name.endswith("_temp"): + return DEVICE_CLASS_TEMPERATURE + return None + + @property + def icon(self) -> Optional[str]: + """Return an icon based on the type sensor.""" + if self.dev.name.endswith("_temp"): + return "mdi:thermometer" + return None From 8feee8dd3eba328d572dd03e432fd71b3783493d Mon Sep 17 00:00:00 2001 From: Florent Thoumie Date: Mon, 9 Sep 2019 22:32:33 +0000 Subject: [PATCH 2/2] Remove unnecessary icon, fix case where value is 0 --- homeassistant/components/iaqualink/sensor.py | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/homeassistant/components/iaqualink/sensor.py b/homeassistant/components/iaqualink/sensor.py index 07ea593100c728..4a1691e0314caa 100644 --- a/homeassistant/components/iaqualink/sensor.py +++ b/homeassistant/components/iaqualink/sensor.py @@ -49,7 +49,7 @@ def unit_of_measurement(self) -> str: @property def state(self) -> str: """Return the state of the sensor.""" - return int(self.dev.state) if self.dev.state else None + return int(self.dev.state) if self.dev.state != "" else None @property def device_class(self) -> Optional[str]: @@ -57,10 +57,3 @@ def device_class(self) -> Optional[str]: if self.dev.name.endswith("_temp"): return DEVICE_CLASS_TEMPERATURE return None - - @property - def icon(self) -> Optional[str]: - """Return an icon based on the type sensor.""" - if self.dev.name.endswith("_temp"): - return "mdi:thermometer" - return None