Update RainMachine sensors in parallel (#23057)

pull/23063/head
Aaron Bach 2019-04-12 17:44:04 -06:00 committed by GitHub
parent 51508d69ad
commit 05f267de6e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 44 additions and 19 deletions

View File

@ -1,4 +1,5 @@
"""Support for RainMachine devices."""
import asyncio
import logging
from datetime import timedelta
from functools import wraps
@ -20,7 +21,8 @@ from homeassistant.helpers.event import async_track_time_interval
from .config_flow import configured_instances
from .const import (
DATA_CLIENT, DEFAULT_PORT, DEFAULT_SCAN_INTERVAL, DEFAULT_SSL, DOMAIN)
DATA_CLIENT, DEFAULT_PORT, DEFAULT_SCAN_INTERVAL, DEFAULT_SSL, DOMAIN,
OPERATION_RESTRICTIONS_CURRENT, OPERATION_RESTRICTIONS_UNIVERSAL)
_LOGGER = logging.getLogger(__name__)
@ -346,17 +348,30 @@ class RainMachine:
"""Initialize."""
self.binary_sensor_conditions = binary_sensor_conditions
self.client = client
self.data = {}
self.default_zone_runtime = default_zone_runtime
self.device_mac = self.client.mac
self.restrictions = {}
self.sensor_conditions = sensor_conditions
async def async_update(self):
"""Update sensor/binary sensor data."""
self.restrictions.update({
'current': await self.client.restrictions.current(),
'global': await self.client.restrictions.universal()
})
from regenmaschine.errors import RainMachineError
tasks = {
OPERATION_RESTRICTIONS_CURRENT: self.client.restrictions.current(),
OPERATION_RESTRICTIONS_UNIVERSAL:
self.client.restrictions.universal(),
}
results = await asyncio.gather(*tasks.values(), return_exceptions=True)
for operation, result in zip(tasks, results):
if isinstance(result, RainMachineError):
_LOGGER.error(
'There was an error while updating %s: %s', operation,
result)
continue
self.data[operation] = result
class RainMachineEntity(Entity):

View File

@ -7,6 +7,7 @@ from homeassistant.helpers.dispatcher import async_dispatcher_connect
from . import (
BINARY_SENSORS, DATA_CLIENT, DOMAIN as RAINMACHINE_DOMAIN,
OPERATION_RESTRICTIONS_CURRENT, OPERATION_RESTRICTIONS_UNIVERSAL,
SENSOR_UPDATE_TOPIC, TYPE_FREEZE, TYPE_FREEZE_PROTECTION, TYPE_HOT_DAYS,
TYPE_HOURLY, TYPE_MONTH, TYPE_RAINDELAY, TYPE_RAINSENSOR, TYPE_WEEKDAY,
RainMachineEntity)
@ -79,21 +80,26 @@ class RainMachineBinarySensor(RainMachineEntity, BinarySensorDevice):
async def async_update(self):
"""Update the state."""
if self._sensor_type == TYPE_FREEZE:
self._state = self.rainmachine.restrictions['current']['freeze']
self._state = self.rainmachine.data[
OPERATION_RESTRICTIONS_CURRENT]['freeze']
elif self._sensor_type == TYPE_FREEZE_PROTECTION:
self._state = self.rainmachine.restrictions['global'][
'freezeProtectEnabled']
self._state = self.rainmachine.data[
OPERATION_RESTRICTIONS_UNIVERSAL]['freezeProtectEnabled']
elif self._sensor_type == TYPE_HOT_DAYS:
self._state = self.rainmachine.restrictions['global'][
'hotDaysExtraWatering']
self._state = self.rainmachine.data[
OPERATION_RESTRICTIONS_UNIVERSAL]['hotDaysExtraWatering']
elif self._sensor_type == TYPE_HOURLY:
self._state = self.rainmachine.restrictions['current']['hourly']
self._state = self.rainmachine.data[
OPERATION_RESTRICTIONS_CURRENT]['hourly']
elif self._sensor_type == TYPE_MONTH:
self._state = self.rainmachine.restrictions['current']['month']
self._state = self.rainmachine.data[
OPERATION_RESTRICTIONS_CURRENT]['month']
elif self._sensor_type == TYPE_RAINDELAY:
self._state = self.rainmachine.restrictions['current']['rainDelay']
self._state = self.rainmachine.data[
OPERATION_RESTRICTIONS_CURRENT]['rainDelay']
elif self._sensor_type == TYPE_RAINSENSOR:
self._state = self.rainmachine.restrictions['current'][
'rainSensor']
self._state = self.rainmachine.data[
OPERATION_RESTRICTIONS_CURRENT]['rainSensor']
elif self._sensor_type == TYPE_WEEKDAY:
self._state = self.rainmachine.restrictions['current']['weekDay']
self._state = self.rainmachine.data[
OPERATION_RESTRICTIONS_CURRENT]['weekDay']

View File

@ -12,4 +12,7 @@ DEFAULT_PORT = 8080
DEFAULT_SCAN_INTERVAL = timedelta(seconds=60)
DEFAULT_SSL = True
OPERATION_RESTRICTIONS_CURRENT = 'restrictions.current'
OPERATION_RESTRICTIONS_UNIVERSAL = 'restrictions.universal'
TOPIC_UPDATE = 'update_{0}'

View File

@ -5,7 +5,8 @@ from homeassistant.core import callback
from homeassistant.helpers.dispatcher import async_dispatcher_connect
from . import (
DATA_CLIENT, DOMAIN as RAINMACHINE_DOMAIN, SENSOR_UPDATE_TOPIC, SENSORS,
DATA_CLIENT, DOMAIN as RAINMACHINE_DOMAIN,
OPERATION_RESTRICTIONS_UNIVERSAL, SENSOR_UPDATE_TOPIC, SENSORS,
RainMachineEntity)
_LOGGER = logging.getLogger(__name__)
@ -81,5 +82,5 @@ class RainMachineSensor(RainMachineEntity):
async def async_update(self):
"""Update the sensor's state."""
self._state = self.rainmachine.restrictions['global'][
self._state = self.rainmachine.data[OPERATION_RESTRICTIONS_UNIVERSAL][
'freezeProtectTemp']