mirror of
https://github.com/home-assistant/core.git
synced 2025-07-22 20:57:21 +00:00
Add Rachio zone moisture service (#38817)
* Add zone moisture percent service * Fix tests * Add flex const * Add fixed constant
This commit is contained in:
parent
81b4c6956b
commit
111c2006c8
@ -60,6 +60,10 @@ RACHIO_API_EXCEPTIONS = (
|
|||||||
|
|
||||||
STATUS_ONLINE = "ONLINE"
|
STATUS_ONLINE = "ONLINE"
|
||||||
|
|
||||||
|
SCHEDULE_TYPE_FIXED = "FIXED"
|
||||||
|
SCHEDULE_TYPE_FLEX = "FLEX"
|
||||||
|
SERVICE_SET_ZONE_MOISTURE = "set_zone_moisture_percent"
|
||||||
|
|
||||||
SIGNAL_RACHIO_UPDATE = f"{DOMAIN}_update"
|
SIGNAL_RACHIO_UPDATE = f"{DOMAIN}_update"
|
||||||
SIGNAL_RACHIO_CONTROLLER_UPDATE = f"{SIGNAL_RACHIO_UPDATE}_controller"
|
SIGNAL_RACHIO_CONTROLLER_UPDATE = f"{SIGNAL_RACHIO_UPDATE}_controller"
|
||||||
SIGNAL_RACHIO_RAIN_DELAY_UPDATE = f"{SIGNAL_RACHIO_UPDATE}_rain_delay"
|
SIGNAL_RACHIO_RAIN_DELAY_UPDATE = f"{SIGNAL_RACHIO_UPDATE}_rain_delay"
|
||||||
|
9
homeassistant/components/rachio/services.yaml
Normal file
9
homeassistant/components/rachio/services.yaml
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
set_zone_moisture_percent:
|
||||||
|
description: Set the moisture percentage of a zone or group of zones.
|
||||||
|
fields:
|
||||||
|
entity_id:
|
||||||
|
description: Name of the zone entity. Can also be a group of zones. [Required]
|
||||||
|
example: "switch.front_yard"
|
||||||
|
percent:
|
||||||
|
description: Set the desired zone moisture percentage from 0 to 100. [Required]
|
||||||
|
example: 50
|
@ -3,8 +3,11 @@ from abc import abstractmethod
|
|||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
|
import voluptuous as vol
|
||||||
|
|
||||||
from homeassistant.components.switch import SwitchEntity
|
from homeassistant.components.switch import SwitchEntity
|
||||||
from homeassistant.core import callback
|
from homeassistant.core import callback
|
||||||
|
from homeassistant.helpers import config_validation as cv, entity_platform
|
||||||
from homeassistant.helpers.dispatcher import async_dispatcher_connect
|
from homeassistant.helpers.dispatcher import async_dispatcher_connect
|
||||||
from homeassistant.helpers.event import async_track_point_in_utc_time
|
from homeassistant.helpers.event import async_track_point_in_utc_time
|
||||||
from homeassistant.util.dt import as_timestamp, now, parse_datetime, utc_from_timestamp
|
from homeassistant.util.dt import as_timestamp, now, parse_datetime, utc_from_timestamp
|
||||||
@ -28,8 +31,12 @@ from .const import (
|
|||||||
KEY_SCHEDULE_ID,
|
KEY_SCHEDULE_ID,
|
||||||
KEY_SUBTYPE,
|
KEY_SUBTYPE,
|
||||||
KEY_SUMMARY,
|
KEY_SUMMARY,
|
||||||
|
KEY_TYPE,
|
||||||
KEY_ZONE_ID,
|
KEY_ZONE_ID,
|
||||||
KEY_ZONE_NUMBER,
|
KEY_ZONE_NUMBER,
|
||||||
|
SCHEDULE_TYPE_FIXED,
|
||||||
|
SCHEDULE_TYPE_FLEX,
|
||||||
|
SERVICE_SET_ZONE_MOISTURE,
|
||||||
SIGNAL_RACHIO_CONTROLLER_UPDATE,
|
SIGNAL_RACHIO_CONTROLLER_UPDATE,
|
||||||
SIGNAL_RACHIO_RAIN_DELAY_UPDATE,
|
SIGNAL_RACHIO_RAIN_DELAY_UPDATE,
|
||||||
SIGNAL_RACHIO_SCHEDULE_UPDATE,
|
SIGNAL_RACHIO_SCHEDULE_UPDATE,
|
||||||
@ -55,9 +62,11 @@ from .webhooks import (
|
|||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
ATTR_PERCENT = "percent"
|
||||||
ATTR_SCHEDULE_SUMMARY = "Summary"
|
ATTR_SCHEDULE_SUMMARY = "Summary"
|
||||||
ATTR_SCHEDULE_ENABLED = "Enabled"
|
ATTR_SCHEDULE_ENABLED = "Enabled"
|
||||||
ATTR_SCHEDULE_DURATION = "Duration"
|
ATTR_SCHEDULE_DURATION = "Duration"
|
||||||
|
ATTR_SCHEDULE_TYPE = "Type"
|
||||||
ATTR_ZONE_NUMBER = "Zone number"
|
ATTR_ZONE_NUMBER = "Zone number"
|
||||||
ATTR_ZONE_SHADE = "Shade"
|
ATTR_ZONE_SHADE = "Shade"
|
||||||
ATTR_ZONE_SLOPE = "Slope"
|
ATTR_ZONE_SLOPE = "Slope"
|
||||||
@ -67,11 +76,24 @@ ATTR_ZONE_TYPE = "Type"
|
|||||||
|
|
||||||
async def async_setup_entry(hass, config_entry, async_add_entities):
|
async def async_setup_entry(hass, config_entry, async_add_entities):
|
||||||
"""Set up the Rachio switches."""
|
"""Set up the Rachio switches."""
|
||||||
# Add all zones from all controllers as switches
|
has_flex_sched = False
|
||||||
entities = await hass.async_add_executor_job(_create_entities, hass, config_entry)
|
entities = await hass.async_add_executor_job(_create_entities, hass, config_entry)
|
||||||
|
for entity in entities:
|
||||||
|
if isinstance(entity, RachioSchedule) and entity.type == SCHEDULE_TYPE_FLEX:
|
||||||
|
has_flex_sched = True
|
||||||
|
break
|
||||||
|
|
||||||
async_add_entities(entities)
|
async_add_entities(entities)
|
||||||
_LOGGER.info("%d Rachio switch(es) added", len(entities))
|
_LOGGER.info("%d Rachio switch(es) added", len(entities))
|
||||||
|
|
||||||
|
platform = entity_platform.current_platform.get()
|
||||||
|
if has_flex_sched:
|
||||||
|
platform.async_register_entity_service(
|
||||||
|
SERVICE_SET_ZONE_MOISTURE,
|
||||||
|
{vol.Required(ATTR_PERCENT): cv.positive_int},
|
||||||
|
"set_moisture_percent",
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def _create_entities(hass, config_entry):
|
def _create_entities(hass, config_entry):
|
||||||
entities = []
|
entities = []
|
||||||
@ -355,6 +377,11 @@ class RachioZone(RachioSwitch):
|
|||||||
"""Stop watering all zones."""
|
"""Stop watering all zones."""
|
||||||
self._controller.stop_watering()
|
self._controller.stop_watering()
|
||||||
|
|
||||||
|
def set_moisture_percent(self, percent) -> None:
|
||||||
|
"""Set the zone moisture percent."""
|
||||||
|
_LOGGER.debug("Setting %s moisture to %s percent", self._zone_name, percent)
|
||||||
|
self._controller.rachio.zone.setMoisturePercent(self._id, percent / 100)
|
||||||
|
|
||||||
@callback
|
@callback
|
||||||
def _async_handle_update(self, *args, **kwargs) -> None:
|
def _async_handle_update(self, *args, **kwargs) -> None:
|
||||||
"""Handle incoming webhook zone data."""
|
"""Handle incoming webhook zone data."""
|
||||||
@ -391,6 +418,7 @@ class RachioSchedule(RachioSwitch):
|
|||||||
self._duration = data[KEY_DURATION]
|
self._duration = data[KEY_DURATION]
|
||||||
self._schedule_enabled = data[KEY_ENABLED]
|
self._schedule_enabled = data[KEY_ENABLED]
|
||||||
self._summary = data[KEY_SUMMARY]
|
self._summary = data[KEY_SUMMARY]
|
||||||
|
self.type = data.get(KEY_TYPE, SCHEDULE_TYPE_FIXED)
|
||||||
self._current_schedule = current_schedule
|
self._current_schedule = current_schedule
|
||||||
super().__init__(controller)
|
super().__init__(controller)
|
||||||
|
|
||||||
@ -416,6 +444,7 @@ class RachioSchedule(RachioSwitch):
|
|||||||
ATTR_SCHEDULE_SUMMARY: self._summary,
|
ATTR_SCHEDULE_SUMMARY: self._summary,
|
||||||
ATTR_SCHEDULE_ENABLED: self.schedule_is_enabled,
|
ATTR_SCHEDULE_ENABLED: self.schedule_is_enabled,
|
||||||
ATTR_SCHEDULE_DURATION: f"{round(self._duration / 60)} minutes",
|
ATTR_SCHEDULE_DURATION: f"{round(self._duration / 60)} minutes",
|
||||||
|
ATTR_SCHEDULE_TYPE: self.type,
|
||||||
}
|
}
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
Loading…
x
Reference in New Issue
Block a user