From afa99c91893957b60df80bf83bd306a1dc7cdd43 Mon Sep 17 00:00:00 2001 From: Anders Melchiorsen Date: Tue, 26 Mar 2019 16:06:11 +0100 Subject: [PATCH] Use dispatcher for netgear_lte state updates (#22328) * Use dispatcher for netgear_lte state updates * Also dispatch unavailable state --- .../components/netgear_lte/__init__.py | 18 ++++++++++++++---- homeassistant/components/netgear_lte/sensor.py | 17 ++++++++++++++--- 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/homeassistant/components/netgear_lte/__init__.py b/homeassistant/components/netgear_lte/__init__.py index 34330426e34..730c3851a2d 100644 --- a/homeassistant/components/netgear_lte/__init__.py +++ b/homeassistant/components/netgear_lte/__init__.py @@ -15,7 +15,8 @@ from homeassistant.components.notify import DOMAIN as NOTIFY_DOMAIN from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN from homeassistant.helpers import config_validation as cv, discovery from homeassistant.helpers.aiohttp_client import async_create_clientsession -from homeassistant.util import Throttle +from homeassistant.helpers.dispatcher import async_dispatcher_send +from homeassistant.helpers.event import async_track_time_interval from . import sensor_types @@ -23,7 +24,8 @@ REQUIREMENTS = ['eternalegypt==0.0.5'] _LOGGER = logging.getLogger(__name__) -MIN_TIME_BETWEEN_UPDATES = timedelta(seconds=10) +SCAN_INTERVAL = timedelta(seconds=10) +DISPATCHER_NETGEAR_LTE = 'netgear_lte_update' DOMAIN = 'netgear_lte' DATA_KEY = 'netgear_lte' @@ -56,6 +58,7 @@ CONFIG_SCHEMA = vol.Schema({ class ModemData: """Class for modem state.""" + hass = attr.ib() host = attr.ib() modem = attr.ib() @@ -64,7 +67,6 @@ class ModemData: usage = attr.ib(init=False, default=None) connected = attr.ib(init=False, default=True) - @Throttle(MIN_TIME_BETWEEN_UPDATES) async def async_update(self): """Call the API to update the data.""" import eternalegypt @@ -83,6 +85,8 @@ class ModemData: self.unread_count = None self.usage = None + async_dispatcher_send(self.hass, DISPATCHER_NETGEAR_LTE) + @attr.s class LTEData: @@ -143,7 +147,7 @@ async def _setup_lte(hass, lte_config): websession = hass.data[DATA_KEY].websession modem = eternalegypt.Modem(hostname=host, websession=websession) - modem_data = ModemData(host, modem) + modem_data = ModemData(hass, host, modem) try: await _login(hass, modem_data, password) @@ -172,6 +176,12 @@ async def _login(hass, modem_data, password): hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, cleanup) + async def _update(now): + """Periodic update.""" + await modem_data.async_update() + + async_track_time_interval(hass, _update, SCAN_INTERVAL) + async def _retry_login(hass, modem_data, password): """Sleep and retry setup.""" diff --git a/homeassistant/components/netgear_lte/sensor.py b/homeassistant/components/netgear_lte/sensor.py index 774cdc5536a..a13f5fbfaa7 100644 --- a/homeassistant/components/netgear_lte/sensor.py +++ b/homeassistant/components/netgear_lte/sensor.py @@ -6,8 +6,9 @@ import attr from homeassistant.components.sensor import DOMAIN from homeassistant.exceptions import PlatformNotReady from homeassistant.helpers.entity import Entity +from homeassistant.helpers.dispatcher import async_dispatcher_connect -from . import CONF_MONITORED_CONDITIONS, DATA_KEY +from . import CONF_MONITORED_CONDITIONS, DATA_KEY, DISPATCHER_NETGEAR_LTE from .sensor_types import SENSOR_SMS, SENSOR_USAGE DEPENDENCIES = ['netgear_lte'] @@ -36,7 +37,7 @@ async def async_setup_platform( elif sensor_type == SENSOR_USAGE: sensors.append(UsageSensor(modem_data, sensor_type)) - async_add_entities(sensors, True) + async_add_entities(sensors) @attr.s @@ -46,10 +47,20 @@ class LTESensor(Entity): modem_data = attr.ib() sensor_type = attr.ib() + async def async_added_to_hass(self): + """Register callback.""" + async_dispatcher_connect( + self.hass, DISPATCHER_NETGEAR_LTE, self.async_write_ha_state) + async def async_update(self): - """Update state.""" + """Force update of state.""" await self.modem_data.async_update() + @property + def should_poll(self): + """Return that the sensor should not be polled.""" + return False + @property def unique_id(self): """Return a unique ID like 'usage_5TG365AB0078V'."""