remove polling

pull/10142/head
Stefan Lehmann 2017-11-18 11:55:57 +01:00
parent 6de2c6b071
commit 7da420f823
4 changed files with 12 additions and 99 deletions
homeassistant/components
binary_sensor
light
sensor

View File

@ -34,8 +34,6 @@ DOMAIN = 'ads'
# config variable names
CONF_ADSVAR = 'adsvar'
CONF_ADSTYPE = 'adstype'
CONF_ADS_USE_NOTIFY = 'use_notify'
CONF_ADS_POLL_INTERVAL = 'poll_interval'
CONF_ADS_FACTOR = 'factor'
CONFIG_SCHEMA = vol.Schema({
@ -43,8 +41,6 @@ CONFIG_SCHEMA = vol.Schema({
vol.Required(CONF_DEVICE): cv.string,
vol.Required(CONF_PORT): cv.port,
vol.Optional(CONF_IP_ADDRESS): cv.string,
vol.Optional(CONF_ADS_POLL_INTERVAL, default=1000): cv.positive_int,
vol.Optional(CONF_ADS_USE_NOTIFY, default=True): cv.boolean,
})
}, extra=vol.ALLOW_EXTRA)
@ -58,8 +54,6 @@ def setup(hass, config):
net_id = conf.get(CONF_DEVICE)
ip_address = conf.get(CONF_IP_ADDRESS)
port = conf.get(CONF_PORT)
poll_interval = conf.get(CONF_ADS_POLL_INTERVAL)
use_notify = conf.get(CONF_ADS_USE_NOTIFY)
# create a new ads connection
client = pyads.Connection(net_id, port, ip_address)
@ -80,8 +74,7 @@ def setup(hass, config):
# connect to ads client and try to connect
try:
ads = AdsHub(client, poll_interval=poll_interval,
use_notify=use_notify)
ads = AdsHub(client)
except pyads.pyads.ADSError:
_LOGGER.error(
'Could not connect to ADS host (netid=%s, port=%s)', net_id, port
@ -120,11 +113,8 @@ NotificationItem = namedtuple(
class AdsHub:
"""Representation of a PyADS connection."""
def __init__(self, ads_client, poll_interval, use_notify):
def __init__(self, ads_client):
"""Initialize the ADS Hub."""
self.poll_interval = poll_interval
self.use_notify = use_notify
self._client = ads_client
self._client.open()

View File

@ -1,16 +1,13 @@
"""Support for ADS binary sensors."""
import logging
from datetime import timedelta
import voluptuous as vol
from homeassistant.components.binary_sensor import BinarySensorDevice, \
PLATFORM_SCHEMA, DEVICE_CLASSES_SCHEMA
from homeassistant.components.ads import DATA_ADS, CONF_ADSVAR, \
CONF_ADS_USE_NOTIFY, CONF_ADS_POLL_INTERVAL
from homeassistant.components.ads import DATA_ADS, CONF_ADSVAR
from homeassistant.const import CONF_NAME, CONF_DEVICE_CLASS
from homeassistant.helpers.event import async_track_time_interval
import homeassistant.helpers.config_validation as cv
@ -24,8 +21,6 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
vol.Required(CONF_ADSVAR): cv.string,
vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
vol.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA,
vol.Optional(CONF_ADS_USE_NOTIFY): cv.boolean,
vol.Optional(CONF_ADS_POLL_INTERVAL): cv.positive_int,
})
@ -38,38 +33,24 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
adsvar = config.get(CONF_ADSVAR)
name = config.get(CONF_NAME)
device_class = config.get(CONF_DEVICE_CLASS)
use_notify = config.get(CONF_ADS_USE_NOTIFY, ads_hub.use_notify)
poll_interval = config.get(CONF_ADS_POLL_INTERVAL, ads_hub.poll_interval)
ads_sensor = AdsBinarySensor(ads_hub, name, adsvar, device_class,
use_notify, poll_interval)
ads_sensor = AdsBinarySensor(ads_hub, name, adsvar, device_class)
add_devices([ads_sensor], True)
if use_notify:
ads_hub.add_device_notification(adsvar, ads_hub.PLCTYPE_BOOL,
ads_sensor.callback)
else:
dtime = timedelta(0, 0, poll_interval * 1000)
async_track_time_interval(hass, ads_sensor.poll, dtime)
ads_hub.add_device_notification(adsvar, ads_hub.PLCTYPE_BOOL,
ads_sensor.callback)
class AdsBinarySensor(BinarySensorDevice):
"""Representation of ADS binary sensors."""
def __init__(self, ads_hub, name, adsvar, device_class, use_notify,
poll_interval):
def __init__(self, ads_hub, name, adsvar, device_class):
"""Initialize AdsBinarySensor entity."""
self._name = name
self._state = False
self._device_class = device_class or 'moving'
self._ads_hub = ads_hub
self.adsvar = adsvar
self.use_notify = use_notify
self.poll_interval = poll_interval
# make first poll if notifications disabled
if not self.use_notify:
self.poll(None)
@property
def name(self):
@ -95,19 +76,3 @@ class AdsBinarySensor(BinarySensorDevice):
self.schedule_update_ha_state()
except AttributeError:
pass
def poll(self, now):
"""Handle polling."""
try:
self._state = self._ads_hub.read_by_name(
self.adsvar, self._ads_hub.PLCTYPE_BOOL
)
_LOGGER.debug('Polled value for bool variable %s: %d',
self.adsvar, self._state)
except self._ads_hub.ADSError as err:
_LOGGER.error(err)
try:
self.schedule_update_ha_state()
except AttributeError:
pass

View File

@ -91,8 +91,6 @@ class AdsLight(Light):
self._ads_hub.write_by_name(self.varname_brightness, bval,
self._ads_hub.PLCTYPE_UINT)
self._on_state = True
def turn_off(self, **kwargs):
"""Turn the light off."""
brightness = kwargs.get(ATTR_BRIGHTNESS)
@ -104,7 +102,6 @@ class AdsLight(Light):
if self.varname_brightness is not None:
self._ads_hub.write_by_name(self.varname_brightness, bval,
self._ads_hub.PLCTYPE_UINT)
self._on_state = False
def value_changed(self, val):
"""Handle value change."""

View File

@ -1,16 +1,14 @@
"""Support for ADS sensors."""
import logging
from datetime import timedelta
import voluptuous as vol
from homeassistant.components.sensor import PLATFORM_SCHEMA
from homeassistant.const import CONF_NAME, CONF_UNIT_OF_MEASUREMENT
from homeassistant.helpers.entity import Entity
import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.event import async_track_time_interval
from homeassistant.components import ads
from homeassistant.components.ads import CONF_ADSVAR, CONF_ADSTYPE, \
CONF_ADS_USE_NOTIFY, CONF_ADS_POLL_INTERVAL, CONF_ADS_FACTOR
CONF_ADS_FACTOR
_LOGGER = logging.getLogger(__name__)
@ -24,8 +22,6 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
vol.Optional(CONF_ADSTYPE, default=ads.ADSTYPE_INT): vol.In(
[ads.ADSTYPE_INT, ads.ADSTYPE_UINT, ads.ADSTYPE_BYTE]
),
vol.Optional(CONF_ADS_USE_NOTIFY): cv.boolean,
vol.Optional(CONF_ADS_POLL_INTERVAL): cv.positive_int,
vol.Optional(CONF_ADS_FACTOR): cv.positive_int,
})
@ -40,28 +36,22 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
adstype = config.get(CONF_ADSTYPE)
name = config.get(CONF_NAME)
unit_of_measurement = config.get(CONF_UNIT_OF_MEASUREMENT)
use_notify = config.get(CONF_ADS_USE_NOTIFY, ads_hub.use_notify)
poll_interval = config.get(CONF_ADS_POLL_INTERVAL, ads_hub.poll_interval)
factor = config.get(CONF_ADS_FACTOR)
entity = AdsSensor(ads_hub, adsvar, adstype, name,
unit_of_measurement, use_notify, poll_interval, factor)
unit_of_measurement, factor)
add_devices([entity])
if use_notify:
ads_hub.add_device_notification(adsvar, ads_hub.ADS_TYPEMAP[adstype],
entity.callback)
else:
dtime = timedelta(0, 0, poll_interval * 1000)
async_track_time_interval(hass, entity.poll, dtime)
ads_hub.add_device_notification(adsvar, ads_hub.ADS_TYPEMAP[adstype],
entity.callback)
class AdsSensor(Entity):
"""Representation of an ADS sensor entity."""
def __init__(self, ads_hub, adsvar, adstype, devname, unit_of_measurement,
use_notify, poll_interval, factor):
factor):
"""Initialize AdsSensor entity."""
self._ads_hub = ads_hub
self._name = devname
@ -69,14 +59,8 @@ class AdsSensor(Entity):
self._unit_of_measurement = unit_of_measurement
self.adsvar = adsvar
self.adstype = adstype
self.use_notify = use_notify
self.poll_interval = poll_interval
self.factor = factor
# make first poll if notifications disabled
if not self.use_notify:
self.poll(None)
@property
def name(self):
"""Return the name of the entity."""
@ -106,26 +90,3 @@ class AdsSensor(Entity):
self.schedule_update_ha_state()
except AttributeError:
pass
def poll(self, now):
"""Poll value from ADS device."""
try:
val = self._ads_hub.read_by_name(
self.adsvar, self._ads_hub.ADS_TYPEMAP[self.adstype]
)
if self.factor is None:
self._value = val
else:
self._value = val / self.factor
_LOGGER.debug('Polled value for variable %s: %d',
self.adsvar, self._value)
except self._ads_hub.ADSError as err:
_LOGGER.error(err)
try:
self.schedule_update_ha_state()
except AttributeError:
pass