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 .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):
|
||||
|
|
|
@ -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']
|
||||
|
|
|
@ -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}'
|
||||
|
|
|
@ -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']
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue