Update RainMachine sensors in parallel (#23057)
parent
51508d69ad
commit
05f267de6e
|
@ -1,4 +1,5 @@
|
||||||
"""Support for RainMachine devices."""
|
"""Support for RainMachine devices."""
|
||||||
|
import asyncio
|
||||||
import logging
|
import logging
|
||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
from functools import wraps
|
from functools import wraps
|
||||||
|
@ -20,7 +21,8 @@ from homeassistant.helpers.event import async_track_time_interval
|
||||||
|
|
||||||
from .config_flow import configured_instances
|
from .config_flow import configured_instances
|
||||||
from .const import (
|
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__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
@ -346,17 +348,30 @@ class RainMachine:
|
||||||
"""Initialize."""
|
"""Initialize."""
|
||||||
self.binary_sensor_conditions = binary_sensor_conditions
|
self.binary_sensor_conditions = binary_sensor_conditions
|
||||||
self.client = client
|
self.client = client
|
||||||
|
self.data = {}
|
||||||
self.default_zone_runtime = default_zone_runtime
|
self.default_zone_runtime = default_zone_runtime
|
||||||
self.device_mac = self.client.mac
|
self.device_mac = self.client.mac
|
||||||
self.restrictions = {}
|
|
||||||
self.sensor_conditions = sensor_conditions
|
self.sensor_conditions = sensor_conditions
|
||||||
|
|
||||||
async def async_update(self):
|
async def async_update(self):
|
||||||
"""Update sensor/binary sensor data."""
|
"""Update sensor/binary sensor data."""
|
||||||
self.restrictions.update({
|
from regenmaschine.errors import RainMachineError
|
||||||
'current': await self.client.restrictions.current(),
|
|
||||||
'global': await self.client.restrictions.universal()
|
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):
|
class RainMachineEntity(Entity):
|
||||||
|
|
|
@ -7,6 +7,7 @@ from homeassistant.helpers.dispatcher import async_dispatcher_connect
|
||||||
|
|
||||||
from . import (
|
from . import (
|
||||||
BINARY_SENSORS, DATA_CLIENT, DOMAIN as RAINMACHINE_DOMAIN,
|
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,
|
SENSOR_UPDATE_TOPIC, TYPE_FREEZE, TYPE_FREEZE_PROTECTION, TYPE_HOT_DAYS,
|
||||||
TYPE_HOURLY, TYPE_MONTH, TYPE_RAINDELAY, TYPE_RAINSENSOR, TYPE_WEEKDAY,
|
TYPE_HOURLY, TYPE_MONTH, TYPE_RAINDELAY, TYPE_RAINSENSOR, TYPE_WEEKDAY,
|
||||||
RainMachineEntity)
|
RainMachineEntity)
|
||||||
|
@ -79,21 +80,26 @@ class RainMachineBinarySensor(RainMachineEntity, BinarySensorDevice):
|
||||||
async def async_update(self):
|
async def async_update(self):
|
||||||
"""Update the state."""
|
"""Update the state."""
|
||||||
if self._sensor_type == TYPE_FREEZE:
|
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:
|
elif self._sensor_type == TYPE_FREEZE_PROTECTION:
|
||||||
self._state = self.rainmachine.restrictions['global'][
|
self._state = self.rainmachine.data[
|
||||||
'freezeProtectEnabled']
|
OPERATION_RESTRICTIONS_UNIVERSAL]['freezeProtectEnabled']
|
||||||
elif self._sensor_type == TYPE_HOT_DAYS:
|
elif self._sensor_type == TYPE_HOT_DAYS:
|
||||||
self._state = self.rainmachine.restrictions['global'][
|
self._state = self.rainmachine.data[
|
||||||
'hotDaysExtraWatering']
|
OPERATION_RESTRICTIONS_UNIVERSAL]['hotDaysExtraWatering']
|
||||||
elif self._sensor_type == TYPE_HOURLY:
|
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:
|
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:
|
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:
|
elif self._sensor_type == TYPE_RAINSENSOR:
|
||||||
self._state = self.rainmachine.restrictions['current'][
|
self._state = self.rainmachine.data[
|
||||||
'rainSensor']
|
OPERATION_RESTRICTIONS_CURRENT]['rainSensor']
|
||||||
elif self._sensor_type == TYPE_WEEKDAY:
|
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_SCAN_INTERVAL = timedelta(seconds=60)
|
||||||
DEFAULT_SSL = True
|
DEFAULT_SSL = True
|
||||||
|
|
||||||
|
OPERATION_RESTRICTIONS_CURRENT = 'restrictions.current'
|
||||||
|
OPERATION_RESTRICTIONS_UNIVERSAL = 'restrictions.universal'
|
||||||
|
|
||||||
TOPIC_UPDATE = 'update_{0}'
|
TOPIC_UPDATE = 'update_{0}'
|
||||||
|
|
|
@ -5,7 +5,8 @@ from homeassistant.core import callback
|
||||||
from homeassistant.helpers.dispatcher import async_dispatcher_connect
|
from homeassistant.helpers.dispatcher import async_dispatcher_connect
|
||||||
|
|
||||||
from . import (
|
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)
|
RainMachineEntity)
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
@ -81,5 +82,5 @@ class RainMachineSensor(RainMachineEntity):
|
||||||
|
|
||||||
async def async_update(self):
|
async def async_update(self):
|
||||||
"""Update the sensor's state."""
|
"""Update the sensor's state."""
|
||||||
self._state = self.rainmachine.restrictions['global'][
|
self._state = self.rainmachine.data[OPERATION_RESTRICTIONS_UNIVERSAL][
|
||||||
'freezeProtectTemp']
|
'freezeProtectTemp']
|
||||||
|
|
Loading…
Reference in New Issue