diff --git a/homeassistant/components/rainmachine/__init__.py b/homeassistant/components/rainmachine/__init__.py index 8c058557fc1..672f1be4694 100644 --- a/homeassistant/components/rainmachine/__init__.py +++ b/homeassistant/components/rainmachine/__init__.py @@ -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): diff --git a/homeassistant/components/rainmachine/binary_sensor.py b/homeassistant/components/rainmachine/binary_sensor.py index 57dbcb551ed..3d818a4e5ce 100644 --- a/homeassistant/components/rainmachine/binary_sensor.py +++ b/homeassistant/components/rainmachine/binary_sensor.py @@ -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'] diff --git a/homeassistant/components/rainmachine/const.py b/homeassistant/components/rainmachine/const.py index d142467443f..56b9f653bf2 100644 --- a/homeassistant/components/rainmachine/const.py +++ b/homeassistant/components/rainmachine/const.py @@ -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}' diff --git a/homeassistant/components/rainmachine/sensor.py b/homeassistant/components/rainmachine/sensor.py index 4894bd2ce39..5b7052959d8 100644 --- a/homeassistant/components/rainmachine/sensor.py +++ b/homeassistant/components/rainmachine/sensor.py @@ -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']