diff --git a/CODEOWNERS b/CODEOWNERS index 0162683a939..d320f72243d 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -186,6 +186,7 @@ homeassistant/components/huawei_router/* @abmantis homeassistant/components/hue/* @balloob homeassistant/components/hunterdouglas_powerview/* @bdraco homeassistant/components/hvv_departures/* @vigonotion +homeassistant/components/hydrawise/* @ptcryan homeassistant/components/iammeter/* @lewei50 homeassistant/components/iaqualink/* @flz homeassistant/components/icloud/* @Quentame diff --git a/homeassistant/components/hydrawise/__init__.py b/homeassistant/components/hydrawise/__init__.py index 28b577354d2..08827baae68 100644 --- a/homeassistant/components/hydrawise/__init__.py +++ b/homeassistant/components/hydrawise/__init__.py @@ -6,6 +6,12 @@ from hydrawiser.core import Hydrawiser from requests.exceptions import ConnectTimeout, HTTPError import voluptuous as vol +from homeassistant.components.binary_sensor import ( + DEVICE_CLASS_CONNECTIVITY, + DEVICE_CLASS_MOISTURE, +) +from homeassistant.components.sensor import DEVICE_CLASS_TIMESTAMP +from homeassistant.components.switch import DEVICE_CLASS_SWITCH from homeassistant.const import ( ATTR_ATTRIBUTION, CONF_ACCESS_TOKEN, @@ -40,16 +46,15 @@ DEVICE_MAP_INDEX = [ "UNIT_OF_MEASURE_INDEX", ] DEVICE_MAP = { - "auto_watering": ["Automatic Watering", "mdi:autorenew", "", ""], - "is_watering": ["Watering", "", "moisture", ""], - "manual_watering": ["Manual Watering", "mdi:water-pump", "", ""], - "next_cycle": ["Next Cycle", "mdi:calendar-clock", "", ""], - "status": ["Status", "", "connectivity", ""], - "watering_time": ["Watering Time", "mdi:water-pump", "", TIME_MINUTES], - "rain_sensor": ["Rain Sensor", "", "moisture", ""], + "auto_watering": ["Automatic Watering", None, DEVICE_CLASS_SWITCH, None], + "is_watering": ["Watering", None, DEVICE_CLASS_MOISTURE, None], + "manual_watering": ["Manual Watering", None, DEVICE_CLASS_SWITCH, None], + "next_cycle": ["Next Cycle", None, DEVICE_CLASS_TIMESTAMP, None], + "status": ["Status", None, DEVICE_CLASS_CONNECTIVITY, None], + "watering_time": ["Watering Time", "mdi:water-pump", None, TIME_MINUTES], } -BINARY_SENSORS = ["is_watering", "status", "rain_sensor"] +BINARY_SENSORS = ["is_watering", "status"] SENSORS = ["next_cycle", "watering_time"] @@ -149,3 +154,15 @@ class HydrawiseEntity(Entity): def device_state_attributes(self): """Return the state attributes.""" return {ATTR_ATTRIBUTION: ATTRIBUTION, "identifier": self.data.get("relay")} + + @property + def device_class(self): + """Return the device class of the sensor type.""" + return DEVICE_MAP[self._sensor_type][ + DEVICE_MAP_INDEX.index("DEVICE_CLASS_INDEX") + ] + + @property + def icon(self): + """Return the icon to use in the frontend, if any.""" + return DEVICE_MAP[self._sensor_type][DEVICE_MAP_INDEX.index("ICON_INDEX")] diff --git a/homeassistant/components/hydrawise/binary_sensor.py b/homeassistant/components/hydrawise/binary_sensor.py index 389506c6d5a..e39ffce73a9 100644 --- a/homeassistant/components/hydrawise/binary_sensor.py +++ b/homeassistant/components/hydrawise/binary_sensor.py @@ -7,13 +7,7 @@ from homeassistant.components.binary_sensor import PLATFORM_SCHEMA, BinarySensor from homeassistant.const import CONF_MONITORED_CONDITIONS import homeassistant.helpers.config_validation as cv -from . import ( - BINARY_SENSORS, - DATA_HYDRAWISE, - DEVICE_MAP, - DEVICE_MAP_INDEX, - HydrawiseEntity, -) +from . import BINARY_SENSORS, DATA_HYDRAWISE, HydrawiseEntity _LOGGER = logging.getLogger(__name__) @@ -32,17 +26,14 @@ def setup_platform(hass, config, add_entities, discovery_info=None): sensors = [] for sensor_type in config.get(CONF_MONITORED_CONDITIONS): - if sensor_type in ["status", "rain_sensor"]: + if sensor_type == "status": sensors.append( - HydrawiseBinarySensor(hydrawise.controller_status, sensor_type) + HydrawiseBinarySensor(hydrawise.current_controller, sensor_type) ) - else: # create a sensor for each zone for zone in hydrawise.relays: - zone_data = zone - zone_data["running"] = hydrawise.controller_status.get("running", False) - sensors.append(HydrawiseBinarySensor(zone_data, sensor_type)) + sensors.append(HydrawiseBinarySensor(zone, sensor_type)) add_entities(sensors, True) @@ -61,21 +52,6 @@ class HydrawiseBinarySensor(HydrawiseEntity, BinarySensorEntity): mydata = self.hass.data[DATA_HYDRAWISE].data if self._sensor_type == "status": self._state = mydata.status == "All good!" - elif self._sensor_type == "rain_sensor": - for sensor in mydata.sensors: - if sensor["name"] == "Rain": - self._state = sensor["active"] == 1 elif self._sensor_type == "is_watering": - if not mydata.running: - self._state = False - elif int(mydata.running[0]["relay"]) == self.data["relay"]: - self._state = True - else: - self._state = False - - @property - def device_class(self): - """Return the device class of the sensor type.""" - return DEVICE_MAP[self._sensor_type][ - DEVICE_MAP_INDEX.index("DEVICE_CLASS_INDEX") - ] + relay_data = mydata.relays[self.data["relay"] - 1] + self._state = relay_data["timestr"] == "Now" diff --git a/homeassistant/components/hydrawise/manifest.json b/homeassistant/components/hydrawise/manifest.json index 1d6a2ee85ea..d5a18620edd 100644 --- a/homeassistant/components/hydrawise/manifest.json +++ b/homeassistant/components/hydrawise/manifest.json @@ -2,6 +2,6 @@ "domain": "hydrawise", "name": "Hunter Hydrawise", "documentation": "https://www.home-assistant.io/integrations/hydrawise", - "requirements": ["hydrawiser==0.1.1"], - "codeowners": [] + "requirements": ["hydrawiser==0.2"], + "codeowners": ["@ptcryan"] } diff --git a/homeassistant/components/hydrawise/sensor.py b/homeassistant/components/hydrawise/sensor.py index 88146dbeb0d..6a0c6ab0d80 100644 --- a/homeassistant/components/hydrawise/sensor.py +++ b/homeassistant/components/hydrawise/sensor.py @@ -6,8 +6,9 @@ import voluptuous as vol from homeassistant.components.sensor import PLATFORM_SCHEMA from homeassistant.const import CONF_MONITORED_CONDITIONS import homeassistant.helpers.config_validation as cv +from homeassistant.util import dt -from . import DATA_HYDRAWISE, DEVICE_MAP, DEVICE_MAP_INDEX, SENSORS, HydrawiseEntity +from . import DATA_HYDRAWISE, SENSORS, HydrawiseEntity _LOGGER = logging.getLogger(__name__) @@ -19,6 +20,9 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( } ) +TWO_YEAR_SECONDS = 60 * 60 * 24 * 365 * 2 +WATERING_TIME_ICON = "mdi:water-pump" + def setup_platform(hass, config, add_entities, discovery_info=None): """Set up a sensor for a Hydrawise device.""" @@ -44,23 +48,15 @@ class HydrawiseSensor(HydrawiseEntity): """Get the latest data and updates the states.""" mydata = self.hass.data[DATA_HYDRAWISE].data _LOGGER.debug("Updating Hydrawise sensor: %s", self._name) + relay_data = mydata.relays[self.data["relay"] - 1] if self._sensor_type == "watering_time": - if not mydata.running: - self._state = 0 + if relay_data["timestr"] == "Now": + self._state = int(relay_data["run"] / 60) else: - if int(mydata.running[0]["relay"]) == self.data["relay"]: - self._state = int(mydata.running[0]["time_left"] / 60) - else: - self._state = 0 + self._state = 0 else: # _sensor_type == 'next_cycle' - for relay in mydata.relays: - if relay["relay"] == self.data["relay"]: - if relay["nicetime"] == "Not scheduled": - self._state = "not_scheduled" - else: - self._state = f"{relay['nicetime'].split(',')[0]} {relay['nicetime'].split(' ')[3]}" - - @property - def icon(self): - """Icon to use in the frontend, if any.""" - return DEVICE_MAP[self._sensor_type][DEVICE_MAP_INDEX.index("ICON_INDEX")] + next_cycle = min(relay_data["time"], TWO_YEAR_SECONDS) + _LOGGER.debug("New cycle time: %s", next_cycle) + self._state = dt.utc_from_timestamp( + dt.as_timestamp(dt.now()) + next_cycle + ).isoformat() diff --git a/homeassistant/components/hydrawise/switch.py b/homeassistant/components/hydrawise/switch.py index 577fde85d37..a385e504d7f 100644 --- a/homeassistant/components/hydrawise/switch.py +++ b/homeassistant/components/hydrawise/switch.py @@ -12,8 +12,6 @@ from . import ( CONF_WATERING_TIME, DATA_HYDRAWISE, DEFAULT_WATERING_TIME, - DEVICE_MAP, - DEVICE_MAP_INDEX, SWITCHES, HydrawiseEntity, ) @@ -62,43 +60,30 @@ class HydrawiseSwitch(HydrawiseEntity, SwitchEntity): def turn_on(self, **kwargs): """Turn the device on.""" + relay_data = self.data["relay"] - 1 if self._sensor_type == "manual_watering": self.hass.data[DATA_HYDRAWISE].data.run_zone( - self._default_watering_timer, (self.data["relay"] - 1) + self._default_watering_timer, relay_data ) elif self._sensor_type == "auto_watering": - self.hass.data[DATA_HYDRAWISE].data.suspend_zone( - 0, (self.data["relay"] - 1) - ) + self.hass.data[DATA_HYDRAWISE].data.suspend_zone(0, relay_data) def turn_off(self, **kwargs): """Turn the device off.""" + relay_data = self.data["relay"] - 1 if self._sensor_type == "manual_watering": - self.hass.data[DATA_HYDRAWISE].data.run_zone(0, (self.data["relay"] - 1)) + self.hass.data[DATA_HYDRAWISE].data.run_zone(0, relay_data) elif self._sensor_type == "auto_watering": - self.hass.data[DATA_HYDRAWISE].data.suspend_zone( - 365, (self.data["relay"] - 1) - ) + self.hass.data[DATA_HYDRAWISE].data.suspend_zone(365, relay_data) def update(self): """Update device state.""" + relay_data = self.data["relay"] - 1 mydata = self.hass.data[DATA_HYDRAWISE].data _LOGGER.debug("Updating Hydrawise switch: %s", self._name) if self._sensor_type == "manual_watering": - if not mydata.running: - self._state = False - else: - self._state = int(mydata.running[0]["relay"]) == self.data["relay"] + self._state = mydata.relays[relay_data]["timestr"] == "Now" elif self._sensor_type == "auto_watering": - for relay in mydata.relays: - if relay["relay"] == self.data["relay"]: - if relay.get("suspended") is not None: - self._state = False - else: - self._state = True - break - - @property - def icon(self): - """Return the icon to use in the frontend, if any.""" - return DEVICE_MAP[self._sensor_type][DEVICE_MAP_INDEX.index("ICON_INDEX")] + self._state = (mydata.relays[relay_data]["timestr"] != "") and ( + mydata.relays[relay_data]["timestr"] != "Now" + ) diff --git a/requirements_all.txt b/requirements_all.txt index 91b2a038f79..517001acfb1 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -760,7 +760,7 @@ httplib2==0.10.3 huawei-lte-api==1.4.12 # homeassistant.components.hydrawise -hydrawiser==0.1.1 +hydrawiser==0.2 # homeassistant.components.bh1750 # homeassistant.components.bme280