Support Hydrawise API v1.4 (#34448)
* Now supports Hydrawise API v1.4 * Removed dependency and codeowners name. * Update CODEOWNERS to include hydrawise * Changes made from review comments. * Clean up update. * Added device class for timestamp and switch. Consolodate methods to parent class. * Cap next_cycle at 2 years to prevent time overflow. * Addressed review comments. * Updated DEVICE_MAP and icon() based on review comments.
This commit is contained in:
parent
fed6625324
commit
29adc6a27b
7 changed files with 60 additions and 85 deletions
|
@ -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
|
||||
|
|
|
@ -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")]
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"]
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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"
|
||||
)
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue