Update RainMachine sensors in parallel (#23057)
parent
51508d69ad
commit
05f267de6e
|
@ -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):
|
||||
|
|
|
@ -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']
|
||||
|
|
|
@ -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}'
|
||||
|
|
|
@ -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']
|
||||
|
|
Loading…
Reference in New Issue