remove polling

This commit is contained in:
Stefan Lehmann
2017-11-18 11:55:57 +01:00
parent 6de2c6b071
commit 7da420f823
4 changed files with 12 additions and 99 deletions

View File

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

View File

@ -1,16 +1,13 @@
"""Support for ADS binary sensors.""" """Support for ADS binary sensors."""
import logging import logging
from datetime import timedelta
import voluptuous as vol import voluptuous as vol
from homeassistant.components.binary_sensor import BinarySensorDevice, \ from homeassistant.components.binary_sensor import BinarySensorDevice, \
PLATFORM_SCHEMA, DEVICE_CLASSES_SCHEMA PLATFORM_SCHEMA, DEVICE_CLASSES_SCHEMA
from homeassistant.components.ads import DATA_ADS, CONF_ADSVAR, \ from homeassistant.components.ads import DATA_ADS, CONF_ADSVAR
CONF_ADS_USE_NOTIFY, CONF_ADS_POLL_INTERVAL
from homeassistant.const import CONF_NAME, CONF_DEVICE_CLASS 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 import homeassistant.helpers.config_validation as cv
@ -24,8 +21,6 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
vol.Required(CONF_ADSVAR): cv.string, vol.Required(CONF_ADSVAR): cv.string,
vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
vol.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA, 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) adsvar = config.get(CONF_ADSVAR)
name = config.get(CONF_NAME) name = config.get(CONF_NAME)
device_class = config.get(CONF_DEVICE_CLASS) 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, ads_sensor = AdsBinarySensor(ads_hub, name, adsvar, device_class)
use_notify, poll_interval)
add_devices([ads_sensor], True) add_devices([ads_sensor], True)
if use_notify: ads_hub.add_device_notification(adsvar, ads_hub.PLCTYPE_BOOL,
ads_hub.add_device_notification(adsvar, ads_hub.PLCTYPE_BOOL, ads_sensor.callback)
ads_sensor.callback)
else:
dtime = timedelta(0, 0, poll_interval * 1000)
async_track_time_interval(hass, ads_sensor.poll, dtime)
class AdsBinarySensor(BinarySensorDevice): class AdsBinarySensor(BinarySensorDevice):
"""Representation of ADS binary sensors.""" """Representation of ADS binary sensors."""
def __init__(self, ads_hub, name, adsvar, device_class, use_notify, def __init__(self, ads_hub, name, adsvar, device_class):
poll_interval):
"""Initialize AdsBinarySensor entity.""" """Initialize AdsBinarySensor entity."""
self._name = name self._name = name
self._state = False self._state = False
self._device_class = device_class or 'moving' self._device_class = device_class or 'moving'
self._ads_hub = ads_hub self._ads_hub = ads_hub
self.adsvar = adsvar 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 @property
def name(self): def name(self):
@ -95,19 +76,3 @@ class AdsBinarySensor(BinarySensorDevice):
self.schedule_update_ha_state() self.schedule_update_ha_state()
except AttributeError: except AttributeError:
pass 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.write_by_name(self.varname_brightness, bval,
self._ads_hub.PLCTYPE_UINT) self._ads_hub.PLCTYPE_UINT)
self._on_state = True
def turn_off(self, **kwargs): def turn_off(self, **kwargs):
"""Turn the light off.""" """Turn the light off."""
brightness = kwargs.get(ATTR_BRIGHTNESS) brightness = kwargs.get(ATTR_BRIGHTNESS)
@ -104,7 +102,6 @@ class AdsLight(Light):
if self.varname_brightness is not None: if self.varname_brightness is not None:
self._ads_hub.write_by_name(self.varname_brightness, bval, self._ads_hub.write_by_name(self.varname_brightness, bval,
self._ads_hub.PLCTYPE_UINT) self._ads_hub.PLCTYPE_UINT)
self._on_state = False
def value_changed(self, val): def value_changed(self, val):
"""Handle value change.""" """Handle value change."""

View File

@ -1,16 +1,14 @@
"""Support for ADS sensors.""" """Support for ADS sensors."""
import logging import logging
from datetime import timedelta
import voluptuous as vol import voluptuous as vol
from homeassistant.components.sensor import PLATFORM_SCHEMA from homeassistant.components.sensor import PLATFORM_SCHEMA
from homeassistant.const import CONF_NAME, CONF_UNIT_OF_MEASUREMENT from homeassistant.const import CONF_NAME, CONF_UNIT_OF_MEASUREMENT
from homeassistant.helpers.entity import Entity from homeassistant.helpers.entity import Entity
import homeassistant.helpers.config_validation as cv import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.event import async_track_time_interval
from homeassistant.components import ads from homeassistant.components import ads
from homeassistant.components.ads import CONF_ADSVAR, CONF_ADSTYPE, \ 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__) _LOGGER = logging.getLogger(__name__)
@ -24,8 +22,6 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
vol.Optional(CONF_ADSTYPE, default=ads.ADSTYPE_INT): vol.In( vol.Optional(CONF_ADSTYPE, default=ads.ADSTYPE_INT): vol.In(
[ads.ADSTYPE_INT, ads.ADSTYPE_UINT, ads.ADSTYPE_BYTE] [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, 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) adstype = config.get(CONF_ADSTYPE)
name = config.get(CONF_NAME) name = config.get(CONF_NAME)
unit_of_measurement = config.get(CONF_UNIT_OF_MEASUREMENT) 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) factor = config.get(CONF_ADS_FACTOR)
entity = AdsSensor(ads_hub, adsvar, adstype, name, entity = AdsSensor(ads_hub, adsvar, adstype, name,
unit_of_measurement, use_notify, poll_interval, factor) unit_of_measurement, factor)
add_devices([entity]) add_devices([entity])
if use_notify: ads_hub.add_device_notification(adsvar, ads_hub.ADS_TYPEMAP[adstype],
ads_hub.add_device_notification(adsvar, ads_hub.ADS_TYPEMAP[adstype], entity.callback)
entity.callback)
else:
dtime = timedelta(0, 0, poll_interval * 1000)
async_track_time_interval(hass, entity.poll, dtime)
class AdsSensor(Entity): class AdsSensor(Entity):
"""Representation of an ADS sensor entity.""" """Representation of an ADS sensor entity."""
def __init__(self, ads_hub, adsvar, adstype, devname, unit_of_measurement, def __init__(self, ads_hub, adsvar, adstype, devname, unit_of_measurement,
use_notify, poll_interval, factor): factor):
"""Initialize AdsSensor entity.""" """Initialize AdsSensor entity."""
self._ads_hub = ads_hub self._ads_hub = ads_hub
self._name = devname self._name = devname
@ -69,14 +59,8 @@ class AdsSensor(Entity):
self._unit_of_measurement = unit_of_measurement self._unit_of_measurement = unit_of_measurement
self.adsvar = adsvar self.adsvar = adsvar
self.adstype = adstype self.adstype = adstype
self.use_notify = use_notify
self.poll_interval = poll_interval
self.factor = factor self.factor = factor
# make first poll if notifications disabled
if not self.use_notify:
self.poll(None)
@property @property
def name(self): def name(self):
"""Return the name of the entity.""" """Return the name of the entity."""
@ -106,26 +90,3 @@ class AdsSensor(Entity):
self.schedule_update_ha_state() self.schedule_update_ha_state()
except AttributeError: except AttributeError:
pass 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