diff --git a/homeassistant/components/rainmachine/__init__.py b/homeassistant/components/rainmachine/__init__.py index f5875558a53..ed46f50ec3b 100644 --- a/homeassistant/components/rainmachine/__init__.py +++ b/homeassistant/components/rainmachine/__init__.py @@ -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): diff --git a/homeassistant/components/rainmachine/binary_sensor.py b/homeassistant/components/rainmachine/binary_sensor.py index fcccf11e17c..57dbcb551ed 100644 --- a/homeassistant/components/rainmachine/binary_sensor.py +++ b/homeassistant/components/rainmachine/binary_sensor.py @@ -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'] diff --git a/homeassistant/components/rainmachine/const.py b/homeassistant/components/rainmachine/const.py index 4d08a871f61..d142467443f 100644 --- a/homeassistant/components/rainmachine/const.py +++ b/homeassistant/components/rainmachine/const.py @@ -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}' diff --git a/homeassistant/components/rainmachine/sensor.py b/homeassistant/components/rainmachine/sensor.py index 08dd67755bb..4894bd2ce39 100644 --- a/homeassistant/components/rainmachine/sensor.py +++ b/homeassistant/components/rainmachine/sensor.py @@ -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']