Handle no_readings in La Crosse View (#138354)

* Handle no_readings in La Crosse View

* Fixes
This commit is contained in:
IceBotYT 2025-02-13 03:24:28 -05:00 committed by GitHub
parent 737baaef2b
commit 6bc4f04a07
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 120 additions and 8 deletions

View File

@ -13,7 +13,7 @@ from homeassistant.core import HomeAssistant
from homeassistant.exceptions import ConfigEntryAuthFailed
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
from .const import SCAN_INTERVAL
from .const import DOMAIN, SCAN_INTERVAL
_LOGGER = logging.getLogger(__name__)
@ -75,16 +75,28 @@ class LaCrosseUpdateCoordinator(DataUpdateCoordinator[list[Sensor]]):
try:
# Fetch last hour of data
for sensor in self.devices:
sensor.data = (
await self.api.get_sensor_status(
sensor=sensor,
tz=self.hass.config.time_zone,
data = await self.api.get_sensor_status(
sensor=sensor,
tz=self.hass.config.time_zone,
)
_LOGGER.debug("Got data: %s", data)
if data_error := data.get("error"):
if data_error == "no_readings":
sensor.data = None
_LOGGER.debug("No readings for %s", sensor.name)
continue
_LOGGER.debug("Error: %s", data_error)
raise UpdateFailed(
translation_domain=DOMAIN, translation_key="update_error"
)
)["data"]["current"]
_LOGGER.debug("Got data: %s", sensor.data)
sensor.data = data["data"]["current"]
except HTTPError as error:
raise UpdateFailed from error
raise UpdateFailed(
translation_domain=DOMAIN, translation_key="update_error"
) from error
# Verify that we have permission to read the sensors
for sensor in self.devices:

View File

@ -42,5 +42,10 @@
"name": "Wind chill"
}
}
},
"exceptions": {
"update_error": {
"message": "Error updating data"
}
}
}

View File

@ -165,3 +165,25 @@ TEST_UNITS_OVERRIDE_SENSOR = Sensor(
permissions={"read": True},
model="Test",
)
TEST_NO_READINGS_SENSOR = Sensor(
name="Test",
device_id="1",
type="Test",
sensor_id="2",
sensor_field_names=["Temperature"],
location=Location(id="1", name="Test"),
data={"error": "no_readings"},
permissions={"read": True},
model="Test",
)
TEST_OTHER_ERROR_SENSOR = Sensor(
name="Test",
device_id="1",
type="Test",
sensor_id="2",
sensor_field_names=["Temperature"],
location=Location(id="1", name="Test"),
data={"error": "some_other_error"},
permissions={"read": True},
model="Test",
)

View File

@ -83,6 +83,23 @@ async def test_http_error(hass: HomeAssistant) -> None:
assert len(entries) == 1
assert entries[0].state is ConfigEntryState.SETUP_RETRY
config_entry_2 = MockConfigEntry(domain=DOMAIN, data=MOCK_ENTRY_DATA)
config_entry_2.add_to_hass(hass)
# Start over, let get_devices succeed but get_sensor_status fail
with (
patch("lacrosse_view.LaCrosse.login", return_value=True),
patch("lacrosse_view.LaCrosse.get_devices", return_value=[TEST_SENSOR]),
patch("lacrosse_view.LaCrosse.get_sensor_status", side_effect=HTTPError),
):
assert not await hass.config_entries.async_setup(config_entry_2.entry_id)
await hass.async_block_till_done()
entries = hass.config_entries.async_entries(DOMAIN)
assert entries
assert len(entries) == 2
assert entries[1].state is ConfigEntryState.SETUP_RETRY
async def test_new_token(hass: HomeAssistant, freezer: FrozenDateTimeFactory) -> None:
"""Test new token."""

View File

@ -18,6 +18,8 @@ from . import (
TEST_MISSING_FIELD_DATA_SENSOR,
TEST_NO_FIELD_SENSOR,
TEST_NO_PERMISSION_SENSOR,
TEST_NO_READINGS_SENSOR,
TEST_OTHER_ERROR_SENSOR,
TEST_SENSOR,
TEST_STRING_SENSOR,
TEST_UNITS_OVERRIDE_SENSOR,
@ -204,3 +206,57 @@ async def test_field_data_missing(hass: HomeAssistant) -> None:
assert len(entries) == 1
assert entries[0].state is ConfigEntryState.LOADED
assert hass.states.get("sensor.test_temperature").state == "unknown"
async def test_no_readings(hass: HomeAssistant) -> None:
"""Test behavior when there are no readings."""
config_entry = MockConfigEntry(domain=DOMAIN, data=MOCK_ENTRY_DATA)
config_entry.add_to_hass(hass)
sensor = TEST_NO_READINGS_SENSOR.model_copy()
status = sensor.data
sensor.data = None
with (
patch("lacrosse_view.LaCrosse.login", return_value=True),
patch(
"lacrosse_view.LaCrosse.get_devices",
return_value=[sensor],
),
patch("lacrosse_view.LaCrosse.get_sensor_status", return_value=status),
):
assert await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done()
assert hass.data[DOMAIN]
entries = hass.config_entries.async_entries(DOMAIN)
assert entries
assert len(entries) == 1
assert entries[0].state is ConfigEntryState.LOADED
assert hass.states.get("sensor.test_temperature").state == "unavailable"
async def test_other_error(hass: HomeAssistant) -> None:
"""Test behavior when there is an error."""
config_entry = MockConfigEntry(domain=DOMAIN, data=MOCK_ENTRY_DATA)
config_entry.add_to_hass(hass)
sensor = TEST_OTHER_ERROR_SENSOR.model_copy()
status = sensor.data
sensor.data = None
with (
patch("lacrosse_view.LaCrosse.login", return_value=True),
patch(
"lacrosse_view.LaCrosse.get_devices",
return_value=[sensor],
),
patch("lacrosse_view.LaCrosse.get_sensor_status", return_value=status),
):
assert not await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done()
entries = hass.config_entries.async_entries(DOMAIN)
assert entries
assert len(entries) == 1
assert entries[0].state is ConfigEntryState.SETUP_RETRY