mirror of
https://github.com/home-assistant/core.git
synced 2025-07-19 03:07:37 +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.exceptions import ConfigEntryAuthFailed
|
||||||
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
|
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
|
||||||
|
|
||||||
from .const import SCAN_INTERVAL
|
from .const import DOMAIN, SCAN_INTERVAL
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
@ -75,16 +75,28 @@ class LaCrosseUpdateCoordinator(DataUpdateCoordinator[list[Sensor]]):
|
|||||||
try:
|
try:
|
||||||
# Fetch last hour of data
|
# Fetch last hour of data
|
||||||
for sensor in self.devices:
|
for sensor in self.devices:
|
||||||
sensor.data = (
|
data = await self.api.get_sensor_status(
|
||||||
await self.api.get_sensor_status(
|
sensor=sensor,
|
||||||
sensor=sensor,
|
tz=self.hass.config.time_zone,
|
||||||
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:
|
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
|
# Verify that we have permission to read the sensors
|
||||||
for sensor in self.devices:
|
for sensor in self.devices:
|
||||||
|
@ -42,5 +42,10 @@
|
|||||||
"name": "Wind chill"
|
"name": "Wind chill"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"exceptions": {
|
||||||
|
"update_error": {
|
||||||
|
"message": "Error updating data"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -165,3 +165,25 @@ TEST_UNITS_OVERRIDE_SENSOR = Sensor(
|
|||||||
permissions={"read": True},
|
permissions={"read": True},
|
||||||
model="Test",
|
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 len(entries) == 1
|
||||||
assert entries[0].state is ConfigEntryState.SETUP_RETRY
|
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:
|
async def test_new_token(hass: HomeAssistant, freezer: FrozenDateTimeFactory) -> None:
|
||||||
"""Test new token."""
|
"""Test new token."""
|
||||||
|
@ -18,6 +18,8 @@ from . import (
|
|||||||
TEST_MISSING_FIELD_DATA_SENSOR,
|
TEST_MISSING_FIELD_DATA_SENSOR,
|
||||||
TEST_NO_FIELD_SENSOR,
|
TEST_NO_FIELD_SENSOR,
|
||||||
TEST_NO_PERMISSION_SENSOR,
|
TEST_NO_PERMISSION_SENSOR,
|
||||||
|
TEST_NO_READINGS_SENSOR,
|
||||||
|
TEST_OTHER_ERROR_SENSOR,
|
||||||
TEST_SENSOR,
|
TEST_SENSOR,
|
||||||
TEST_STRING_SENSOR,
|
TEST_STRING_SENSOR,
|
||||||
TEST_UNITS_OVERRIDE_SENSOR,
|
TEST_UNITS_OVERRIDE_SENSOR,
|
||||||
@ -204,3 +206,57 @@ async def test_field_data_missing(hass: HomeAssistant) -> None:
|
|||||||
assert len(entries) == 1
|
assert len(entries) == 1
|
||||||
assert entries[0].state is ConfigEntryState.LOADED
|
assert entries[0].state is ConfigEntryState.LOADED
|
||||||
assert hass.states.get("sensor.test_temperature").state == "unknown"
|
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