Add support for flow sensor metrics in RainMachine (#23221)
* Initial commit * In the clear
This commit is contained in:
parent
f3925b7ede
commit
daa1d103d4
4 changed files with 86 additions and 34 deletions
|
@ -20,7 +20,7 @@ from homeassistant.helpers.service import verify_domain_control
|
||||||
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)
|
PROVISION_SETTINGS, RESTRICTIONS_CURRENT, RESTRICTIONS_UNIVERSAL)
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
@ -40,6 +40,11 @@ DEFAULT_ATTRIBUTION = 'Data provided by Green Electronics LLC'
|
||||||
DEFAULT_ICON = 'mdi:water'
|
DEFAULT_ICON = 'mdi:water'
|
||||||
DEFAULT_ZONE_RUN = 60 * 10
|
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 = 'freeze'
|
||||||
TYPE_FREEZE_PROTECTION = 'freeze_protection'
|
TYPE_FREEZE_PROTECTION = 'freeze_protection'
|
||||||
TYPE_FREEZE_TEMP = 'freeze_protect_temp'
|
TYPE_FREEZE_TEMP = 'freeze_protect_temp'
|
||||||
|
@ -51,6 +56,7 @@ TYPE_RAINSENSOR = 'rainsensor'
|
||||||
TYPE_WEEKDAY = 'weekday'
|
TYPE_WEEKDAY = 'weekday'
|
||||||
|
|
||||||
BINARY_SENSORS = {
|
BINARY_SENSORS = {
|
||||||
|
TYPE_FLOW_SENSOR: ('Flow Sensor', 'mdi:water-pump'),
|
||||||
TYPE_FREEZE: ('Freeze Restrictions', 'mdi:cancel'),
|
TYPE_FREEZE: ('Freeze Restrictions', 'mdi:cancel'),
|
||||||
TYPE_FREEZE_PROTECTION: ('Freeze Protection', 'mdi:weather-snowy'),
|
TYPE_FREEZE_PROTECTION: ('Freeze Protection', 'mdi:weather-snowy'),
|
||||||
TYPE_HOT_DAYS: ('Extra Water on Hot Days', 'mdi:thermometer-lines'),
|
TYPE_HOT_DAYS: ('Extra Water on Hot Days', 'mdi:thermometer-lines'),
|
||||||
|
@ -62,6 +68,14 @@ BINARY_SENSORS = {
|
||||||
}
|
}
|
||||||
|
|
||||||
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'),
|
TYPE_FREEZE_TEMP: ('Freeze Protect Temperature', 'mdi:thermometer', '°C'),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -319,11 +333,26 @@ class RainMachine:
|
||||||
"""Update sensor/binary sensor data."""
|
"""Update sensor/binary sensor data."""
|
||||||
from regenmaschine.errors import RainMachineError
|
from regenmaschine.errors import RainMachineError
|
||||||
|
|
||||||
tasks = {
|
tasks = {}
|
||||||
OPERATION_RESTRICTIONS_CURRENT: self.client.restrictions.current(),
|
|
||||||
OPERATION_RESTRICTIONS_UNIVERSAL:
|
if (TYPE_FLOW_SENSOR in self.binary_sensor_conditions
|
||||||
self.client.restrictions.universal(),
|
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)
|
results = await asyncio.gather(*tasks.values(), return_exceptions=True)
|
||||||
for operation, result in zip(tasks, results):
|
for operation, result in zip(tasks, results):
|
||||||
|
|
|
@ -7,10 +7,10 @@ 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,
|
PROVISION_SETTINGS, RESTRICTIONS_CURRENT, RESTRICTIONS_UNIVERSAL,
|
||||||
SENSOR_UPDATE_TOPIC, TYPE_FREEZE, TYPE_FREEZE_PROTECTION, TYPE_HOT_DAYS,
|
SENSOR_UPDATE_TOPIC, TYPE_FLOW_SENSOR, TYPE_FREEZE, TYPE_FREEZE_PROTECTION,
|
||||||
TYPE_HOURLY, TYPE_MONTH, TYPE_RAINDELAY, TYPE_RAINSENSOR, TYPE_WEEKDAY,
|
TYPE_HOT_DAYS, TYPE_HOURLY, TYPE_MONTH, TYPE_RAINDELAY, TYPE_RAINSENSOR,
|
||||||
RainMachineEntity)
|
TYPE_WEEKDAY, RainMachineEntity)
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
@ -79,27 +79,27 @@ 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_FLOW_SENSOR:
|
||||||
self._state = self.rainmachine.data[
|
self._state = self.rainmachine.data[PROVISION_SETTINGS].get(
|
||||||
OPERATION_RESTRICTIONS_CURRENT]['freeze']
|
'useFlowSensor')
|
||||||
|
elif self._sensor_type == TYPE_FREEZE:
|
||||||
|
self._state = self.rainmachine.data[RESTRICTIONS_CURRENT]['freeze']
|
||||||
elif self._sensor_type == TYPE_FREEZE_PROTECTION:
|
elif self._sensor_type == TYPE_FREEZE_PROTECTION:
|
||||||
self._state = self.rainmachine.data[
|
self._state = self.rainmachine.data[RESTRICTIONS_UNIVERSAL][
|
||||||
OPERATION_RESTRICTIONS_UNIVERSAL]['freezeProtectEnabled']
|
'freezeProtectEnabled']
|
||||||
elif self._sensor_type == TYPE_HOT_DAYS:
|
elif self._sensor_type == TYPE_HOT_DAYS:
|
||||||
self._state = self.rainmachine.data[
|
self._state = self.rainmachine.data[RESTRICTIONS_UNIVERSAL][
|
||||||
OPERATION_RESTRICTIONS_UNIVERSAL]['hotDaysExtraWatering']
|
'hotDaysExtraWatering']
|
||||||
elif self._sensor_type == TYPE_HOURLY:
|
elif self._sensor_type == TYPE_HOURLY:
|
||||||
self._state = self.rainmachine.data[
|
self._state = self.rainmachine.data[RESTRICTIONS_CURRENT]['hourly']
|
||||||
OPERATION_RESTRICTIONS_CURRENT]['hourly']
|
|
||||||
elif self._sensor_type == TYPE_MONTH:
|
elif self._sensor_type == TYPE_MONTH:
|
||||||
self._state = self.rainmachine.data[
|
self._state = self.rainmachine.data[RESTRICTIONS_CURRENT]['month']
|
||||||
OPERATION_RESTRICTIONS_CURRENT]['month']
|
|
||||||
elif self._sensor_type == TYPE_RAINDELAY:
|
elif self._sensor_type == TYPE_RAINDELAY:
|
||||||
self._state = self.rainmachine.data[
|
self._state = self.rainmachine.data[RESTRICTIONS_CURRENT][
|
||||||
OPERATION_RESTRICTIONS_CURRENT]['rainDelay']
|
'rainDelay']
|
||||||
elif self._sensor_type == TYPE_RAINSENSOR:
|
elif self._sensor_type == TYPE_RAINSENSOR:
|
||||||
self._state = self.rainmachine.data[
|
self._state = self.rainmachine.data[RESTRICTIONS_CURRENT][
|
||||||
OPERATION_RESTRICTIONS_CURRENT]['rainSensor']
|
'rainSensor']
|
||||||
elif self._sensor_type == TYPE_WEEKDAY:
|
elif self._sensor_type == TYPE_WEEKDAY:
|
||||||
self._state = self.rainmachine.data[
|
self._state = self.rainmachine.data[RESTRICTIONS_CURRENT][
|
||||||
OPERATION_RESTRICTIONS_CURRENT]['weekDay']
|
'weekDay']
|
||||||
|
|
|
@ -12,7 +12,8 @@ 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'
|
PROVISION_SETTINGS = 'provision.settings'
|
||||||
OPERATION_RESTRICTIONS_UNIVERSAL = 'restrictions.universal'
|
RESTRICTIONS_CURRENT = 'restrictions.current'
|
||||||
|
RESTRICTIONS_UNIVERSAL = 'restrictions.universal'
|
||||||
|
|
||||||
TOPIC_UPDATE = 'update_{0}'
|
TOPIC_UPDATE = 'update_{0}'
|
||||||
|
|
|
@ -5,9 +5,11 @@ 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,
|
DATA_CLIENT, DOMAIN as RAINMACHINE_DOMAIN, PROVISION_SETTINGS,
|
||||||
OPERATION_RESTRICTIONS_UNIVERSAL, SENSOR_UPDATE_TOPIC, SENSORS,
|
RESTRICTIONS_UNIVERSAL, SENSOR_UPDATE_TOPIC, SENSORS,
|
||||||
RainMachineEntity)
|
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__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
@ -82,5 +84,25 @@ 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.data[OPERATION_RESTRICTIONS_UNIVERSAL][
|
if self._sensor_type == TYPE_FLOW_SENSOR_CLICK_M3:
|
||||||
'freezeProtectTemp']
|
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']
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue