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):