From 5f36fd2a805d359bb5380ff917469fb2e7f6de6f Mon Sep 17 00:00:00 2001
From: "J. Nick Koston" <nick@koston.org>
Date: Thu, 28 Oct 2021 14:27:19 -0500
Subject: [PATCH] Fix uncaught exception in sense and retry later (#58623)

---
 homeassistant/components/sense/__init__.py | 25 ++++++++++++++--------
 homeassistant/components/sense/const.py    |  3 +++
 2 files changed, 19 insertions(+), 9 deletions(-)

diff --git a/homeassistant/components/sense/__init__.py b/homeassistant/components/sense/__init__.py
index 5c8028f2525..92a4e29108c 100644
--- a/homeassistant/components/sense/__init__.py
+++ b/homeassistant/components/sense/__init__.py
@@ -3,11 +3,7 @@ import asyncio
 from datetime import timedelta
 import logging
 
-from sense_energy import (
-    ASyncSenseable,
-    SenseAPITimeoutException,
-    SenseAuthenticationException,
-)
+from sense_energy import ASyncSenseable, SenseAuthenticationException
 
 from homeassistant.config_entries import ConfigEntry
 from homeassistant.const import (
@@ -30,6 +26,7 @@ from .const import (
     SENSE_DEVICE_UPDATE,
     SENSE_DEVICES_DATA,
     SENSE_DISCOVERED_DEVICES_DATA,
+    SENSE_EXCEPTIONS,
     SENSE_TIMEOUT_EXCEPTIONS,
     SENSE_TRENDS_COORDINATOR,
 )
@@ -76,14 +73,22 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
         _LOGGER.error("Could not authenticate with sense server")
         return False
     except SENSE_TIMEOUT_EXCEPTIONS as err:
-        raise ConfigEntryNotReady from err
+        raise ConfigEntryNotReady(
+            str(err) or "Timed out during authentication"
+        ) from err
+    except SENSE_EXCEPTIONS as err:
+        raise ConfigEntryNotReady(str(err) or "Error during authentication") from err
 
     sense_devices_data = SenseDevicesData()
     try:
         sense_discovered_devices = await gateway.get_discovered_device_data()
         await gateway.update_realtime()
     except SENSE_TIMEOUT_EXCEPTIONS as err:
-        raise ConfigEntryNotReady from err
+        raise ConfigEntryNotReady(
+            str(err) or "Timed out during realtime update"
+        ) from err
+    except SENSE_EXCEPTIONS as err:
+        raise ConfigEntryNotReady(str(err) or "Error during realtime update") from err
 
     trends_coordinator = DataUpdateCoordinator(
         hass,
@@ -114,8 +119,10 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
         """Retrieve latest state."""
         try:
             await gateway.update_realtime()
-        except SenseAPITimeoutException:
-            _LOGGER.error("Timeout retrieving data")
+        except SENSE_TIMEOUT_EXCEPTIONS as ex:
+            _LOGGER.error("Timeout retrieving data: %s", ex)
+        except SENSE_EXCEPTIONS as ex:
+            _LOGGER.error("Failed to update data: %s", ex)
 
         data = gateway.get_realtime()
         if "devices" in data:
diff --git a/homeassistant/components/sense/const.py b/homeassistant/components/sense/const.py
index af8454bbeab..bb323151950 100644
--- a/homeassistant/components/sense/const.py
+++ b/homeassistant/components/sense/const.py
@@ -1,8 +1,10 @@
 """Constants for monitoring a Sense energy sensor."""
 
 import asyncio
+import socket
 
 from sense_energy import SenseAPITimeoutException
+from sense_energy.sense_exceptions import SenseWebsocketException
 
 DOMAIN = "sense"
 DEFAULT_TIMEOUT = 10
@@ -37,6 +39,7 @@ SOLAR_POWERED_ID = "solar_powered"
 ICON = "mdi:flash"
 
 SENSE_TIMEOUT_EXCEPTIONS = (asyncio.TimeoutError, SenseAPITimeoutException)
+SENSE_EXCEPTIONS = (socket.gaierror, SenseWebsocketException)
 
 MDI_ICONS = {
     "ac": "air-conditioner",
-- 
GitLab