Add support for flow sensor metrics in RainMachine (#23221)

* Initial commit

* In the clear
This commit is contained in:
Aaron Bach 2019-05-02 01:45:51 -06:00 committed by Fabian Affolter
parent f3925b7ede
commit daa1d103d4
4 changed files with 86 additions and 34 deletions

View file

@ -20,7 +20,7 @@ from homeassistant.helpers.service import verify_domain_control
from .config_flow import configured_instances
from .const import (
DATA_CLIENT, DEFAULT_PORT, DEFAULT_SCAN_INTERVAL, DEFAULT_SSL, DOMAIN,
OPERATION_RESTRICTIONS_CURRENT, OPERATION_RESTRICTIONS_UNIVERSAL)
PROVISION_SETTINGS, RESTRICTIONS_CURRENT, RESTRICTIONS_UNIVERSAL)
_LOGGER = logging.getLogger(__name__)
@ -40,6 +40,11 @@ DEFAULT_ATTRIBUTION = 'Data provided by Green Electronics LLC'
DEFAULT_ICON = 'mdi:water'
DEFAULT_ZONE_RUN = 60 * 10
TYPE_FLOW_SENSOR = 'flow_sensor'
TYPE_FLOW_SENSOR_CLICK_M3 = 'flow_sensor_clicks_cubic_meter'
TYPE_FLOW_SENSOR_CONSUMED_LITERS = 'flow_sensor_consumed_liters'
TYPE_FLOW_SENSOR_START_INDEX = 'flow_sensor_start_index'
TYPE_FLOW_SENSOR_WATERING_CLICKS = 'flow_sensor_watering_clicks'
TYPE_FREEZE = 'freeze'
TYPE_FREEZE_PROTECTION = 'freeze_protection'
TYPE_FREEZE_TEMP = 'freeze_protect_temp'
@ -51,6 +56,7 @@ TYPE_RAINSENSOR = 'rainsensor'
TYPE_WEEKDAY = 'weekday'
BINARY_SENSORS = {
TYPE_FLOW_SENSOR: ('Flow Sensor', 'mdi:water-pump'),
TYPE_FREEZE: ('Freeze Restrictions', 'mdi:cancel'),
TYPE_FREEZE_PROTECTION: ('Freeze Protection', 'mdi:weather-snowy'),
TYPE_HOT_DAYS: ('Extra Water on Hot Days', 'mdi:thermometer-lines'),
@ -62,6 +68,14 @@ BINARY_SENSORS = {
}
SENSORS = {
TYPE_FLOW_SENSOR_CLICK_M3: (
'Flow Sensor Clicks', 'mdi:water-pump', 'clicks/m^3'),
TYPE_FLOW_SENSOR_CONSUMED_LITERS: (
'Flow Sensor Consumed Liters', 'mdi:water-pump', 'liter'),
TYPE_FLOW_SENSOR_START_INDEX: (
'Flow Sensor Start Index', 'mdi:water-pump', None),
TYPE_FLOW_SENSOR_WATERING_CLICKS: (
'Flow Sensor Clicks', 'mdi:water-pump', 'clicks'),
TYPE_FREEZE_TEMP: ('Freeze Protect Temperature', 'mdi:thermometer', '°C'),
}
@ -319,11 +333,26 @@ class RainMachine:
"""Update sensor/binary sensor data."""
from regenmaschine.errors import RainMachineError
tasks = {
OPERATION_RESTRICTIONS_CURRENT: self.client.restrictions.current(),
OPERATION_RESTRICTIONS_UNIVERSAL:
self.client.restrictions.universal(),
}
tasks = {}
if (TYPE_FLOW_SENSOR in self.binary_sensor_conditions
or any(c in self.sensor_conditions
for c in (TYPE_FLOW_SENSOR_CLICK_M3,
TYPE_FLOW_SENSOR_CONSUMED_LITERS,
TYPE_FLOW_SENSOR_START_INDEX,
TYPE_FLOW_SENSOR_WATERING_CLICKS))):
tasks[PROVISION_SETTINGS] = self.client.provisioning.settings()
if any(c in self.binary_sensor_conditions
for c in (TYPE_FREEZE, TYPE_HOURLY, TYPE_MONTH, TYPE_RAINDELAY,
TYPE_RAINSENSOR, TYPE_WEEKDAY)):
tasks[RESTRICTIONS_CURRENT] = self.client.restrictions.current()
if (any(c in self.binary_sensor_conditions
for c in (TYPE_FREEZE_PROTECTION, TYPE_HOT_DAYS))
or TYPE_FREEZE_TEMP in self.sensor_conditions):
tasks[RESTRICTIONS_UNIVERSAL] = (
self.client.restrictions.universal())
results = await asyncio.gather(*tasks.values(), return_exceptions=True)
for operation, result in zip(tasks, results):

View file

@ -7,10 +7,10 @@ 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)
PROVISION_SETTINGS, RESTRICTIONS_CURRENT, RESTRICTIONS_UNIVERSAL,
SENSOR_UPDATE_TOPIC, TYPE_FLOW_SENSOR, TYPE_FREEZE, TYPE_FREEZE_PROTECTION,
TYPE_HOT_DAYS, TYPE_HOURLY, TYPE_MONTH, TYPE_RAINDELAY, TYPE_RAINSENSOR,
TYPE_WEEKDAY, RainMachineEntity)
_LOGGER = logging.getLogger(__name__)
@ -79,27 +79,27 @@ class RainMachineBinarySensor(RainMachineEntity, BinarySensorDevice):
async def async_update(self):
"""Update the state."""
if self._sensor_type == TYPE_FREEZE:
self._state = self.rainmachine.data[
OPERATION_RESTRICTIONS_CURRENT]['freeze']
if self._sensor_type == TYPE_FLOW_SENSOR:
self._state = self.rainmachine.data[PROVISION_SETTINGS].get(
'useFlowSensor')
elif self._sensor_type == TYPE_FREEZE:
self._state = self.rainmachine.data[RESTRICTIONS_CURRENT]['freeze']
elif self._sensor_type == TYPE_FREEZE_PROTECTION:
self._state = self.rainmachine.data[
OPERATION_RESTRICTIONS_UNIVERSAL]['freezeProtectEnabled']
self._state = self.rainmachine.data[RESTRICTIONS_UNIVERSAL][
'freezeProtectEnabled']
elif self._sensor_type == TYPE_HOT_DAYS:
self._state = self.rainmachine.data[
OPERATION_RESTRICTIONS_UNIVERSAL]['hotDaysExtraWatering']
self._state = self.rainmachine.data[RESTRICTIONS_UNIVERSAL][
'hotDaysExtraWatering']
elif self._sensor_type == TYPE_HOURLY:
self._state = self.rainmachine.data[
OPERATION_RESTRICTIONS_CURRENT]['hourly']
self._state = self.rainmachine.data[RESTRICTIONS_CURRENT]['hourly']
elif self._sensor_type == TYPE_MONTH:
self._state = self.rainmachine.data[
OPERATION_RESTRICTIONS_CURRENT]['month']
self._state = self.rainmachine.data[RESTRICTIONS_CURRENT]['month']
elif self._sensor_type == TYPE_RAINDELAY:
self._state = self.rainmachine.data[
OPERATION_RESTRICTIONS_CURRENT]['rainDelay']
self._state = self.rainmachine.data[RESTRICTIONS_CURRENT][
'rainDelay']
elif self._sensor_type == TYPE_RAINSENSOR:
self._state = self.rainmachine.data[
OPERATION_RESTRICTIONS_CURRENT]['rainSensor']
self._state = self.rainmachine.data[RESTRICTIONS_CURRENT][
'rainSensor']
elif self._sensor_type == TYPE_WEEKDAY:
self._state = self.rainmachine.data[
OPERATION_RESTRICTIONS_CURRENT]['weekDay']
self._state = self.rainmachine.data[RESTRICTIONS_CURRENT][
'weekDay']

View file

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

View file

@ -5,9 +5,11 @@ from homeassistant.core import callback
from homeassistant.helpers.dispatcher import async_dispatcher_connect
from . import (
DATA_CLIENT, DOMAIN as RAINMACHINE_DOMAIN,
OPERATION_RESTRICTIONS_UNIVERSAL, SENSOR_UPDATE_TOPIC, SENSORS,
RainMachineEntity)
DATA_CLIENT, DOMAIN as RAINMACHINE_DOMAIN, PROVISION_SETTINGS,
RESTRICTIONS_UNIVERSAL, SENSOR_UPDATE_TOPIC, SENSORS,
TYPE_FLOW_SENSOR_CLICK_M3, TYPE_FLOW_SENSOR_CONSUMED_LITERS,
TYPE_FLOW_SENSOR_START_INDEX, TYPE_FLOW_SENSOR_WATERING_CLICKS,
TYPE_FREEZE_TEMP, RainMachineEntity)
_LOGGER = logging.getLogger(__name__)
@ -82,5 +84,25 @@ class RainMachineSensor(RainMachineEntity):
async def async_update(self):
"""Update the sensor's state."""
self._state = self.rainmachine.data[OPERATION_RESTRICTIONS_UNIVERSAL][
'freezeProtectTemp']
if self._sensor_type == TYPE_FLOW_SENSOR_CLICK_M3:
self._state = self.rainmachine.data[PROVISION_SETTINGS].get(
'flowSensorClicksPerCubicMeter')
elif self._sensor_type == TYPE_FLOW_SENSOR_CONSUMED_LITERS:
clicks = self.rainmachine.data[PROVISION_SETTINGS].get(
'flowSensorWateringClicks')
clicks_per_m3 = self.rainmachine.data[PROVISION_SETTINGS].get(
'flowSensorClicksPerCubicMeter')
if clicks and clicks_per_m3:
self._state = (clicks * 1000) / clicks_per_m3
else:
self._state = None
elif self._sensor_type == TYPE_FLOW_SENSOR_START_INDEX:
self._state = self.rainmachine.data[PROVISION_SETTINGS].get(
'flowSensorStartIndex')
elif self._sensor_type == TYPE_FLOW_SENSOR_WATERING_CLICKS:
self._state = self.rainmachine.data[PROVISION_SETTINGS].get(
'flowSensorWateringClicks')
elif self._sensor_type == TYPE_FREEZE_TEMP:
self._state = self.rainmachine.data[RESTRICTIONS_UNIVERSAL][
'freezeProtectTemp']