From dca95b445fe220fc9e1f9264d06876d59137be9a Mon Sep 17 00:00:00 2001 From: Jaco Kok Date: Sun, 23 May 2021 22:43:51 +0000 Subject: [PATCH] Fixed sensor not updating from coordinator --- custom_components/warzone/__init__.py | 13 +++------- custom_components/warzone/config_flow.py | 3 +-- custom_components/warzone/const.py | 3 +-- custom_components/warzone/sensor.py | 33 ++++++++++++++---------- 4 files changed, 24 insertions(+), 28 deletions(-) diff --git a/custom_components/warzone/__init__.py b/custom_components/warzone/__init__.py index 7923d56..021b314 100644 --- a/custom_components/warzone/__init__.py +++ b/custom_components/warzone/__init__.py @@ -4,7 +4,7 @@ from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant import logging -from .const import CLIENT, CONF_PASSWORD, CONF_USERNAME, DOMAIN +from .const import CONF_PASSWORD, CONF_USERNAME, DOMAIN from .lib import Login _LOGGER = logging.getLogger(__name__) @@ -12,18 +12,12 @@ PLATFORMS = ["sensor"] async def async_setup(hass: HomeAssistant, config: dict): - hass.data[DOMAIN] = {} - if DOMAIN not in config: - return True + """Cannot setup using YAML""" return True - async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up warzone from a config entry.""" hass.data.setdefault(DOMAIN, {}) - hass.data[DOMAIN][entry.entry_id] = { - CLIENT: await Login(entry.data.get(CONF_USERNAME), entry.data.get(CONF_PASSWORD)), - } hass.config_entries.async_setup_platforms(entry, PLATFORMS) return True @@ -32,5 +26,4 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: unload_ok = await hass.config_entries.async_unload_platforms(entry, PLATFORMS) if unload_ok: hass.data[DOMAIN].pop(entry.entry_id) - - return unload_ok + return unload_ok \ No newline at end of file diff --git a/custom_components/warzone/config_flow.py b/custom_components/warzone/config_flow.py index 4fb7d4b..8739d8e 100644 --- a/custom_components/warzone/config_flow.py +++ b/custom_components/warzone/config_flow.py @@ -13,8 +13,7 @@ from homeassistant.exceptions import HomeAssistantError from homeassistant.core import callback import homeassistant.helpers.config_validation as cv -from .lib import Login -from .lib import Platform +from .lib import Login, Platform from .const import CONF_POLLING_INTERVAL, DOMAIN, CONF_PASSWORD, CONF_PLATFORM, CONF_PROFILE, CONF_USERNAME, PLATFORM_TYPES, POLLING_INTERVAL _LOGGER = logging.getLogger(__name__) diff --git a/custom_components/warzone/const.py b/custom_components/warzone/const.py index 0aa2c9a..3a287d5 100644 --- a/custom_components/warzone/const.py +++ b/custom_components/warzone/const.py @@ -1,7 +1,6 @@ """Constants for the warzone integration.""" -DOMAIN = "warzone" -CLIENT = "client" +DOMAIN = "warzone" CONF_USERNAME = "username" CONF_PASSWORD = "password" CONF_PLATFORM = "platform" diff --git a/custom_components/warzone/sensor.py b/custom_components/warzone/sensor.py index d43913c..cc3f6b7 100644 --- a/custom_components/warzone/sensor.py +++ b/custom_components/warzone/sensor.py @@ -5,14 +5,15 @@ from homeassistant.components.sensor import SensorEntity from homeassistant.config_entries import ConfigEntry from homeassistant.core import DOMAIN, HomeAssistant -from .const import CLIENT, CONF_POLLING_INTERVAL, DOMAIN, CONF_PLATFORM, CONF_PROFILE, POLLING_INTERVAL, PULL_TIMEOUT -from .lib import Platform, Title, Mode +from .const import CONF_POLLING_INTERVAL, DOMAIN, CONF_PLATFORM, CONF_PROFILE, POLLING_INTERVAL, PULL_TIMEOUT, CONF_USERNAME, CONF_PASSWORD +from .lib import Platform, Title, Mode, Login import async_timeout from homeassistant.helpers.update_coordinator import ( CoordinatorEntity, - DataUpdateCoordinator + DataUpdateCoordinator, + UpdateFailed ) _LOGGER = logging.getLogger(__name__) @@ -20,19 +21,24 @@ async def async_setup_entry( hass: HomeAssistant, entry: ConfigEntry, async_add_entities ) -> None: - client = hass.data[DOMAIN][entry.entry_id][CLIENT] profile = entry.data.get(CONF_PROFILE) platform = Platform(entry.data.get(CONF_PLATFORM)) + username = entry.data.get(CONF_USERNAME) + password = entry.data.get(CONF_PASSWORD) sensors = [] async def async_update_data(): with async_timeout.timeout(PULL_TIMEOUT): - results = await client.SearchPlayers(platform, profile, limit=1) - me = results[0] - profileResults = await me.profile(Title.ModernWarfare, Mode.Warzone) - finalResults = profileResults["lifetime"]["mode"]["br"]["properties"] - finalResults["level"] = profileResults["level"] - return finalResults + try: + client = await Login(username, password) + results = await client.SearchPlayers(platform, profile, limit=1) + me = results[0] + profileResults = await me.profile(Title.ModernWarfare, Mode.Warzone) + finalResults = profileResults["lifetime"]["mode"]["br"]["properties"] + finalResults["level"] = profileResults["level"] + return finalResults + except Exception as exception: + raise UpdateFailed(exception) polling = entry.options.get(CONF_POLLING_INTERVAL, POLLING_INTERVAL) @@ -48,7 +54,7 @@ async def async_update_data(): for idx, ent in enumerate(coordinator.data): sensors.append( - WarzoneSensor(coordinator, ent, coordinator.data[ent], profile) + WarzoneSensor(coordinator, ent, profile) ) async_add_entities(sensors, True) @@ -56,10 +62,9 @@ async def async_update_data(): class WarzoneSensor(CoordinatorEntity, SensorEntity): """Representation of a Sensor.""" - def __init__(self, coordinator, sensor, state, profile): + def __init__(self, coordinator, sensor, profile): """Initialize the sensor.""" super().__init__(coordinator) - self._state = state self._sensor = sensor self._profile = profile @@ -71,4 +76,4 @@ def name(self): @property def state(self): """Return the state of the sensor.""" - return self._state \ No newline at end of file + return self.coordinator.data[self._sensor] \ No newline at end of file