Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Set Scrape sensor unavailable when errors #134143

Merged
merged 2 commits into from
Dec 29, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions homeassistant/components/scrape/sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,7 @@ def __init__(
self._index = index
self._value_template = value_template
self._attr_native_value = None
self._available = True
if not yaml and (unique_id := trigger_entity_config.get(CONF_UNIQUE_ID)):
self._attr_name = None
self._attr_has_entity_name = True
Expand All @@ -172,6 +173,7 @@ def _extract_value(self) -> Any:
"""Parse the html extraction in the executor."""
raw_data = self.coordinator.data
value: str | list[str] | None
self._available = True
try:
if self._attr is not None:
value = raw_data.select(self._select)[self._index][self._attr]
Expand All @@ -184,18 +186,21 @@ def _extract_value(self) -> Any:
except IndexError:
_LOGGER.warning("Index '%s' not found in %s", self._index, self.entity_id)
value = None
self._available = False
except KeyError:
_LOGGER.warning(
"Attribute '%s' not found in %s", self._attr, self.entity_id
)
value = None
self._available = False
_LOGGER.debug("Parsed value: %s", value)
return value

async def async_added_to_hass(self) -> None:
"""Ensure the data from the initial update is reflected in the state."""
await super().async_added_to_hass()
self._async_update_from_rest_data()
self.async_write_ha_state()

def _async_update_from_rest_data(self) -> None:
"""Update state from the rest data."""
Expand All @@ -210,21 +215,22 @@ def _async_update_from_rest_data(self) -> None:
SensorDeviceClass.TIMESTAMP,
}:
self._attr_native_value = value
self._attr_available = self._available
self._process_manual_data(raw_value)
return

self._attr_native_value = async_parse_date_datetime(
value, self.entity_id, self.device_class
)
self._attr_available = self._available
self._process_manual_data(raw_value)
self.async_write_ha_state()
gjohansson-ST marked this conversation as resolved.
Show resolved Hide resolved

@property
def available(self) -> bool:
"""Return if entity is available."""
available1 = CoordinatorEntity.available.fget(self) # type: ignore[attr-defined]
available2 = ManualTriggerEntity.available.fget(self) # type: ignore[attr-defined]
return bool(available1 and available2)
return bool(available1 and available2 and self._attr_available)

@callback
def _handle_coordinator_update(self) -> None:
Expand Down
4 changes: 2 additions & 2 deletions tests/components/scrape/test_sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -443,9 +443,9 @@ async def test_scrape_sensor_errors(hass: HomeAssistant) -> None:
await hass.async_block_till_done()

state = hass.states.get("sensor.ha_class")
assert state.state == STATE_UNKNOWN
assert state.state == STATE_UNAVAILABLE
state2 = hass.states.get("sensor.ha_class2")
assert state2.state == STATE_UNKNOWN
assert state2.state == STATE_UNAVAILABLE


async def test_scrape_sensor_unique_id(
Expand Down