Use dispatcher for netgear_lte state updates (#22328)

* Use dispatcher for netgear_lte state updates

* Also dispatch unavailable state
This commit is contained in:
Anders Melchiorsen 2019-03-26 16:06:11 +01:00 committed by Paulus Schoutsen
parent 7519e8d417
commit afa99c9189
2 changed files with 28 additions and 7 deletions

View File

@ -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."""

View File

@ -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'."""