Small cleanups to rachio (#49404)

- Remove unused async_step
- Reduce async callbacks from executor
This commit is contained in:
J. Nick Koston 2021-04-18 22:39:45 -10:00 committed by GitHub
parent e98f27ead6
commit 0b26294fb0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 53 additions and 55 deletions

View file

@ -26,14 +26,6 @@ PLATFORMS = ["switch", "binary_sensor"]
CONFIG_SCHEMA = cv.deprecated(DOMAIN) CONFIG_SCHEMA = cv.deprecated(DOMAIN)
async def async_setup(hass: HomeAssistant, config: dict):
"""Set up the rachio component from YAML."""
hass.data.setdefault(DOMAIN, {})
return True
async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry): async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry):
"""Unload a config entry.""" """Unload a config entry."""
unload_ok = all( unload_ok = all(
@ -84,7 +76,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry):
# Get the API user # Get the API user
try: try:
await hass.async_add_executor_job(person.setup, hass) await person.async_setup(hass)
except ConnectTimeout as error: except ConnectTimeout as error:
_LOGGER.error("Could not reach the Rachio API: %s", error) _LOGGER.error("Could not reach the Rachio API: %s", error)
raise ConfigEntryNotReady from error raise ConfigEntryNotReady from error
@ -100,6 +92,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry):
) )
# Enable platform # Enable platform
hass.data.setdefault(DOMAIN, {})
hass.data[DOMAIN][entry.entry_id] = person hass.data[DOMAIN][entry.entry_id] = person
async_register_webhook(hass, webhook_id, entry.entry_id) async_register_webhook(hass, webhook_id, entry.entry_id)

View file

@ -57,23 +57,65 @@ class RachioPerson:
self._id = None self._id = None
self._controllers = [] self._controllers = []
def setup(self, hass): async def async_setup(self, hass):
"""Rachio device setup.""" """Create rachio devices and services."""
all_devices = [] await hass.async_add_executor_job(self._setup, hass)
can_pause = False can_pause = False
response = self.rachio.person.info() for rachio_iro in self._controllers:
# Generation 1 controllers don't support pause or resume
if rachio_iro.model.split("_")[0] != MODEL_GENERATION_1:
can_pause = True
break
if not can_pause:
return
all_devices = [rachio_iro.name for rachio_iro in self._controllers]
def pause_water(service):
"""Service to pause watering on all or specific controllers."""
duration = service.data[ATTR_DURATION]
devices = service.data.get(ATTR_DEVICES, all_devices)
for iro in self._controllers:
if iro.name in devices:
iro.pause_watering(duration)
def resume_water(service):
"""Service to resume watering on all or specific controllers."""
devices = service.data.get(ATTR_DEVICES, all_devices)
for iro in self._controllers:
if iro.name in devices:
iro.resume_watering()
hass.services.async_register(
DOMAIN,
SERVICE_PAUSE_WATERING,
pause_water,
schema=PAUSE_SERVICE_SCHEMA,
)
hass.services.async_register(
DOMAIN,
SERVICE_RESUME_WATERING,
resume_water,
schema=RESUME_SERVICE_SCHEMA,
)
def _setup(self, hass):
"""Rachio device setup."""
rachio = self.rachio
response = rachio.person.info()
assert int(response[0][KEY_STATUS]) == HTTP_OK, "API key error" assert int(response[0][KEY_STATUS]) == HTTP_OK, "API key error"
self._id = response[1][KEY_ID] self._id = response[1][KEY_ID]
# Use user ID to get user data # Use user ID to get user data
data = self.rachio.person.get(self._id) data = rachio.person.get(self._id)
assert int(data[0][KEY_STATUS]) == HTTP_OK, "User ID error" assert int(data[0][KEY_STATUS]) == HTTP_OK, "User ID error"
self.username = data[1][KEY_USERNAME] self.username = data[1][KEY_USERNAME]
devices = data[1][KEY_DEVICES] devices = data[1][KEY_DEVICES]
for controller in devices: for controller in devices:
webhooks = self.rachio.notification.get_device_webhook(controller[KEY_ID])[ webhooks = rachio.notification.get_device_webhook(controller[KEY_ID])[1]
1
]
# The API does not provide a way to tell if a controller is shared # The API does not provide a way to tell if a controller is shared
# or if they are the owner. To work around this problem we fetch the webooks # or if they are the owner. To work around this problem we fetch the webooks
# before we setup the device so we can skip it instead of failing. # before we setup the device so we can skip it instead of failing.
@ -94,46 +136,12 @@ class RachioPerson:
) )
continue continue
rachio_iro = RachioIro(hass, self.rachio, controller, webhooks) rachio_iro = RachioIro(hass, rachio, controller, webhooks)
rachio_iro.setup() rachio_iro.setup()
self._controllers.append(rachio_iro) self._controllers.append(rachio_iro)
all_devices.append(rachio_iro.name)
# Generation 1 controllers don't support pause or resume
if rachio_iro.model.split("_")[0] != MODEL_GENERATION_1:
can_pause = True
_LOGGER.info('Using Rachio API as user "%s"', self.username) _LOGGER.info('Using Rachio API as user "%s"', self.username)
def pause_water(service):
"""Service to pause watering on all or specific controllers."""
duration = service.data[ATTR_DURATION]
devices = service.data.get(ATTR_DEVICES, all_devices)
for iro in self._controllers:
if iro.name in devices:
iro.pause_watering(duration)
def resume_water(service):
"""Service to resume watering on all or specific controllers."""
devices = service.data.get(ATTR_DEVICES, all_devices)
for iro in self._controllers:
if iro.name in devices:
iro.resume_watering()
if can_pause:
hass.services.register(
DOMAIN,
SERVICE_PAUSE_WATERING,
pause_water,
schema=PAUSE_SERVICE_SCHEMA,
)
hass.services.register(
DOMAIN,
SERVICE_RESUME_WATERING,
resume_water,
schema=RESUME_SERVICE_SCHEMA,
)
@property @property
def user_id(self) -> str: def user_id(self) -> str:
"""Get the user ID as defined by the Rachio API.""" """Get the user ID as defined by the Rachio API."""

View file

@ -38,8 +38,6 @@ async def test_form(hass):
with patch( with patch(
"homeassistant.components.rachio.config_flow.Rachio", return_value=rachio_mock "homeassistant.components.rachio.config_flow.Rachio", return_value=rachio_mock
), patch( ), patch(
"homeassistant.components.rachio.async_setup", return_value=True
) as mock_setup, patch(
"homeassistant.components.rachio.async_setup_entry", "homeassistant.components.rachio.async_setup_entry",
return_value=True, return_value=True,
) as mock_setup_entry: ) as mock_setup_entry:
@ -60,7 +58,6 @@ async def test_form(hass):
CONF_CUSTOM_URL: "http://custom.url", CONF_CUSTOM_URL: "http://custom.url",
CONF_MANUAL_RUN_MINS: 5, CONF_MANUAL_RUN_MINS: 5,
} }
assert len(mock_setup.mock_calls) == 1
assert len(mock_setup_entry.mock_calls) == 1 assert len(mock_setup_entry.mock_calls) == 1