diff --git a/homeassistant/components/atome/sensor.py b/homeassistant/components/atome/sensor.py index 59d193ec8e2239f1532840b402c861db568c068d..0402e80949e45fe007dd729b7dc21f465434b403 100644 --- a/homeassistant/components/atome/sensor.py +++ b/homeassistant/components/atome/sensor.py @@ -111,11 +111,13 @@ class AtomeData: """Return latest active power value.""" return self._is_connected - @Throttle(LIVE_SCAN_INTERVAL) - def update_live_usage(self): - """Return current power value.""" - try: - values = self.atome_client.get_live() + def _retrieve_live(self): + values = self.atome_client.get_live() + if ( + values.get("last") + and values.get("subscribed") + and (values.get("isConnected") is not None) + ): self._live_power = values["last"] self._subscribed_power = values["subscribed"] self._is_connected = values["isConnected"] @@ -125,9 +127,47 @@ class AtomeData: self._is_connected, self._subscribed_power, ) + return True - except KeyError as error: - _LOGGER.error("Missing last value in values: %s: %s", values, error) + _LOGGER.error("Live Data : Missing last value in values: %s", values) + return False + + @Throttle(LIVE_SCAN_INTERVAL) + def update_live_usage(self): + """Return current power value.""" + if not self._retrieve_live(): + _LOGGER.debug("Perform Reconnect during live request") + self.atome_client.login() + self._retrieve_live() + + def _retrieve_period_usage(self, period_type): + """Return current daily/weekly/monthly/yearly power usage.""" + values = self.atome_client.get_consumption(period_type) + if values.get("total") and values.get("price"): + period_usage = values["total"] / 1000 + period_price = values["price"] + _LOGGER.debug("Updating Atome %s data. Got: %d", period_type, period_usage) + return True, period_usage, period_price + + _LOGGER.error("%s : Missing last value in values: %s", period_type, values) + return False, None, None + + def _retrieve_period_usage_with_retry(self, period_type): + """Return current daily/weekly/monthly/yearly power usage with one retry.""" + ( + retrieve_success, + period_usage, + period_price, + ) = self._retrieve_period_usage(period_type) + if not retrieve_success: + _LOGGER.debug("Perform Reconnect during %s", period_type) + self.atome_client.login() + ( + retrieve_success, + period_usage, + period_price, + ) = self._retrieve_period_usage(period_type) + return (period_usage, period_price) @property def day_usage(self): @@ -142,14 +182,10 @@ class AtomeData: @Throttle(DAILY_SCAN_INTERVAL) def update_day_usage(self): """Return current daily power usage.""" - try: - values = self.atome_client.get_consumption(DAILY_TYPE) - self._day_usage = values["total"] / 1000 - self._day_price = values["price"] - _LOGGER.debug("Updating Atome daily data. Got: %d", self._day_usage) - - except KeyError as error: - _LOGGER.error("Missing last value in values: %s: %s", values, error) + ( + self._day_usage, + self._day_price, + ) = self._retrieve_period_usage_with_retry(DAILY_TYPE) @property def week_usage(self): @@ -164,14 +200,10 @@ class AtomeData: @Throttle(WEEKLY_SCAN_INTERVAL) def update_week_usage(self): """Return current weekly power usage.""" - try: - values = self.atome_client.get_consumption(WEEKLY_TYPE) - self._week_usage = values["total"] / 1000 - self._week_price = values["price"] - _LOGGER.debug("Updating Atome weekly data. Got: %d", self._week_usage) - - except KeyError as error: - _LOGGER.error("Missing last value in values: %s: %s", values, error) + ( + self._week_usage, + self._week_price, + ) = self._retrieve_period_usage_with_retry(WEEKLY_TYPE) @property def month_usage(self): @@ -186,14 +218,10 @@ class AtomeData: @Throttle(MONTHLY_SCAN_INTERVAL) def update_month_usage(self): """Return current monthly power usage.""" - try: - values = self.atome_client.get_consumption(MONTHLY_TYPE) - self._month_usage = values["total"] / 1000 - self._month_price = values["price"] - _LOGGER.debug("Updating Atome monthly data. Got: %d", self._month_usage) - - except KeyError as error: - _LOGGER.error("Missing last value in values: %s: %s", values, error) + ( + self._month_usage, + self._month_price, + ) = self._retrieve_period_usage_with_retry(MONTHLY_TYPE) @property def year_usage(self): @@ -208,14 +236,10 @@ class AtomeData: @Throttle(YEARLY_SCAN_INTERVAL) def update_year_usage(self): """Return current yearly power usage.""" - try: - values = self.atome_client.get_consumption(YEARLY_TYPE) - self._year_usage = values["total"] / 1000 - self._year_price = values["price"] - _LOGGER.debug("Updating Atome yearly data. Got: %d", self._year_usage) - - except KeyError as error: - _LOGGER.error("Missing last value in values: %s: %s", values, error) + ( + self._year_usage, + self._year_price, + ) = self._retrieve_period_usage_with_retry(YEARLY_TYPE) class AtomeSensor(SensorEntity):