mirror of
https://github.com/home-assistant/core.git
synced 2025-04-19 14:57:52 +00:00
Handle no_readings in La Crosse View (#138354)
* Handle no_readings in La Crosse View * Fixes
This commit is contained in:
parent
737baaef2b
commit
6bc4f04a07
@ -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:
|
||||
|
@ -42,5 +42,10 @@
|
||||
"name": "Wind chill"
|
||||
}
|
||||
}
|
||||
},
|
||||
"exceptions": {
|
||||
"update_error": {
|
||||
"message": "Error updating data"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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",
|
||||
)
|
||||
|
@ -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."""
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user