From 2a284ee16d2034f9b24342fd772a9e890c23cbcb Mon Sep 17 00:00:00 2001 From: Jacob Shufro Date: Fri, 28 Aug 2020 18:04:26 -0400 Subject: [PATCH] Make temp-type sensors resilient to partial data availability --- noaa_tides/sensor.py | 36 +++++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/noaa_tides/sensor.py b/noaa_tides/sensor.py index 9e46045..e179f7a 100644 --- a/noaa_tides/sensor.py +++ b/noaa_tides/sensor.py @@ -220,10 +220,12 @@ def device_state_attributes(self): if self.data is None: return self.attr - self.attr["temperature"] = self.data[0].water_temp[0] - self.attr["air_temperature"] = self.data[1].air_temp[0] - self.attr["temperature_time"] = self.data[0].index[0].strftime("%Y-%m-%dT%H:%M") - self.attr["air_temperature_time"] = self.data[1].index[0].strftime("%Y-%m-%dT%H:%M") + if self.data[0] is not None: + self.attr["temperature"] = self.data[0].water_temp[0] + self.attr["temperature_time"] = self.data[0].index[0].strftime("%Y-%m-%dT%H:%M") + if self.data[1] is not None: + self.attr["air_temperature"] = self.data[1].air_temp[0] + self.attr["air_temperature_time"] = self.data[1].index[0].strftime("%Y-%m-%dT%H:%M") return self.attr @property @@ -231,6 +233,9 @@ def state(self): """Return the state of the device.""" if self.data is None: return None + if self.data[0] is None: + # If there is no water temperature use the air temperature + return self.data[1].air_temp[0] return self.data[0].water_temp[0] @property @@ -255,6 +260,8 @@ def noaa_coops_update(self): end = datetime.now() delta = timedelta(minutes=60) begin = end - delta + temps = None + air_temps = None try: temps = stn.get_data( begin_date=begin.strftime("%Y%m%d %H:%M"), @@ -262,26 +269,37 @@ def noaa_coops_update(self): product="water_temperature", units=self._unit_system, time_zone=self._timezone, + ).tail(1) + _LOGGER.debug( + "Recent water temperature data queried with start time set to %s", + begin.strftime("%m-%d-%Y %H:%M"), ) + except ValueError as err: + _LOGGER.error(f"Check NOAA Tides and Currents: {err.args}") + except requests.exceptions.ConnectionError as err: + _LOGGER.error(f"Couldn't connect to NOAA Ties and Currents API: {err}") + + try: air_temps = stn.get_data( begin_date=begin.strftime("%Y%m%d %H:%M"), end_date=end.strftime("%Y%m%d %H:%M"), product="air_temperature", units=self._unit_system, time_zone=self._timezone, - ) - self.data = (temps.tail(1), air_temps.tail(1)) - _LOGGER.debug(f"Data = {self.data}") + ).tail(1) _LOGGER.debug( "Recent temperature data queried with start time set to %s", begin.strftime("%m-%d-%Y %H:%M"), ) except ValueError as err: - self.data = None _LOGGER.error(f"Check NOAA Tides and Currents: {err.args}") except requests.exceptions.ConnectionError as err: - self.data = None _LOGGER.error(f"Couldn't connect to NOAA Ties and Currents API: {err}") + if temps is None and air_temps is None: + self.data = None + else: + self.data = (temps, air_temps) + _LOGGER.debug(f"Data = {self.data}") async def async_update(self): """Get the latest data from NOAA Tides and Currents API."""